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

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

Merge changes Idc321ecf,I64dfd056,I7d88c26b

* changes:
  Revert "Revert "Sync app ops for all runtime permissions in PermissionPolicyService.""
  Cache permission info before syncing app op mode.
  Fix getAllPermissionWithProtectionLevel().
parents 9a73a38d ab6a6822
Loading
Loading
Loading
Loading
+4 −13
Original line number Diff line number Diff line
@@ -53,7 +53,6 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.ApplicationPackageManager;
import android.app.IActivityManager;
import android.content.Context;
@@ -1542,7 +1541,6 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            }
        };

        final AppOpsManager appOpsManager = mContext.getSystemService(AppOpsManager.class);
        for (int i = 0; i < permissionCount; i++) {
            final String permName = pkg.requestedPermissions.get(i);
            final BasePermission bp;
@@ -1608,16 +1606,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {

            // If this permission was granted by default, make sure it is.
            if ((oldFlags & FLAG_PERMISSION_GRANTED_BY_DEFAULT) != 0) {
                // PermissionPolicyService will handle the app op for runtime permissions later.
                grantRuntimePermissionInternal(permName, packageName, false,
                        Process.SYSTEM_UID, userId, delayingPermCallback);
                // Allow app op later as we are holding mPackages
                // PermissionPolicyService will handle the app op for foreground/background
                // permissions.
                String appOp = AppOpsManager.permissionToOp(permName);
                if (appOp != null) {
                    mHandler.post(() -> appOpsManager.setUidMode(appOp, uid,
                            AppOpsManager.MODE_ALLOWED));
                }
            // If permission review is enabled the permissions for a legacy apps
            // are represented as constantly granted runtime ones, so don't revoke.
            } else if ((flags & FLAG_PERMISSION_REVIEW_REQUIRED) == 0) {
@@ -4233,8 +4224,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
        }

        @Override
        public @NonNull ArrayList<PermissionInfo> getAllPermissionWithProtectionLevel(
                @PermissionInfo.Protection int protectionLevel) {
        public @NonNull ArrayList<PermissionInfo> getAllPermissionWithProtection(
                @PermissionInfo.Protection int protection) {
            ArrayList<PermissionInfo> matchingPermissions = new ArrayList<>();

            synchronized (PermissionManagerService.this.mLock) {
@@ -4244,7 +4235,7 @@ public class PermissionManagerService extends IPermissionManager.Stub {
                    BasePermission bp = mSettings.mPermissions.valueAt(i);

                    if (bp.perm != null && bp.perm.info != null
                            && bp.protectionLevel == protectionLevel) {
                            && bp.perm.info.getProtection() == protection) {
                        matchingPermissions.add(bp.perm.info);
                    }
                }
+2 −2
Original line number Diff line number Diff line
@@ -291,8 +291,8 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager
    public abstract @Nullable BasePermission getPermissionTEMP(@NonNull String permName);

    /** Get all permission that have a certain protection level */
    public abstract @NonNull ArrayList<PermissionInfo> getAllPermissionWithProtectionLevel(
            @PermissionInfo.Protection int protectionLevel);
    public abstract @NonNull ArrayList<PermissionInfo> getAllPermissionWithProtection(
            @PermissionInfo.Protection int protection);

    /**
     * Returns the delegate used to influence permission checking.
+20 −20
Original line number Diff line number Diff line
@@ -48,12 +48,12 @@ import android.os.UserManagerInternal;
import android.permission.PermissionControllerManager;
import android.provider.Telephony;
import android.telecom.TelecomManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.LongSparseLongArray;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.app.IAppOpsCallback;
@@ -67,6 +67,7 @@ import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.policy.PermissionPolicyInternal.OnInitializedCallback;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
@@ -144,7 +145,7 @@ public final class PermissionPolicyService extends SystemService {
        };

        final ArrayList<PermissionInfo> dangerousPerms =
                permManagerInternal.getAllPermissionWithProtectionLevel(
                permManagerInternal.getAllPermissionWithProtection(
                        PermissionInfo.PROTECTION_DANGEROUS);

        try {
@@ -152,7 +153,7 @@ public final class PermissionPolicyService extends SystemService {
            for (int i = 0; i < numDangerousPerms; i++) {
                PermissionInfo perm = dangerousPerms.get(i);

                if (perm.isRestricted() || perm.backgroundPermission != null) {
                if (perm.isRuntime()) {
                    appOpsService.startWatchingMode(getSwitchOp(perm.name), null, appOpsListener);
                }
                if (perm.isSoftRestricted()) {
@@ -389,8 +390,7 @@ public final class PermissionPolicyService extends SystemService {
        private final @NonNull PackageManager mPackageManager;
        private final @NonNull AppOpsManager mAppOpsManager;

        /** All uid that need to be synchronized */
        private final @NonNull SparseIntArray mAllUids = new SparseIntArray();
        private final @NonNull ArrayMap<String, PermissionInfo> mRuntimePermissionInfos;

        /**
         * All ops that need to be flipped to allow.
@@ -428,6 +428,18 @@ public final class PermissionPolicyService extends SystemService {
            mContext = context;
            mPackageManager = context.getPackageManager();
            mAppOpsManager = context.getSystemService(AppOpsManager.class);

            mRuntimePermissionInfos = new ArrayMap<>();
            PermissionManagerServiceInternal permissionManagerInternal = LocalServices.getService(
                    PermissionManagerServiceInternal.class);
            List<PermissionInfo> permissionInfos =
                    permissionManagerInternal.getAllPermissionWithProtection(
                            PermissionInfo.PROTECTION_DANGEROUS);
            int permissionInfosSize = permissionInfos.size();
            for (int i = 0; i < permissionInfosSize; i++) {
                PermissionInfo permissionInfo = permissionInfos.get(i);
                mRuntimePermissionInfos.put(permissionInfo.name, permissionInfo);
            }
        }

        /**
@@ -489,7 +501,7 @@ public final class PermissionPolicyService extends SystemService {
         * Note: Called with the package lock held. Do <u>not</u> call into app-op manager.
         */
        private void addAppOps(@NonNull PackageInfo packageInfo, @NonNull String permissionName) {
            PermissionInfo permissionInfo = getPermissionInfo(permissionName);
            PermissionInfo permissionInfo = mRuntimePermissionInfos.get(permissionName);
            if (permissionInfo == null) {
                return;
            }
@@ -499,8 +511,7 @@ public final class PermissionPolicyService extends SystemService {

        private void addPermissionAppOp(@NonNull PackageInfo packageInfo,
                @NonNull PermissionInfo permissionInfo) {
            // TODO: Sync all permissions in the future.
            if (!permissionInfo.isRestricted() && permissionInfo.backgroundPermission == null) {
            if (!permissionInfo.isRuntime()) {
                return;
            }

@@ -525,7 +536,7 @@ public final class PermissionPolicyService extends SystemService {
            boolean shouldGrantAppOp = shouldGrantAppOp(packageInfo, permissionInfo);
            if (shouldGrantAppOp) {
                if (permissionInfo.backgroundPermission != null) {
                    PermissionInfo backgroundPermissionInfo = getPermissionInfo(
                    PermissionInfo backgroundPermissionInfo = mRuntimePermissionInfos.get(
                            permissionInfo.backgroundPermission);
                    boolean shouldGrantBackgroundAppOp = backgroundPermissionInfo != null
                            && shouldGrantAppOp(packageInfo, backgroundPermissionInfo);
@@ -552,15 +563,6 @@ public final class PermissionPolicyService extends SystemService {
            }
        }

        @Nullable
        private PermissionInfo getPermissionInfo(@NonNull String permissionName) {
            try {
                return mPackageManager.getPermissionInfo(permissionName, 0);
            } catch (PackageManager.NameNotFoundException e) {
                return null;
            }
        }

        private boolean shouldGrantAppOp(@NonNull PackageInfo packageInfo,
                @NonNull PermissionInfo permissionInfo) {
            String permissionName = permissionInfo.name;
@@ -638,8 +640,6 @@ public final class PermissionPolicyService extends SystemService {
                return;
            }

            mAllUids.put(pkg.applicationInfo.uid, pkg.applicationInfo.uid);

            if (pkg.requestedPermissions == null) {
                return;
            }