summaryrefslogtreecommitdiffstats
path: root/services/java/com/android/server/ClipboardService.java
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2013-02-25 18:02:35 -0800
committerDianne Hackborn <hackbod@google.com>2013-02-25 18:02:35 -0800
commitefcc1a23a1f731390ef8506b3536b9562d18ed78 (patch)
tree3bf75913746cac59177a3d1c7ff2d82034e03cc2 /services/java/com/android/server/ClipboardService.java
parentf4b36ad1617920691def64c00179666e2e42d5fa (diff)
downloadframeworks_base-efcc1a23a1f731390ef8506b3536b9562d18ed78.zip
frameworks_base-efcc1a23a1f731390ef8506b3536b9562d18ed78.tar.gz
frameworks_base-efcc1a23a1f731390ef8506b3536b9562d18ed78.tar.bz2
App ops: adding operations for reading/writing clipboard.
Change-Id: Ic4cade153618fe86954754a3b3edde64a52a0a9c
Diffstat (limited to 'services/java/com/android/server/ClipboardService.java')
-rw-r--r--services/java/com/android/server/ClipboardService.java54
1 files changed, 47 insertions, 7 deletions
diff --git a/services/java/com/android/server/ClipboardService.java b/services/java/com/android/server/ClipboardService.java
index 74ec6e2..058857d 100644
--- a/services/java/com/android/server/ClipboardService.java
+++ b/services/java/com/android/server/ClipboardService.java
@@ -18,6 +18,7 @@ package com.android.server;
import android.app.ActivityManagerNative;
import android.app.AppGlobals;
+import android.app.AppOpsManager;
import android.app.IActivityManager;
import android.content.BroadcastReceiver;
import android.content.ClipData;
@@ -55,8 +56,18 @@ public class ClipboardService extends IClipboard.Stub {
private final Context mContext;
private final IActivityManager mAm;
private final PackageManager mPm;
+ private final AppOpsManager mAppOps;
private final IBinder mPermissionOwner;
+ private class ListenerInfo {
+ final int mUid;
+ final String mPackageName;
+ ListenerInfo(int uid, String packageName) {
+ mUid = uid;
+ mPackageName = packageName;
+ }
+ }
+
private class PerUserClipboard {
final int userId;
@@ -82,6 +93,7 @@ public class ClipboardService extends IClipboard.Stub {
mContext = context;
mAm = ActivityManagerNative.getDefault();
mPm = context.getPackageManager();
+ mAppOps = (AppOpsManager)context.getSystemService(Context.APP_OPS_SERVICE);
IBinder permOwner = null;
try {
permOwner = mAm.newUriPermissionOwner("clipboard");
@@ -137,11 +149,15 @@ public class ClipboardService extends IClipboard.Stub {
}
}
- public void setPrimaryClip(ClipData clip) {
+ public void setPrimaryClip(ClipData clip, String callingPackage) {
synchronized (this) {
if (clip != null && clip.getItemCount() <= 0) {
throw new IllegalArgumentException("No items");
}
+ if (mAppOps.noteOp(AppOpsManager.OP_WRITE_CLIPBOARD, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return;
+ }
checkDataOwnerLocked(clip, Binder.getCallingUid());
clearActiveOwnersLocked();
PerUserClipboard clipboard = getClipboard();
@@ -149,7 +165,13 @@ public class ClipboardService extends IClipboard.Stub {
final int n = clipboard.primaryClipListeners.beginBroadcast();
for (int i = 0; i < n; i++) {
try {
- clipboard.primaryClipListeners.getBroadcastItem(i).dispatchPrimaryClipChanged();
+ ListenerInfo li = (ListenerInfo)
+ clipboard.primaryClipListeners.getBroadcastCookie(i);
+ if (mAppOps.checkOpNoThrow(AppOpsManager.OP_READ_CLIPBOARD, li.mUid,
+ li.mPackageName) == AppOpsManager.MODE_ALLOWED) {
+ clipboard.primaryClipListeners.getBroadcastItem(i)
+ .dispatchPrimaryClipChanged();
+ }
} catch (RemoteException e) {
// The RemoteCallbackList will take care of removing
@@ -162,27 +184,41 @@ 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) {
+ return null;
+ }
addActiveOwnerLocked(Binder.getCallingUid(), pkg);
return getClipboard().primaryClip;
}
}
- public ClipDescription getPrimaryClipDescription() {
+ public ClipDescription getPrimaryClipDescription(String callingPackage) {
synchronized (this) {
+ if (mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return null;
+ }
PerUserClipboard clipboard = getClipboard();
return clipboard.primaryClip != null ? clipboard.primaryClip.getDescription() : null;
}
}
- public boolean hasPrimaryClip() {
+ public boolean hasPrimaryClip(String callingPackage) {
synchronized (this) {
+ if (mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return false;
+ }
return getClipboard().primaryClip != null;
}
}
- public void addPrimaryClipChangedListener(IOnPrimaryClipChangedListener listener) {
+ public void addPrimaryClipChangedListener(IOnPrimaryClipChangedListener listener,
+ String callingPackage) {
synchronized (this) {
- getClipboard().primaryClipListeners.register(listener);
+ getClipboard().primaryClipListeners.register(listener,
+ new ListenerInfo(Binder.getCallingUid(), callingPackage));
}
}
@@ -192,8 +228,12 @@ public class ClipboardService extends IClipboard.Stub {
}
}
- public boolean hasClipboardText() {
+ public boolean hasClipboardText(String callingPackage) {
synchronized (this) {
+ if (mAppOps.checkOp(AppOpsManager.OP_READ_CLIPBOARD, Binder.getCallingUid(),
+ callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ return false;
+ }
PerUserClipboard clipboard = getClipboard();
if (clipboard.primaryClip != null) {
CharSequence text = clipboard.primaryClip.getItemAt(0).getText();