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

Commit b9994c44 authored by Rafael Prado's avatar Rafael Prado
Browse files

Update permission grant state DPE migration code.

Test: Updated permissions on TestDPC with flags off, then enabled and verified permissions were in the right state.
Flag: android.app.admin.flags.set_permission_grant_state_coexistence
Bug: 370472975
Change-Id: I344834b0fb78e541d4c85ae41968e04fbaeab32c
parent 1d687887
Loading
Loading
Loading
Loading
+58 −45
Original line number Diff line number Diff line
@@ -24335,10 +24335,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
                synchronized (getLockObject()) {
                    Slogf.i(LOG_TAG,
                            "Started device policies migration to the device policy engine.");
                    // TODO(b/359188869): Move this to the current migration method.
                    if (Flags.setPermissionGrantStateCoexistence()) {
                        migratePermissionGrantStatePolicies();
                    }
                    migratePermittedInputMethodsPolicyLocked();
                    migrateAccountManagementDisabledPolicyLocked();
                    migrateUserControlDisabledPackagesLocked();
@@ -24382,6 +24378,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
            Slogf.i(LOG_TAG, "Backup made: " + memoryTaggingBackupId);
        }
        String permissionBackupId = "37.1.permission-support";
        boolean permissionMigrated =
                maybeMigratePermissionGrantStatePoliciesLocked(permissionBackupId);
        if (permissionMigrated) {
            Slogf.i(LOG_TAG, "Backup made: " + permissionBackupId);
        }
        // Additional migration steps should repeat the pattern above with a new backupId.
    }
@@ -24417,16 +24420,21 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
        return true;
    }
    private void migratePermissionGrantStatePolicies() {
    private boolean maybeMigratePermissionGrantStatePoliciesLocked(String backupId) {
        Slogf.i(LOG_TAG, "Migrating PERMISSION_GRANT policy to device policy engine.");
        for (UserInfo userInfo : mUserManager.getUsers()) {
            ActiveAdmin admin = getMostProbableDPCAdminForLocalPolicy(userInfo.id);
            if (admin == null) {
                Slogf.i(LOG_TAG, "No admin found that can set permission grant state on user "
                        + userInfo.id);
                continue;
        if (!Flags.setPermissionGrantStateCoexistence() || !Flags.dpeBasedOnAsyncApisEnabled()) {
            return false;
        }
        if (mOwners.isPermissionGrantStateMigrated()) {
            return false;
        }
            for (PackageInfo packageInfo : getInstalledPackagesOnUser(userInfo.id)) {
        // Create backup if none exists
        mDevicePolicyEngine.createBackup(backupId);
        try {
            iterateThroughDpcAdminsLocked((admin, enforcingAdmin) -> {
                int userId = enforcingAdmin.getUserId();
                for (PackageInfo packageInfo : getInstalledPackagesOnUser(userId)) {
                    if (packageInfo.requestedPermissions == null) {
                        continue;
                    }
@@ -24439,10 +24447,10 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
                            grantState = getPermissionGrantStateForUser(
                                    packageInfo.packageName, permission,
                                    new CallerIdentity(
                                        mInjector.binderGetCallingUid(),
                                            admin.getUid(),
                                            admin.info.getComponent().getPackageName(),
                                            admin.info.getComponent()),
                                userInfo.id);
                                    userId);
                        } catch (RemoteException e) {
                            Slogf.e(LOG_TAG, e, "Error retrieving permission grant state for %s "
                                    + "and %s", packageInfo.packageName, permission);
@@ -24452,18 +24460,23 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
                            continue;
                        }
                    mDevicePolicyEngine.setLocalPolicy(
                        var unused = mDevicePolicyEngine.setLocalPolicy(
                                PolicyDefinition.PERMISSION_GRANT(packageInfo.packageName,
                                        permission),
                            EnforcingAdmin.createEnterpriseEnforcingAdmin(
                                    admin.info.getComponent(),
                                    admin.getUserHandle().getIdentifier()),
                                enforcingAdmin,
                                new IntegerPolicyValue(grantState),
                            userInfo.id,
                                userId,
                                /* skipEnforcePolicy= */ true);
                    }
                }
            });
        } catch (Exception e) {
            Slog.wtf(LOG_TAG, "Failed to migrate Permission Grant State to policy engine", e);
        }
        Slog.i(LOG_TAG, "Marking Permission Grant State migration complete");
        mOwners.markPermissionGrantStateMigrated();
        return true;
    }
    private void migrateScreenCapturePolicyLocked() {
+13 −0
Original line number Diff line number Diff line
@@ -650,6 +650,19 @@ class Owners {
        }
    }

    void markPermissionGrantStateMigrated() {
        synchronized (mData) {
            mData.mPermissionGrantStateMigrated = true;
            mData.writeDeviceOwner();
        }
    }

    boolean isPermissionGrantStateMigrated() {
        synchronized (mData) {
            return mData.mPermissionGrantStateMigrated;
        }
    }

    void markSetKeyguardDisabledFeaturesMigrated() {
        synchronized (mData) {
            mData.mSetKeyguardDisabledFeaturesMigrated = true;
+12 −0
Original line number Diff line number Diff line
@@ -97,6 +97,8 @@ class OwnersData {
            "memoryTaggingMigrated";
    private static final String ATTR_SET_KEYGUARD_DISABLED_FEATURES_MIGRATED =
            "setKeyguardDisabledFeaturesMigrated";
    private static final String ATTR_PERMISSION_GRANT_STATE_MIGRATED =
            "permissionGrantStateMigrated";

    private static final String ATTR_MIGRATED_POST_UPGRADE = "migratedPostUpgrade";

@@ -132,6 +134,7 @@ class OwnersData {
    boolean mResetPasswordWithTokenMigrated = false;
    boolean mMemoryTaggingMigrated = false;
    boolean mSetKeyguardDisabledFeaturesMigrated = false;
    boolean mPermissionGrantStateMigrated = false;

    boolean mPoliciesMigratedPostUpdate = false;

@@ -439,6 +442,10 @@ class OwnersData {
                out.attributeBoolean(null, ATTR_SET_KEYGUARD_DISABLED_FEATURES_MIGRATED,
                        mSetKeyguardDisabledFeaturesMigrated);
            }
            if (Flags.setPermissionGrantStateCoexistence() && Flags.dpeBasedOnAsyncApisEnabled()) {
                out.attributeBoolean(null, ATTR_PERMISSION_GRANT_STATE_MIGRATED,
                        mPermissionGrantStateMigrated);
            }
            out.endTag(null, TAG_POLICY_ENGINE_MIGRATION);

        }
@@ -518,6 +525,11 @@ class OwnersData {
                            Flags.setKeyguardDisabledFeaturesCoexistence()
                                    && parser.getAttributeBoolean(null,
                                    ATTR_SET_KEYGUARD_DISABLED_FEATURES_MIGRATED, false);
                    mPermissionGrantStateMigrated =
                            Flags.setPermissionGrantStateCoexistence()
                                    && Flags.dpeBasedOnAsyncApisEnabled()
                                    && parser.getAttributeBoolean(null,
                                    ATTR_PERMISSION_GRANT_STATE_MIGRATED, false);
                    break;
                default:
                    Slog.e(TAG, "Unexpected tag: " + tag);