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

Commit 1279fd1f authored by Iavor-Valentin Iftime's avatar Iavor-Valentin Iftime
Browse files

[conflict] Merge "Check sound Uri permission when creating a notification...

[conflict] Merge "Check sound Uri permission when creating a notification channel" into udc-dev am: ae3d9211

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/34035712



Bug: 430281463

Change-Id: Ia85d9da2735fb06ee127fc7327595189d82b724f
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 48334dd7 ae3d9211
Loading
Loading
Loading
Loading
+6 −5
Original line number Diff line number Diff line
@@ -30,10 +30,7 @@ import android.app.IActivityManager;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.Person;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ShortcutInfo;
@@ -42,7 +39,6 @@ import android.media.AudioAttributes;
import android.media.AudioSystem;
import android.metrics.LogMaker;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
@@ -1405,7 +1401,12 @@ public final class NotificationRecord {
     * {@link #mGrantableUris}. Otherwise, this will either log or throw
     * {@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 (uri == null) {
            return;
        }

        if (mGrantableUris != null && mGrantableUris.contains(uri)) {
            return; // already verified this URI
        }
+7 −1
Original line number Diff line number Diff line
@@ -1006,7 +1006,13 @@ public class PreferencesHelper implements RankingConfig {
                // 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}
                try {
                    PermissionHelper.grantUriPermission(mUgmInternal, channel.getSound(), uid);
                } catch (SecurityException e) {
                    // Fallback to default Uri to prevent app crashes
                    channel.setSound(Settings.System.DEFAULT_NOTIFICATION_URI,
                            Notification.AUDIO_ATTRIBUTES_DEFAULT);
                }

                channel.setImportanceLockedByCriticalDeviceFunction(
                        r.defaultAppLockedImportance || r.fixedImportance);
+3 −3
Original line number Diff line number Diff line
@@ -3684,12 +3684,12 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
                updatedNotificationChannel.getAudioAttributes());
        mBinderService.updateNotificationChannelFromPrivilegedListener(
                null, PKG, Process.myUserHandle(), updatedNotificationChannel);
                null, mPkg, Process.myUserHandle(), updatedNotificationChannel);
        verify(mPreferencesHelper, times(1)).updateNotificationChannel(
                anyString(), anyInt(), any(), anyBoolean(),  anyInt(), anyBoolean());
        verify(mListeners, never()).notifyNotificationChannelChanged(eq(PKG),
        verify(mListeners, never()).notifyNotificationChannelChanged(eq(mPkg),
                eq(Process.myUserHandle()), eq(mTestNotificationChannel),
                eq(NotificationListenerService.NOTIFICATION_CHANNEL_OR_GROUP_UPDATED));
    }
+6 −3
Original line number Diff line number Diff line
@@ -867,9 +867,12 @@ public class NotificationRecordTest extends UiServiceTestCase {
        StatusBarNotification sbn =
                new StatusBarNotification(PKG_P, PKG_P, id1, tag1, uid, uid, n, mUser, null, uid);

        assertThrows("App provided uri for p targeting app should throw exception",
                SecurityException.class,
                () -> new NotificationRecord(mMockContext, sbn, channel));
        try {
            NotificationRecord record = new NotificationRecord(mMockContext, sbn, channel);
            fail("App provided uri for p targeting app should throw exception");
        } catch (SecurityException e) {
            // expected
        }
    }

    @Test
+48 −19
Original line number Diff line number Diff line
@@ -132,6 +132,7 @@ import com.android.modules.utils.TypedXmlSerializer;
import com.android.os.AtomsProto.PackageNotificationPreferences;
import com.android.server.UiServiceTestCase;
import com.android.server.notification.PermissionHelper.PackagePermission;
import com.android.server.uri.UriGrantsManagerInternal;

import com.google.common.collect.ImmutableList;

@@ -308,8 +309,10 @@ public class PreferencesHelperTest extends UiServiceTestCase {

        mStatsEventBuilderFactory = new WrappedSysUiStatsEvent.WrappedBuilderFactory();


        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager,
                mUgmInternal, mStatsEventBuilderFactory, false);
        resetZenModeHelper();

        mAudioAttributes = new AudioAttributes.Builder()
@@ -651,7 +654,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testReadXml_oldXml_migrates() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, true);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, true);

        String xml = "<ranking version=\"2\">\n"
                + "<package name=\"" + PKG_N_MR1 + "\" uid=\"" + UID_N_MR1
@@ -717,7 +721,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testReadXml_oldXml_backup_migratesWhenPkgInstalled() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        when(mPm.getPackageUidAsUser("pkg1", USER_SYSTEM)).thenReturn(UNKNOWN_UID);
        when(mPm.getPackageUidAsUser("pkg2", USER_SYSTEM)).thenReturn(UNKNOWN_UID);
@@ -795,7 +800,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testReadXml_newXml_noMigration_showPermissionNotification() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, true);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, true);

        String xml = "<ranking version=\"3\">\n"
                + "<package name=\"" + PKG_N_MR1 + "\" show_badge=\"true\">\n"
@@ -852,7 +858,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testReadXml_newXml_permissionNotificationOff() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        String xml = "<ranking version=\"3\">\n"
                + "<package name=\"" + PKG_N_MR1 + "\" show_badge=\"true\">\n"
@@ -909,7 +916,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testReadXml_newXml_noMigration_noPermissionNotification() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, true);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, true);

        String xml = "<ranking version=\"4\">\n"
                + "<package name=\"" + PKG_N_MR1 + "\" show_badge=\"true\">\n"
@@ -965,7 +973,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testReadXml_oldXml_migration_NoUid() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        when(mPm.getPackageUidAsUser("something", USER_SYSTEM)).thenReturn(UNKNOWN_UID);
        String xml = "<ranking version=\"2\">\n"
@@ -998,7 +1007,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testReadXml_newXml_noMigration_NoUid() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        when(mPm.getPackageUidAsUser("something", USER_SYSTEM)).thenReturn(UNKNOWN_UID);
        String xml = "<ranking version=\"3\">\n"
@@ -1030,7 +1040,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testChannelXmlForNonBackup_postMigration() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        ArrayMap<Pair<Integer, String>, Pair<Boolean, Boolean>> appPermissions = new ArrayMap<>();
        appPermissions.put(new Pair<>(1, "first"), new Pair<>(true, false));
@@ -1116,7 +1127,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testChannelXmlForBackup_postMigration() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        ArrayMap<Pair<Integer, String>, Pair<Boolean, Boolean>> appPermissions = new ArrayMap<>();
        appPermissions.put(new Pair<>(1, "first"), new Pair<>(true, false));
@@ -1208,7 +1220,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testChannelXmlForBackup_postMigration_noExternal() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        ArrayMap<Pair<Integer, String>, Pair<Boolean, Boolean>> appPermissions = new ArrayMap<>();
        appPermissions.put(new Pair<>(UID_P, PKG_P), new Pair<>(true, false));
@@ -1293,7 +1306,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    @Test
    public void testChannelXmlForBackup_postMigration_noLocalSettings() throws Exception {
        mHelper = new PreferencesHelper(getContext(), mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        ArrayMap<Pair<Integer, String>, Pair<Boolean, Boolean>> appPermissions = new ArrayMap<>();
        appPermissions.put(new Pair<>(1, "first"), new Pair<>(true, false));
@@ -1503,7 +1517,8 @@ public class PreferencesHelperTest extends UiServiceTestCase {
                new FileNotFoundException("")).thenReturn(resId);

        mHelper = new PreferencesHelper(mContext, mPm, mHandler, mMockZenModeHelper,
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal, mStatsEventBuilderFactory, false);
                mPermissionHelper, mLogger, mAppOpsManager, mUgmInternal,
                mStatsEventBuilderFactory, false);

        NotificationChannel channel =
                new NotificationChannel("id", "name", IMPORTANCE_LOW);
@@ -2667,7 +2682,21 @@ public class PreferencesHelperTest extends UiServiceTestCase {
    }

    @Test
    public void testCreateChannel_noSoundUriPermission_contentSchemeVerified() {
    public void testCreateChannel_hasSoundUriPermission_useCustomSound() {
        final Uri sound = Uri.parse(SCHEME_CONTENT + "://media/test/sound/uri");

        final NotificationChannel channel = new NotificationChannel("id2", "name2",
                NotificationManager.IMPORTANCE_DEFAULT);
        channel.setSound(sound, mAudioAttributes);
        mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel, true, false, UID_N_MR1,
                false);
        assertThat(mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId(), true)
                .getSound()).isEqualTo(sound);
    }


    @Test
    public void testCreateChannel_noSoundUriPermission_replaceWithDefaultSound() {
        final Uri sound = Uri.parse(SCHEME_CONTENT + "://media/test/sound/uri");

        doThrow(new SecurityException("no access")).when(mUgmInternal)
@@ -2677,12 +2706,12 @@ public class PreferencesHelperTest extends UiServiceTestCase {
        final NotificationChannel channel = new NotificationChannel("id2", "name2",
                NotificationManager.IMPORTANCE_DEFAULT);
        channel.setSound(sound, mAudioAttributes);

        assertThrows(SecurityException.class,
                () -> mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel,
                    true, false, UID_N_MR1, false));
        mHelper.createNotificationChannel(PKG_N_MR1, UID_N_MR1, channel, true, false, UID_N_MR1,
                false);
        assertThat(mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId(), true))
                .isNull();
                .isNotNull();
        assertThat(mHelper.getNotificationChannel(PKG_N_MR1, UID_N_MR1, channel.getId(), true)
                .getSound()).isEqualTo(Settings.System.DEFAULT_NOTIFICATION_URI);
    }

    @Test