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

Commit 0a258ab8 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[PM] Use callingUid instead of binder#getCallingUid for uninstall" into main

parents ab1f6f06 cb5aa649
Loading
Loading
Loading
Loading
+17 −5
Original line number Original line Diff line number Diff line
@@ -690,7 +690,13 @@ final class DeletePackageHelper {
    public void deletePackageVersionedInternal(VersionedPackage versionedPackage,
    public void deletePackageVersionedInternal(VersionedPackage versionedPackage,
            final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags,
            final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags,
            final boolean allowSilentUninstall) {
            final boolean allowSilentUninstall) {
        final int callingUid = Binder.getCallingUid();
        deletePackageVersionedInternal(versionedPackage, observer, userId, deleteFlags,
                Binder.getCallingUid(), allowSilentUninstall);
    }

    public void deletePackageVersionedInternal(VersionedPackage versionedPackage,
            final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags,
            final int callingUid, final boolean allowSilentUninstall) {
        mPm.mContext.enforceCallingOrSelfPermission(
        mPm.mContext.enforceCallingOrSelfPermission(
                android.Manifest.permission.DELETE_PACKAGES, null);
                android.Manifest.permission.DELETE_PACKAGES, null);
        final Computer snapshot = mPm.snapshotComputer();
        final Computer snapshot = mPm.snapshotComputer();
@@ -720,16 +726,22 @@ final class DeletePackageHelper {
        final String internalPackageName =
        final String internalPackageName =
                snapshot.resolveInternalPackageName(packageName, versionCode);
                snapshot.resolveInternalPackageName(packageName, versionCode);


        final int uid = Binder.getCallingUid();
        if (!isOrphaned(snapshot, internalPackageName)
        if (!isOrphaned(snapshot, internalPackageName)
                && !allowSilentUninstall
                && !allowSilentUninstall
                && !isCallerAllowedToSilentlyUninstall(
                && !isCallerAllowedToSilentlyUninstall(
                        snapshot, uid, internalPackageName, userId)) {
                        snapshot, callingUid, internalPackageName, userId)) {
            mPm.mHandler.post(() -> {
            mPm.mHandler.post(() -> {
                try {
                try {
                    final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
                    final Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE);
                    intent.setData(Uri.fromParts(PACKAGE_SCHEME, packageName, null));
                    intent.setData(Uri.fromParts(PACKAGE_SCHEME, packageName, null));
                    intent.putExtra(PackageInstaller.EXTRA_CALLBACK, observer.asBinder());
                    intent.putExtra(PackageInstaller.EXTRA_CALLBACK,
                            new PackageManager.UninstallCompleteCallback(observer.asBinder()));
                    if ((deleteFlags & PackageManager.DELETE_ARCHIVE) != 0) {
                        // Delete flags are passed to the uninstaller activity so it can be
                        // preserved in the follow-up uninstall operation after the user
                        // confirmation
                        intent.putExtra(PackageInstaller.EXTRA_DELETE_FLAGS, deleteFlags);
                    }
                    observer.onUserActionRequired(intent);
                    observer.onUserActionRequired(intent);
                } catch (RemoteException re) {
                } catch (RemoteException re) {
                }
                }
@@ -738,7 +750,7 @@ final class DeletePackageHelper {
        }
        }
        final boolean deleteAllUsers = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0;
        final boolean deleteAllUsers = (deleteFlags & PackageManager.DELETE_ALL_USERS) != 0;
        final int[] users = deleteAllUsers ? mUserManagerInternal.getUserIds() : new int[]{userId};
        final int[] users = deleteAllUsers ? mUserManagerInternal.getUserIds() : new int[]{userId};
        if (UserHandle.getUserId(uid) != userId || (deleteAllUsers && users.length > 1)) {
        if (UserHandle.getUserId(callingUid) != userId || (deleteAllUsers && users.length > 1)) {
            mPm.mContext.enforceCallingOrSelfPermission(
            mPm.mContext.enforceCallingOrSelfPermission(
                    android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
                    android.Manifest.permission.INTERACT_ACROSS_USERS_FULL,
                    "deletePackage for user " + userId);
                    "deletePackage for user " + userId);
+2 −1
Original line number Original line Diff line number Diff line
@@ -1438,7 +1438,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
        if (mContext.checkPermission(Manifest.permission.DELETE_PACKAGES, callingPid, callingUid)
        if (mContext.checkPermission(Manifest.permission.DELETE_PACKAGES, callingPid, callingUid)
                == PackageManager.PERMISSION_GRANTED) {
                == PackageManager.PERMISSION_GRANTED) {
            // Sweet, call straight through!
            // Sweet, call straight through!
            mPm.deletePackageVersioned(versionedPackage, adapter.getBinder(), userId, flags);
            mPm.deletePackageVersioned(versionedPackage, adapter.getBinder(), userId, flags,
                    callingUid);
        } else if (canSilentlyInstallPackage) {
        } else if (canSilentlyInstallPackage) {
            // Allow the device owner and affiliated profile owner to silently delete packages
            // Allow the device owner and affiliated profile owner to silently delete packages
            // Need to clear the calling identity to get DELETE_PACKAGES permission
            // Need to clear the calling identity to get DELETE_PACKAGES permission
+9 −1
Original line number Original line Diff line number Diff line
@@ -3322,10 +3322,18 @@ public class PackageManagerService implements PackageSender, TestUtilityService
                versionedPackage, observer, userId);
                versionedPackage, observer, userId);
    }
    }


    public void deletePackageVersioned(VersionedPackage versionedPackage,
            final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags,
            final int callingUid) {
        mDeletePackageHelper.deletePackageVersionedInternal(
                versionedPackage, observer, userId, deleteFlags, callingUid,
                /* allowSilentUninstall= */ false);
    }

    public void deletePackageVersioned(VersionedPackage versionedPackage,
    public void deletePackageVersioned(VersionedPackage versionedPackage,
            final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
            final IPackageDeleteObserver2 observer, final int userId, final int deleteFlags) {
        mDeletePackageHelper.deletePackageVersionedInternal(
        mDeletePackageHelper.deletePackageVersionedInternal(
                versionedPackage, observer, userId, deleteFlags, false);
                versionedPackage, observer, userId, deleteFlags, /* allowSilentUninstall= */ false);
    }
    }


    boolean isCallerVerifier(@NonNull Computer snapshot, int callingUid) {
    boolean isCallerVerifier(@NonNull Computer snapshot, int callingUid) {