From 3a70f7b6e64042034f480ff246099b33fc1eda4c Mon Sep 17 00:00:00 2001 From: Sarah Chin Date: Thu, 12 May 2022 03:50:34 -0700 Subject: [PATCH] Add always full location check to LocationAccessPolicy Check whether the package is allowlisted to always have full location data. Test: atest LocationAccessPolicyTest Bug: 231445403 Change-Id: I33c5088b639595c8e0f89f3f2a926dfc5d830fcf --- .../telephony/LocationAccessPolicy.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/telephony/common/android/telephony/LocationAccessPolicy.java b/telephony/common/android/telephony/LocationAccessPolicy.java index 9dfb0cc289eed..d4b6c91eb7a05 100644 --- a/telephony/common/android/telephony/LocationAccessPolicy.java +++ b/telephony/common/android/telephony/LocationAccessPolicy.java @@ -316,9 +316,11 @@ public final class LocationAccessPolicy { return LocationPermissionResult.ALLOWED; } - // Check the system-wide requirements. If the location main switch is off or - // the app's profile isn't in foreground, return a soft denial. - if (!checkSystemLocationAccess(context, query.callingUid, query.callingPid)) { + // Check the system-wide requirements. If the location main switch is off and the caller is + // not in the allowlist of apps that always have loation access or the app's profile + // isn't in the foreground, return a soft denial. + if (!checkSystemLocationAccess(context, query.callingUid, query.callingPid, + query.callingPackage)) { return LocationPermissionResult.DENIED_SOFT; } @@ -344,15 +346,16 @@ public final class LocationAccessPolicy { return LocationPermissionResult.ALLOWED; } - private static boolean checkManifestPermission(Context context, int pid, int uid, String permissionToCheck) { return context.checkPermission(permissionToCheck, pid, uid) == PackageManager.PERMISSION_GRANTED; } - private static boolean checkSystemLocationAccess(@NonNull Context context, int uid, int pid) { - if (!isLocationModeEnabled(context, UserHandle.getUserHandleForUid(uid).getIdentifier())) { + private static boolean checkSystemLocationAccess(@NonNull Context context, int uid, int pid, + @NonNull String callingPackage) { + if (!isLocationModeEnabled(context, UserHandle.getUserHandleForUid(uid).getIdentifier()) + && !isLocationBypassAllowed(context, callingPackage)) { if (DBG) Log.w(TAG, "Location disabled, failed, (" + uid + ")"); return false; } @@ -373,6 +376,16 @@ public final class LocationAccessPolicy { return locationManager.isLocationEnabledForUser(UserHandle.of(userId)); } + private static boolean isLocationBypassAllowed(@NonNull Context context, + @NonNull String callingPackage) { + for (String bypassPackage : getLocationBypassPackages(context)) { + if (callingPackage.equals(bypassPackage)) { + return true; + } + } + return false; + } + /** * @return An array of packages that are always allowed to access location. */