diff options
author | 2015-03-05 17:52:20 +0000 | |
---|---|---|
committer | 2015-03-05 17:52:21 +0000 | |
commit | be331a3809b9cf921c6ad65e1d671b24e97dded9 (patch) | |
tree | 0203406ea2aaec451e0775263139faf890e2e11a | |
parent | d833ba8d4e6d93744b3cd06a87b57b0a17864501 (diff) | |
parent | 1c3754a35c434e4102c7ac3dceb887fa137b153b (diff) |
Merge "Add security check for clearDeviceInitializer in the service."
-rw-r--r-- | api/current.txt | 2 | ||||
-rw-r--r-- | api/system-current.txt | 2 | ||||
-rw-r--r-- | core/java/android/app/admin/DevicePolicyManager.java | 8 | ||||
-rw-r--r-- | core/java/android/app/admin/IDevicePolicyManager.aidl | 2 | ||||
-rw-r--r-- | services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java | 14 |
5 files changed, 18 insertions, 10 deletions
diff --git a/api/current.txt b/api/current.txt index b96d241d3bcc..7a348ea7d846 100644 --- a/api/current.txt +++ b/api/current.txt @@ -5458,7 +5458,7 @@ package android.app.admin { method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName); method public void addUserRestriction(android.content.ComponentName, java.lang.String); method public void clearCrossProfileIntentFilters(android.content.ComponentName); - method public void clearDeviceInitializerApp(); + method public void clearDeviceInitializerApp(android.content.ComponentName); method public void clearDeviceOwnerApp(java.lang.String); method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String); method public void clearUserRestriction(android.content.ComponentName, java.lang.String); diff --git a/api/system-current.txt b/api/system-current.txt index 65df35451cee..4755fe748c27 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -5552,7 +5552,7 @@ package android.app.admin { method public void addPersistentPreferredActivity(android.content.ComponentName, android.content.IntentFilter, android.content.ComponentName); method public void addUserRestriction(android.content.ComponentName, java.lang.String); method public void clearCrossProfileIntentFilters(android.content.ComponentName); - method public void clearDeviceInitializerApp(); + method public void clearDeviceInitializerApp(android.content.ComponentName); method public void clearDeviceOwnerApp(java.lang.String); method public void clearPackagePersistentPreferredActivities(android.content.ComponentName, java.lang.String); method public void clearProfileOwner(android.content.ComponentName); diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java index add713095c35..3d587b608d57 100644 --- a/core/java/android/app/admin/DevicePolicyManager.java +++ b/core/java/android/app/admin/DevicePolicyManager.java @@ -2476,12 +2476,14 @@ public class DevicePolicyManager { /** * Removes the device initializer, so that it will not be invoked on user initialization for any * subsequently created users. This method can be called by either the device owner or device - * initializer itself. + * initializer itself. The caller must be an active administrator. + * + * @param who Which {@link DeviceAdminReceiver} this request is associated with. */ - public void clearDeviceInitializerApp() { + public void clearDeviceInitializerApp(ComponentName who) { if (mService != null) { try { - mService.clearDeviceInitializer(mContext.getPackageName()); + mService.clearDeviceInitializer(who); } catch (RemoteException re) { Log.w(TAG, "Failed to clear device initializer"); } diff --git a/core/java/android/app/admin/IDevicePolicyManager.aidl b/core/java/android/app/admin/IDevicePolicyManager.aidl index 5e58fe00c7c3..5cbab4b48a44 100644 --- a/core/java/android/app/admin/IDevicePolicyManager.aidl +++ b/core/java/android/app/admin/IDevicePolicyManager.aidl @@ -202,7 +202,7 @@ interface IDevicePolicyManager { boolean setUserEnabled(in ComponentName who); boolean isDeviceInitializer(String packageName); - void clearDeviceInitializer(String packageName); + void clearDeviceInitializer(in ComponentName who); boolean setDeviceInitializer(in ComponentName who, in ComponentName initializer, String initializerName); String getDeviceInitializer(); } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index aa9d8ddb4beb..fc9ff76c7b5d 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -3940,15 +3940,21 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } @Override - public void clearDeviceInitializer(String packageName) { + public void clearDeviceInitializer(ComponentName who) { if (!mHasFeature) { return; } - if (packageName == null) { - throw new NullPointerException("packageName is null"); + Preconditions.checkNotNull(who, "ComponentName is null"); + + ActiveAdmin admin = getActiveAdminUncheckedLocked(who, UserHandle.getCallingUserId()); + + if (admin.getUid() != Binder.getCallingUid()) { + throw new SecurityException("Admin " + who + " is not owned by uid " + + Binder.getCallingUid()); } - if (!isDeviceInitializer(packageName) && !isDeviceOwner(packageName)) { + if (!isDeviceInitializer(admin.info.getPackageName()) + && !isDeviceOwner(admin.info.getPackageName())) { throw new SecurityException( "clearDeviceInitializer can only be called by the device initializer/owner"); } |