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

Commit 5f5783e1 authored by Philip P. Moltmann's avatar Philip P. Moltmann
Browse files

Make sure to always upgrade runtime permissions

- For users running when the PermissionPolicyService is initialized we
  are not running onStartUser. Hence we have force to do this in
  onBootPhase
- Only write the runtime-permission fingerprint after all permission
  upgrade steps are done
  - This also means that if a user was not started in the first boot
    after an OTA we do not upgrade the fingerprint until the user was
    eventually started

Fixes: 132737426
Test: - Started a fresh build
      - Rebooted
      - Simulated an OTA
      - Added a second user
      - Simulated an OTA with a second user, rebooted and only then
        started the second user
Change-Id: I0758e8bdfefc16139bde2444f126adc3b0a17526
parent 261b3b13
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -978,4 +978,13 @@ public abstract class PackageManagerInternal {
     * @return true if default permissions
     */
    public abstract boolean wereDefaultPermissionsGrantedSinceBoot(int userId);

    /**
     * Get fingerprint of build that updated the runtime permissions for a user.
     *
     * @param userId The user to update
     * @param fingerPrint The fingerprint to set
     */
    public abstract void setRuntimePermissionsFingerPrint(@NonNull String fingerPrint,
            @UserIdInt int userId);
}
+9 −10
Original line number Diff line number Diff line
@@ -317,7 +317,6 @@ import com.android.server.pm.dex.PackageDexUsage;
import com.android.server.pm.dex.ViewCompiler;
import com.android.server.pm.permission.BasePermission;
import com.android.server.pm.permission.DefaultPermissionGrantPolicy;
import com.android.server.pm.permission.DefaultPermissionGrantPolicy.DefaultPermissionGrantedCallback;
import com.android.server.pm.permission.PermissionManagerService;
import com.android.server.pm.permission.PermissionManagerServiceInternal;
import com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback;
@@ -2415,15 +2414,7 @@ public class PackageManagerService extends IPackageManager.Stub
                    LocalServices.getService(PackageManagerInternal.class),
                    mPackages);
            mPermissionManager = PermissionManagerService.create(context,
                    new DefaultPermissionGrantedCallback() {
                        @Override
                        public void onDefaultRuntimePermissionsGranted(int userId) {
                            synchronized(mPackages) {
                                mSettings.onDefaultRuntimePermissionsGrantedLPr(userId);
                                mDefaultPermissionsGrantedUsers.put(userId, userId);
                            }
                        }
                    }, mPackages /*externalLock*/);
                    mPackages /*externalLock*/);
            mDefaultPermissionPolicy = mPermissionManager.getDefaultPermissionGrantPolicy();
            mSettings = new Settings(Environment.getDataDirectory(),
                    mPermissionManager.getPermissionSettings(), mPackages);
@@ -24921,6 +24912,14 @@ public class PackageManagerService extends IPackageManager.Stub
                return mDefaultPermissionPolicy.wereDefaultPermissionsGrantedSinceBoot(userId);
            }
        }
        @Override
        public void setRuntimePermissionsFingerPrint(@NonNull String fingerPrint,
                @UserIdInt int userId) {
            synchronized (mPackages) {
                mSettings.setRuntimePermissionsFingerPrintLPr(fingerPrint, userId);
            }
        }
    }
    @GuardedBy("mPackages")
+5 −5
Original line number Diff line number Diff line
@@ -1306,9 +1306,8 @@ public final class Settings {
                .areDefaultRuntimePermissionsGrantedLPr(userId);
    }

    void onDefaultRuntimePermissionsGrantedLPr(int userId) {
        mRuntimePermissionsPersistence
                .onDefaultRuntimePermissionsGrantedLPr(userId);
    void setRuntimePermissionsFingerPrintLPr(@NonNull String fingerPrint, @UserIdInt int userId) {
        mRuntimePermissionsPersistence.setRuntimePermissionsFingerPrintLPr(fingerPrint, userId);
    }

    int getDefaultRuntimePermissionsVersionLPr(int userId) {
@@ -5149,8 +5148,9 @@ public final class Settings {
        }

        @GuardedBy("Settings.this.mLock")
        public void onDefaultRuntimePermissionsGrantedLPr(int userId) {
            mFingerprints.put(userId, Build.FINGERPRINT);
        public void setRuntimePermissionsFingerPrintLPr(@NonNull String fingerPrint,
                @UserIdInt int userId) {
            mFingerprints.put(userId, fingerPrint);
            writePermissionsForUserAsyncLPr(userId);
        }

+0 −12
Original line number Diff line number Diff line
@@ -218,18 +218,11 @@ public final class DefaultPermissionGrantPolicy {
    private final Object mLock = new Object();
    private final PackageManagerInternal mServiceInternal;
    private final PermissionManagerService mPermissionManager;
    private final DefaultPermissionGrantedCallback mPermissionGrantedCallback;

    @GuardedBy("mLock")
    private SparseIntArray mDefaultPermissionsGrantedUsers = new SparseIntArray();

    public interface DefaultPermissionGrantedCallback {
        /** Callback when permissions have been granted */
        void onDefaultRuntimePermissionsGranted(int userId);
    }

    DefaultPermissionGrantPolicy(Context context, Looper looper,
            @Nullable DefaultPermissionGrantedCallback callback,
            @NonNull PermissionManagerService permissionManager) {
        mContext = context;
        mHandler = new Handler(looper) {
@@ -244,7 +237,6 @@ public final class DefaultPermissionGrantPolicy {
                }
            }
        };
        mPermissionGrantedCallback = callback;
        mPermissionManager = permissionManager;
        mServiceInternal = LocalServices.getService(PackageManagerInternal.class);
    }
@@ -756,10 +748,6 @@ public final class DefaultPermissionGrantPolicy {
            grantPermissionsToSystemPackage(systemCaptionsServicePackageName, userId,
                    MICROPHONE_PERMISSIONS);
        }

        if (mPermissionGrantedCallback != null) {
            mPermissionGrantedCallback.onDefaultRuntimePermissionsGranted(userId);
        }
    }

    private String getDefaultSystemHandlerActivityPackageForCategory(String category, int userId) {
+2 −5
Original line number Diff line number Diff line
@@ -95,7 +95,6 @@ import com.android.server.pm.PackageManagerServiceUtils;
import com.android.server.pm.PackageSetting;
import com.android.server.pm.SharedUserSetting;
import com.android.server.pm.UserManagerService;
import com.android.server.pm.permission.DefaultPermissionGrantPolicy.DefaultPermissionGrantedCallback;
import com.android.server.pm.permission.PermissionManagerServiceInternal.PermissionCallback;
import com.android.server.pm.permission.PermissionsState.PermissionState;

@@ -220,7 +219,6 @@ public class PermissionManagerService {
            mRuntimePermissionStateChangedListeners = new ArrayList<>();

    PermissionManagerService(Context context,
            @Nullable DefaultPermissionGrantedCallback defaultGrantCallback,
            @NonNull Object externalLock) {
        mContext = context;
        mLock = externalLock;
@@ -235,7 +233,7 @@ public class PermissionManagerService {
        Watchdog.getInstance().addThread(mHandler);

        mDefaultPermissionGrantPolicy = new DefaultPermissionGrantPolicy(
                context, mHandlerThread.getLooper(), defaultGrantCallback, this);
                context, mHandlerThread.getLooper(), this);
        SystemConfig systemConfig = SystemConfig.getInstance();
        mSystemPermissions = systemConfig.getSystemPermissions();
        mGlobalGids = systemConfig.getGlobalGids();
@@ -273,14 +271,13 @@ public class PermissionManagerService {
     * lock created by the permission manager itself.
     */
    public static PermissionManagerServiceInternal create(Context context,
            @Nullable DefaultPermissionGrantedCallback defaultGrantCallback,
            @NonNull Object externalLock) {
        final PermissionManagerServiceInternal permMgrInt =
                LocalServices.getService(PermissionManagerServiceInternal.class);
        if (permMgrInt != null) {
            return permMgrInt;
        }
        new PermissionManagerService(context, defaultGrantCallback, externalLock);
        new PermissionManagerService(context, externalLock);
        return LocalServices.getService(PermissionManagerServiceInternal.class);
    }

Loading