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

Commit ec413924 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Set user sensitive flags for shared uids correctly."

parents 4144cc4f de74f1bf
Loading
Loading
Loading
Loading
+60 −3
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.os.UserHandle;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.SparseArray;

import androidx.annotation.NonNull;
import androidx.annotation.WorkerThread;
@@ -185,6 +186,18 @@ public class RoleControllerServiceImpl extends RoleControllerService {
    /**
     * Update the {@link PackageManager#FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED} and
     * {@link PackageManager#FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED} for all apps of this user.
     *
     * <p>For shared uids:
     * <dl>
     *     <dt>For system UIDs</dt>
     *     <dd>If there is any package for which the permission is not sensitive, the permission
     *     is not sensitive for all packages with the same the UID</dd>
     * </dl>
     * <dl>
     *     <dt>For app (not system) UIDs</dt>
     *     <dd>If there is any package for which the permission is sensitive, the permission is
     *     sensitive for all packages with the same the UID</dd>
     * </dl>
     */
    private void updateUserSensitive() {
        PackageManager pm = getPackageManager();
@@ -193,18 +206,40 @@ public class RoleControllerServiceImpl extends RoleControllerService {
        Set<String> platformPerms = Utils.getPlatformPermissions();
        ArraySet<String> pkgsWithLauncherIcon = Utils.getLauncherPackages(this);

        // uid -> permission -> flags
        SparseArray<ArrayMap<String, Integer>> uidsPermissions = new SparseArray<>();

        // Collect the flags and store it in 'uidsPermissions'
        int numPkgs = pkgs.size();
        for (int pkgNum = 0; pkgNum < numPkgs; pkgNum++) {
            PackageInfo pkg = pkgs.get(pkgNum);
            boolean pkgHasLauncherIcon = pkgsWithLauncherIcon.contains(pkg.packageName);
            boolean pkgIsSystemApp = (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;

            // permission -> flags
            ArrayMap<String, Integer> uidPermissions = uidsPermissions.get(pkg.applicationInfo.uid);
            if (uidPermissions == null) {
                uidPermissions = new ArrayMap<>();
                uidsPermissions.put(pkg.applicationInfo.uid, uidPermissions);
            }

            for (String perm : platformPerms) {
                if (pkg.requestedPermissions == null || !ArrayUtils.contains(
                        pkg.requestedPermissions, perm)) {
                    continue;
                }

                Integer previousFlagsInt = uidPermissions.get(perm);
                int previousFlags;
                if (pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID) {
                    previousFlags = previousFlagsInt == null
                            ? PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED
                            | PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED
                            : previousFlagsInt;
                } else {
                    previousFlags = previousFlagsInt == null ? 0 : previousFlagsInt;
                }

                int flags;
                if (pkgIsSystemApp && !pkgHasLauncherIcon) {
                    boolean permGrantedByDefault = (pm.getPermissionFlags(perm, pkg.packageName,
@@ -220,10 +255,32 @@ public class RoleControllerServiceImpl extends RoleControllerService {
                            | PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED;
                }

                pm.updatePermissionFlags(perm, pkg.packageName,
                if (pkg.applicationInfo.uid < Process.FIRST_APPLICATION_UID) {
                    flags &= previousFlags;
                } else {
                    flags |= previousFlags;
                }

                uidPermissions.put(perm, flags);
            }
        }

        // Apply the update
        int numUids = uidsPermissions.size();
        for (int uidNum = 0; uidNum < numUids; uidNum++) {
            String[] uidPkgs = pm.getPackagesForUid(uidsPermissions.keyAt(uidNum));
            if (uidPkgs == null) {
                continue;
            }

            ArrayMap<String, Integer> uidPermissions = uidsPermissions.valueAt(uidNum);

            int numPerms = uidPermissions.size();
            for (int permNum = 0; permNum < numPerms; permNum++) {
                pm.updatePermissionFlags(uidPermissions.keyAt(permNum), uidPkgs[0],
                        PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_GRANTED
                                | PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED, flags,
                        user);
                                | PackageManager.FLAG_PERMISSION_USER_SENSITIVE_WHEN_DENIED,
                        uidPermissions.valueAt(permNum), user);
            }
        }
    }