summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daniel Sandler <dsandler@android.com> 2013-07-31 20:21:07 -0400
committer The Android Automerger <android-build@android.com> 2013-08-01 13:51:51 -0700
commit74ff4588a9bcfe40a7e2ceb254aaada2bcd5b0c2 (patch)
treea916837596e10acc13c46a12bb0820a0277d0a82
parent70973b7bea5af6db40cf37f3eacb4ad7a5781b8c (diff)
Allow the user to block notifications for foreground services.
Stepping carefully around the fix in change Idc788527, we perform security (and AppOps, and therefore user block) checks against the uid passed to enqueueNotificationInternal rather than the Binder caller. Bug: 9502541 Change-Id: I91745db92823381df75721c1b8f11013a7fa4ecc
-rw-r--r--services/java/com/android/server/NotificationManagerService.java12
1 files changed, 8 insertions, 4 deletions
diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java
index 29aaeaf33f4f..29780c06e8e5 100644
--- a/services/java/com/android/server/NotificationManagerService.java
+++ b/services/java/com/android/server/NotificationManagerService.java
@@ -1606,7 +1606,7 @@ public class NotificationManagerService extends INotificationManager.Stub
Slog.v(TAG, "enqueueNotificationInternal: pkg=" + pkg + " id=" + id + " notification=" + notification);
}
checkCallerIsSystemOrSameApp(pkg);
- final boolean isSystemNotification = isCallerSystem() || ("android".equals(pkg));
+ final boolean isSystemNotification = isUidSystem(callingUid) || ("android".equals(pkg));
userId = ActivityManager.handleIncomingUser(callingPid,
callingUid, userId, true, false, "enqueueNotification", pkg);
@@ -2084,14 +2084,18 @@ public class NotificationManagerService extends INotificationManager.Stub
cancelAllNotificationsInt(pkg, 0, Notification.FLAG_FOREGROUND_SERVICE, true, userId);
}
- // Return true if the caller is a system or phone UID and therefore should not have
+ // Return true if the UID is a system or phone UID and therefore should not have
// any notifications or toasts blocked.
- boolean isCallerSystem() {
- final int uid = Binder.getCallingUid();
+ boolean isUidSystem(int uid) {
final int appid = UserHandle.getAppId(uid);
return (appid == Process.SYSTEM_UID || appid == Process.PHONE_UID || uid == 0);
}
+ // same as isUidSystem(int, int) for the Binder caller's UID.
+ boolean isCallerSystem() {
+ return isUidSystem(Binder.getCallingUid());
+ }
+
void checkCallerIsSystem() {
if (isCallerSystem()) {
return;