diff options
| author | Philip P. Moltmann <moltmann@google.com> | 2019-02-08 13:07:57 -0800 |
|---|---|---|
| committer | Philip P. Moltmann <moltmann@google.com> | 2019-02-21 16:56:25 -0800 |
| commit | 41df9f94aee658f53cf520c80d3ec67e2406a51a (patch) | |
| tree | 2b6c70c32faa60097436921aa5c439ccf574053a /core/java/android/permission/PermissionControllerService.java | |
| parent | 2a537a6ef5e21bb87dcf295a28d465fcb70b55ac (diff) | |
Ask Perm Controller to set policy-fixed perms
This is much slower than the old way as we need to call into a different
process. On the other hand this handles the following cases correctly:
- foreground / background permissions
- pre-M apps
- split permissions
Test: CtsDevicePolicyManagerTestCases:com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionGrant,testPermissionPolicy,testPermissionMixedPolicies,testPermissionAppUpdate,testPermissionGrantPreMApp
Change-Id: I5cd139ad29e5b77b77b02e12c75eb774984a7759
Bug: 124128308
Diffstat (limited to 'core/java/android/permission/PermissionControllerService.java')
| -rw-r--r-- | core/java/android/permission/PermissionControllerService.java | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/core/java/android/permission/PermissionControllerService.java b/core/java/android/permission/PermissionControllerService.java index fb6c061c536f..e883d25ab0bd 100644 --- a/core/java/android/permission/PermissionControllerService.java +++ b/core/java/android/permission/PermissionControllerService.java @@ -16,6 +16,9 @@ package android.permission; +import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_DEFAULT; +import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_DENIED; +import static android.app.admin.DevicePolicyManager.PERMISSION_GRANT_STATE_GRANTED; import static android.permission.PermissionControllerManager.COUNT_ONLY_WHEN_GRANTED; import static android.permission.PermissionControllerManager.COUNT_WHEN_SYSTEM; @@ -32,6 +35,7 @@ import android.annotation.BinderThread; import android.annotation.NonNull; import android.annotation.SystemApi; import android.app.Service; +import android.app.admin.DevicePolicyManager.PermissionGrantState; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; @@ -180,6 +184,18 @@ public abstract class PermissionControllerService extends Service { public abstract boolean onIsApplicationQualifiedForRole(@NonNull String roleName, @NonNull String packageName); + /** + * Set the runtime permission state from a device admin. + * + * @param callerPackageName The package name of the admin requesting the change + * @param packageName Package the permission belongs to + * @param permission Permission to change + * @param grantState State to set the permission into + */ + public abstract boolean onSetRuntimePermissionGrantStateByDeviceAdmin( + @NonNull String callerPackageName, @NonNull String packageName, + @NonNull String permission, @PermissionGrantState int grantState); + @Override public final IBinder onBind(Intent intent) { return new IPermissionController.Stub() { @@ -326,6 +342,35 @@ public abstract class PermissionControllerService extends Service { PermissionControllerService::isApplicationQualifiedForRole, PermissionControllerService.this, roleName, packageName, callback)); } + + @Override + public void setRuntimePermissionGrantStateByDeviceAdmin(String callerPackageName, + String packageName, String permission, int grantState, + RemoteCallback callback) { + checkStringNotEmpty(callerPackageName); + checkStringNotEmpty(packageName); + checkStringNotEmpty(permission); + checkArgument(grantState == PERMISSION_GRANT_STATE_GRANTED + || grantState == PERMISSION_GRANT_STATE_DENIED + || grantState == PERMISSION_GRANT_STATE_DEFAULT); + checkNotNull(callback); + + if (grantState == PERMISSION_GRANT_STATE_DENIED) { + enforceCallingPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS, null); + } + + if (grantState == PERMISSION_GRANT_STATE_DENIED) { + enforceCallingPermission(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS, null); + } + + enforceCallingPermission(Manifest.permission.ADJUST_RUNTIME_PERMISSIONS_POLICY, + null); + + mHandler.sendMessage(obtainMessage( + PermissionControllerService::setRuntimePermissionGrantStateByDeviceAdmin, + PermissionControllerService.this, callerPackageName, packageName, + permission, grantState, callback)); + } }; } @@ -399,4 +444,15 @@ public abstract class PermissionControllerService extends Service { result.putBoolean(PermissionControllerManager.KEY_RESULT, qualified); callback.sendResult(result); } + + private void setRuntimePermissionGrantStateByDeviceAdmin(@NonNull String callerPackageName, + @NonNull String packageName, @NonNull String permission, + @PermissionGrantState int grantState, @NonNull RemoteCallback callback) { + boolean wasSet = onSetRuntimePermissionGrantStateByDeviceAdmin(callerPackageName, + packageName, permission, grantState); + + Bundle result = new Bundle(); + result.putBoolean(PermissionControllerManager.KEY_RESULT, wasSet); + callback.sendResult(result); + } } |
