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

Commit 6b68f106 authored by Chad Brubaker's avatar Chad Brubaker
Browse files

Limit Instant App notifications

Instants apps are not allowed to create toasts or notifications, however
they are allowed to update notifications that were created by the
system for them (i.e. a notification for a foreground service).

Test: Manually verified that .notify() fails with a security exception
Test: Manually verified startForeground shows a notification and that it
can be updated.

Change-Id: I054cccc2aa817263d15abd34851b0e06f16fb829
parent 61d7a8a7
Loading
Loading
Loading
Loading
+33 −0
Original line number Diff line number Diff line
@@ -1434,6 +1434,11 @@ public class NotificationManagerService extends SystemService {
                return ;
            }

            if (isCallerInstantApp(pkg)) {
                throw new SecurityException("Instant app " + pkg
                        + " is not allowed to create toasts");
            }

            final boolean isSystemToast = isCallerSystem() || ("android".equals(pkg));
            final boolean isPackageSuspended =
                    isPackageSuspendedForUser(pkg, Binder.getCallingUid());
@@ -3052,6 +3057,13 @@ public class NotificationManagerService extends SystemService {
                        }
                        return false;
                    }
                } else if (isCallerInstantApp(pkg)) {
                    // Ephemeral apps have some special contraints for notifications.
                    // They are not allowed to create new notifications however they are allowed to
                    // update notifications created by the system (e.g. a foreground service
                    // notification).
                    throw new SecurityException("Instant app " + pkg
                            + " cannot create notifications");
                }

                int count = 0;
@@ -4326,6 +4338,27 @@ public class NotificationManagerService extends SystemService {
        checkCallerIsSameApp(pkg);
    }

    private boolean isCallerInstantApp(String pkg) {
        // System is always allowed to act for ephemeral apps.
        if (isCallerSystem()) {
            return false;
        }

        mAppOps.checkPackage(Binder.getCallingUid(), pkg);

        try {
            ApplicationInfo ai = mPackageManager.getApplicationInfo(pkg, 0,
                    UserHandle.getCallingUserId());
            if (ai == null) {
                throw new SecurityException("Unknown package " + pkg);
            }
            return ai.isInstantApp();
        } catch (RemoteException re) {
            throw new SecurityException("Unknown package " + pkg, re);
        }

    }

    private void checkCallerIsSameApp(String pkg) {
        final int uid = Binder.getCallingUid();
        try {