diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 8b51124d911ac..d317e82cc095b 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1995,13 +1995,12 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final DevicePolicyData policy = getUserData(UserHandle.getUserId(callerUid)); ActiveAdmin admin = policy.mAdminMap.get(adminComponent); - if (admin == null) { + // Throwing combined exception message for both the cases here, because from different + // security exceptions it could be deduced if particular package is admin package. + if (admin == null || admin.getUid() != callerUid) { throw new SecurityException(String.format( - "No active admin for %s", adminComponent)); - } - if (admin.getUid() != callerUid) { - throw new SecurityException(String.format( - "Admin %s is not owned by uid %d", adminComponent, callerUid)); + "Admin %s does not exist or is not owned by uid %d", adminComponent, + callerUid)); } if (callerPackage != null) { Preconditions.checkArgument(callerPackage.equals(adminComponent.getPackageName())); @@ -8181,17 +8180,16 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { */ @Override public boolean getCameraDisabled(ComponentName who, int userHandle, boolean parent) { - return getCameraDisabled(who, userHandle, /* mergeDeviceOwnerRestriction= */ true, parent); - } - - private boolean getCameraDisabled(ComponentName who, int userHandle, - boolean mergeDeviceOwnerRestriction, boolean parent) { if (!mHasFeature) { return false; } + + final CallerIdentity caller = getCallerIdentity(who); + Preconditions.checkCallAuthorization(hasFullCrossUsersPermission(caller, userHandle)); + if (parent) { Preconditions.checkCallAuthorization( - isProfileOwnerOfOrganizationOwnedDevice(getCallerIdentity().getUserId())); + isProfileOwnerOfOrganizationOwnedDevice(caller.getUserId())); } synchronized (getLockObject()) { @@ -8200,17 +8198,15 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { return (admin != null) && admin.disableCamera; } // First, see if DO has set it. If so, it's device-wide. - if (mergeDeviceOwnerRestriction) { - final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked(); - if (deviceOwner != null && deviceOwner.disableCamera) { - return true; - } + final ActiveAdmin deviceOwner = getDeviceOwnerAdminLocked(); + if (deviceOwner != null && deviceOwner.disableCamera) { + return true; } final int affectedUserId = parent ? getProfileParentId(userHandle) : userHandle; // Return the strictest policy across all participating admins. List admins = getActiveAdminsForAffectedUserLocked(affectedUserId); // Determine whether or not the device camera is disabled for any active admins. - for (ActiveAdmin admin: admins) { + for (ActiveAdmin admin : admins) { if (admin.disableCamera) { return true; } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index cadc81600bbbe..97fb399c63ef9 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -102,6 +102,7 @@ import android.graphics.Color; import android.hardware.usb.UsbManager; import android.net.ConnectivityManager; import android.net.Uri; +import android.os.Build; import android.os.Build.VERSION_CODES; import android.os.Bundle; import android.os.Process; @@ -2102,9 +2103,12 @@ public class DevicePolicyManagerTest extends DpmTestBase { mContext.callerPermissions.add(permission.MANAGE_DEVICE_ADMINS); mContext.callerPermissions.add(permission.INTERACT_ACROSS_USERS_FULL); - setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID); + setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID, null, + Build.VERSION_CODES.Q); dpm.setActiveAdmin(admin1, /* replace =*/ false, UserHandle.USER_SYSTEM); + + mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID; boolean originalCameraDisabled = dpm.getCameraDisabled(admin1); assertExpectException(SecurityException.class, /* messageRegex= */ null, () -> dpm.setCameraDisabled(admin1, true)); @@ -2674,8 +2678,8 @@ public class DevicePolicyManagerTest extends DpmTestBase { setUpPackageManagerForAdmin(admin1, DpmMockContext.CALLER_SYSTEM_USER_UID); // Test 1. Caller doesn't have DO or DA. - assertExpectException(SecurityException.class, /* messageRegex= */ "No active admin", - () -> dpm.getWifiMacAddress(admin1)); + assertExpectException(SecurityException.class, /* messageRegex= */ + "does not exist or is not owned by uid", () -> dpm.getWifiMacAddress(admin1)); // DO needs to be an DA. dpm.setActiveAdmin(admin1, /* replace =*/ false);