diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 832c9b788b0b3..d451152703dd5 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -5233,9 +5233,7 @@ public final class Settings { List permissions = getPermissionsFromPermissionsState( packageSetting.getPermissionsState(), userId); - if (permissions != null) { - packagePermissions.put(packageName, permissions); - } + packagePermissions.put(packageName, permissions); } } @@ -5248,9 +5246,7 @@ public final class Settings { List permissions = getPermissionsFromPermissionsState( sharedUserSetting.getPermissionsState(), userId); - if (permissions != null) { - sharedUserPermissions.put(sharedUserName, permissions); - } + sharedUserPermissions.put(sharedUserName, permissions); } runtimePermissions = new RuntimePermissionsState(version, fingerprint, @@ -5260,15 +5256,11 @@ public final class Settings { mPersistence.write(runtimePermissions, UserHandle.of(userId)); } - @Nullable + @NonNull private List getPermissionsFromPermissionsState( @NonNull PermissionsState permissionsState, @UserIdInt int userId) { List permissionStates = permissionsState.getRuntimePermissionStates( userId); - if (permissionStates.isEmpty()) { - return null; - } - List permissions = new ArrayList<>(); int permissionStatesSize = permissionStates.size(); @@ -5340,31 +5332,60 @@ public final class Settings { boolean defaultPermissionsGranted = Build.FINGERPRINT.equals(fingerprint); mDefaultPermissionsGranted.put(userId, defaultPermissionsGranted); - for (Map.Entry> entry - : runtimePermissions.getPackagePermissions().entrySet()) { - String packageName = entry.getKey(); - List permissions = entry.getValue(); + boolean isUpgradeToR = getInternalVersion().sdkVersion < Build.VERSION_CODES.R; - PackageSetting packageSetting = mPackages.get(packageName); - if (packageSetting == null) { - Slog.w(PackageManagerService.TAG, "Unknown package:" + packageName); - continue; + Map> packagePermissions = + runtimePermissions.getPackagePermissions(); + int packagesSize = mPackages.size(); + for (int i = 0; i < packagesSize; i++) { + String packageName = mPackages.keyAt(i); + PackageSetting packageSetting = mPackages.valueAt(i); + + List permissions = + packagePermissions.get(packageName); + if (permissions != null) { + readPermissionsStateLpr(permissions, packageSetting.getPermissionsState(), + userId); + } else if (packageSetting.sharedUser == null && !isUpgradeToR) { + Slog.w(TAG, "Missing permission state for package: " + packageName); + generateFallbackPermissionsStateLpr( + packageSetting.pkg.getRequestedPermissions(), + packageSetting.pkg.getTargetSdkVersion(), + packageSetting.getPermissionsState(), userId); } - readPermissionsStateLpr(permissions, packageSetting.getPermissionsState(), userId); } - for (Map.Entry> entry - : runtimePermissions.getSharedUserPermissions().entrySet()) { - String sharedUserName = entry.getKey(); - List permissions = entry.getValue(); + Map> sharedUserPermissions = + runtimePermissions.getSharedUserPermissions(); + int sharedUsersSize = mSharedUsers.size(); + for (int i = 0; i < sharedUsersSize; i++) { + String sharedUserName = mSharedUsers.keyAt(i); + SharedUserSetting sharedUserSetting = mSharedUsers.valueAt(i); - SharedUserSetting sharedUserSetting = mSharedUsers.get(sharedUserName); - if (sharedUserSetting == null) { - Slog.w(PackageManagerService.TAG, "Unknown shared user:" + sharedUserName); - continue; + List permissions = + sharedUserPermissions.get(sharedUserName); + if (permissions != null) { + readPermissionsStateLpr(permissions, sharedUserSetting.getPermissionsState(), + userId); + } else if (!isUpgradeToR) { + Slog.w(TAG, "Missing permission state for shared user: " + sharedUserName); + ArraySet requestedPermissions = new ArraySet<>(); + int targetSdkVersion = Build.VERSION_CODES.CUR_DEVELOPMENT; + int sharedUserPackagesSize = sharedUserSetting.packages.size(); + for (int packagesI = 0; packagesI < sharedUserPackagesSize; packagesI++) { + PackageSetting packageSetting = sharedUserSetting.packages.valueAt( + packagesI); + if (packageSetting == null || packageSetting.pkg == null + || !packageSetting.getInstalled(userId)) { + continue; + } + AndroidPackage pkg = packageSetting.pkg; + requestedPermissions.addAll(pkg.getRequestedPermissions()); + targetSdkVersion = Math.min(targetSdkVersion, pkg.getTargetSdkVersion()); + } + generateFallbackPermissionsStateLpr(requestedPermissions, targetSdkVersion, + sharedUserSetting.getPermissionsState(), userId); } - readPermissionsStateLpr(permissions, sharedUserSetting.getPermissionsState(), - userId); } } @@ -5395,6 +5416,30 @@ public final class Settings { } } + private void generateFallbackPermissionsStateLpr( + @NonNull Collection requestedPermissions, int targetSdkVersion, + @NonNull PermissionsState permissionsState, @UserIdInt int userId) { + for (String permissionName : requestedPermissions) { + BasePermission permission = mPermissions.getPermission(permissionName); + if (Objects.equals(permission.getSourcePackageName(), PLATFORM_PACKAGE_NAME) + && permission.isRuntime() && !permission.isRemoved()) { + if (permission.isHardOrSoftRestricted() || permission.isImmutablyRestricted()) { + permissionsState.updatePermissionFlags(permission, userId, + PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT, + PackageManager.FLAG_PERMISSION_RESTRICTION_UPGRADE_EXEMPT); + } + if (targetSdkVersion < Build.VERSION_CODES.M) { + permissionsState.updatePermissionFlags(permission, userId, + PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED + | PackageManager.FLAG_PERMISSION_REVOKED_COMPAT, + PackageManager.FLAG_PERMISSION_REVIEW_REQUIRED + | PackageManager.FLAG_PERMISSION_REVOKED_COMPAT); + permissionsState.grantRuntimePermission(permission, userId); + } + } + } + } + @GuardedBy("Settings.this.mLock") private void readLegacyStateForUserSyncLPr(int userId) { File permissionsFile = getUserRuntimePermissionsFile(userId);