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

Commit a4d981b6 authored by Manjeet Rulhania's avatar Manjeet Rulhania
Browse files

add legacy apis in permissions compat layer

Bug: 263504888
Test: presubmit & build
Change-Id: Ifd8625e29713027d52dbe4ca19d8d3e8e16db406
parent 3af2f318
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -29,7 +29,6 @@ import android.util.Log;
import android.util.Slog;

import com.android.server.pm.PackageManagerService;
import com.android.server.pm.pkg.AndroidPackage;
import com.android.server.pm.pkg.PackageState;
import com.android.server.pm.pkg.component.ParsedPermission;

@@ -106,6 +105,15 @@ public final class Permission {
        mType = type;
    }

    public Permission(@NonNull PermissionInfo permissionInfo, @PermissionType int type,
            boolean reconciled, int uid, int[] gids, boolean gidsPerUser) {
        this(permissionInfo, type);
        mReconciled = reconciled;
        mUid = uid;
        mGids = gids;
        mGidsPerUser = gidsPerUser;
    }

    @NonNull
    public PermissionInfo getPermissionInfo() {
        return mPermissionInfo;
+7 −0
Original line number Diff line number Diff line
@@ -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> =
+57 −19
Original line number Diff line number Diff line
@@ -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
@@ -1655,40 +1656,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

        return LegacyPermission2(
            permission.permissionInfo, permission.type, permission.isReconciled, permission.appId,
            permission.gids, permission.areGidsPerUser
        )
    }

    override fun getLegacyPermissions(): List<LegacyPermission> {
        // TODO("Not yet implemented")
        return emptyList()
    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))
        }

    override fun getLegacyPermissionState(appId: Int): LegacyPermissionState {
        // TODO("Not yet implemented")
        return LegacyPermissionState()
    }

    override fun readLegacyPermissionStateTEMP() {
        // TODO("Not yet implemented")
    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 writeLegacyPermissionStateTEMP() {
        // TODO("Not yet implemented")
    override fun getLegacyPermissionState(appId: Int): 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

                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 readLegacyPermissionStateTEMP() {}

    override fun writeLegacyPermissionStateTEMP() {}

    override fun onSystemReady() {
        // TODO STOPSHIP privappPermissionsViolationsfix check