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
Merged-In: I33c5088b639595c8e0f89f3f2a926dfc5d830fcf
This commit is contained in:
Sarah Chin
2022-05-12 03:50:34 -07:00
parent 407d531735
commit 69bca0eb26

View File

@@ -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.
*/