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:
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user