Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9895b5bf authored by Siyamed Sinir's avatar Siyamed Sinir Committed by Tim Schumacher
Browse files

Prevent getting data from Clipboard if device is locked

Clipboard should not return data if the device is locked. This CL checks
for device locked state before returning values from get/has functions.

Test: bit -t CtsContentTestCases:android.content.cts.ClipboardManagerTest

Bug: 64934810
Change-Id: Icefac226615fe22a7735dff4ba4c3b528fb2ac12
parent 36c01459
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -20,6 +20,8 @@ import android.app.ActivityManagerNative;
import android.app.AppGlobals;
import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.app.KeyguardManager;
import android.os.PowerManager;
import android.content.BroadcastReceiver;
import android.content.ClipData;
import android.content.ClipDescription;
@@ -191,8 +193,8 @@ public class ClipboardService extends IClipboard.Stub {
    
    public ClipData getPrimaryClip(String pkg) {
        synchronized (this) {
            if (mAppOps.noteOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    pkg) != AppOpsManager.MODE_ALLOWED) {
            if ((mAppOps.noteOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    pkg) != AppOpsManager.MODE_ALLOWED) || isDeviceLocked()) {
                return null;
            }
            addActiveOwnerLocked(Binder.getCallingUid(), pkg);
@@ -202,8 +204,8 @@ public class ClipboardService extends IClipboard.Stub {

    public ClipDescription getPrimaryClipDescription(String callingPackage) {
        synchronized (this) {
            if (mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    callingPackage) != AppOpsManager.MODE_ALLOWED) {
            if ((mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    callingPackage) != AppOpsManager.MODE_ALLOWED) || isDeviceLocked()) {
                return null;
            }
            PerUserClipboard clipboard = getClipboard();
@@ -213,8 +215,8 @@ public class ClipboardService extends IClipboard.Stub {

    public boolean hasPrimaryClip(String callingPackage) {
        synchronized (this) {
            if (mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    callingPackage) != AppOpsManager.MODE_ALLOWED) {
            if ((mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    callingPackage) != AppOpsManager.MODE_ALLOWED) || isDeviceLocked()) {
                return false;
            }
            return getClipboard().primaryClip != null;
@@ -237,8 +239,8 @@ public class ClipboardService extends IClipboard.Stub {

    public boolean hasClipboardText(String callingPackage) {
        synchronized (this) {
            if (mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    callingPackage) != AppOpsManager.MODE_ALLOWED) {
            if ((mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
                    callingPackage) != AppOpsManager.MODE_ALLOWED) || isDeviceLocked()) {
                return false;
            }
            PerUserClipboard clipboard = getClipboard();
@@ -250,6 +252,19 @@ public class ClipboardService extends IClipboard.Stub {
        }
    }

    private boolean isDeviceLocked() {
        boolean isLocked = false;
        KeyguardManager keyguardManager = (KeyguardManager) mContext.getSystemService(Context.KEYGUARD_SERVICE);
        boolean inKeyguardRestrictedInputMode = keyguardManager.inKeyguardRestrictedInputMode();
        if (inKeyguardRestrictedInputMode) {
            isLocked = true;
        } else {
            PowerManager powerManager = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
            isLocked = !powerManager.isScreenOn();
        }
        return isLocked;
    }

    private final void checkUriOwnerLocked(Uri uri, int uid) {
        if (!"content".equals(uri.getScheme())) {
            return;