Add parameters to @PermissionMethod

- orSelf: signifies that this method checks if the calling process OR
  the current process has the permission
- anyOf: signifies that if this method checks multiple permissions,
  the check passes if ANY ONE of the permissions is granted
- value (default parameter): a hard coded list of permissions that this method checks.
  This parameter is useful for static analysis, where the implementation
  of some @PermissionMethod may not be visible across library
  boundaries.  A good example of this is
  NetworkStack#checkNetworkStackPermission, which is a source in
  framework-minus-apex, but is used from services.core.unboosted.  Since
  it passes straight into a helper which checks the actual permissions,
  it's not possible for lint running on services.core.unboosted to see
  which permissions are checked.

Bug: 247537842
Test: TH
Change-Id: Ia5d92149763766576602f5d84a86c67f6fb7e96d
This commit is contained in:
mattgilbride
2022-10-20 23:48:52 +00:00
parent 3ed2898d28
commit 8e806dd2b1
3 changed files with 20 additions and 3 deletions

View File

@@ -6172,7 +6172,7 @@ public abstract class Context {
*/
@CheckResult(suggest="#enforceCallingOrSelfPermission(String,String)")
@PackageManager.PermissionResult
@PermissionMethod
@PermissionMethod(orSelf = true)
public abstract int checkCallingOrSelfPermission(@NonNull @PermissionName String permission);
/**
@@ -6240,7 +6240,7 @@ public abstract class Context {
*
* @see #checkCallingOrSelfPermission(String)
*/
@PermissionMethod
@PermissionMethod(orSelf = true)
public abstract void enforceCallingOrSelfPermission(
@NonNull @PermissionName String permission, @Nullable String message);

View File

@@ -33,4 +33,20 @@ import java.lang.annotation.Target;
*/
@Retention(CLASS)
@Target({METHOD})
public @interface PermissionMethod {}
public @interface PermissionMethod {
/**
* Hard-coded list of permissions checked by this method
*/
@PermissionName String[] value() default {};
/**
* If true, the check passes if the caller
* has any ONE of the supplied permissions
*/
boolean anyOf() default false;
/**
* Signifies that the permission check passes if
* the calling process OR the current process has
* the permission
*/
boolean orSelf() default false;
}

View File

@@ -6141,6 +6141,7 @@ public class ActivityManagerService extends IActivityManager.Stub
/**
* This can be called with or without the global lock held.
*/
@PermissionMethod(anyOf = true)
private void enforceCallingHasAtLeastOnePermission(String func, String... permissions) {
for (String permission : permissions) {
if (checkCallingPermission(permission) == PackageManager.PERMISSION_GRANTED) {