diff options
| author | 2023-01-11 16:31:23 +0000 | |
|---|---|---|
| committer | 2023-01-11 16:31:23 +0000 | |
| commit | b08ffa681fc6ee0f43727e7fd4cc3377a2d73ec8 (patch) | |
| tree | ec1cd3c723e1b2c9cbf6ff8e6de7cbebd2cd59e1 /services/permission/java | |
| parent | 2e16613fdd42a8bfbdee19fa24d8fe98dd13b35e (diff) | |
| parent | a4d981b6b5e083f4ddf1f3e419d897403b0e26cd (diff) | |
Merge "add legacy apis in permissions compat layer"
Diffstat (limited to 'services/permission/java')
2 files changed, 64 insertions, 19 deletions
diff --git a/services/permission/java/com/android/server/permission/access/collection/IndexedMap.kt b/services/permission/java/com/android/server/permission/access/collection/IndexedMap.kt index f4e362ceb2c7..998d2067e070 100644 --- a/services/permission/java/com/android/server/permission/access/collection/IndexedMap.kt +++ b/services/permission/java/com/android/server/permission/access/collection/IndexedMap.kt @@ -148,6 +148,13 @@ inline fun <K, V> IndexedMap<K, V>.retainAllIndexed(predicate: (Int, K, V) -> Bo return isChanged } +inline fun <K, V, R> IndexedMap<K, V>.mapIndexed(transform: (Int, K, V) -> R): IndexedList<R> = + IndexedList<R>().also { destination -> + forEachIndexed { index, key, value -> + transform(index, key, value).let { destination += it } + } + } + inline fun <K, V, R> IndexedMap<K, V>.mapNotNullIndexed( transform: (Int, K, V) -> R? ): IndexedList<R> = diff --git a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt index acd0a3cbbb98..903fad33055f 100644 --- a/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt +++ b/services/permission/java/com/android/server/permission/access/permission/PermissionService.kt @@ -73,6 +73,7 @@ import com.android.server.pm.UserManagerInternal import com.android.server.pm.UserManagerService import com.android.server.pm.parsing.pkg.AndroidPackageUtils import com.android.server.pm.permission.LegacyPermission +import com.android.server.pm.permission.Permission as LegacyPermission2 import com.android.server.pm.permission.LegacyPermissionSettings import com.android.server.pm.permission.LegacyPermissionState import com.android.server.pm.permission.PermissionManagerServiceInterface @@ -1673,40 +1674,77 @@ class PermissionService( context.getSystemService(PermissionControllerManager::class.java)!!.dump(fd, args) } - override fun getPermissionTEMP( - permissionName: String - ): com.android.server.pm.permission.Permission? { - // TODO("Not yet implemented") - return null - } + override fun getPermissionTEMP(permissionName: String): LegacyPermission2? { + val permission = service.getState { + with(policy) { getPermissions()[permissionName] } + } ?: return null - override fun getLegacyPermissions(): List<LegacyPermission> { - // TODO("Not yet implemented") - return emptyList() + return LegacyPermission2( + permission.permissionInfo, permission.type, permission.isReconciled, permission.appId, + permission.gids, permission.areGidsPerUser + ) } + override fun getLegacyPermissions(): List<LegacyPermission> = + service.getState { + with(policy) { getPermissions() } + }.mapIndexed { _, _, permission -> + LegacyPermission( + permission.permissionInfo, permission.type, permission.appId, permission.gids + ) + } + override fun readLegacyPermissionsTEMP(legacyPermissionSettings: LegacyPermissionSettings) { // Package settings has been read when this method is called. service.initialize() - // TODO("Not yet implemented") } override fun writeLegacyPermissionsTEMP(legacyPermissionSettings: LegacyPermissionSettings) { - // TODO("Not yet implemented") + service.getState { + val permissions = with(policy) { getPermissions() } + legacyPermissionSettings.replacePermissions(toLegacyPermissions(permissions)) + val permissionTrees = with(policy) { getPermissionTrees() } + legacyPermissionSettings.replacePermissionTrees(toLegacyPermissions(permissionTrees)) + } } + private fun toLegacyPermissions( + permissions: IndexedMap<String, Permission> + ): List<LegacyPermission> = + permissions.mapIndexed { _, _, permission -> + // We don't need to provide UID and GIDs, which are only retrieved when dumping. + LegacyPermission( + permission.permissionInfo, permission.type, 0, EmptyArray.INT + ) + } + override fun getLegacyPermissionState(appId: Int): LegacyPermissionState { - // TODO("Not yet implemented") - return LegacyPermissionState() - } + val legacyState = LegacyPermissionState() + val userIds = userManagerService.userIdsIncludingPreCreated + service.getState { + val permissions = with(policy) { getPermissions() } + userIds.forEachIndexed { _, userId -> + val permissionFlags = with(policy) { getUidPermissionFlags(appId, userId) } + ?: return@forEachIndexed - override fun readLegacyPermissionStateTEMP() { - // TODO("Not yet implemented") + permissionFlags.forEachIndexed permissionFlags@{ _, permissionName, flags -> + val permission = permissions[permissionName] ?: return@permissionFlags + val legacyPermissionState = LegacyPermissionState.PermissionState( + permissionName, + permission.isRuntime, + PermissionFlags.isPermissionGranted(flags), + PermissionFlags.toApiFlags(flags) + ) + legacyState.putPermissionState(legacyPermissionState, userId) + } + } + } + return legacyState } - override fun writeLegacyPermissionStateTEMP() { - // TODO("Not yet implemented") - } + override fun readLegacyPermissionStateTEMP() {} + + override fun writeLegacyPermissionStateTEMP() {} override fun onSystemReady() { // TODO STOPSHIP privappPermissionsViolationsfix check |