summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Justin Lannin <jlannin@google.com> 2025-03-20 12:18:06 -0700
committer Android (Google) Code Review <android-gerrit@google.com> 2025-03-20 12:18:06 -0700
commit868062a1585c75962ab0458eec26c1fdceca882a (patch)
treeaeae09d473261e0e6685a24207277acc32973b5b
parent0da9bb05ab19e7cd2af686f7afce42671e1e2fec (diff)
parent5b5ac779195b2bc17955b5d2fb2fd4ab18123845 (diff)
Merge "Permissions: Run kotlin formatter on a few files." into main
-rw-r--r--services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt176
-rw-r--r--services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionStatesTest.kt605
-rw-r--r--services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/BasePermissionPolicyTest.kt301
3 files changed, 552 insertions, 530 deletions
diff --git a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
index 5a140d53a4d8..662e0c06f261 100644
--- a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
+++ b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt
@@ -100,7 +100,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
override fun MutateStateScope.onStorageVolumeMounted(
volumeUuid: String?,
packageNames: List<String>,
- isSystemUpdated: Boolean
+ isSystemUpdated: Boolean,
) {
val changedPermissionNames = MutableIndexedSet<String>()
packageNames.forEachIndexed { _, packageName ->
@@ -173,7 +173,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.clearRestrictedPermissionImplicitExemption(
packageState: PackageState,
- userId: Int
+ userId: Int,
) {
// System apps can always retain their UPGRADE_EXEMPT.
if (packageState.isSystem) {
@@ -198,7 +198,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
userId,
permission,
PermissionFlags.UPGRADE_EXEMPT,
- 0
+ 0,
)
}
}
@@ -208,7 +208,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
userId: Int,
permission: Permission,
exemptFlagMask: Int,
- exemptFlagValues: Int
+ exemptFlagValues: Int,
) {
val permissionName = permission.name
val oldFlags = getPermissionFlags(appId, userId, permissionName)
@@ -236,7 +236,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
isSoftRestrictedPermissionExemptForPackage(
it,
targetSdkVersion,
- permissionName
+ permissionName,
)
}
} else {
@@ -257,7 +257,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
override fun MutateStateScope.onPackageUninstalled(
packageName: String,
appId: Int,
- userId: Int
+ userId: Int,
) {
resetRuntimePermissions(packageName, userId)
}
@@ -290,17 +290,16 @@ class AppIdPermissionPolicy : SchemePolicy() {
packageState.isSystem || packageState.getUserStateOrDefault(userId).isInstalled
newFlags =
if (
- isSystemOrInstalled && (
- newFlags.hasBits(PermissionFlags.ROLE) ||
- newFlags.hasBits(PermissionFlags.PREGRANT)
- )
+ isSystemOrInstalled &&
+ (newFlags.hasBits(PermissionFlags.ROLE) ||
+ newFlags.hasBits(PermissionFlags.PREGRANT))
) {
newFlags or PermissionFlags.RUNTIME_GRANTED
} else {
- newFlags andInv (
- PermissionFlags.RUNTIME_GRANTED or PermissionFlags.ROLE or
- PermissionFlags.PREGRANT
- )
+ newFlags andInv
+ (PermissionFlags.RUNTIME_GRANTED or
+ PermissionFlags.ROLE or
+ PermissionFlags.PREGRANT)
}
newFlags = newFlags andInv USER_SETTABLE_MASK
if (newFlags.hasBits(PermissionFlags.LEGACY_GRANTED)) {
@@ -312,7 +311,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.adoptPermissions(
packageState: PackageState,
- changedPermissionNames: MutableIndexedSet<String>
+ changedPermissionNames: MutableIndexedSet<String>,
) {
val `package` = packageState.androidPackage!!
`package`.adoptPermissions.forEachIndexed { _, originalPackageName ->
@@ -341,7 +340,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
oldPermission.copy(
permissionInfo = newPermissionInfo,
isReconciled = false,
- appId = 0
+ appId = 0,
)
newState
.mutateSystemState()
@@ -354,7 +353,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.canAdoptPermissions(
packageName: String,
- originalPackageName: String
+ originalPackageName: String,
): Boolean {
val originalPackageState =
newState.externalState.packageStates[originalPackageName] ?: return false
@@ -362,7 +361,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Slog.w(
LOG_TAG,
"Unable to adopt permissions from $originalPackageName to $packageName:" +
- " original package not in system partition"
+ " original package not in system partition",
)
return false
}
@@ -370,7 +369,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Slog.w(
LOG_TAG,
"Unable to adopt permissions from $originalPackageName to $packageName:" +
- " original package still exists"
+ " original package still exists",
)
return false
}
@@ -386,7 +385,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Slog.w(
LOG_TAG,
"Ignoring permission groups declared in package" +
- " ${packageState.packageName}: instant apps cannot declare permission groups"
+ " ${packageState.packageName}: instant apps cannot declare permission groups",
)
return
}
@@ -394,7 +393,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
val newPermissionGroup =
PackageInfoUtils.generatePermissionGroupInfo(
parsedPermissionGroup,
- PackageManager.GET_META_DATA.toLong()
+ PackageManager.GET_META_DATA.toLong(),
)!!
// TODO: Clear permission state on group take-over?
val permissionGroupName = newPermissionGroup.name
@@ -414,7 +413,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Ignoring permission group $permissionGroupName declared in" +
" package $newPackageName: already declared in another" +
- " package $oldPackageName"
+ " package $oldPackageName",
)
return@forEachIndexed
}
@@ -423,7 +422,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Ignoring permission group $permissionGroupName declared in" +
" system package $newPackageName: already declared in another" +
- " system package $oldPackageName"
+ " system package $oldPackageName",
)
return@forEachIndexed
}
@@ -431,7 +430,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Overriding permission group $permissionGroupName with" +
" new declaration in system package $newPackageName: originally" +
- " declared in another package $oldPackageName"
+ " declared in another package $oldPackageName",
)
}
newState.mutateSystemState().mutatePermissionGroups()[permissionGroupName] =
@@ -441,7 +440,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.addPermissions(
packageState: PackageState,
- changedPermissionNames: MutableIndexedSet<String>
+ changedPermissionNames: MutableIndexedSet<String>,
) {
val androidPackage = packageState.androidPackage!!
// This may not be the same package as the old permission because the old permission owner
@@ -454,7 +453,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
val newPermissionInfo =
PackageInfoUtils.generatePermissionInfo(
parsedPermission,
- PackageManager.GET_META_DATA.toLong()
+ PackageManager.GET_META_DATA.toLong(),
)!!
val permissionName = newPermissionInfo.name
val oldPermission =
@@ -474,7 +473,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Ignoring permission $permissionName declared in package" +
" $newPackageName: base permission tree ${permissionTree.name} is" +
- " declared in another package ${permissionTree.packageName}"
+ " declared in another package ${permissionTree.packageName}",
)
return@forEachIndexed
}
@@ -488,7 +487,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Ignoring permission $permissionName declared in package" +
" $newPackageName: already declared in another package" +
- " $oldPackageName"
+ " $oldPackageName",
)
return@forEachIndexed
}
@@ -497,7 +496,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Ignoring permission $permissionName declared in system package" +
" $newPackageName: already declared in another system package" +
- " $oldPackageName"
+ " $oldPackageName",
)
return@forEachIndexed
}
@@ -505,7 +504,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Overriding permission $permissionName with new declaration in" +
" system package $newPackageName: originally declared in another" +
- " package $oldPackageName"
+ " package $oldPackageName",
)
// Remove permission state on owner change.
newState.externalState.userIds.forEachIndexed { _, userId ->
@@ -534,7 +533,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
"Revoking runtime permission $permissionName for" +
" appId $appId and userId $userId as the permission" +
" group changed from ${oldPermission.groupName}" +
- " to ${newPermissionInfo.group}"
+ " to ${newPermissionInfo.group}",
)
}
if (isPermissionProtectionChanged) {
@@ -542,7 +541,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Revoking permission $permissionName for" +
" appId $appId and userId $userId as the permission" +
- " protection changed."
+ " protection changed.",
)
}
setPermissionFlags(appId, userId, permissionName, 0)
@@ -572,7 +571,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Permission.TYPE_MANIFEST,
packageState.appId,
gids,
- areGidsPerUser
+ areGidsPerUser,
)
if (parsedPermission.isTree) {
@@ -599,7 +598,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.trimPermissions(
packageName: String,
- changedPermissionNames: MutableIndexedSet<String>
+ changedPermissionNames: MutableIndexedSet<String>,
) {
val packageState = newState.externalState.packageStates[packageName]
val androidPackage = packageState?.androidPackage
@@ -675,7 +674,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
packageName = permissionTree.packageName
},
appId = permissionTree.appId,
- isReconciled = true
+ isReconciled = true,
)
}
@@ -754,7 +753,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Slog.v(
LOG_TAG,
"Revoking storage permission: $permissionName for appId: " +
- " $appId and user: $userId"
+ " $appId and user: $userId",
)
val newFlags =
oldFlags andInv (PermissionFlags.RUNTIME_GRANTED or USER_SETTABLE_MASK)
@@ -767,7 +766,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.evaluatePermissionStateForAllPackages(
permissionName: String,
- installedPackageState: PackageState?
+ installedPackageState: PackageState?,
) {
val externalState = newState.externalState
externalState.userIds.forEachIndexed { _, userId ->
@@ -785,13 +784,13 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.evaluateAllPermissionStatesForPackage(
packageState: PackageState,
- installedPackageState: PackageState?
+ installedPackageState: PackageState?,
) {
newState.externalState.userIds.forEachIndexed { _, userId ->
evaluateAllPermissionStatesForPackageAndUser(
packageState,
userId,
- installedPackageState
+ installedPackageState,
)
}
}
@@ -799,14 +798,14 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.evaluateAllPermissionStatesForPackageAndUser(
packageState: PackageState,
userId: Int,
- installedPackageState: PackageState?
+ installedPackageState: PackageState?,
) {
packageState.androidPackage?.requestedPermissions?.forEach { permissionName ->
evaluatePermissionState(
packageState.appId,
userId,
permissionName,
- installedPackageState
+ installedPackageState,
)
}
}
@@ -815,7 +814,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
appId: Int,
userId: Int,
permissionName: String,
- installedPackageState: PackageState?
+ installedPackageState: PackageState?,
) {
val packageNames = newState.externalState.appIdPackageNames[appId]!!
// Repeatedly checking whether a permission is requested can actually be costly, so we cache
@@ -989,8 +988,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
"Unknown source permission $sourcePermissionName in split permissions"
}
!sourcePermission.isRuntime
- }
- ?: false
+ } ?: false
val shouldGrantByImplicit =
isLeanbackNotificationsPermission ||
(isImplicitPermission && isAnySourcePermissionNonRuntime)
@@ -1024,7 +1022,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
getPermissionFlags(
appId,
userId,
- Manifest.permission.ACCESS_BACKGROUND_LOCATION
+ Manifest.permission.ACCESS_BACKGROUND_LOCATION,
)
shouldRetainAsNearbyDevices =
PermissionFlags.isAppOpGranted(accessBackgroundLocationFlags) &&
@@ -1081,7 +1079,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
isSoftRestrictedPermissionExemptForPackage(
it,
targetSdkVersion,
- permissionName
+ permissionName,
)
}
) {
@@ -1095,7 +1093,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Unknown protection level ${permission.protectionLevel}" +
"for permission ${permission.name} while evaluating permission state" +
- "for appId $appId and userId $userId"
+ "for appId $appId and userId $userId",
)
}
}
@@ -1154,7 +1152,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun isCompatibilityPermissionForPackage(
androidPackage: AndroidPackage,
- permissionName: String
+ permissionName: String,
): Boolean {
for (compatibilityPermission in CompatibilityPermissionInfo.COMPAT_PERMS) {
if (
@@ -1164,7 +1162,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Slog.i(
LOG_TAG,
"Auto-granting $permissionName to old package" +
- " ${androidPackage.packageName}"
+ " ${androidPackage.packageName}",
)
return true
}
@@ -1174,7 +1172,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.shouldGrantPermissionBySignature(
packageState: PackageState,
- permission: Permission
+ permission: Permission,
): Boolean {
// Check if the package is allowed to use this signature permission. A package is allowed
// to use a signature permission if:
@@ -1197,12 +1195,12 @@ class AppIdPermissionPolicy : SchemePolicy() {
val hasCommonSigner =
sourceSigningDetails?.hasCommonSignerWithCapability(
packageSigningDetails,
- SigningDetails.CertCapabilities.PERMISSION
+ SigningDetails.CertCapabilities.PERMISSION,
) == true ||
packageSigningDetails.hasAncestorOrSelf(platformSigningDetails) ||
platformSigningDetails.checkCapability(
packageSigningDetails,
- SigningDetails.CertCapabilities.PERMISSION
+ SigningDetails.CertCapabilities.PERMISSION,
)
if (!Flags.signaturePermissionAllowlistEnabled()) {
return hasCommonSigner
@@ -1237,7 +1235,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Signature permission ${permission.name} for package" +
" ${packageState.packageName} (${packageState.path}) not in" +
- " signature permission allowlist"
+ " signature permission allowlist",
)
if (!Build.isDebuggable() || isSignaturePermissionAllowlistForceEnforced) {
return false
@@ -1249,7 +1247,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.getSignaturePermissionAllowlistState(
packageState: PackageState,
- permissionName: String
+ permissionName: String,
): Boolean? {
val permissionAllowlist = newState.externalState.permissionAllowlist
val packageName = packageState.packageName
@@ -1259,30 +1257,30 @@ class AppIdPermissionPolicy : SchemePolicy() {
packageState.isProduct ->
permissionAllowlist.getProductSignatureAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
packageState.isSystemExt ->
permissionAllowlist.getSystemExtSignatureAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
else ->
permissionAllowlist.getApexSignatureAppAllowlistState(packageName, permissionName)
?: permissionAllowlist.getProductSignatureAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
?: permissionAllowlist.getVendorSignatureAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
?: permissionAllowlist.getSystemExtSignatureAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
?: permissionAllowlist.getSignatureAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
}
}
@@ -1292,13 +1290,13 @@ class AppIdPermissionPolicy : SchemePolicy() {
* or for normal apps, we return true to indicate that we don't need to check the allowlist and
* will let follow-up checks to decide whether we should grant the permission.
*
- * @return `true`, if the permission is allowlisted for system privileged apps, or if we
- * don't need to check the allowlist (for platform or for normal apps).
- * `false`, if the permission is not allowlisted for system privileged apps.
+ * @return `true`, if the permission is allowlisted for system privileged apps, or if we don't
+ * need to check the allowlist (for platform or for normal apps). `false`, if the permission
+ * is not allowlisted for system privileged apps.
*/
private fun MutateStateScope.checkPrivilegedPermissionAllowlistIfNeeded(
packageState: PackageState,
- permission: Permission
+ permission: Permission,
): Boolean {
if (RoSystemProperties.CONTROL_PRIVAPP_PERMISSIONS_DISABLE) {
return true
@@ -1330,7 +1328,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Privileged permission ${permission.name} for package" +
" ${packageState.packageName} (${packageState.path}) not in" +
- " privileged permission allowlist"
+ " privileged permission allowlist",
)
if (RoSystemProperties.CONTROL_PRIVAPP_PERMISSIONS_ENFORCE) {
privilegedPermissionAllowlistViolations +=
@@ -1348,7 +1346,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
*/
private fun MutateStateScope.getPrivilegedPermissionAllowlistState(
packageState: PackageState,
- permissionName: String
+ permissionName: String,
): Boolean? {
val permissionAllowlist = newState.externalState.permissionAllowlist
val apexModuleName = packageState.apexModuleName
@@ -1357,17 +1355,17 @@ class AppIdPermissionPolicy : SchemePolicy() {
packageState.isVendor || packageState.isOdm ->
permissionAllowlist.getVendorPrivilegedAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
packageState.isProduct ->
permissionAllowlist.getProductPrivilegedAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
packageState.isSystemExt ->
permissionAllowlist.getSystemExtPrivilegedAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
apexModuleName != null -> {
val nonApexAllowlistState =
@@ -1379,14 +1377,14 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Package $packageName is an APK in APEX but has permission" +
" allowlist on the system image, please bundle the allowlist in the" +
- " $apexModuleName APEX instead"
+ " $apexModuleName APEX instead",
)
}
val apexAllowlistState =
permissionAllowlist.getApexPrivilegedAppAllowlistState(
apexModuleName,
packageName,
- permissionName
+ permissionName,
)
apexAllowlistState ?: nonApexAllowlistState
}
@@ -1403,7 +1401,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun isSoftRestrictedPermissionExemptForPackage(
packageState: PackageState,
appIdTargetSdkVersion: Int,
- permissionName: String
+ permissionName: String,
): Boolean =
when (permissionName) {
Manifest.permission.READ_EXTERNAL_STORAGE,
@@ -1415,7 +1413,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.getAppIdTargetSdkVersion(
appId: Int,
permissionName: String?,
- state: AccessState = newState
+ state: AccessState = newState,
): Int =
reducePackageInAppId(appId, Build.VERSION_CODES.CUR_DEVELOPMENT, state) {
targetSdkVersion,
@@ -1431,7 +1429,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private inline fun MutateStateScope.anyPackageInAppId(
appId: Int,
state: AccessState = newState,
- predicate: (PackageState) -> Boolean
+ predicate: (PackageState) -> Boolean,
): Boolean {
val packageNames = state.externalState.appIdPackageNames[appId]!!
return packageNames.anyIndexed { _, packageName ->
@@ -1443,7 +1441,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private inline fun MutateStateScope.forEachPackageInAppId(
appId: Int,
state: AccessState = newState,
- action: (PackageState) -> Unit
+ action: (PackageState) -> Unit,
) {
val packageNames = state.externalState.appIdPackageNames[appId]!!
packageNames.forEachIndexed { _, packageName ->
@@ -1459,7 +1457,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
appId: Int,
initialValue: Int,
state: AccessState = newState,
- accumulator: (Int, PackageState) -> Int
+ accumulator: (Int, PackageState) -> Int,
): Int {
val packageNames = state.externalState.appIdPackageNames[appId]!!
return packageNames.reduceIndexed(initialValue) { value, _, packageName ->
@@ -1474,7 +1472,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.shouldGrantPermissionByProtectionFlags(
packageState: PackageState,
- permission: Permission
+ permission: Permission,
): Boolean {
val androidPackage = packageState.androidPackage!!
val knownPackages = newState.externalState.knownPackages
@@ -1587,7 +1585,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.shouldGrantPrivilegedOrOemPermission(
packageState: PackageState,
- permission: Permission
+ permission: Permission,
): Boolean {
val permissionName = permission.name
val packageName = packageState.packageName
@@ -1605,7 +1603,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
LOG_TAG,
"Permission $permissionName cannot be granted to privileged" +
" vendor (or odm) app $packageName because it isn't a" +
- " vendorPrivileged permission"
+ " vendorPrivileged permission",
)
return false
}
@@ -1617,7 +1615,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
val allowlistState =
newState.externalState.permissionAllowlist.getOemAppAllowlistState(
packageName,
- permissionName
+ permissionName,
)
checkNotNull(allowlistState) {
"OEM permission $permissionName requested by package" +
@@ -1688,7 +1686,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
fun MutateStateScope.addPermission(
permission: Permission,
- isSynchronousWrite: Boolean = false
+ isSynchronousWrite: Boolean = false,
) {
val writeMode = if (isSynchronousWrite) WriteMode.SYNCHRONOUS else WriteMode.ASYNCHRONOUS
newState.mutateSystemState(writeMode).mutatePermissions()[permission.name] = permission
@@ -1707,14 +1705,14 @@ class AppIdPermissionPolicy : SchemePolicy() {
private fun MutateStateScope.getOldStatePermissionFlags(
appId: Int,
userId: Int,
- permissionName: String
+ permissionName: String,
): Int = getPermissionFlags(oldState, appId, userId, permissionName)
private fun getPermissionFlags(
state: AccessState,
appId: Int,
userId: Int,
- permissionName: String
+ permissionName: String,
): Int =
state.userStates[userId]?.appIdPermissionFlags?.get(appId).getWithDefault(permissionName, 0)
@@ -1725,7 +1723,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
appId: Int,
userId: Int,
permissionName: String,
- flags: Int
+ flags: Int,
): Boolean =
updatePermissionFlags(appId, userId, permissionName, PermissionFlags.MASK_ALL, flags)
@@ -1734,7 +1732,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
userId: Int,
permissionName: String,
flagMask: Int,
- flagValues: Int
+ flagValues: Int,
): Boolean {
if (userId !in newState.userStates) {
// Despite that we check UserManagerInternal.exists() in PermissionService, we may still
@@ -1793,7 +1791,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
override fun MutateStateScope.upgradePackageState(
packageState: PackageState,
userId: Int,
- version: Int
+ version: Int,
) {
with(upgrade) { upgradePackageState(packageState, userId, version) }
}
@@ -1819,7 +1817,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Manifest.permission.BLUETOOTH_ADVERTISE,
Manifest.permission.BLUETOOTH_CONNECT,
Manifest.permission.BLUETOOTH_SCAN,
- Manifest.permission.NEARBY_WIFI_DEVICES
+ Manifest.permission.NEARBY_WIFI_DEVICES,
)
private val NOTIFICATIONS_PERMISSIONS = indexedSetOf(Manifest.permission.POST_NOTIFICATIONS)
@@ -1832,7 +1830,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.ACCESS_MEDIA_LOCATION,
- Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED
+ Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED,
)
/** Mask for all permission flags that can be set by the user */
@@ -1866,7 +1864,7 @@ class AppIdPermissionPolicy : SchemePolicy() {
userId: Int,
permissionName: String,
oldFlags: Int,
- newFlags: Int
+ newFlags: Int,
)
/**
diff --git a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionStatesTest.kt b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionStatesTest.kt
index 6b9c9c2b4abc..bf9033981442 100644
--- a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionStatesTest.kt
+++ b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionStatesTest.kt
@@ -57,10 +57,10 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = oldFlags
assertWithMessage(
- "After $action is called for a package that requests a normal permission" +
- " with an existing INSTALL_GRANTED flag, the actual permission flags $actualFlags" +
- " should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a normal permission" +
+ " with an existing INSTALL_GRANTED flag, the actual permission flags $actualFlags" +
+ " should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -71,16 +71,16 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
testEvaluatePermissionState(
oldFlags,
PermissionInfo.PROTECTION_NORMAL,
- isNewInstall = true
+ isNewInstall = true,
) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.INSTALL_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a normal permission" +
- " with no existing flags, the actual permission flags $actualFlags" +
- " should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a normal permission" +
+ " with no existing flags, the actual permission flags $actualFlags" +
+ " should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -90,16 +90,16 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val oldFlags = PermissionFlags.ROLE or PermissionFlags.USER_SET
testEvaluatePermissionState(
oldFlags,
- PermissionInfo.PROTECTION_NORMAL or PermissionInfo.PROTECTION_FLAG_APPOP
+ PermissionInfo.PROTECTION_NORMAL or PermissionInfo.PROTECTION_FLAG_APPOP,
) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.INSTALL_GRANTED or oldFlags
assertWithMessage(
- "After $action is called for a package that requests a normal app op" +
- " permission with existing ROLE and USER_SET flags, the actual permission flags" +
- " $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a normal app op" +
+ " permission with existing ROLE and USER_SET flags, the actual permission flags" +
+ " $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -115,21 +115,21 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = oldFlags
assertWithMessage(
- "After $action is called for a package that requests an internal permission" +
- " with missing android package and $oldFlags flag, the actual permission flags" +
- " $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests an internal permission" +
+ " with missing android package and $oldFlags flag, the actual permission flags" +
+ " $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@Test
fun testEvaluatePermissionState_internalAppOpPermission_getsRoleAndUserSetFlagsPreserved() {
- val oldFlags = PermissionFlags.PROTECTION_GRANTED or PermissionFlags.ROLE or
- PermissionFlags.USER_SET
+ val oldFlags =
+ PermissionFlags.PROTECTION_GRANTED or PermissionFlags.ROLE or PermissionFlags.USER_SET
testEvaluatePermissionState(
oldFlags,
- PermissionInfo.PROTECTION_INTERNAL or PermissionInfo.PROTECTION_FLAG_APPOP
+ PermissionInfo.PROTECTION_INTERNAL or PermissionInfo.PROTECTION_FLAG_APPOP,
) {
val packageStateWithMissingPackage = mockPackageState(APP_ID_1, MISSING_ANDROID_PACKAGE)
addPackageState(packageStateWithMissingPackage)
@@ -138,11 +138,11 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = oldFlags
assertWithMessage(
- "After $action is called for a package that requests an internal permission" +
- " with missing android package and $oldFlags flag and the permission isAppOp," +
- " the actual permission flags $actualFlags should match the expected" +
- " flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests an internal permission" +
+ " with missing android package and $oldFlags flag and the permission isAppOp," +
+ " the actual permission flags $actualFlags should match the expected" +
+ " flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -152,7 +152,7 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val oldFlags = PermissionFlags.PROTECTION_GRANTED or PermissionFlags.RUNTIME_GRANTED
testEvaluatePermissionState(
oldFlags,
- PermissionInfo.PROTECTION_INTERNAL or PermissionInfo.PROTECTION_FLAG_DEVELOPMENT
+ PermissionInfo.PROTECTION_INTERNAL or PermissionInfo.PROTECTION_FLAG_DEVELOPMENT,
) {
val packageStateWithMissingPackage = mockPackageState(APP_ID_1, MISSING_ANDROID_PACKAGE)
addPackageState(packageStateWithMissingPackage)
@@ -161,22 +161,24 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = oldFlags
assertWithMessage(
- "After $action is called for a package that requests an internal permission" +
- " with missing android package and $oldFlags flag and permission isDevelopment," +
- " the actual permission flags $actualFlags should match the expected" +
- " flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests an internal permission" +
+ " with missing android package and $oldFlags flag and permission isDevelopment," +
+ " the actual permission flags $actualFlags should match the expected" +
+ " flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@Test
fun testEvaluatePermissionState_internalRolePermission_getsRoleAndRuntimeGrantedPreserved() {
- val oldFlags = PermissionFlags.PROTECTION_GRANTED or PermissionFlags.ROLE or
- PermissionFlags.RUNTIME_GRANTED
+ val oldFlags =
+ PermissionFlags.PROTECTION_GRANTED or
+ PermissionFlags.ROLE or
+ PermissionFlags.RUNTIME_GRANTED
testEvaluatePermissionState(
oldFlags,
- PermissionInfo.PROTECTION_INTERNAL or PermissionInfo.PROTECTION_FLAG_ROLE
+ PermissionInfo.PROTECTION_INTERNAL or PermissionInfo.PROTECTION_FLAG_ROLE,
) {
val packageStateWithMissingPackage = mockPackageState(APP_ID_1, MISSING_ANDROID_PACKAGE)
addPackageState(packageStateWithMissingPackage)
@@ -185,11 +187,11 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = oldFlags
assertWithMessage(
- "After $action is called for a package that requests an internal permission" +
- " with missing android package and $oldFlags flag and the permission isRole," +
- " the actual permission flags $actualFlags should match the expected" +
- " flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests an internal permission" +
+ " with missing android package and $oldFlags flag and the permission isRole," +
+ " the actual permission flags $actualFlags should match the expected" +
+ " flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -205,12 +207,10 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
isInstalledPackageProduct = true,
// To mock the return value of shouldGrantPrivilegedOrOemPermission()
isInstalledPackageVendor = true,
- isNewInstall = true
+ isNewInstall = true,
) {
- val platformPackage = mockPackageState(
- PLATFORM_APP_ID,
- mockAndroidPackage(PLATFORM_PACKAGE_NAME)
- )
+ val platformPackage =
+ mockPackageState(PLATFORM_APP_ID, mockAndroidPackage(PLATFORM_PACKAGE_NAME))
setupAllowlist(PACKAGE_NAME_1, false)
addPackageState(platformPackage)
}
@@ -218,10 +218,10 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = oldFlags
assertWithMessage(
- "After $action is called for a package that requests a signature privileged" +
- " permission that's not allowlisted, the actual permission" +
- " flags $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a signature privileged" +
+ " permission that's not allowlisted, the actual permission" +
+ " flags $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -237,12 +237,13 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
isInstalledPackageProduct = true,
isInstalledPackageSignatureMatching = true,
isInstalledPackageVendor = true,
- isNewInstall = true
+ isNewInstall = true,
) {
- val platformPackage = mockPackageState(
- PLATFORM_APP_ID,
- mockAndroidPackage(PLATFORM_PACKAGE_NAME, isSignatureMatching = true)
- )
+ val platformPackage =
+ mockPackageState(
+ PLATFORM_APP_ID,
+ mockAndroidPackage(PLATFORM_PACKAGE_NAME, isSignatureMatching = true),
+ )
setupAllowlist(PACKAGE_NAME_1, false)
addPackageState(platformPackage)
}
@@ -250,10 +251,10 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.PROTECTION_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a signature" +
- " non-privileged permission, the actual permission" +
- " flags $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a signature" +
+ " non-privileged permission, the actual permission" +
+ " flags $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -267,12 +268,10 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
isInstalledPackageSystem = true,
isInstalledPackagePrivileged = true,
isInstalledPackageProduct = true,
- isNewInstall = true
+ isNewInstall = true,
) {
- val platformPackage = mockPackageState(
- PLATFORM_APP_ID,
- mockAndroidPackage(PLATFORM_PACKAGE_NAME)
- )
+ val platformPackage =
+ mockPackageState(PLATFORM_APP_ID, mockAndroidPackage(PLATFORM_PACKAGE_NAME))
setupAllowlist(PACKAGE_NAME_1, true)
addPackageState(platformPackage)
}
@@ -280,10 +279,10 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.PROTECTION_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a signature privileged" +
- " permission that's allowlisted and should grant by protection flags, the actual" +
- " permission flags $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a signature privileged" +
+ " permission that's allowlisted and should grant by protection flags, the actual" +
+ " permission flags $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -291,32 +290,36 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
private fun setupAllowlist(
packageName: String,
allowlistState: Boolean,
- state: MutableAccessState = oldState
+ state: MutableAccessState = oldState,
) {
- state.mutateExternalState().setPrivilegedPermissionAllowlistPackages(
- MutableIndexedListSet<String>().apply { add(packageName) }
- )
- val mockAllowlist = mock<PermissionAllowlist> {
- whenever(
- getProductPrivilegedAppAllowlistState(packageName, PERMISSION_NAME_0)
- ).thenReturn(allowlistState)
- }
+ state
+ .mutateExternalState()
+ .setPrivilegedPermissionAllowlistPackages(
+ MutableIndexedListSet<String>().apply { add(packageName) }
+ )
+ val mockAllowlist =
+ mock<PermissionAllowlist> {
+ whenever(getProductPrivilegedAppAllowlistState(packageName, PERMISSION_NAME_0))
+ .thenReturn(allowlistState)
+ }
state.mutateExternalState().setPermissionAllowlist(mockAllowlist)
}
@Test
fun testEvaluatePermissionState_nonRuntimeFlagsOnRuntimePermissions_getsCleared() {
- val oldFlags = PermissionFlags.INSTALL_GRANTED or PermissionFlags.PREGRANT or
- PermissionFlags.RUNTIME_GRANTED
+ val oldFlags =
+ PermissionFlags.INSTALL_GRANTED or
+ PermissionFlags.PREGRANT or
+ PermissionFlags.RUNTIME_GRANTED
testEvaluatePermissionState(oldFlags, PermissionInfo.PROTECTION_DANGEROUS) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.PREGRANT or PermissionFlags.RUNTIME_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " with existing $oldFlags flags, the actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " with existing $oldFlags flags, the actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -328,16 +331,16 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
oldFlags,
PermissionInfo.PROTECTION_DANGEROUS,
installedPackageTargetSdkVersion = Build.VERSION_CODES.LOLLIPOP,
- isNewInstall = true
+ isNewInstall = true,
) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.LEGACY_GRANTED or PermissionFlags.IMPLICIT
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " with no existing flags in pre M, actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " with no existing flags in pre M, actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -348,20 +351,22 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
testEvaluatePermissionState(
oldFlags,
PermissionInfo.PROTECTION_DANGEROUS,
- installedPackageTargetSdkVersion = Build.VERSION_CODES.LOLLIPOP
+ installedPackageTargetSdkVersion = Build.VERSION_CODES.LOLLIPOP,
) {
setPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0, oldFlags)
}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
- val expectedNewFlags = PermissionFlags.LEGACY_GRANTED or PermissionFlags.USER_FIXED or
- PermissionFlags.APP_OP_REVOKED
+ val expectedNewFlags =
+ PermissionFlags.LEGACY_GRANTED or
+ PermissionFlags.USER_FIXED or
+ PermissionFlags.APP_OP_REVOKED
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " that should be LEGACY_GRANTED or IMPLICIT_GRANTED that was previously revoked," +
- " the actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " that should be LEGACY_GRANTED or IMPLICIT_GRANTED that was previously revoked," +
+ " the actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -374,11 +379,11 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = 0
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " that used to require user review, the user review requirement should be removed" +
- " if it's upgraded to post M. The actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " that used to require user review, the user review requirement should be removed" +
+ " if it's upgraded to post M. The actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -391,11 +396,11 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.RUNTIME_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " that was already reviewed by the user, the permission should be RUNTIME_GRANTED" +
- " if it's upgraded to post M. The actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " that was already reviewed by the user, the permission should be RUNTIME_GRANTED" +
+ " if it's upgraded to post M. The actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -407,22 +412,19 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
oldFlags,
PermissionInfo.PROTECTION_DANGEROUS,
permissionName = PERMISSION_POST_NOTIFICATIONS,
- isNewInstall = true
+ isNewInstall = true,
) {
oldState.mutateExternalState().setLeanback(true)
}
- val actualFlags = getPermissionFlags(
- APP_ID_1,
- getUserIdEvaluated(),
- PERMISSION_POST_NOTIFICATIONS
- )
+ val actualFlags =
+ getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_POST_NOTIFICATIONS)
val expectedNewFlags = PermissionFlags.IMPLICIT_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a runtime notification" +
- " permission when isLeanback, the actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime notification" +
+ " permission when isLeanback, the actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -434,65 +436,73 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
oldFlags,
PermissionInfo.PROTECTION_DANGEROUS,
implicitPermissions = setOf(PERMISSION_NAME_0),
- isNewInstall = true
+ isNewInstall = true,
) {
- oldState.mutateExternalState().setImplicitToSourcePermissions(
- MutableIndexedMap<String, IndexedListSet<String>>().apply {
- put(PERMISSION_NAME_0, MutableIndexedListSet<String>().apply {
- add(PERMISSION_NAME_1)
- })
- }
- )
+ oldState
+ .mutateExternalState()
+ .setImplicitToSourcePermissions(
+ MutableIndexedMap<String, IndexedListSet<String>>().apply {
+ put(
+ PERMISSION_NAME_0,
+ MutableIndexedListSet<String>().apply { add(PERMISSION_NAME_1) },
+ )
+ }
+ )
addPermission(mockParsedPermission(PERMISSION_NAME_1, PACKAGE_NAME_0))
}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.IMPLICIT_GRANTED or PermissionFlags.IMPLICIT
assertWithMessage(
- "After $action is called for a package that requests a runtime implicit" +
- " permission that's source from a non-runtime permission, the actual permission" +
- " flags $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime implicit" +
+ " permission that's source from a non-runtime permission, the actual permission" +
+ " flags $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
/**
* For a legacy granted or implicit permission during the app upgrade, when the permission
- * should no longer be legacy or implicit granted, we want to remove the APP_OP_REVOKED flag
- * so that the app can request the permission.
+ * should no longer be legacy or implicit granted, we want to remove the APP_OP_REVOKED flag so
+ * that the app can request the permission.
*/
@Test
fun testEvaluatePermissionState_noLongerLegacyOrImplicitGranted_canBeRequested() {
- val oldFlags = PermissionFlags.LEGACY_GRANTED or PermissionFlags.APP_OP_REVOKED or
- PermissionFlags.RUNTIME_GRANTED
+ val oldFlags =
+ PermissionFlags.LEGACY_GRANTED or
+ PermissionFlags.APP_OP_REVOKED or
+ PermissionFlags.RUNTIME_GRANTED
testEvaluatePermissionState(oldFlags, PermissionInfo.PROTECTION_DANGEROUS) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = 0
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " that is no longer LEGACY_GRANTED or IMPLICIT_GRANTED, the actual permission" +
- " flags $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " that is no longer LEGACY_GRANTED or IMPLICIT_GRANTED, the actual permission" +
+ " flags $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@Test
fun testEvaluatePermissionState_noLongerImplicit_getsRuntimeAndImplicitFlagsRemoved() {
- val oldFlags = PermissionFlags.IMPLICIT or PermissionFlags.RUNTIME_GRANTED or
- PermissionFlags.USER_SET or PermissionFlags.USER_FIXED
+ val oldFlags =
+ PermissionFlags.IMPLICIT or
+ PermissionFlags.RUNTIME_GRANTED or
+ PermissionFlags.USER_SET or
+ PermissionFlags.USER_FIXED
testEvaluatePermissionState(oldFlags, PermissionInfo.PROTECTION_DANGEROUS) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = 0
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " that is no longer implicit and we shouldn't retain as nearby device" +
- " permissions, the actual permission flags $actualFlags should match the expected" +
- " flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " that is no longer implicit and we shouldn't retain as nearby device" +
+ " permissions, the actual permission flags $actualFlags should match the expected" +
+ " flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -504,48 +514,45 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
oldFlags,
PermissionInfo.PROTECTION_DANGEROUS,
permissionName = PERMISSION_BLUETOOTH_CONNECT,
- requestedPermissions = setOf(
- PERMISSION_BLUETOOTH_CONNECT,
- PERMISSION_ACCESS_BACKGROUND_LOCATION
- )
+ requestedPermissions =
+ setOf(PERMISSION_BLUETOOTH_CONNECT, PERMISSION_ACCESS_BACKGROUND_LOCATION),
) {
setPermissionFlags(
APP_ID_1,
getUserIdEvaluated(),
PERMISSION_ACCESS_BACKGROUND_LOCATION,
- PermissionFlags.RUNTIME_GRANTED
+ PermissionFlags.RUNTIME_GRANTED,
)
}
- val actualFlags = getPermissionFlags(
- APP_ID_1,
- getUserIdEvaluated(),
- PERMISSION_BLUETOOTH_CONNECT
- )
+ val actualFlags =
+ getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_BLUETOOTH_CONNECT)
val expectedNewFlags = PermissionFlags.RUNTIME_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a runtime nearby device" +
- " permission that was granted by implicit, the actual permission flags" +
- " $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime nearby device" +
+ " permission that was granted by implicit, the actual permission flags" +
+ " $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@Test
fun testEvaluatePermissionState_noLongerImplicitSystemOrPolicyFixedWasGranted_runtimeGranted() {
- val oldFlags = PermissionFlags.IMPLICIT_GRANTED or PermissionFlags.IMPLICIT or
- PermissionFlags.SYSTEM_FIXED
+ val oldFlags =
+ PermissionFlags.IMPLICIT_GRANTED or
+ PermissionFlags.IMPLICIT or
+ PermissionFlags.SYSTEM_FIXED
testEvaluatePermissionState(oldFlags, PermissionInfo.PROTECTION_DANGEROUS) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.RUNTIME_GRANTED or PermissionFlags.SYSTEM_FIXED
assertWithMessage(
- "After $action is called for a package that requests a runtime permission" +
- " that was granted and is no longer implicit and is SYSTEM_FIXED or POLICY_FIXED," +
- " the actual permission flags $actualFlags should match the expected" +
- " flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime permission" +
+ " that was granted and is no longer implicit and is SYSTEM_FIXED or POLICY_FIXED," +
+ " the actual permission flags $actualFlags should match the expected" +
+ " flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -556,16 +563,16 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
testEvaluatePermissionState(
oldFlags,
PermissionInfo.PROTECTION_DANGEROUS,
- permissionInfoFlags = PermissionInfo.FLAG_HARD_RESTRICTED
+ permissionInfoFlags = PermissionInfo.FLAG_HARD_RESTRICTED,
) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = oldFlags
assertWithMessage(
- "After $action is called for a package that requests a runtime hard" +
- " restricted permission that is not exempted, the actual permission flags" +
- " $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime hard" +
+ " restricted permission that is not exempted, the actual permission flags" +
+ " $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -576,16 +583,16 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
testEvaluatePermissionState(
oldFlags,
PermissionInfo.PROTECTION_DANGEROUS,
- permissionInfoFlags = PermissionInfo.FLAG_SOFT_RESTRICTED
+ permissionInfoFlags = PermissionInfo.FLAG_SOFT_RESTRICTED,
) {}
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.UPGRADE_EXEMPT
assertWithMessage(
- "After $action is called for a package that requests a runtime soft" +
- " restricted permission that is exempted, the actual permission flags" +
- " $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a runtime soft" +
+ " restricted permission that is exempted, the actual permission flags" +
+ " $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -595,18 +602,20 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val oldImplicitPermissionFlags = PermissionFlags.USER_FIXED
testInheritImplicitPermissionStates(
implicitPermissionFlags = oldImplicitPermissionFlags,
- isNewInstallAndNewPermission = false
+ isNewInstallAndNewPermission = false,
)
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
- val expectedNewFlags = oldImplicitPermissionFlags or PermissionFlags.IMPLICIT_GRANTED or
- PermissionFlags.APP_OP_REVOKED
+ val expectedNewFlags =
+ oldImplicitPermissionFlags or
+ PermissionFlags.IMPLICIT_GRANTED or
+ PermissionFlags.APP_OP_REVOKED
assertWithMessage(
- "After $action is called for a package that requests a permission that is" +
- " implicit, existing and runtime, it should not inherit the runtime flags from" +
- " the source permission. Hence the actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a permission that is" +
+ " implicit, existing and runtime, it should not inherit the runtime flags from" +
+ " the source permission. Hence the actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -620,11 +629,11 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = PermissionFlags.INSTALL_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a permission that is" +
- " implicit, new and non-runtime, it should not inherit the runtime flags from" +
- " the source permission. Hence the actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a permission that is" +
+ " implicit, new and non-runtime, it should not inherit the runtime flags from" +
+ " the source permission. Hence the actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -635,14 +644,14 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
testInheritImplicitPermissionStates(sourceRuntimeFlags = sourceRuntimeFlags)
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
- val expectedNewFlags = sourceRuntimeFlags or PermissionFlags.IMPLICIT_GRANTED or
- PermissionFlags.IMPLICIT
+ val expectedNewFlags =
+ sourceRuntimeFlags or PermissionFlags.IMPLICIT_GRANTED or PermissionFlags.IMPLICIT
assertWithMessage(
- "After $action is called for a package that requests a permission that is" +
- " implicit, new and runtime, it should inherit the runtime flags from" +
- " the source permission. Hence the actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a permission that is" +
+ " implicit, new and runtime, it should inherit the runtime flags from" +
+ " the source permission. Hence the actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -653,17 +662,17 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
testInheritImplicitPermissionStates(
implicitPermissionFlags = PermissionFlags.POLICY_FIXED,
sourceRuntimeFlags = sourceRuntimeFlags,
- isAnySourcePermissionNonRuntime = false
+ isAnySourcePermissionNonRuntime = false,
)
val actualFlags = getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_NAME_0)
val expectedNewFlags = sourceRuntimeFlags or PermissionFlags.IMPLICIT
assertWithMessage(
- "After $action is called for a package that requests a permission that is" +
- " implicit, existing, runtime and revoked, it should only inherit runtime flags" +
- " from source permission. Hence the actual permission flags $actualFlags should" +
- " match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a permission that is" +
+ " implicit, existing, runtime and revoked, it should only inherit runtime flags" +
+ " from source permission. Hence the actual permission flags $actualFlags should" +
+ " match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -678,21 +687,18 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
val sourceRuntimeFlags = PermissionFlags.RUNTIME_GRANTED or PermissionFlags.USER_SET
testInheritImplicitPermissionStates(
implicitPermissionName = PERMISSION_ACCESS_MEDIA_LOCATION,
- sourceRuntimeFlags = sourceRuntimeFlags
+ sourceRuntimeFlags = sourceRuntimeFlags,
)
- val actualFlags = getPermissionFlags(
- APP_ID_1,
- getUserIdEvaluated(),
- PERMISSION_ACCESS_MEDIA_LOCATION
- )
+ val actualFlags =
+ getPermissionFlags(APP_ID_1, getUserIdEvaluated(), PERMISSION_ACCESS_MEDIA_LOCATION)
val expectedNewFlags = sourceRuntimeFlags or PermissionFlags.IMPLICIT_GRANTED
assertWithMessage(
- "After $action is called for a package that requests a media permission that" +
- " is implicit, new and runtime, it should inherit the runtime flags from" +
- " the source permission and have the IMPLICIT flag removed. Hence the actual" +
- " permission flags $actualFlags should match the expected flags $expectedNewFlags"
- )
+ "After $action is called for a package that requests a media permission that" +
+ " is implicit, new and runtime, it should inherit the runtime flags from" +
+ " the source permission and have the IMPLICIT flag removed. Hence the actual" +
+ " permission flags $actualFlags should match the expected flags $expectedNewFlags"
+ )
.that(actualFlags)
.isEqualTo(expectedNewFlags)
}
@@ -703,57 +709,65 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
implicitPermissionProtectionLevel: Int = PermissionInfo.PROTECTION_DANGEROUS,
sourceRuntimeFlags: Int = PermissionFlags.RUNTIME_GRANTED or PermissionFlags.USER_SET,
isAnySourcePermissionNonRuntime: Boolean = true,
- isNewInstallAndNewPermission: Boolean = true
+ isNewInstallAndNewPermission: Boolean = true,
) {
val userId = getUserIdEvaluated()
- val implicitPermission = mockParsedPermission(
- implicitPermissionName,
- PACKAGE_NAME_0,
- protectionLevel = implicitPermissionProtectionLevel,
- )
+ val implicitPermission =
+ mockParsedPermission(
+ implicitPermissionName,
+ PACKAGE_NAME_0,
+ protectionLevel = implicitPermissionProtectionLevel,
+ )
// For source from non-runtime in order to grant by implicit
- val sourcePermission1 = mockParsedPermission(
- PERMISSION_NAME_1,
- PACKAGE_NAME_0,
- protectionLevel = if (isAnySourcePermissionNonRuntime) {
- PermissionInfo.PROTECTION_NORMAL
- } else {
- PermissionInfo.PROTECTION_DANGEROUS
- }
- )
+ val sourcePermission1 =
+ mockParsedPermission(
+ PERMISSION_NAME_1,
+ PACKAGE_NAME_0,
+ protectionLevel =
+ if (isAnySourcePermissionNonRuntime) {
+ PermissionInfo.PROTECTION_NORMAL
+ } else {
+ PermissionInfo.PROTECTION_DANGEROUS
+ },
+ )
// For inheriting runtime flags
- val sourcePermission2 = mockParsedPermission(
- PERMISSION_NAME_2,
- PACKAGE_NAME_0,
- protectionLevel = PermissionInfo.PROTECTION_DANGEROUS,
- )
- val permissionOwnerPackageState = mockPackageState(
- APP_ID_0,
- mockAndroidPackage(
+ val sourcePermission2 =
+ mockParsedPermission(
+ PERMISSION_NAME_2,
PACKAGE_NAME_0,
- permissions = listOf(implicitPermission, sourcePermission1, sourcePermission2)
+ protectionLevel = PermissionInfo.PROTECTION_DANGEROUS,
)
- )
- val installedPackageState = mockPackageState(
- APP_ID_1,
- mockAndroidPackage(
- PACKAGE_NAME_1,
- requestedPermissions = setOf(
- implicitPermissionName,
- PERMISSION_NAME_1,
- PERMISSION_NAME_2
+ val permissionOwnerPackageState =
+ mockPackageState(
+ APP_ID_0,
+ mockAndroidPackage(
+ PACKAGE_NAME_0,
+ permissions = listOf(implicitPermission, sourcePermission1, sourcePermission2),
),
- implicitPermissions = setOf(implicitPermissionName)
)
- )
- oldState.mutateExternalState().setImplicitToSourcePermissions(
- MutableIndexedMap<String, IndexedListSet<String>>().apply {
- put(implicitPermissionName, MutableIndexedListSet<String>().apply {
- add(PERMISSION_NAME_1)
- add(PERMISSION_NAME_2)
- })
- }
- )
+ val installedPackageState =
+ mockPackageState(
+ APP_ID_1,
+ mockAndroidPackage(
+ PACKAGE_NAME_1,
+ requestedPermissions =
+ setOf(implicitPermissionName, PERMISSION_NAME_1, PERMISSION_NAME_2),
+ implicitPermissions = setOf(implicitPermissionName),
+ ),
+ )
+ oldState
+ .mutateExternalState()
+ .setImplicitToSourcePermissions(
+ MutableIndexedMap<String, IndexedListSet<String>>().apply {
+ put(
+ implicitPermissionName,
+ MutableIndexedListSet<String>().apply {
+ add(PERMISSION_NAME_1)
+ add(PERMISSION_NAME_2)
+ },
+ )
+ }
+ )
addPackageState(permissionOwnerPackageState)
addPermission(implicitPermission)
addPermission(sourcePermission1)
@@ -772,7 +786,7 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
userId,
implicitPermissionName,
implicitPermissionFlags,
- newState
+ newState,
)
}
testAction(installedPackageState)
@@ -781,18 +795,17 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
/**
* Setup simple package states for testing evaluatePermissionState().
- * permissionOwnerPackageState is definer of permissionName with APP_ID_0.
- * installedPackageState is the installed package that requests permissionName with APP_ID_1.
+ * permissionOwnerPackageState is definer of permissionName with APP_ID_0. installedPackageState
+ * is the installed package that requests permissionName with APP_ID_1.
*
* @param oldFlags the existing permission flags for APP_ID_1, userId, permissionName
* @param protectionLevel the protectionLevel for the permission
* @param permissionName the name of the permission (1) being defined (2) of the oldFlags, and
- * (3) requested by installedPackageState
+ * (3) requested by installedPackageState
* @param requestedPermissions the permissions requested by installedPackageState
* @param implicitPermissions the implicit permissions of installedPackageState
* @param permissionInfoFlags the flags for the permission itself
* @param isInstalledPackageSystem whether installedPackageState is a system package
- *
* @return installedPackageState
*/
private fun testEvaluatePermissionState(
@@ -809,33 +822,36 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
isInstalledPackageVendor: Boolean = false,
installedPackageTargetSdkVersion: Int = Build.VERSION_CODES.UPSIDE_DOWN_CAKE,
isNewInstall: Boolean = false,
- additionalSetup: () -> Unit
+ additionalSetup: () -> Unit,
) {
val userId = getUserIdEvaluated()
- val parsedPermission = mockParsedPermission(
- permissionName,
- PACKAGE_NAME_0,
- protectionLevel = protectionLevel,
- flags = permissionInfoFlags
- )
- val permissionOwnerPackageState = mockPackageState(
- APP_ID_0,
- mockAndroidPackage(PACKAGE_NAME_0, permissions = listOf(parsedPermission))
- )
- val installedPackageState = mockPackageState(
- APP_ID_1,
- mockAndroidPackage(
- PACKAGE_NAME_1,
- requestedPermissions = requestedPermissions,
- implicitPermissions = implicitPermissions,
- targetSdkVersion = installedPackageTargetSdkVersion,
- isSignatureMatching = isInstalledPackageSignatureMatching
- ),
- isSystem = isInstalledPackageSystem,
- isPrivileged = isInstalledPackagePrivileged,
- isProduct = isInstalledPackageProduct,
- isVendor = isInstalledPackageVendor
- )
+ val parsedPermission =
+ mockParsedPermission(
+ permissionName,
+ PACKAGE_NAME_0,
+ protectionLevel = protectionLevel,
+ flags = permissionInfoFlags,
+ )
+ val permissionOwnerPackageState =
+ mockPackageState(
+ APP_ID_0,
+ mockAndroidPackage(PACKAGE_NAME_0, permissions = listOf(parsedPermission)),
+ )
+ val installedPackageState =
+ mockPackageState(
+ APP_ID_1,
+ mockAndroidPackage(
+ PACKAGE_NAME_1,
+ requestedPermissions = requestedPermissions,
+ implicitPermissions = implicitPermissions,
+ targetSdkVersion = installedPackageTargetSdkVersion,
+ isSignatureMatching = isInstalledPackageSignatureMatching,
+ ),
+ isSystem = isInstalledPackageSystem,
+ isPrivileged = isInstalledPackagePrivileged,
+ isProduct = isInstalledPackageProduct,
+ isVendor = isInstalledPackageVendor,
+ )
addPackageState(permissionOwnerPackageState)
if (!isNewInstall) {
addPackageState(installedPackageState)
@@ -854,26 +870,29 @@ class AppIdPermissionPolicyPermissionStatesTest : BasePermissionPolicyTest() {
}
}
- private fun getUserIdEvaluated(): Int = when (action) {
- Action.ON_USER_ADDED -> USER_ID_NEW
- Action.ON_STORAGE_VOLUME_ADDED, Action.ON_PACKAGE_ADDED -> USER_ID_0
- }
+ private fun getUserIdEvaluated(): Int =
+ when (action) {
+ Action.ON_USER_ADDED -> USER_ID_NEW
+ Action.ON_STORAGE_VOLUME_ADDED,
+ Action.ON_PACKAGE_ADDED -> USER_ID_0
+ }
private fun MutateStateScope.testAction(packageState: PackageState) {
with(appIdPermissionPolicy) {
when (action) {
Action.ON_USER_ADDED -> onUserAdded(getUserIdEvaluated())
- Action.ON_STORAGE_VOLUME_ADDED -> onStorageVolumeMounted(
- null,
- listOf(packageState.packageName),
- true
- )
+ Action.ON_STORAGE_VOLUME_ADDED ->
+ onStorageVolumeMounted(null, listOf(packageState.packageName), true)
Action.ON_PACKAGE_ADDED -> onPackageAdded(packageState)
}
}
}
- enum class Action { ON_USER_ADDED, ON_STORAGE_VOLUME_ADDED, ON_PACKAGE_ADDED }
+ enum class Action {
+ ON_USER_ADDED,
+ ON_STORAGE_VOLUME_ADDED,
+ ON_PACKAGE_ADDED,
+ }
companion object {
@Parameterized.Parameters(name = "{0}")
diff --git a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/BasePermissionPolicyTest.kt b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/BasePermissionPolicyTest.kt
index 7b3f21603c0a..207820cc3135 100644
--- a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/BasePermissionPolicyTest.kt
+++ b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/BasePermissionPolicyTest.kt
@@ -49,32 +49,24 @@ import org.junit.Rule
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.anyLong
-/**
- * Mocking unit test for AppIdPermissionPolicy.
- */
+/** Mocking unit test for AppIdPermissionPolicy. */
@RunWith(AndroidJUnit4::class)
abstract class BasePermissionPolicyTest {
protected lateinit var oldState: MutableAccessState
protected lateinit var newState: MutableAccessState
- protected val defaultPermissionGroup = mockParsedPermissionGroup(
- PERMISSION_GROUP_NAME_0,
- PACKAGE_NAME_0
- )
- protected val defaultPermissionTree = mockParsedPermission(
- PERMISSION_TREE_NAME,
- PACKAGE_NAME_0,
- isTree = true
- )
+ protected val defaultPermissionGroup =
+ mockParsedPermissionGroup(PERMISSION_GROUP_NAME_0, PACKAGE_NAME_0)
+ protected val defaultPermissionTree =
+ mockParsedPermission(PERMISSION_TREE_NAME, PACKAGE_NAME_0, isTree = true)
protected val defaultPermission = mockParsedPermission(PERMISSION_NAME_0, PACKAGE_NAME_0)
protected val appIdPermissionPolicy = AppIdPermissionPolicy()
@Rule
@JvmField
- val extendedMockitoRule = ExtendedMockitoRule.Builder(this)
- .spyStatic(PackageInfoUtils::class.java)
- .build()
+ val extendedMockitoRule =
+ ExtendedMockitoRule.Builder(this).spyStatic(PackageInfoUtils::class.java).build()
@Before
fun baseSetUp() {
@@ -93,65 +85,76 @@ abstract class BasePermissionPolicyTest {
private fun mockPackageInfoUtilsGeneratePermissionInfo() {
wheneverStatic {
- PackageInfoUtils.generatePermissionInfo(any(ParsedPermission::class.java), anyLong())
- }.thenAnswer { invocation ->
- val parsedPermission = invocation.getArgument<ParsedPermission>(0)
- val generateFlags = invocation.getArgument<Long>(1)
- PermissionInfo(parsedPermission.backgroundPermission).apply {
- name = parsedPermission.name
- packageName = parsedPermission.packageName
- metaData = if (generateFlags.toInt().hasBits(PackageManager.GET_META_DATA)) {
- parsedPermission.metaData
- } else {
- null
+ PackageInfoUtils.generatePermissionInfo(
+ any(ParsedPermission::class.java),
+ anyLong(),
+ )
+ }
+ .thenAnswer { invocation ->
+ val parsedPermission = invocation.getArgument<ParsedPermission>(0)
+ val generateFlags = invocation.getArgument<Long>(1)
+ PermissionInfo(parsedPermission.backgroundPermission).apply {
+ name = parsedPermission.name
+ packageName = parsedPermission.packageName
+ metaData =
+ if (generateFlags.toInt().hasBits(PackageManager.GET_META_DATA)) {
+ parsedPermission.metaData
+ } else {
+ null
+ }
+ @Suppress("DEPRECATION")
+ protectionLevel = parsedPermission.protectionLevel
+ group = parsedPermission.group
+ flags = parsedPermission.flags
}
- @Suppress("DEPRECATION")
- protectionLevel = parsedPermission.protectionLevel
- group = parsedPermission.group
- flags = parsedPermission.flags
}
- }
}
private fun mockPackageInfoUtilsGeneratePermissionGroupInfo() {
wheneverStatic {
- PackageInfoUtils.generatePermissionGroupInfo(
- any(ParsedPermissionGroup::class.java),
- anyLong()
- )
- }.thenAnswer { invocation ->
- val parsedPermissionGroup = invocation.getArgument<ParsedPermissionGroup>(0)
- val generateFlags = invocation.getArgument<Long>(1)
- @Suppress("DEPRECATION")
- PermissionGroupInfo().apply {
- name = parsedPermissionGroup.name
- packageName = parsedPermissionGroup.packageName
- metaData = if (generateFlags.toInt().hasBits(PackageManager.GET_META_DATA)) {
- parsedPermissionGroup.metaData
- } else {
- null
+ PackageInfoUtils.generatePermissionGroupInfo(
+ any(ParsedPermissionGroup::class.java),
+ anyLong(),
+ )
+ }
+ .thenAnswer { invocation ->
+ val parsedPermissionGroup = invocation.getArgument<ParsedPermissionGroup>(0)
+ val generateFlags = invocation.getArgument<Long>(1)
+ @Suppress("DEPRECATION")
+ PermissionGroupInfo().apply {
+ name = parsedPermissionGroup.name
+ packageName = parsedPermissionGroup.packageName
+ metaData =
+ if (generateFlags.toInt().hasBits(PackageManager.GET_META_DATA)) {
+ parsedPermissionGroup.metaData
+ } else {
+ null
+ }
+ flags = parsedPermissionGroup.flags
}
- flags = parsedPermissionGroup.flags
}
- }
}
- /**
- * Mock an AndroidPackage with PACKAGE_NAME_0, PERMISSION_NAME_0 and PERMISSION_GROUP_NAME_0
- */
+ /** Mock an AndroidPackage with PACKAGE_NAME_0, PERMISSION_NAME_0 and PERMISSION_GROUP_NAME_0 */
protected fun mockSimpleAndroidPackage(): AndroidPackage =
mockAndroidPackage(
PACKAGE_NAME_0,
permissionGroups = listOf(defaultPermissionGroup),
- permissions = listOf(defaultPermissionTree, defaultPermission)
+ permissions = listOf(defaultPermissionTree, defaultPermission),
)
protected fun createSimplePermission(isTree: Boolean = false): Permission {
- val parsedPermission = if (isTree) { defaultPermissionTree } else { defaultPermission }
- val permissionInfo = PackageInfoUtils.generatePermissionInfo(
- parsedPermission,
- PackageManager.GET_META_DATA.toLong()
- )!!
+ val parsedPermission =
+ if (isTree) {
+ defaultPermissionTree
+ } else {
+ defaultPermission
+ }
+ val permissionInfo =
+ PackageInfoUtils.generatePermissionInfo(
+ parsedPermission,
+ PackageManager.GET_META_DATA.toLong(),
+ )!!
return Permission(permissionInfo, true, Permission.TYPE_MANIFEST, APP_ID_0)
}
@@ -164,13 +167,12 @@ abstract class BasePermissionPolicyTest {
appId: Int,
packageName: String,
isSystem: Boolean = false,
- ): PackageState =
- mock {
- whenever(this.appId).thenReturn(appId)
- whenever(this.packageName).thenReturn(packageName)
- whenever(androidPackage).thenReturn(null)
- whenever(this.isSystem).thenReturn(isSystem)
- }
+ ): PackageState = mock {
+ whenever(this.appId).thenReturn(appId)
+ whenever(this.packageName).thenReturn(packageName)
+ whenever(androidPackage).thenReturn(null)
+ whenever(this.isSystem).thenReturn(isSystem)
+ }
protected fun mockPackageState(
appId: Int,
@@ -179,22 +181,22 @@ abstract class BasePermissionPolicyTest {
isPrivileged: Boolean = false,
isProduct: Boolean = false,
isInstantApp: Boolean = false,
- isVendor: Boolean = false
- ): PackageState =
- mock {
- whenever(this.appId).thenReturn(appId)
- whenever(this.androidPackage).thenReturn(androidPackage)
- val packageName = androidPackage.packageName
- whenever(this.packageName).thenReturn(packageName)
- whenever(this.isSystem).thenReturn(isSystem)
- whenever(this.isPrivileged).thenReturn(isPrivileged)
- whenever(this.isProduct).thenReturn(isProduct)
- whenever(this.isVendor).thenReturn(isVendor)
- val userStates = SparseArray<PackageUserState>().apply {
+ isVendor: Boolean = false,
+ ): PackageState = mock {
+ whenever(this.appId).thenReturn(appId)
+ whenever(this.androidPackage).thenReturn(androidPackage)
+ val packageName = androidPackage.packageName
+ whenever(this.packageName).thenReturn(packageName)
+ whenever(this.isSystem).thenReturn(isSystem)
+ whenever(this.isPrivileged).thenReturn(isPrivileged)
+ whenever(this.isProduct).thenReturn(isProduct)
+ whenever(this.isVendor).thenReturn(isVendor)
+ val userStates =
+ SparseArray<PackageUserState>().apply {
put(USER_ID_0, mock { whenever(this.isInstantApp).thenReturn(isInstantApp) })
}
- whenever(this.userStates).thenReturn(userStates)
- }
+ whenever(this.userStates).thenReturn(userStates)
+ }
protected fun mockAndroidPackage(
packageName: String,
@@ -205,28 +207,26 @@ abstract class BasePermissionPolicyTest {
requestedPermissions: Set<String> = emptySet(),
permissionGroups: List<ParsedPermissionGroup> = emptyList(),
permissions: List<ParsedPermission> = emptyList(),
- isSignatureMatching: Boolean = false
- ): AndroidPackage =
- mock {
- whenever(this.packageName).thenReturn(packageName)
- whenever(this.targetSdkVersion).thenReturn(targetSdkVersion)
- whenever(this.isRequestLegacyExternalStorage).thenReturn(isRequestLegacyExternalStorage)
- whenever(this.adoptPermissions).thenReturn(adoptPermissions)
- whenever(this.implicitPermissions).thenReturn(implicitPermissions)
- whenever(this.requestedPermissions).thenReturn(requestedPermissions)
- whenever(this.permissionGroups).thenReturn(permissionGroups)
- whenever(this.permissions).thenReturn(permissions)
- val signingDetails = mock<SigningDetails> {
- whenever(
- hasCommonSignerWithCapability(any(), any())
- ).thenReturn(isSignatureMatching)
+ isSignatureMatching: Boolean = false,
+ ): AndroidPackage = mock {
+ whenever(this.packageName).thenReturn(packageName)
+ whenever(this.targetSdkVersion).thenReturn(targetSdkVersion)
+ whenever(this.isRequestLegacyExternalStorage).thenReturn(isRequestLegacyExternalStorage)
+ whenever(this.adoptPermissions).thenReturn(adoptPermissions)
+ whenever(this.implicitPermissions).thenReturn(implicitPermissions)
+ whenever(this.requestedPermissions).thenReturn(requestedPermissions)
+ whenever(this.permissionGroups).thenReturn(permissionGroups)
+ whenever(this.permissions).thenReturn(permissions)
+ val signingDetails =
+ mock<SigningDetails> {
+ whenever(hasCommonSignerWithCapability(any(), any()))
+ .thenReturn(isSignatureMatching)
whenever(hasAncestorOrSelf(any())).thenReturn(isSignatureMatching)
- whenever(
- checkCapability(any<SigningDetails>(), any())
- ).thenReturn(isSignatureMatching)
+ whenever(checkCapability(any<SigningDetails>(), any()))
+ .thenReturn(isSignatureMatching)
}
- whenever(this.signingDetails).thenReturn(signingDetails)
- }
+ whenever(this.signingDetails).thenReturn(signingDetails)
+ }
protected fun mockParsedPermission(
permissionName: String,
@@ -235,72 +235,74 @@ abstract class BasePermissionPolicyTest {
group: String? = null,
protectionLevel: Int = PermissionInfo.PROTECTION_NORMAL,
flags: Int = 0,
- isTree: Boolean = false
- ): ParsedPermission =
- mock {
- whenever(name).thenReturn(permissionName)
- whenever(this.packageName).thenReturn(packageName)
- whenever(metaData).thenReturn(Bundle())
- whenever(this.backgroundPermission).thenReturn(backgroundPermission)
- whenever(this.group).thenReturn(group)
- whenever(this.protectionLevel).thenReturn(protectionLevel)
- whenever(this.flags).thenReturn(flags)
- whenever(this.isTree).thenReturn(isTree)
- }
+ isTree: Boolean = false,
+ ): ParsedPermission = mock {
+ whenever(name).thenReturn(permissionName)
+ whenever(this.packageName).thenReturn(packageName)
+ whenever(metaData).thenReturn(Bundle())
+ whenever(this.backgroundPermission).thenReturn(backgroundPermission)
+ whenever(this.group).thenReturn(group)
+ whenever(this.protectionLevel).thenReturn(protectionLevel)
+ whenever(this.flags).thenReturn(flags)
+ whenever(this.isTree).thenReturn(isTree)
+ }
protected fun mockParsedPermissionGroup(
permissionGroupName: String,
packageName: String,
- ): ParsedPermissionGroup =
- mock {
- whenever(name).thenReturn(permissionGroupName)
- whenever(this.packageName).thenReturn(packageName)
- whenever(metaData).thenReturn(Bundle())
- }
+ ): ParsedPermissionGroup = mock {
+ whenever(name).thenReturn(permissionGroupName)
+ whenever(this.packageName).thenReturn(packageName)
+ whenever(metaData).thenReturn(Bundle())
+ }
protected fun addPackageState(
packageState: PackageState,
- state: MutableAccessState = oldState
+ state: MutableAccessState = oldState,
) {
state.mutateExternalState().apply {
setPackageStates(
packageStates.toMutableMap().apply { put(packageState.packageName, packageState) }
)
- mutateAppIdPackageNames().mutateOrPut(packageState.appId) { MutableIndexedListSet() }
+ mutateAppIdPackageNames()
+ .mutateOrPut(packageState.appId) { MutableIndexedListSet() }
.add(packageState.packageName)
}
}
protected fun removePackageState(
packageState: PackageState,
- state: MutableAccessState = oldState
+ state: MutableAccessState = oldState,
) {
state.mutateExternalState().apply {
setPackageStates(
packageStates.toMutableMap().apply { remove(packageState.packageName) }
)
- mutateAppIdPackageNames().mutateOrPut(packageState.appId) { MutableIndexedListSet() }
+ mutateAppIdPackageNames()
+ .mutateOrPut(packageState.appId) { MutableIndexedListSet() }
.remove(packageState.packageName)
}
}
protected fun addDisabledSystemPackageState(
packageState: PackageState,
- state: MutableAccessState = oldState
- ) = state.mutateExternalState().apply {
- (disabledSystemPackageStates as ArrayMap)[packageState.packageName] = packageState
- }
+ state: MutableAccessState = oldState,
+ ) =
+ state.mutateExternalState().apply {
+ (disabledSystemPackageStates as ArrayMap)[packageState.packageName] = packageState
+ }
protected fun addPermission(
parsedPermission: ParsedPermission,
type: Int = Permission.TYPE_MANIFEST,
isReconciled: Boolean = true,
- state: MutableAccessState = oldState
+ state: MutableAccessState = oldState,
) {
- val permissionInfo = PackageInfoUtils.generatePermissionInfo(
- parsedPermission,
- PackageManager.GET_META_DATA.toLong()
- )!!
+ val permissionInfo =
+ PackageInfoUtils.generatePermissionInfo(
+ parsedPermission,
+ PackageManager.GET_META_DATA.toLong(),
+ )!!
val appId = state.externalState.packageStates[permissionInfo.packageName]!!.appId
val permission = Permission(permissionInfo, isReconciled, type, appId)
if (parsedPermission.isTree) {
@@ -312,35 +314,35 @@ abstract class BasePermissionPolicyTest {
protected fun addPermissionGroup(
parsedPermissionGroup: ParsedPermissionGroup,
- state: MutableAccessState = oldState
+ state: MutableAccessState = oldState,
) {
state.mutateSystemState().mutatePermissionGroups()[parsedPermissionGroup.name] =
PackageInfoUtils.generatePermissionGroupInfo(
parsedPermissionGroup,
- PackageManager.GET_META_DATA.toLong()
+ PackageManager.GET_META_DATA.toLong(),
)!!
}
protected fun getPermission(
permissionName: String,
- state: MutableAccessState = newState
+ state: MutableAccessState = newState,
): Permission? = state.systemState.permissions[permissionName]
protected fun getPermissionTree(
permissionTreeName: String,
- state: MutableAccessState = newState
+ state: MutableAccessState = newState,
): Permission? = state.systemState.permissionTrees[permissionTreeName]
protected fun getPermissionGroup(
permissionGroupName: String,
- state: MutableAccessState = newState
+ state: MutableAccessState = newState,
): PermissionGroupInfo? = state.systemState.permissionGroups[permissionGroupName]
protected fun getPermissionFlags(
appId: Int,
userId: Int,
permissionName: String,
- state: MutableAccessState = newState
+ state: MutableAccessState = newState,
): Int =
state.userStates[userId]?.appIdPermissionFlags?.get(appId).getWithDefault(permissionName, 0)
@@ -349,11 +351,13 @@ abstract class BasePermissionPolicyTest {
userId: Int,
permissionName: String,
flags: Int,
- state: MutableAccessState = oldState
+ state: MutableAccessState = oldState,
) =
- state.mutateUserState(userId)!!.mutateAppIdPermissionFlags().mutateOrPut(appId) {
- MutableIndexedMap()
- }.put(permissionName, flags)
+ state
+ .mutateUserState(userId)!!
+ .mutateAppIdPermissionFlags()
+ .mutateOrPut(appId) { MutableIndexedMap() }
+ .put(permissionName, flags)
companion object {
@JvmStatic protected val PACKAGE_NAME_0 = "packageName0"
@@ -375,16 +379,17 @@ abstract class BasePermissionPolicyTest {
@JvmStatic protected val PERMISSION_NAME_1 = "permissionName1"
@JvmStatic protected val PERMISSION_NAME_2 = "permissionName2"
@JvmStatic protected val PERMISSION_BELONGS_TO_A_TREE = "permissionTree.permission"
- @JvmStatic protected val PERMISSION_READ_EXTERNAL_STORAGE =
- Manifest.permission.READ_EXTERNAL_STORAGE
- @JvmStatic protected val PERMISSION_POST_NOTIFICATIONS =
- Manifest.permission.POST_NOTIFICATIONS
- @JvmStatic protected val PERMISSION_BLUETOOTH_CONNECT =
- Manifest.permission.BLUETOOTH_CONNECT
- @JvmStatic protected val PERMISSION_ACCESS_BACKGROUND_LOCATION =
+ @JvmStatic
+ protected val PERMISSION_READ_EXTERNAL_STORAGE = Manifest.permission.READ_EXTERNAL_STORAGE
+ @JvmStatic
+ protected val PERMISSION_POST_NOTIFICATIONS = Manifest.permission.POST_NOTIFICATIONS
+ @JvmStatic
+ protected val PERMISSION_BLUETOOTH_CONNECT = Manifest.permission.BLUETOOTH_CONNECT
+ @JvmStatic
+ protected val PERMISSION_ACCESS_BACKGROUND_LOCATION =
Manifest.permission.ACCESS_BACKGROUND_LOCATION
- @JvmStatic protected val PERMISSION_ACCESS_MEDIA_LOCATION =
- Manifest.permission.ACCESS_MEDIA_LOCATION
+ @JvmStatic
+ protected val PERMISSION_ACCESS_MEDIA_LOCATION = Manifest.permission.ACCESS_MEDIA_LOCATION
@JvmStatic protected val USER_ID_0 = 0
@JvmStatic protected val USER_ID_NEW = 1