Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1c3754a3 authored by Julia Reynolds's avatar Julia Reynolds
Browse files

Add security check for clearDeviceInitializer in the service.

Bug: 19230954
Change-Id: I5c648492bef0d2b579b6f59b91afc890e3092d36
parent af343548
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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);
+5 −3
Original line number Diff line number Diff line
@@ -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");
            }
+1 −1
Original line number Diff line number Diff line
@@ -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();
}
+10 −4
Original line number Diff line number Diff line
@@ -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");
        }