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

Commit 5186dea4 authored by Nate Myren's avatar Nate Myren
Browse files

Add xml pregrants for appfunction access

These pregrants, run on every fingerprint change, will allow a system
agent access to system targets. The pregrant files have the following
format:
<pregrants>
  <agent package="com.example.agent">
    <target package="com.example.target.1"/>
    <target package="com.example.target.2"/>
  </agent>
</pregrants>

Flag: android.permission.flags.app_function_access_service_enabled
Bug: 413087113
Test: atestAppFunctionAccessPregrantTest
Change-Id: I17fa3f7df39ed24db0602225629699ffdd98a25a
parent 3df32c4e
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -57,4 +57,7 @@ public interface AppFunctionAccessServiceInterface {
    /** @see AppFunctionManager#getValidTargets(String) () */
    @NonNull
    List<String> getValidTargets(int userId);

    /** Should be called whenever a user starts */
    void onUserStarting(int userId);
}
+5 −0
Original line number Diff line number Diff line
@@ -96,4 +96,9 @@ public class AppFunctionManagerService extends SystemService {
    public void onUserStopping(@NonNull TargetUser user) {
        mServiceImpl.onUserStopping(user);
    }

    @Override
    public void onUserStarting(@NonNull TargetUser user) {
        mServiceImpl.onUserStarting(user);
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -259,6 +259,11 @@ public class AppFunctionManagerServiceImpl extends IAppFunctionManager.Stub {
        }
    }

    /** Called when a the user is starting. */
    public void onUserStarting(@NonNull TargetUser user) {
        mAppFunctionAccessService.onUserStarting(user.getUserIdentifier());
    }

    /** Called when the user is stopping. */
    public void onUserStopping(@NonNull TargetUser user) {
        Objects.requireNonNull(user);
+22 −0
Original line number Diff line number Diff line
@@ -345,6 +345,7 @@ private constructor(
                            TAG_PACKAGE_VERSIONS -> parsePackageVersions(state, userId)
                            TAG_DEFAULT_PERMISSION_GRANT ->
                                parseDefaultPermissionGrant(state, userId)
                            TAG_APP_FUNCTION_PREGRANT -> parseAppFunctionPregrant(state, userId)
                            else -> {
                                forEachSchemePolicy { with(it) { parseUserState(state, userId) } }
                            }
@@ -396,12 +397,24 @@ private constructor(
        userState.setDefaultPermissionGrantFingerprint(fingerprint)
    }

    private fun BinaryXmlPullParser.parseAppFunctionPregrant(
        state: MutableAccessState,
        userId: Int,
    ) {
        val userState = state.mutateUserState(userId, WriteMode.NONE)!!
        val fingerprint = getAttributeValueOrThrow(ATTR_FINGERPRINT).intern()
        userState.appFunctionAccessPregrantFingerprint = fingerprint
    }

    fun BinaryXmlSerializer.serializeUserState(state: AccessState, userId: Int) {
        tag(TAG_ACCESS) {
            serializePackageVersions(state.userStates[userId]!!.packageVersions)
            serializeDefaultPermissionGrantFingerprint(
                state.userStates[userId]!!.defaultPermissionGrantFingerprint
            )
            serializeAppFunctionAccessPregrantFingerprint(
                state.userStates[userId]!!.appFunctionAccessPregrantFingerprint
            )
            forEachSchemePolicy { with(it) { serializeUserState(state, userId) } }
        }
    }
@@ -427,6 +440,14 @@ private constructor(
        }
    }

    private fun BinaryXmlSerializer.serializeAppFunctionAccessPregrantFingerprint(
        fingerprint: String?
    ) {
        if (fingerprint != null) {
            tag(TAG_APP_FUNCTION_PREGRANT) { attributeInterned(ATTR_FINGERPRINT, fingerprint) }
        }
    }

    private fun getSchemePolicy(subject: AccessUri, `object`: AccessUri): SchemePolicy =
        getSchemePolicy(subject.scheme, `object`.scheme)

@@ -443,6 +464,7 @@ private constructor(

        private const val TAG_ACCESS = "access"
        private const val TAG_DEFAULT_PERMISSION_GRANT = "default-permission-grant"
        private const val TAG_APP_FUNCTION_PREGRANT = "app-function-pregrant"
        private const val TAG_PACKAGE_VERSIONS = "package-versions"
        private const val TAG_PACKAGE = "package"

+7 −0
Original line number Diff line number Diff line
@@ -408,6 +408,7 @@ sealed class UserState(
    internal val packageAppOpModesReference: PackageAppOpModesReference,
    internal val appIdAppFunctionAccessFlagsReference: AppIdAppFunctionAccessFlagsReference,
    defaultPermissionGrantFingerprint: String?,
    appFunctionAccessPregrantFingerprint: String?,
    writeMode: Int,
) : WritableState, Immutable<MutableUserState> {
    val packageVersions: IndexedMap<String, Int>
@@ -431,6 +432,8 @@ sealed class UserState(
    var defaultPermissionGrantFingerprint: String? = defaultPermissionGrantFingerprint
        protected set

    var appFunctionAccessPregrantFingerprint: String? = appFunctionAccessPregrantFingerprint

    override var writeMode: Int = writeMode
        protected set

@@ -446,6 +449,7 @@ private constructor(
    packageAppOpModesReference: PackageAppOpModesReference,
    appIdAppFunctionAccessFlagsReference: AppIdAppFunctionAccessFlagsReference,
    defaultPermissionGrantFingerprint: String?,
    appFunctionAccessPregrantFingerprint: String?,
    writeMode: Int,
) :
    UserState(
@@ -456,6 +460,7 @@ private constructor(
        packageAppOpModesReference,
        appIdAppFunctionAccessFlagsReference,
        defaultPermissionGrantFingerprint,
        appFunctionAccessPregrantFingerprint,
        writeMode,
    ),
    MutableWritableState {
@@ -468,6 +473,7 @@ private constructor(
            PackageAppOpModesReference(MutablePackageAppOpModes()),
            AppIdAppFunctionAccessFlagsReference(MutableAppIdAppFunctionAccessFlags()),
            null,
            null,
            WriteMode.NONE,
        )

@@ -481,6 +487,7 @@ private constructor(
        userState.packageAppOpModesReference.toImmutable(),
        userState.appIdAppFunctionAccessFlagsReference.toImmutable(),
        userState.defaultPermissionGrantFingerprint,
        userState.appFunctionAccessPregrantFingerprint,
        WriteMode.NONE,
    )

Loading