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

Commit 89a3f144 authored by Hai Zhang's avatar Hai Zhang Committed by Android (Google) Code Review
Browse files

Merge "Revert "Refactor permission checking to allow computing app op mode.""

parents 2fa0a87d 4fef76ab
Loading
Loading
Loading
Loading
+29 −54
Original line number Diff line number Diff line
@@ -793,68 +793,62 @@ public class PermissionManagerService extends IPermissionManager.Stub {

        final CheckPermissionDelegate checkPermissionDelegate;
        synchronized (mLock) {
            checkPermissionDelegate = mCheckPermissionDelegate;
        }
        if (checkPermissionDelegate == null)  {
            if (mCheckPermissionDelegate == null)  {
                return checkPermissionImpl(permName, pkgName, userId);
            }
            checkPermissionDelegate = mCheckPermissionDelegate;
        }
        return checkPermissionDelegate.checkPermission(permName, pkgName, userId,
                this::checkPermissionImpl);
                PermissionManagerService.this::checkPermissionImpl);
    }

    private int checkPermissionImpl(@NonNull String permissionName, @NonNull String packageName,
            @UserIdInt int userId) {
        final PackageParser.Package pkg = mPackageManagerInt.getPackage(packageName);
    private int checkPermissionImpl(String permName, String pkgName, int userId) {
        final PackageParser.Package pkg = mPackageManagerInt.getPackage(pkgName);
        if (pkg == null) {
            return PackageManager.PERMISSION_DENIED;
        }
        return checkPermissionInternal(pkg, true, permissionName, true, userId)
                ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED;
        return checkPermissionInternal(pkg, true, permName, userId);
    }

    private boolean checkPermissionInternal(@NonNull Package pkg, boolean isPackageExplicit,
            @NonNull String permissionName, boolean useRequestedPermissionsForLegacyApps,
            @UserIdInt int userId) {
    private int checkPermissionInternal(@NonNull Package pkg, boolean isPackageExplicit,
            @NonNull String permissionName, @UserIdInt int userId) {
        final int callingUid = getCallingUid();
        if (isPackageExplicit || pkg.mSharedUserId == null) {
            if (mPackageManagerInt.filterAppAccess(pkg, callingUid, userId)) {
                return false;
                return PackageManager.PERMISSION_DENIED;
            }
        } else {
            if (mPackageManagerInt.getInstantAppPackageName(callingUid) != null) {
                return false;
                return PackageManager.PERMISSION_DENIED;
            }
        }

        final int uid = UserHandle.getUid(userId, pkg.applicationInfo.uid);
        final PackageSetting ps = (PackageSetting) pkg.mExtras;
        if (ps == null) {
            return false;
            return PackageManager.PERMISSION_DENIED;
        }
        final PermissionsState permissionsState = ps.getPermissionsState();

        if (checkSinglePermissionInternal(uid, permissionsState, permissionName,
                useRequestedPermissionsForLegacyApps)) {
            return true;
        if (checkSinglePermissionInternal(uid, permissionsState, permissionName)) {
            return PackageManager.PERMISSION_GRANTED;
        }

        final String fullerPermissionName = FULLER_PERMISSION_MAP.get(permissionName);
        if (fullerPermissionName != null && checkSinglePermissionInternal(uid, permissionsState,
                fullerPermissionName, useRequestedPermissionsForLegacyApps)) {
            return true;
        if (fullerPermissionName != null
                && checkSinglePermissionInternal(uid, permissionsState, fullerPermissionName)) {
            return PackageManager.PERMISSION_GRANTED;
        }

        return false;
        return PackageManager.PERMISSION_DENIED;
    }

    private boolean checkSinglePermissionInternal(int uid,
            @NonNull PermissionsState permissionsState, @NonNull String permissionName,
            boolean useRequestedPermissionsForLegacyApps) {
            @NonNull PermissionsState permissionsState, @NonNull String permissionName) {
        boolean hasPermission = permissionsState.hasPermission(permissionName,
                UserHandle.getUserId(uid));

        if (!hasPermission && useRequestedPermissionsForLegacyApps
                && mSettings.isPermissionRuntime(permissionName)) {
        if (!hasPermission && mSettings.isPermissionRuntime(permissionName)) {
            final String[] packageNames = mContext.getPackageManager().getPackagesForUid(uid);
            final int packageNamesSize = packageNames != null ? packageNames.length : 0;
            for (int i = 0; i < packageNamesSize; i++) {
@@ -897,13 +891,12 @@ public class PermissionManagerService extends IPermissionManager.Stub {
            checkPermissionDelegate = mCheckPermissionDelegate;
        }
        return checkPermissionDelegate.checkUidPermission(permName, uid,
                this::checkUidPermissionImpl);
                PermissionManagerService.this::checkUidPermissionImpl);
    }

    private int checkUidPermissionImpl(@NonNull String permissionName, int uid) {
    private int checkUidPermissionImpl(String permName, int uid) {
        final PackageParser.Package pkg = mPackageManagerInt.getPackage(uid);
        return checkUidPermissionInternal(uid, pkg, permissionName, true)
                ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED;
        return checkUidPermissionInternal(pkg, uid, permName);
    }

    /**
@@ -913,25 +906,24 @@ public class PermissionManagerService extends IPermissionManager.Stub {
     *
     * @see SystemConfig#getSystemPermissions()
     */
    private boolean checkUidPermissionInternal(int uid, @Nullable Package pkg,
            @NonNull String permissionName, boolean useRequestedPermissionsForLegacyApps) {
    private int checkUidPermissionInternal(@Nullable Package pkg, int uid,
            @NonNull String permissionName) {
        if (pkg != null) {
            final int userId = UserHandle.getUserId(uid);
            return checkPermissionInternal(pkg, false, permissionName,
                    useRequestedPermissionsForLegacyApps, userId);
            return checkPermissionInternal(pkg, false, permissionName, userId);
        }

        if (checkSingleUidPermissionInternal(uid, permissionName)) {
            return true;
            return PackageManager.PERMISSION_GRANTED;
        }

        final String fullerPermissionName = FULLER_PERMISSION_MAP.get(permissionName);
        if (fullerPermissionName != null
                && checkSingleUidPermissionInternal(uid, fullerPermissionName)) {
            return true;
            return PackageManager.PERMISSION_GRANTED;
        }

        return false;
        return PackageManager.PERMISSION_DENIED;
    }

    private boolean checkSingleUidPermissionInternal(int uid, @NonNull String permissionName) {
@@ -941,17 +933,6 @@ public class PermissionManagerService extends IPermissionManager.Stub {
        }
    }

    private int computeRuntimePermissionAppOpMode(int uid, @NonNull String permissionName) {
        boolean granted = isUidPermissionGranted(uid, permissionName);
        // TODO: Foreground permissions.
        return granted ? AppOpsManager.MODE_ALLOWED : AppOpsManager.MODE_IGNORED;
    }

    private boolean isUidPermissionGranted(int uid, @NonNull String permissionName) {
        final PackageParser.Package pkg = mPackageManagerInt.getPackage(uid);
        return checkUidPermissionInternal(uid, pkg, permissionName, false);
    }

    @Override
    public void addOnPermissionsChangeListener(IOnPermissionsChangeListener listener) {
        mContext.enforceCallingOrSelfPermission(
@@ -4477,12 +4458,6 @@ public class PermissionManagerService extends IPermissionManager.Stub {
                        StorageManager.UUID_PRIVATE_INTERNAL, true, mDefaultPermissionCallback);
            }
        }

        @Override
        public int computeRuntimePermissionAppOpMode(int uid, @NonNull String permissionName) {
            return PermissionManagerService.this.computeRuntimePermissionAppOpMode(uid,
                    permissionName);
        }
    }

    private static final class OnPermissionChangeListeners extends Handler {
+0 −9
Original line number Diff line number Diff line
@@ -445,13 +445,4 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager

    /** Called when a new user has been created. */
    public abstract void onNewUserCreated(@UserIdInt int userId);

    /**
     * Compute an app op mode based on its runtime permission state.
     *
     * @param uid the uid for the app op
     * @param permissionName the permission name for the app op
     * @return the computed mode
     */
    public abstract int computeRuntimePermissionAppOpMode(int uid, @NonNull String permissionName);
}