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

Commit c564c8bb authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add permission flags persistence and drop invalid entries."

parents 6e6ee932 19303035
Loading
Loading
Loading
Loading
+14 −15
Original line number Diff line number Diff line
@@ -33,24 +33,23 @@ class AccessPersistence(
    private val policy: AccessPolicy
) {
    fun read(state: AccessState) {
        readSystemState(state.systemState)
        val userStates = state.userStates
        readSystemState(state)
        state.systemState.userIds.forEachIndexed { _, userId ->
            readUserState(userId, userStates[userId])
            readUserState(state, userId)
        }
    }

    private fun readSystemState(systemState: SystemState) {
    private fun readSystemState(state: AccessState) {
        systemFile.parse {
            // This is the canonical way to call an extension function in a different class.
            // TODO(b/259469752): Use context receiver for this when it becomes stable.
            with(policy) { parseSystemState(systemState) }
            with(policy) { parseSystemState(state) }
        }
    }

    private fun readUserState(userId: Int, userState: UserState) {
    private fun readUserState(state: AccessState, userId: Int) {
        getUserFile(userId).parse {
            with(policy) { parseUserState(userId, userState) }
            with(policy) { parseUserState(state, userId) }
        }
    }

@@ -65,30 +64,30 @@ class AccessPersistence(
    }

    fun write(state: AccessState) {
        writeState(state.systemState, ::writeSystemState)
        writeState(state.systemState) { writeSystemState(state) }
        state.userStates.forEachIndexed { _, userId, userState ->
            writeState(userState) { writeUserState(userId, it) }
            writeState(userState) { writeUserState(state, userId) }
        }
    }

    private inline fun <T : WritableState> writeState(state: T, write: (T) -> Unit) {
    private inline fun <T : WritableState> writeState(state: T, write: () -> Unit) {
        when (val writeMode = state.writeMode) {
            WriteMode.NONE -> {}
            WriteMode.SYNC -> write(state)
            WriteMode.SYNC -> write()
            WriteMode.ASYNC -> TODO()
            else -> error(writeMode)
        }
    }

    private fun writeSystemState(systemState: SystemState) {
    private fun writeSystemState(state: AccessState) {
        systemFile.serialize {
            with(policy) { serializeSystemState(systemState) }
            with(policy) { serializeSystemState(state) }
        }
    }

    private fun writeUserState(userId: Int, userState: UserState) {
    private fun writeUserState(state: AccessState, userId: Int) {
        getUserFile(userId).serialize {
            with(policy) { serializeUserState(userId, userState) }
            with(policy) { serializeUserState(state, userId) }
        }
    }

+12 −12
Original line number Diff line number Diff line
@@ -202,13 +202,13 @@ class AccessPolicy private constructor(
        }
    }

    fun BinaryXmlPullParser.parseSystemState(systemState: SystemState) {
    fun BinaryXmlPullParser.parseSystemState(state: AccessState) {
        forEachTag {
            when (tagName) {
                TAG_ACCESS -> {
                    forEachTag {
                        forEachSchemePolicy {
                            with(it) { parseSystemState(systemState) }
                            with(it) { parseSystemState(state) }
                        }
                    }
                }
@@ -217,21 +217,21 @@ class AccessPolicy private constructor(
        }
    }

    fun BinaryXmlSerializer.serializeSystemState(systemState: SystemState) {
    fun BinaryXmlSerializer.serializeSystemState(state: AccessState) {
        tag(TAG_ACCESS) {
            forEachSchemePolicy {
                with(it) { serializeSystemState(systemState) }
                with(it) { serializeSystemState(state) }
            }
        }
    }

    fun BinaryXmlPullParser.parseUserState(userId: Int, userState: UserState) {
    fun BinaryXmlPullParser.parseUserState(state: AccessState, userId: Int) {
        forEachTag {
            when (tagName) {
                TAG_ACCESS -> {
                    forEachTag {
                        forEachSchemePolicy {
                            with(it) { parseUserState(userId, userState) }
                            with(it) { parseUserState(state, userId) }
                        }
                    }
                }
@@ -245,10 +245,10 @@ class AccessPolicy private constructor(
        }
    }

    fun BinaryXmlSerializer.serializeUserState(userId: Int, userState: UserState) {
    fun BinaryXmlSerializer.serializeUserState(state: AccessState, userId: Int) {
        tag(TAG_ACCESS) {
            forEachSchemePolicy {
                with(it) { serializeUserState(userId, userState) }
                with(it) { serializeUserState(state, userId) }
            }
        }
    }
@@ -305,11 +305,11 @@ abstract class SchemePolicy {

    open fun MutateStateScope.onPackageUninstalled(packageName: String, appId: Int, userId: Int) {}

    open fun BinaryXmlPullParser.parseSystemState(systemState: SystemState) {}
    open fun BinaryXmlPullParser.parseSystemState(state: AccessState) {}

    open fun BinaryXmlSerializer.serializeSystemState(systemState: SystemState) {}
    open fun BinaryXmlSerializer.serializeSystemState(state: AccessState) {}

    open fun BinaryXmlPullParser.parseUserState(userId: Int, userState: UserState) {}
    open fun BinaryXmlPullParser.parseUserState(state: AccessState, userId: Int) {}

    open fun BinaryXmlSerializer.serializeUserState(userId: Int, userState: UserState) {}
    open fun BinaryXmlSerializer.serializeUserState(state: AccessState, userId: Int) {}
}
+4 −4
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ package com.android.server.permission.access.appop
import android.util.Log
import com.android.modules.utils.BinaryXmlPullParser
import com.android.modules.utils.BinaryXmlSerializer
import com.android.server.permission.access.UserState
import com.android.server.permission.access.AccessState
import com.android.server.permission.access.collection.* // ktlint-disable no-wildcard-imports
import com.android.server.permission.access.util.attributeInt
import com.android.server.permission.access.util.attributeInterned
@@ -30,9 +30,9 @@ import com.android.server.permission.access.util.tag
import com.android.server.permission.access.util.tagName

abstract class BaseAppOpPersistence {
    abstract fun BinaryXmlPullParser.parseUserState(userId: Int, userState: UserState)
    abstract fun BinaryXmlPullParser.parseUserState(state: AccessState, userId: Int)

    abstract fun BinaryXmlSerializer.serializeUserState(userId: Int, userState: UserState)
    abstract fun BinaryXmlSerializer.serializeUserState(state: AccessState, userId: Int)

    protected fun BinaryXmlPullParser.parseAppOps(appOpModes: IndexedMap<String, Int>) {
        forEachTag {
@@ -67,7 +67,7 @@ abstract class BaseAppOpPersistence {

        private const val TAG_APP_OP = "app-op"

        private const val ATTR_NAME = "name"
        private const val ATTR_MODE = "mode"
        private const val ATTR_NAME = "name"
    }
}
+5 −5
Original line number Diff line number Diff line
@@ -18,9 +18,9 @@ package com.android.server.permission.access.appop

import com.android.modules.utils.BinaryXmlPullParser
import com.android.modules.utils.BinaryXmlSerializer
import com.android.server.permission.access.AccessState
import com.android.server.permission.access.AppOpUri
import com.android.server.permission.access.SchemePolicy
import com.android.server.permission.access.UserState

abstract class BaseAppOpPolicy(
    private val persistence: BaseAppOpPersistence
@@ -28,11 +28,11 @@ abstract class BaseAppOpPolicy(
    override val objectScheme: String
        get() = AppOpUri.SCHEME

    override fun BinaryXmlPullParser.parseUserState(userId: Int, userState: UserState) {
        with(persistence) { this@parseUserState.parseUserState(userId, userState) }
    override fun BinaryXmlPullParser.parseUserState(state: AccessState, userId: Int) {
        with(persistence) { this@parseUserState.parseUserState(state, userId) }
    }

    override fun BinaryXmlSerializer.serializeUserState(userId: Int, userState: UserState) {
        with(persistence) { this@serializeUserState.serializeUserState(userId, userState) }
    override fun BinaryXmlSerializer.serializeUserState(state: AccessState, userId: Int) {
        with(persistence) { this@serializeUserState.serializeUserState(state, userId) }
    }
}
+15 −6
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package com.android.server.permission.access.appop
import android.util.Log
import com.android.modules.utils.BinaryXmlPullParser
import com.android.modules.utils.BinaryXmlSerializer
import com.android.server.permission.access.AccessState
import com.android.server.permission.access.UserState
import com.android.server.permission.access.collection.* // ktlint-disable no-wildcard-imports
import com.android.server.permission.access.util.attributeInterned
@@ -28,20 +29,28 @@ import com.android.server.permission.access.util.tag
import com.android.server.permission.access.util.tagName

class PackageAppOpPersistence : BaseAppOpPersistence() {
    override fun BinaryXmlPullParser.parseUserState(userId: Int, userState: UserState) {
    override fun BinaryXmlPullParser.parseUserState(state: AccessState, userId: Int) {
        when (tagName) {
            TAG_PACKAGE_APP_OPS -> parsePackageAppOps(userState)
            TAG_PACKAGE_APP_OPS -> parsePackageAppOps(state, userId)
            else -> {}
        }
    }

    private fun BinaryXmlPullParser.parsePackageAppOps(userState: UserState) {
    private fun BinaryXmlPullParser.parsePackageAppOps(state: AccessState, userId: Int) {
        val userState = state.userStates[userId]
        forEachTag {
            when (tagName) {
                TAG_PACKAGE -> parsePackage(userState)
                else -> Log.w(LOG_TAG, "Ignoring unknown tag $name when parsing app-op state")
            }
        }
        userState.packageAppOpModes.retainAllIndexed { _, packageName, _ ->
            val hasPackage = packageName in state.systemState.packageStates
            if (!hasPackage) {
                Log.w(LOG_TAG, "Dropping unknown package $packageName when parsing app-op state")
            }
            hasPackage
        }
    }

    private fun BinaryXmlPullParser.parsePackage(userState: UserState) {
@@ -51,8 +60,8 @@ class PackageAppOpPersistence : BaseAppOpPersistence() {
        parseAppOps(appOpModes)
    }

    override fun BinaryXmlSerializer.serializeUserState(userId: Int, userState: UserState) {
        serializePackageAppOps(userState)
    override fun BinaryXmlSerializer.serializeUserState(state: AccessState, userId: Int) {
        serializePackageAppOps(state.userStates[userId])
    }

    private fun BinaryXmlSerializer.serializePackageAppOps(userState: UserState) {
@@ -76,8 +85,8 @@ class PackageAppOpPersistence : BaseAppOpPersistence() {
    companion object {
        private val LOG_TAG = PackageAppOpPersistence::class.java.simpleName

        private const val TAG_PACKAGE_APP_OPS = "package-app-ops"
        private const val TAG_PACKAGE = "package"
        private const val TAG_PACKAGE_APP_OPS = "package-app-ops"

        private const val ATTR_NAME = "name"
    }
Loading