summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Menghan Li <menghanli@google.com> 2023-03-17 03:02:13 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2023-03-17 03:02:13 +0000
commit223802d6f4f6a1f1949b1297a85dce1c4a88a903 (patch)
treed0871f6596f83e964241ed1cf36ea8667329316a
parentaf5033e80b7f74611f7358ae599bc756de7104b8 (diff)
parent125d1d9bc04c41c3f60e7c8b057c6d5f5f76fd3d (diff)
Merge "Avoid A11y features blocked by IT admin can be allowed to bind at the system level" into udc-dev
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java50
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java39
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);
}
}