Merge "Revert "Refactor permission checking to allow computing app op mode.""
This commit is contained in:
@@ -793,68 +793,62 @@ public class PermissionManagerService extends IPermissionManager.Stub {
|
||||
|
||||
final CheckPermissionDelegate checkPermissionDelegate;
|
||||
synchronized (mLock) {
|
||||
if (mCheckPermissionDelegate == null) {
|
||||
return checkPermissionImpl(permName, pkgName, userId);
|
||||
}
|
||||
checkPermissionDelegate = mCheckPermissionDelegate;
|
||||
}
|
||||
if (checkPermissionDelegate == null) {
|
||||
return checkPermissionImpl(permName, pkgName, userId);
|
||||
}
|
||||
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 {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user