diff options
| author | 2023-03-17 03:02:13 +0000 | |
|---|---|---|
| committer | 2023-03-17 03:02:13 +0000 | |
| commit | 223802d6f4f6a1f1949b1297a85dce1c4a88a903 (patch) | |
| tree | d0871f6596f83e964241ed1cf36ea8667329316a | |
| parent | af5033e80b7f74611f7358ae599bc756de7104b8 (diff) | |
| parent | 125d1d9bc04c41c3f60e7c8b057c6d5f5f76fd3d (diff) | |
Merge "Avoid A11y features blocked by IT admin can be allowed to bind at the system level" into udc-dev
2 files changed, 48 insertions, 41 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index d422f9a1ab63..0edb8f27d413 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -2263,6 +2263,15 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } if (userState.mEnabledServices.contains(componentName) && !mUiAutomationManager.suppressingAccessibilityServicesLocked()) { + // Skip the enabling service disallowed by device admin policy. + if (!isAccessibilityTargetAllowed(componentName.getPackageName(), + installedService.getResolveInfo().serviceInfo.applicationInfo.uid, + userState.mUserId)) { + Slog.d(LOG_TAG, "Skipping enabling service disallowed by device admin policy: " + + componentName); + disableAccessibilityServiceLocked(componentName, userState.mUserId); + continue; + } if (service == null) { service = new AccessibilityServiceConnection(userState, mContext, componentName, installedService, sIdCounter++, mMainHandler, mLock, mSecurityPolicy, @@ -3875,32 +3884,29 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } - @Override - @RequiresPermission(anyOf = { - android.Manifest.permission.MANAGE_USERS, - android.Manifest.permission.QUERY_ADMIN_POLICY}) public boolean isAccessibilityTargetAllowed(String packageName, int uid, int userId) { - final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); - final List<String> permittedServices = dpm.getPermittedAccessibilityServices(userId); - - // permittedServices null means all accessibility services are allowed. - boolean allowed = permittedServices == null || permittedServices.contains(packageName); - if (allowed) { - final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class); - final int mode = appOps.noteOpNoThrow( - AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS, - uid, packageName, /* attributionTag= */ null, /* message= */ null); - final boolean ecmEnabled = mContext.getResources().getBoolean( - R.bool.config_enhancedConfirmationModeEnabled); - return !ecmEnabled || mode == AppOpsManager.MODE_ALLOWED; + final long identity = Binder.clearCallingIdentity(); + try { + final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); + final List<String> permittedServices = dpm.getPermittedAccessibilityServices(userId); + + // permittedServices null means all accessibility services are allowed. + boolean allowed = permittedServices == null || permittedServices.contains(packageName); + if (allowed) { + final AppOpsManager appOps = mContext.getSystemService(AppOpsManager.class); + final int mode = appOps.noteOpNoThrow( + AppOpsManager.OP_ACCESS_RESTRICTED_SETTINGS, + uid, packageName, /* attributionTag= */ null, /* message= */ null); + final boolean ecmEnabled = mContext.getResources().getBoolean( + R.bool.config_enhancedConfirmationModeEnabled); + return !ecmEnabled || mode == AppOpsManager.MODE_ALLOWED; + } + return false; + } finally { + Binder.restoreCallingIdentity(identity); } - return false; } - @Override - @RequiresPermission(anyOf = { - android.Manifest.permission.MANAGE_USERS, - android.Manifest.permission.QUERY_ADMIN_POLICY}) public boolean sendRestrictedDialogIntent(String packageName, int uid, int userId) { // The accessibility service is allowed. Don't show the restricted dialog. if (isAccessibilityTargetAllowed(packageName, uid, userId)) { diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 835c92348abc..746672968da5 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -11779,6 +11779,20 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { final CallerIdentity caller = getCallerIdentity(); Preconditions.checkCallAuthorization(canManageUsers(caller) || canQueryAdminPolicy(caller)); + // Move AccessibilityManager out of lock to prevent potential deadlock + final List<AccessibilityServiceInfo> installedServices; + long id = mInjector.binderClearCallingIdentity(); + try { + UserInfo user = getUserInfo(userId); + if (user.isManagedProfile()) { + userId = user.profileGroupId; + } + installedServices = withAccessibilityManager(userId, + AccessibilityManager::getInstalledAccessibilityServiceList); + } finally { + mInjector.binderRestoreCallingIdentity(id); + } + synchronized (getLockObject()) { List<String> result = null; // If we have multiple profiles we return the intersection of the @@ -11805,27 +11819,14 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // If we have a permitted list add all system accessibility services. if (result != null) { - long id = mInjector.binderClearCallingIdentity(); - try { - UserInfo user = getUserInfo(userId); - if (user.isManagedProfile()) { - userId = user.profileGroupId; - } - final List<AccessibilityServiceInfo> installedServices = - withAccessibilityManager(userId, - AccessibilityManager::getInstalledAccessibilityServiceList); - - if (installedServices != null) { - for (AccessibilityServiceInfo service : installedServices) { - ServiceInfo serviceInfo = service.getResolveInfo().serviceInfo; - ApplicationInfo applicationInfo = serviceInfo.applicationInfo; - if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { - result.add(serviceInfo.packageName); - } + if (installedServices != null) { + for (AccessibilityServiceInfo service : installedServices) { + ServiceInfo serviceInfo = service.getResolveInfo().serviceInfo; + ApplicationInfo applicationInfo = serviceInfo.applicationInfo; + if ((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { + result.add(serviceInfo.packageName); } } - } finally { - mInjector.binderRestoreCallingIdentity(id); } } |