From 9eb434c3899ce4791ca58affcbe673e5a96ff6b9 Mon Sep 17 00:00:00 2001 From: Daniel Sandler Date: Wed, 31 Jul 2013 20:21:07 -0400 Subject: [PATCH] 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 --- .../android/server/NotificationManagerService.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 29aaeaf33f4f3..29780c06e8e5d 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;