Merge "Preserve certain "Nearby devices" implicit grants." into sc-dev am: 5af6057607

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/15518456

Change-Id: Iff34ad44acacd02e949c806c75f449b461c74e77
This commit is contained in:
Jeff Sharkey
2021-08-16 16:05:45 +00:00
committed by Automerger Merge Worker

View File

@@ -217,6 +217,8 @@ public class PermissionManagerService extends IPermissionManager.Stub {
/** All storage permissions */
private static final List<String> STORAGE_PERMISSIONS = new ArrayList<>();
/** All nearby devices permissions */
private static final List<String> NEARBY_DEVICES_PERMISSIONS = new ArrayList<>();
/** If the permission of the value is granted, so is the key */
private static final Map<String, String> FULLER_PERMISSION_MAP = new HashMap<>();
@@ -233,6 +235,9 @@ public class PermissionManagerService extends IPermissionManager.Stub {
STORAGE_PERMISSIONS.add(Manifest.permission.READ_EXTERNAL_STORAGE);
STORAGE_PERMISSIONS.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
STORAGE_PERMISSIONS.add(Manifest.permission.ACCESS_MEDIA_LOCATION);
NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_ADVERTISE);
NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_CONNECT);
NEARBY_DEVICES_PERMISSIONS.add(Manifest.permission.BLUETOOTH_SCAN);
}
/** Set of source package names for Privileged Permission Allowlist */
@@ -3076,13 +3081,26 @@ public class PermissionManagerService extends IPermissionManager.Stub {
Permission bp = mRegistry.getPermission(permission);
if (bp != null && bp.isRuntime()) {
int flags = ps.getPermissionFlags(permission);
if ((flags & FLAG_PERMISSION_REVOKE_WHEN_REQUESTED) != 0) {
int flagsToRemove = FLAG_PERMISSION_REVOKE_WHEN_REQUESTED;
// We're willing to preserve an implicit "Nearby devices"
// permission grant if this app was already able to interact
// with nearby devices via background location access
boolean preserveGrant = false;
if (ArrayUtils.contains(NEARBY_DEVICES_PERMISSIONS, permission)
&& ps.isPermissionGranted(
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)
&& (ps.getPermissionFlags(
android.Manifest.permission.ACCESS_BACKGROUND_LOCATION)
& (FLAG_PERMISSION_REVOKE_WHEN_REQUESTED
| FLAG_PERMISSION_REVOKED_COMPAT)) == 0) {
preserveGrant = true;
}
if ((flags & BLOCKING_PERMISSION_FLAGS) == 0
&& supportsRuntimePermissions) {
&& supportsRuntimePermissions
&& !preserveGrant) {
if (ps.revokePermission(bp)) {
if (DEBUG_PERMISSIONS) {
Slog.i(TAG, "Revoking runtime permission "