Loading services/core/java/com/android/server/notification/NotificationManagerService.java +7 −2 Original line number Original line Diff line number Diff line Loading @@ -2288,7 +2288,6 @@ public class NotificationManagerService extends SystemService { mPermissionHelper, mPermissionHelper, mNotificationChannelLogger, mNotificationChannelLogger, mAppOps, mAppOps, mUgmInternal, new SysUiStatsEvent.BuilderFactory(), new SysUiStatsEvent.BuilderFactory(), mShowReviewPermissionsNotification); mShowReviewPermissionsNotification); mPreferencesHelper.updateFixedImportance(mUm.getUsers()); mPreferencesHelper.updateFixedImportance(mUm.getUsers()); Loading Loading @@ -5729,7 +5728,13 @@ public class NotificationManagerService extends SystemService { final Uri originalSoundUri = final Uri originalSoundUri = (originalChannel != null) ? originalChannel.getSound() : null; (originalChannel != null) ? originalChannel.getSound() : null; if (soundUri != null && !Objects.equals(originalSoundUri, soundUri)) { if (soundUri != null && !Objects.equals(originalSoundUri, soundUri)) { PermissionHelper.grantUriPermission(mUgmInternal, soundUri, sourceUid); Binder.withCleanCallingIdentity(() -> { mUgmInternal.checkGrantUriPermission(sourceUid, null, ContentProvider.getUriWithoutUserId(soundUri), Intent.FLAG_GRANT_READ_URI_PERMISSION, ContentProvider.getUserIdFromUri(soundUri, UserHandle.getUserId(sourceUid))); }); } } } } Loading services/core/java/com/android/server/notification/NotificationRecord.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -1369,16 +1369,19 @@ public final class NotificationRecord { * {@link SecurityException} depending on target SDK of enqueuing app. * {@link SecurityException} depending on target SDK of enqueuing app. */ */ private void visitGrantableUri(Uri uri, boolean userOverriddenUri, boolean isSound) { private void visitGrantableUri(Uri uri, boolean userOverriddenUri, boolean isSound) { if (mGrantableUris != null && mGrantableUris.contains(uri)) { if (uri == null || !ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) return; return; // already verified this URI } // We can't grant Uri permissions from system // We can't grant Uri permissions from system final int sourceUid = getSbn().getUid(); final int sourceUid = getSbn().getUid(); if (sourceUid == android.os.Process.SYSTEM_UID) return; if (sourceUid == android.os.Process.SYSTEM_UID) return; final long ident = Binder.clearCallingIdentity(); try { try { PermissionHelper.grantUriPermission(mUgmInternal, uri, sourceUid); // This will throw SecurityException if caller can't grant mUgmInternal.checkGrantUriPermission(sourceUid, null, ContentProvider.getUriWithoutUserId(uri), Intent.FLAG_GRANT_READ_URI_PERMISSION, ContentProvider.getUserIdFromUri(uri, UserHandle.getUserId(sourceUid))); if (mGrantableUris == null) { if (mGrantableUris == null) { mGrantableUris = new ArraySet<>(); mGrantableUris = new ArraySet<>(); Loading @@ -1398,6 +1401,8 @@ public final class NotificationRecord { } } } } } } } finally { Binder.restoreCallingIdentity(ident); } } } } Loading services/core/java/com/android/server/notification/PermissionHelper.java +0 −19 Original line number Original line Diff line number Diff line Loading @@ -23,17 +23,12 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.Manifest; import android.Manifest; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.annotation.UserIdInt; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Intent; import android.content.pm.IPackageManager; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ParceledListSlice; import android.net.Uri; import android.os.Binder; import android.os.Binder; import android.os.RemoteException; import android.os.RemoteException; import android.os.UserHandle; import android.permission.IPermissionManager; import android.permission.IPermissionManager; import android.util.ArrayMap; import android.util.ArrayMap; import android.util.Pair; import android.util.Pair; Loading @@ -41,7 +36,6 @@ import android.util.Slog; import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.uri.UriGrantsManagerInternal; import java.util.Collections; import java.util.Collections; import java.util.HashSet; import java.util.HashSet; Loading Loading @@ -272,19 +266,6 @@ public final class PermissionHelper { return false; return false; } } static void grantUriPermission(final UriGrantsManagerInternal ugmInternal, Uri uri, int sourceUid) { if (uri == null || !ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) return; Binder.withCleanCallingIdentity(() -> { // This will throw a SecurityException if the caller can't grant. ugmInternal.checkGrantUriPermission(sourceUid, null, ContentProvider.getUriWithoutUserId(uri), Intent.FLAG_GRANT_READ_URI_PERMISSION, ContentProvider.getUserIdFromUri(uri, UserHandle.getUserId(sourceUid))); }); } public static class PackagePermission { public static class PackagePermission { public final String packageName; public final String packageName; public final @UserIdInt int userId; public final @UserIdInt int userId; Loading services/core/java/com/android/server/notification/PreferencesHelper.java +0 −9 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.internal.util.XmlUtils; import com.android.server.notification.PermissionHelper.PackagePermission; import com.android.server.notification.PermissionHelper.PackagePermission; import com.android.server.uri.UriGrantsManagerInternal; import org.json.JSONArray; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONException; Loading Loading @@ -183,7 +182,6 @@ public class PreferencesHelper implements RankingConfig { private final PermissionHelper mPermissionHelper; private final PermissionHelper mPermissionHelper; private final NotificationChannelLogger mNotificationChannelLogger; private final NotificationChannelLogger mNotificationChannelLogger; private final AppOpsManager mAppOps; private final AppOpsManager mAppOps; private final UriGrantsManagerInternal mUgmInternal; private SparseBooleanArray mBadgingEnabled; private SparseBooleanArray mBadgingEnabled; private SparseBooleanArray mBubblesEnabled; private SparseBooleanArray mBubblesEnabled; Loading @@ -200,7 +198,6 @@ public class PreferencesHelper implements RankingConfig { ZenModeHelper zenHelper, PermissionHelper permHelper, ZenModeHelper zenHelper, PermissionHelper permHelper, NotificationChannelLogger notificationChannelLogger, NotificationChannelLogger notificationChannelLogger, AppOpsManager appOpsManager, AppOpsManager appOpsManager, UriGrantsManagerInternal ugmInternal, SysUiStatsEvent.BuilderFactory statsEventBuilderFactory, SysUiStatsEvent.BuilderFactory statsEventBuilderFactory, boolean showReviewPermissionsNotification) { boolean showReviewPermissionsNotification) { mContext = context; mContext = context; Loading @@ -211,7 +208,6 @@ public class PreferencesHelper implements RankingConfig { mNotificationChannelLogger = notificationChannelLogger; mNotificationChannelLogger = notificationChannelLogger; mAppOps = appOpsManager; mAppOps = appOpsManager; mStatsEventBuilderFactory = statsEventBuilderFactory; mStatsEventBuilderFactory = statsEventBuilderFactory; mUgmInternal = ugmInternal; mShowReviewPermissionsNotification = showReviewPermissionsNotification; mShowReviewPermissionsNotification = showReviewPermissionsNotification; XML_VERSION = 4; XML_VERSION = 4; Loading Loading @@ -1012,11 +1008,6 @@ public class PreferencesHelper implements RankingConfig { } } clearLockedFieldsLocked(channel); clearLockedFieldsLocked(channel); // Verify that the app has permission to read the sound Uri // Only check for new channels, as regular apps can only set sound // before creating. See: {@link NotificationChannel#setSound} PermissionHelper.grantUriPermission(mUgmInternal, channel.getSound(), uid); channel.setImportanceLockedByCriticalDeviceFunction( channel.setImportanceLockedByCriticalDeviceFunction( r.defaultAppLockedImportance || r.fixedImportance); r.defaultAppLockedImportance || r.fixedImportance); Loading services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +1 −36 Original line number Original line Diff line number Diff line Loading @@ -3256,41 +3256,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { .checkGrantUriPermission(eq(Process.myUid()), any(), eq(soundUri), .checkGrantUriPermission(eq(Process.myUid()), any(), eq(soundUri), anyInt(), eq(Process.myUserHandle().getIdentifier())); anyInt(), eq(Process.myUserHandle().getIdentifier())); mBinderService.updateNotificationChannelFromPrivilegedListener( null, mPkg, Process.myUserHandle(), updatedNotificationChannel); verify(mPreferencesHelper, times(1)).updateNotificationChannel( anyString(), anyInt(), any(), anyBoolean()); verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg), eq(Process.myUserHandle()), eq(mTestNotificationChannel), eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED)); } @Test public void testUpdateNotificationChannelFromPrivilegedListener_oldSoundNoUriPerm_newSoundHasUriPerm() throws Exception { mService.setPreferencesHelper(mPreferencesHelper); when(mCompanionMgr.getAssociations(mPkg, mUserId)) .thenReturn(singletonList(mock(AssociationInfo.class))); when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(), eq(mTestNotificationChannel.getId()), anyBoolean())) .thenReturn(mTestNotificationChannel); // Missing Uri permissions for the old channel sound final Uri oldSoundUri = Settings.System.DEFAULT_NOTIFICATION_URI; doThrow(new SecurityException("no access")).when(mUgmInternal) .checkGrantUriPermission(eq(Process.myUid()), any(), eq(oldSoundUri), anyInt(), eq(Process.myUserHandle().getIdentifier())); // Has Uri permissions for the old channel sound final Uri newSoundUri = Uri.parse("content://media/test/sound/uri"); final NotificationChannel updatedNotificationChannel = new NotificationChannel( TEST_CHANNEL_ID, TEST_CHANNEL_ID, IMPORTANCE_DEFAULT); updatedNotificationChannel.setSound(newSoundUri, updatedNotificationChannel.getAudioAttributes()); mBinderService.updateNotificationChannelFromPrivilegedListener( mBinderService.updateNotificationChannelFromPrivilegedListener( null, PKG, Process.myUserHandle(), updatedNotificationChannel); null, PKG, Process.myUserHandle(), updatedNotificationChannel); Loading Loading
services/core/java/com/android/server/notification/NotificationManagerService.java +7 −2 Original line number Original line Diff line number Diff line Loading @@ -2288,7 +2288,6 @@ public class NotificationManagerService extends SystemService { mPermissionHelper, mPermissionHelper, mNotificationChannelLogger, mNotificationChannelLogger, mAppOps, mAppOps, mUgmInternal, new SysUiStatsEvent.BuilderFactory(), new SysUiStatsEvent.BuilderFactory(), mShowReviewPermissionsNotification); mShowReviewPermissionsNotification); mPreferencesHelper.updateFixedImportance(mUm.getUsers()); mPreferencesHelper.updateFixedImportance(mUm.getUsers()); Loading Loading @@ -5729,7 +5728,13 @@ public class NotificationManagerService extends SystemService { final Uri originalSoundUri = final Uri originalSoundUri = (originalChannel != null) ? originalChannel.getSound() : null; (originalChannel != null) ? originalChannel.getSound() : null; if (soundUri != null && !Objects.equals(originalSoundUri, soundUri)) { if (soundUri != null && !Objects.equals(originalSoundUri, soundUri)) { PermissionHelper.grantUriPermission(mUgmInternal, soundUri, sourceUid); Binder.withCleanCallingIdentity(() -> { mUgmInternal.checkGrantUriPermission(sourceUid, null, ContentProvider.getUriWithoutUserId(soundUri), Intent.FLAG_GRANT_READ_URI_PERMISSION, ContentProvider.getUserIdFromUri(soundUri, UserHandle.getUserId(sourceUid))); }); } } } } Loading
services/core/java/com/android/server/notification/NotificationRecord.java +9 −4 Original line number Original line Diff line number Diff line Loading @@ -1369,16 +1369,19 @@ public final class NotificationRecord { * {@link SecurityException} depending on target SDK of enqueuing app. * {@link SecurityException} depending on target SDK of enqueuing app. */ */ private void visitGrantableUri(Uri uri, boolean userOverriddenUri, boolean isSound) { private void visitGrantableUri(Uri uri, boolean userOverriddenUri, boolean isSound) { if (mGrantableUris != null && mGrantableUris.contains(uri)) { if (uri == null || !ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) return; return; // already verified this URI } // We can't grant Uri permissions from system // We can't grant Uri permissions from system final int sourceUid = getSbn().getUid(); final int sourceUid = getSbn().getUid(); if (sourceUid == android.os.Process.SYSTEM_UID) return; if (sourceUid == android.os.Process.SYSTEM_UID) return; final long ident = Binder.clearCallingIdentity(); try { try { PermissionHelper.grantUriPermission(mUgmInternal, uri, sourceUid); // This will throw SecurityException if caller can't grant mUgmInternal.checkGrantUriPermission(sourceUid, null, ContentProvider.getUriWithoutUserId(uri), Intent.FLAG_GRANT_READ_URI_PERMISSION, ContentProvider.getUserIdFromUri(uri, UserHandle.getUserId(sourceUid))); if (mGrantableUris == null) { if (mGrantableUris == null) { mGrantableUris = new ArraySet<>(); mGrantableUris = new ArraySet<>(); Loading @@ -1398,6 +1401,8 @@ public final class NotificationRecord { } } } } } } } finally { Binder.restoreCallingIdentity(ident); } } } } Loading
services/core/java/com/android/server/notification/PermissionHelper.java +0 −19 Original line number Original line Diff line number Diff line Loading @@ -23,17 +23,12 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; import android.Manifest; import android.Manifest; import android.annotation.NonNull; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.annotation.UserIdInt; import android.content.ContentProvider; import android.content.ContentResolver; import android.content.Intent; import android.content.pm.IPackageManager; import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager; import android.content.pm.ParceledListSlice; import android.content.pm.ParceledListSlice; import android.net.Uri; import android.os.Binder; import android.os.Binder; import android.os.RemoteException; import android.os.RemoteException; import android.os.UserHandle; import android.permission.IPermissionManager; import android.permission.IPermissionManager; import android.util.ArrayMap; import android.util.ArrayMap; import android.util.Pair; import android.util.Pair; Loading @@ -41,7 +36,6 @@ import android.util.Slog; import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.pm.permission.PermissionManagerServiceInternal; import com.android.server.uri.UriGrantsManagerInternal; import java.util.Collections; import java.util.Collections; import java.util.HashSet; import java.util.HashSet; Loading Loading @@ -272,19 +266,6 @@ public final class PermissionHelper { return false; return false; } } static void grantUriPermission(final UriGrantsManagerInternal ugmInternal, Uri uri, int sourceUid) { if (uri == null || !ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) return; Binder.withCleanCallingIdentity(() -> { // This will throw a SecurityException if the caller can't grant. ugmInternal.checkGrantUriPermission(sourceUid, null, ContentProvider.getUriWithoutUserId(uri), Intent.FLAG_GRANT_READ_URI_PERMISSION, ContentProvider.getUserIdFromUri(uri, UserHandle.getUserId(sourceUid))); }); } public static class PackagePermission { public static class PackagePermission { public final String packageName; public final String packageName; public final @UserIdInt int userId; public final @UserIdInt int userId; Loading
services/core/java/com/android/server/notification/PreferencesHelper.java +0 −9 Original line number Original line Diff line number Diff line Loading @@ -74,7 +74,6 @@ import com.android.internal.logging.MetricsLogger; import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions; import com.android.internal.util.XmlUtils; import com.android.internal.util.XmlUtils; import com.android.server.notification.PermissionHelper.PackagePermission; import com.android.server.notification.PermissionHelper.PackagePermission; import com.android.server.uri.UriGrantsManagerInternal; import org.json.JSONArray; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONException; Loading Loading @@ -183,7 +182,6 @@ public class PreferencesHelper implements RankingConfig { private final PermissionHelper mPermissionHelper; private final PermissionHelper mPermissionHelper; private final NotificationChannelLogger mNotificationChannelLogger; private final NotificationChannelLogger mNotificationChannelLogger; private final AppOpsManager mAppOps; private final AppOpsManager mAppOps; private final UriGrantsManagerInternal mUgmInternal; private SparseBooleanArray mBadgingEnabled; private SparseBooleanArray mBadgingEnabled; private SparseBooleanArray mBubblesEnabled; private SparseBooleanArray mBubblesEnabled; Loading @@ -200,7 +198,6 @@ public class PreferencesHelper implements RankingConfig { ZenModeHelper zenHelper, PermissionHelper permHelper, ZenModeHelper zenHelper, PermissionHelper permHelper, NotificationChannelLogger notificationChannelLogger, NotificationChannelLogger notificationChannelLogger, AppOpsManager appOpsManager, AppOpsManager appOpsManager, UriGrantsManagerInternal ugmInternal, SysUiStatsEvent.BuilderFactory statsEventBuilderFactory, SysUiStatsEvent.BuilderFactory statsEventBuilderFactory, boolean showReviewPermissionsNotification) { boolean showReviewPermissionsNotification) { mContext = context; mContext = context; Loading @@ -211,7 +208,6 @@ public class PreferencesHelper implements RankingConfig { mNotificationChannelLogger = notificationChannelLogger; mNotificationChannelLogger = notificationChannelLogger; mAppOps = appOpsManager; mAppOps = appOpsManager; mStatsEventBuilderFactory = statsEventBuilderFactory; mStatsEventBuilderFactory = statsEventBuilderFactory; mUgmInternal = ugmInternal; mShowReviewPermissionsNotification = showReviewPermissionsNotification; mShowReviewPermissionsNotification = showReviewPermissionsNotification; XML_VERSION = 4; XML_VERSION = 4; Loading Loading @@ -1012,11 +1008,6 @@ public class PreferencesHelper implements RankingConfig { } } clearLockedFieldsLocked(channel); clearLockedFieldsLocked(channel); // Verify that the app has permission to read the sound Uri // Only check for new channels, as regular apps can only set sound // before creating. See: {@link NotificationChannel#setSound} PermissionHelper.grantUriPermission(mUgmInternal, channel.getSound(), uid); channel.setImportanceLockedByCriticalDeviceFunction( channel.setImportanceLockedByCriticalDeviceFunction( r.defaultAppLockedImportance || r.fixedImportance); r.defaultAppLockedImportance || r.fixedImportance); Loading
services/tests/uiservicestests/src/com/android/server/notification/NotificationManagerServiceTest.java +1 −36 Original line number Original line Diff line number Diff line Loading @@ -3256,41 +3256,6 @@ public class NotificationManagerServiceTest extends UiServiceTestCase { .checkGrantUriPermission(eq(Process.myUid()), any(), eq(soundUri), .checkGrantUriPermission(eq(Process.myUid()), any(), eq(soundUri), anyInt(), eq(Process.myUserHandle().getIdentifier())); anyInt(), eq(Process.myUserHandle().getIdentifier())); mBinderService.updateNotificationChannelFromPrivilegedListener( null, mPkg, Process.myUserHandle(), updatedNotificationChannel); verify(mPreferencesHelper, times(1)).updateNotificationChannel( anyString(), anyInt(), any(), anyBoolean()); verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg), eq(Process.myUserHandle()), eq(mTestNotificationChannel), eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED)); } @Test public void testUpdateNotificationChannelFromPrivilegedListener_oldSoundNoUriPerm_newSoundHasUriPerm() throws Exception { mService.setPreferencesHelper(mPreferencesHelper); when(mCompanionMgr.getAssociations(mPkg, mUserId)) .thenReturn(singletonList(mock(AssociationInfo.class))); when(mPreferencesHelper.getNotificationChannel(eq(mPkg), anyInt(), eq(mTestNotificationChannel.getId()), anyBoolean())) .thenReturn(mTestNotificationChannel); // Missing Uri permissions for the old channel sound final Uri oldSoundUri = Settings.System.DEFAULT_NOTIFICATION_URI; doThrow(new SecurityException("no access")).when(mUgmInternal) .checkGrantUriPermission(eq(Process.myUid()), any(), eq(oldSoundUri), anyInt(), eq(Process.myUserHandle().getIdentifier())); // Has Uri permissions for the old channel sound final Uri newSoundUri = Uri.parse("content://media/test/sound/uri"); final NotificationChannel updatedNotificationChannel = new NotificationChannel( TEST_CHANNEL_ID, TEST_CHANNEL_ID, IMPORTANCE_DEFAULT); updatedNotificationChannel.setSound(newSoundUri, updatedNotificationChannel.getAudioAttributes()); mBinderService.updateNotificationChannelFromPrivilegedListener( mBinderService.updateNotificationChannelFromPrivilegedListener( null, PKG, Process.myUserHandle(), updatedNotificationChannel); null, PKG, Process.myUserHandle(), updatedNotificationChannel); Loading