diff options
| author | 2024-11-14 13:25:06 +0000 | |
|---|---|---|
| committer | 2024-11-14 13:25:06 +0000 | |
| commit | 9893f1040b8f586da8fb57180b01b8452aaf1ba5 (patch) | |
| tree | 151126334f5f9ef9f57f612fa69e54427554d1c6 | |
| parent | 5c0c91dd7b39680af35ed0eee34fec43f608dff1 (diff) | |
| parent | 10a7d33594fc2c185214fee9d17797386d95a89d (diff) | |
Merge changes Ia7918022,Iabd5a4e9 into main
* changes:
Remove permission based active admin.
Remove mActiveAdmin from EnforcingAdmin
5 files changed, 120 insertions, 52 deletions
diff --git a/core/java/android/app/admin/flags/flags.aconfig b/core/java/android/app/admin/flags/flags.aconfig index 404471e266d2..0088925a2c4f 100644 --- a/core/java/android/app/admin/flags/flags.aconfig +++ b/core/java/android/app/admin/flags/flags.aconfig @@ -343,6 +343,16 @@ flag { } flag { + name: "active_admin_cleanup" + namespace: "enterprise" + description: "Remove ActiveAdmin from EnforcingAdmin and related cleanups" + bug: "335663055" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "user_provisioning_same_state" namespace: "enterprise" description: "Handle exceptions while setting same provisioning state." diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java index b982098fefa4..76d16e19e774 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/ActiveAdmin.java @@ -371,6 +371,9 @@ class ActiveAdmin { } ActiveAdmin(int userId, boolean permissionBased) { + if (Flags.activeAdminCleanup()) { + throw new UnsupportedOperationException("permission based admin no longer supported"); + } if (permissionBased == false) { throw new IllegalArgumentException("Can only pass true for permissionBased admin"); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java index 395ea9176877..c937e10a28ce 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyData.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.admin.DeviceAdminInfo; import android.app.admin.DevicePolicyManager; +import android.app.admin.flags.Flags; import android.content.ComponentName; import android.os.FileUtils; import android.os.PersistableBundle; @@ -124,17 +125,18 @@ class DevicePolicyData { final ArrayList<ActiveAdmin> mAdminList = new ArrayList<>(); final ArrayList<ComponentName> mRemovingAdmins = new ArrayList<>(); - // Some DevicePolicyManager APIs can be called by (1) a DPC or (2) an app with permissions that - // isn't a DPC. For the latter, the caller won't have to provide a ComponentName and won't be - // mapped to an ActiveAdmin. This permission-based admin should be used to persist policies - // set by the permission-based caller. This admin should not be added to mAdminMap or mAdminList - // since a lot of methods in DPMS assume the ActiveAdmins here have a valid ComponentName. - // Instead, use variants of DPMS active admin getters to include the permission-based admin. + /** + * @deprecated Do not use. Policies set by permission holders must go into DevicePolicyEngine. + */ + @Deprecated ActiveAdmin mPermissionBasedAdmin; // Create or get the permission-based admin. The permission-based admin will not have a // DeviceAdminInfo or ComponentName. ActiveAdmin createOrGetPermissionBasedAdmin(int userId) { + if (Flags.activeAdminCleanup()) { + throw new UnsupportedOperationException("permission based admin no longer supported"); + } if (mPermissionBasedAdmin == null) { mPermissionBasedAdmin = new ActiveAdmin(userId, /* permissionBased= */ true); } @@ -147,7 +149,7 @@ class DevicePolicyData { // This is the list of component allowed to start lock task mode. List<String> mLockTaskPackages = new ArrayList<>(); - /** @deprecated moved to {@link ActiveAdmin#protectedPackages}. */ + /** @deprecated moved to DevicePolicyEngine. */ @Deprecated @Nullable List<String> mUserControlDisabledPackages; @@ -280,7 +282,7 @@ class DevicePolicyData { } } - if (policyData.mPermissionBasedAdmin != null) { + if (!Flags.activeAdminCleanup() && policyData.mPermissionBasedAdmin != null) { out.startTag(null, "permission-based-admin"); policyData.mPermissionBasedAdmin.writeToXml(out); out.endTag(null, "permission-based-admin"); @@ -521,7 +523,8 @@ class DevicePolicyData { } catch (RuntimeException e) { Slogf.w(TAG, e, "Failed loading admin %s", name); } - } else if ("permission-based-admin".equals(tag)) { + } else if (!Flags.activeAdminCleanup() && "permission-based-admin".equals(tag)) { + ActiveAdmin ap = new ActiveAdmin(policy.mUserId, /* permissionBased= */ true); ap.readFromXml(parser, /* overwritePolicies= */ false); policy.mPermissionBasedAdmin = ap; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 90c3dff86280..ad7e21c6ac82 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -3978,7 +3978,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int N = admins.size(); for (int i = 0; i < N; i++) { ActiveAdmin admin = admins.get(i); - if ((admin.isPermissionBased || admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)) + if (((!Flags.activeAdminCleanup() && admin.isPermissionBased) + || admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)) && admin.passwordExpirationTimeout > 0L && now >= admin.passwordExpirationDate - EXPIRATION_GRACE_PERIOD_MS && admin.passwordExpirationDate > 0L) { @@ -5575,13 +5576,25 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { caller.getUserId()); Preconditions.checkArgument(!calledOnParent || isProfileOwner(caller)); - ActiveAdmin activeAdmin = admin.getActiveAdmin(); + final ActiveAdmin activeAdmin; + if (Flags.activeAdminCleanup()) { + if (admin.hasAuthority(EnforcingAdmin.DPC_AUTHORITY)) { + synchronized (getLockObject()) { + activeAdmin = getActiveAdminUncheckedLocked( + admin.getComponentName(), admin.getUserId()); + } + } else { + activeAdmin = null; + } + } else { + activeAdmin = admin.getActiveAdmin(); + } // We require the caller to explicitly clear any password quality requirements set // on the parent DPM instance, to avoid the case where password requirements are // specified in the form of quality on the parent but complexity on the profile // itself. - if (!calledOnParent) { + if (activeAdmin != null && !calledOnParent) { final boolean hasQualityRequirementsOnParent = activeAdmin.hasParentActiveAdmin() && activeAdmin.getParentActiveAdmin().mPasswordPolicy.quality != PASSWORD_QUALITY_UNSPECIFIED; @@ -5605,20 +5618,22 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } mInjector.binderWithCleanCallingIdentity(() -> { - // Reset the password policy. - if (calledOnParent) { - activeAdmin.getParentActiveAdmin().mPasswordPolicy = new PasswordPolicy(); - } else { - activeAdmin.mPasswordPolicy = new PasswordPolicy(); + if (activeAdmin != null) { + // Reset the password policy. + if (calledOnParent) { + activeAdmin.getParentActiveAdmin().mPasswordPolicy = new PasswordPolicy(); + } else { + activeAdmin.mPasswordPolicy = new PasswordPolicy(); + } + updatePasswordQualityCacheForUserGroup(caller.getUserId()); } + synchronized (getLockObject()) { updatePasswordValidityCheckpointLocked(caller.getUserId(), calledOnParent); } - updatePasswordQualityCacheForUserGroup(caller.getUserId()); saveSettingsLocked(caller.getUserId()); }); - DevicePolicyEventLogger .createEvent(DevicePolicyEnums.SET_PASSWORD_COMPLEXITY) .setAdmin(caller.getPackageName()) @@ -6299,28 +6314,33 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final int callingUserId = caller.getUserId(); ComponentName adminComponent = null; synchronized (getLockObject()) { - ActiveAdmin admin; // Make sure the caller has any active admin with the right policy or // the required permission. if (Flags.lockNowCoexistence()) { - admin = enforcePermissionsAndGetEnforcingAdmin( + EnforcingAdmin enforcingAdmin = enforcePermissionsAndGetEnforcingAdmin( /* admin= */ null, /* permissions= */ new String[]{MANAGE_DEVICE_POLICY_LOCK, LOCK_DEVICE}, /* deviceAdminPolicy= */ USES_POLICY_FORCE_LOCK, caller.getPackageName(), getAffectedUser(parent) - ).getActiveAdmin(); + ); + if (Flags.activeAdminCleanup()) { + adminComponent = enforcingAdmin.getComponentName(); + } else { + ActiveAdmin admin = enforcingAdmin.getActiveAdmin(); + adminComponent = admin == null ? null : admin.info.getComponent(); + } } else { - admin = getActiveAdminOrCheckPermissionForCallerLocked( + ActiveAdmin admin = getActiveAdminOrCheckPermissionForCallerLocked( null, DeviceAdminInfo.USES_POLICY_FORCE_LOCK, parent, LOCK_DEVICE); + adminComponent = admin == null ? null : admin.info.getComponent(); } checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_LOCK_NOW); final long ident = mInjector.binderClearCallingIdentity(); try { - adminComponent = admin == null ? null : admin.info.getComponent(); if (adminComponent != null) { // For Profile Owners only, callers with only permission not allowed. if ((flags & DevicePolicyManager.FLAG_EVICT_CREDENTIAL_ENCRYPTION_KEY) != 0) { @@ -7789,7 +7809,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { USES_POLICY_WIPE_DATA, caller.getPackageName(), factoryReset ? UserHandle.USER_ALL : getAffectedUser(calledOnParentInstance)); - ActiveAdmin admin = enforcingAdmin.getActiveAdmin(); checkCanExecuteOrThrowUnsafe(DevicePolicyManager.OPERATION_WIPE_DATA); @@ -7798,10 +7817,20 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { calledByProfileOwnerOnOrgOwnedDevice, calledOnParentInstance); } - int userId = admin != null ? admin.getUserHandle().getIdentifier() - : caller.getUserId(); - Slogf.i(LOG_TAG, "wipeDataWithReason(%s): admin=%s, user=%d", wipeReasonForUser, admin, - userId); + int userId; + ActiveAdmin admin = null; + if (Flags.activeAdminCleanup()) { + userId = enforcingAdmin.getUserId(); + Slogf.i(LOG_TAG, "wipeDataWithReason(%s): admin=%s, user=%d", wipeReasonForUser, + enforcingAdmin, userId); + } else { + admin = enforcingAdmin.getActiveAdmin(); + userId = admin != null ? admin.getUserHandle().getIdentifier() + : caller.getUserId(); + Slogf.i(LOG_TAG, "wipeDataWithReason(%s): admin=%s, user=%d", wipeReasonForUser, admin, + userId); + } + if (calledByProfileOwnerOnOrgOwnedDevice) { // When wipeData is called on the parent instance, it implies wiping the entire device. if (calledOnParentInstance) { @@ -7822,25 +7851,36 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final String adminName; final ComponentName adminComp; - if (admin != null) { - if (admin.isPermissionBased) { + if (Flags.activeAdminCleanup()) { + adminComp = enforcingAdmin.getComponentName(); + adminName = adminComp != null + ? adminComp.flattenToShortString() + : enforcingAdmin.getPackageName(); + event.setAdmin(enforcingAdmin.getPackageName()); + // Not including any HSUM handling here because the "else" branch in the "flag off" + // case below is unreachable under normal circumstances and for permission-based + // callers admin won't be null. + } else { + if (admin != null) { + if (admin.isPermissionBased) { + adminComp = null; + adminName = caller.getPackageName(); + event.setAdmin(adminName); + } else { + adminComp = admin.info.getComponent(); + adminName = adminComp.flattenToShortString(); + event.setAdmin(adminComp); + } + } else { adminComp = null; - adminName = caller.getPackageName(); + adminName = mInjector.getPackageManager().getPackagesForUid(caller.getUid())[0]; + Slogf.i(LOG_TAG, "Logging wipeData() event admin as " + adminName); event.setAdmin(adminName); - } else { - adminComp = admin.info.getComponent(); - adminName = adminComp.flattenToShortString(); - event.setAdmin(adminComp); - } - } else { - adminComp = null; - adminName = mInjector.getPackageManager().getPackagesForUid(caller.getUid())[0]; - Slogf.i(LOG_TAG, "Logging wipeData() event admin as " + adminName); - event.setAdmin(adminName); - if (mInjector.userManagerIsHeadlessSystemUserMode()) { - // On headless system user mode, the call is meant to factory reset the whole - // device, otherwise the caller could simply remove the current user. - userId = UserHandle.USER_SYSTEM; + if (mInjector.userManagerIsHeadlessSystemUserMode()) { + // On headless system user mode, the call is meant to factory reset the whole + // device, otherwise the caller could simply remove the current user. + userId = UserHandle.USER_SYSTEM; + } } } event.write(); @@ -8328,7 +8368,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { List<ActiveAdmin> admins = getActiveAdminsForLockscreenPoliciesLocked(userHandle); for (int i = 0; i < admins.size(); i++) { ActiveAdmin admin = admins.get(i); - if (admin.isPermissionBased || admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)) { + if ((!Flags.activeAdminCleanup() && admin.isPermissionBased) + || admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_EXPIRE_PASSWORD)) { affectedUserIds.add(admin.getUserHandle().getIdentifier()); long timeout = admin.passwordExpirationTimeout; admin.passwordExpirationDate = @@ -8422,7 +8463,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { */ private int getUserIdToWipeForFailedPasswords(ActiveAdmin admin) { final int userId = admin.getUserHandle().getIdentifier(); - if (admin.isPermissionBased) { + if (!Flags.activeAdminCleanup() && admin.isPermissionBased) { return userId; } final ComponentName component = admin.info.getComponent(); @@ -16326,7 +16367,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (admin.mPasswordPolicy.quality < minPasswordQuality) { return false; } - return admin.isPermissionBased || admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD); + return (!Flags.activeAdminCleanup() && admin.isPermissionBased) + || admin.info.usesPolicy(DeviceAdminInfo.USES_POLICY_LIMIT_PASSWORD); } @Override @@ -23410,7 +23452,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { return EnforcingAdmin.createDeviceAdminEnforcingAdmin(admin.info.getComponent(), userId, admin); } - admin = getUserData(userId).createOrGetPermissionBasedAdmin(userId); + admin = Flags.activeAdminCleanup() + ? null : getUserData(userId).createOrGetPermissionBasedAdmin(userId); return EnforcingAdmin.createEnforcingAdmin(caller.getPackageName(), userId, admin); } @@ -23433,8 +23476,8 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } } - - admin = getUserData(userId).createOrGetPermissionBasedAdmin(userId); + admin = Flags.activeAdminCleanup() + ? null : getUserData(userId).createOrGetPermissionBasedAdmin(userId); return EnforcingAdmin.createEnforcingAdmin(packageName, userId, admin); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java b/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java index 58e3a7d236b4..1fd628a20afa 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/EnforcingAdmin.java @@ -23,6 +23,7 @@ import android.app.admin.DeviceAdminAuthority; import android.app.admin.DpcAuthority; import android.app.admin.RoleAuthority; import android.app.admin.UnknownAuthority; +import android.app.admin.flags.Flags; import android.content.ComponentName; import android.os.UserHandle; @@ -295,9 +296,17 @@ final class EnforcingAdmin { @Nullable public ActiveAdmin getActiveAdmin() { + if (Flags.activeAdminCleanup()) { + throw new UnsupportedOperationException("getActiveAdmin() no longer supported"); + } return mActiveAdmin; } + @Nullable + ComponentName getComponentName() { + return mComponentName; + } + @NonNull android.app.admin.EnforcingAdmin getParcelableAdmin() { Authority authority; |