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

Commit 8bfdef2a authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Ensure allowlist token

Bug: 320659371
Test: NotificationManagerServiceTest
Test: NotificationManager
Change-Id: I9d2d848a9beb2258affe58c0d0089e3a493d6de2
parent aed78ff2
Loading
Loading
Loading
Loading
+3 −6
Original line number Diff line number Diff line
@@ -3540,15 +3540,12 @@ public class Notification implements Parcelable
     * Sets the token used for background operations for the pending intents associated with this
     * notification.
     *
     * This token is automatically set during deserialization for you, you usually won't need to
     * call this unless you want to change the existing token, if any.
     *
     * @hide
     */
    public void clearAllowlistToken() {
        mAllowlistToken = null;
    public void overrideAllowlistToken(IBinder token) {
        mAllowlistToken = token;
        if (publicVersion != null) {
            publicVersion.clearAllowlistToken();
            publicVersion.overrideAllowlistToken(token);
        }
    }
+4 −2
Original line number Diff line number Diff line
@@ -727,7 +727,7 @@ public class NotificationManagerService extends SystemService {
    private static final int MY_UID = Process.myUid();
    private static final int MY_PID = Process.myPid();
    private static final IBinder ALLOWLIST_TOKEN = new Binder();
    static final IBinder ALLOWLIST_TOKEN = new Binder();
    protected RankingHandler mRankingHandler;
    private long mLastOverRateLogTime;
    private float mMaxPackageEnqueueRate = DEFAULT_MAX_NOTIFICATION_ENQUEUE_RATE;
@@ -4759,7 +4759,7 @@ public class NotificationManagerService extends SystemService {
                    // Remove background token before returning notification to untrusted app, this
                    // ensures the app isn't able to perform background operations that are
                    // associated with notification interactions.
                    notification.clearAllowlistToken();
                    notification.overrideAllowlistToken(null);
                    return new StatusBarNotification(
                            sbn.getPackageName(),
                            sbn.getOpPkg(),
@@ -7634,6 +7634,8 @@ public class NotificationManagerService extends SystemService {
            }
        }
        notification.overrideAllowlistToken(ALLOWLIST_TOKEN);
        // Remote views? Are they too big?
        checkRemoteViews(pkg, tag, id, notification);
    }
+30 −0
Original line number Diff line number Diff line
@@ -323,6 +323,7 @@ import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -12861,6 +12862,35 @@ public class NotificationManagerServiceTest extends UiServiceTestCase {
        assertSame(0, n.flags & Notification.FLAG_NO_DISMISS);
    }
    @Test
    public void fixNotification_customAllowlistToken()
            throws Exception {
        Notification n = new Notification.Builder(mContext, "test")
                .build();
        try {
            Field allowlistToken = Class.forName("android.app.Notification").
                    getDeclaredField("mAllowlistToken");
            allowlistToken.setAccessible(true);
            allowlistToken.set(n, new Binder());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        mService.fixNotification(n, PKG, "tag", 9, 0, mUid, NOT_FOREGROUND_SERVICE, true);
        IBinder actual = null;
        try {
            Field allowlistToken = Class.forName("android.app.Notification").
                    getDeclaredField("mAllowlistToken");
            allowlistToken.setAccessible(true);
            actual = (IBinder) allowlistToken.get(n);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        assertTrue(mService.ALLOWLIST_TOKEN == actual);
    }
    @Test
    public void testCancelAllNotifications_IgnoreUserInitiatedJob() throws Exception {
        when(mJsi.isNotificationAssociatedWithAnyUserInitiatedJobs(anyInt(), anyInt(), anyString()))