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

Commit c3c52177 authored by Todd Kennedy's avatar Todd Kennedy
Browse files

Fix "--user" handling

In some cases, USER_ALL defaults to an unexpected value. Instead,
cause an exception when USER_ALL is undefined.

Bug: 137410612
Test: manual
Change-Id: Id923f3e7c4a9f6d9f5e4cf3ff86d5d9d439c3609
parent f4eb2ca0
Loading
Loading
Loading
Loading
+81 −97
Original line number Diff line number Diff line
@@ -504,11 +504,9 @@ class PackageManagerShellCommand extends ShellCommand {
            getErrPrintWriter().println("Error: no package specified");
            return 1;
        }
        userId = translateUserId(userId, true /*allowAll*/, "runPath");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        return displayPackageFilePath(pkg, userId);
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runPath");
        return displayPackageFilePath(pkg, translatedUserId);
    }

    private int runList() throws RemoteException {
@@ -730,13 +728,11 @@ class PackageManagerShellCommand extends ShellCommand {

        final String filter = getNextArg();

        userId = translateUserId(userId, true /*allowAll*/, "runListPackages");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runListPackages");
        @SuppressWarnings("unchecked")
        final ParceledListSlice<PackageInfo> slice =
                mInterface.getInstalledPackages(getFlags, userId);
                mInterface.getInstalledPackages(getFlags, translatedUserId);
        final List<PackageInfo> packages = slice.getList();

        final int count = packages.size();
@@ -1357,19 +1353,17 @@ class PackageManagerShellCommand extends ShellCommand {
            pw.println("Error: package name not specified");
            return 1;
        }
        userId = translateUserId(userId, true /*allowAll*/, "runInstallExisting");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runInstallExisting");

        int installReason = PackageManager.INSTALL_REASON_UNKNOWN;
        try {
            if (waitTillComplete) {
                final LocalIntentReceiver receiver = new LocalIntentReceiver();
                final IPackageInstaller installer = mInterface.getPackageInstaller();
                pw.println("Installing package " + packageName + " for user: " + userId);
                pw.println("Installing package " + packageName + " for user: " + translatedUserId);
                installer.installExistingPackage(packageName, installFlags, installReason,
                        receiver.getIntentSender(), userId, null);
                        receiver.getIntentSender(), translatedUserId, null);
                final Intent result = receiver.getResult();
                final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
                        PackageInstaller.STATUS_FAILURE);
@@ -1377,12 +1371,12 @@ class PackageManagerShellCommand extends ShellCommand {
                return status == PackageInstaller.STATUS_SUCCESS ? 0 : 1;
            }

            final int res = mInterface.installExistingPackageAsUser(packageName, userId,
            final int res = mInterface.installExistingPackageAsUser(packageName, translatedUserId,
                    installFlags, installReason, null);
            if (res == PackageManager.INSTALL_FAILED_INVALID_URI) {
                throw new NameNotFoundException("Package " + packageName + " doesn't exist");
            }
            pw.println("Package " + packageName + " installed for user: " + userId);
            pw.println("Package " + packageName + " installed for user: " + translatedUserId);
            return 0;
        } catch (RemoteException | NameNotFoundException e) {
            pw.println(e.toString());
@@ -1845,21 +1839,23 @@ class PackageManagerShellCommand extends ShellCommand {
            return runRemoveSplits(packageName, splitNames);
        }

        userId = translateUserId(userId, true /*allowAll*/, "runUninstall");
        if (userId == UserHandle.USER_ALL) {
            flags |= PackageManager.DELETE_ALL_USERS;
        }
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_SYSTEM, "runUninstall");
        final LocalIntentReceiver receiver = new LocalIntentReceiver();
        PackageManagerInternal internal = LocalServices.getService(PackageManagerInternal.class);
        final PackageManagerInternal internal =
                LocalServices.getService(PackageManagerInternal.class);

        if (internal.isApexPackage(packageName)) {
            internal.uninstallApex(packageName, versionCode, userId, receiver.getIntentSender());
        } else {
            if (userId == UserHandle.USER_ALL) {
                userId = UserHandle.USER_SYSTEM;
                flags |= PackageManager.DELETE_ALL_USERS;
            } else {
            internal.uninstallApex(
                    packageName, versionCode, translatedUserId, receiver.getIntentSender());
        } else if ((flags & PackageManager.DELETE_ALL_USERS) != 0) {
            final PackageInfo info = mInterface.getPackageInfo(packageName,
                        PackageManager.MATCH_STATIC_SHARED_LIBRARIES, userId);
                    PackageManager.MATCH_STATIC_SHARED_LIBRARIES, translatedUserId);
            if (info == null) {
                    pw.println("Failure [not installed for " + userId + "]");
                pw.println("Failure [not installed for " + translatedUserId + "]");
                return 1;
            }
            final boolean isSystem =
@@ -1870,11 +1866,10 @@ class PackageManagerShellCommand extends ShellCommand {
            if (isSystem) {
                flags |= PackageManager.DELETE_SYSTEM_APP;
            }
            }

            mInterface.getPackageInstaller().uninstall(new VersionedPackage(packageName,
                            versionCode), null /*callerPackageName*/, flags,
                    receiver.getIntentSender(), userId);
                    receiver.getIntentSender(), translatedUserId);
        }

        final Intent result = receiver.getResult();
@@ -1991,28 +1986,26 @@ class PackageManagerShellCommand extends ShellCommand {
            userId = UserHandle.parseUserArg(getNextArgRequired());
        }

        String pkg = getNextArg();
        final String pkg = getNextArg();
        if (pkg == null) {
            getErrPrintWriter().println("Error: no package or component specified");
            return 1;
        }
        userId = translateUserId(userId, true /*allowAll*/, "runSetEnabledSetting");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        ComponentName cn = ComponentName.unflattenFromString(pkg);
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runSetEnabledSetting");
        final ComponentName cn = ComponentName.unflattenFromString(pkg);
        if (cn == null) {
            mInterface.setApplicationEnabledSetting(pkg, state, 0, userId,
            mInterface.setApplicationEnabledSetting(pkg, state, 0, translatedUserId,
                    "shell:" + android.os.Process.myUid());
            getOutPrintWriter().println("Package " + pkg + " new state: "
                    + enabledSettingToString(
                    mInterface.getApplicationEnabledSetting(pkg, userId)));
                    mInterface.getApplicationEnabledSetting(pkg, translatedUserId)));
            return 0;
        } else {
            mInterface.setComponentEnabledSetting(cn, state, 0, userId);
            mInterface.setComponentEnabledSetting(cn, state, 0, translatedUserId);
            getOutPrintWriter().println("Component " + cn.toShortString() + " new state: "
                    + enabledSettingToString(
                    mInterface.getComponentEnabledSetting(cn, userId)));
                    mInterface.getComponentEnabledSetting(cn, translatedUserId)));
            return 0;
        }
    }
@@ -2029,13 +2022,11 @@ class PackageManagerShellCommand extends ShellCommand {
            getErrPrintWriter().println("Error: no package or component specified");
            return 1;
        }
        userId = translateUserId(userId, true /*allowAll*/, "runSetHiddenSetting");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        mInterface.setApplicationHiddenSettingAsUser(pkg, state, userId);
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runSetHiddenSetting");
        mInterface.setApplicationHiddenSettingAsUser(pkg, state, translatedUserId);
        getOutPrintWriter().println("Package " + pkg + " new hidden state: "
                + mInterface.getApplicationHiddenSettingAsUser(pkg, userId));
                + mInterface.getApplicationHiddenSettingAsUser(pkg, translatedUserId));
        return 0;
    }

@@ -2102,16 +2093,14 @@ class PackageManagerShellCommand extends ShellCommand {
            info = null;
        }
        try {
            userId = translateUserId(userId, true /*allowAll*/, "runSuspend");
            if (userId == UserHandle.USER_ALL) {
                userId = UserHandle.USER_SYSTEM;
            }
            final int translatedUserId =
                    translateUserId(userId, UserHandle.USER_NULL, "runSuspend");
            mInterface.setPackagesSuspendedAsUser(new String[]{packageName}, suspendedState,
                    ((appExtras.size() > 0) ? appExtras : null),
                    ((launcherExtras.size() > 0) ? launcherExtras : null),
                    info, callingPackage, userId);
                    info, callingPackage, translatedUserId);
            pw.println("Package " + packageName + " new suspended state: "
                    + mInterface.isPackageSuspendedForUser(packageName, userId));
                    + mInterface.isPackageSuspendedForUser(packageName, translatedUserId));
            return 0;
        } catch (RemoteException | IllegalArgumentException e) {
            pw.println(e.toString());
@@ -2139,11 +2128,12 @@ class PackageManagerShellCommand extends ShellCommand {
            getErrPrintWriter().println("Error: no permission specified");
            return 1;
        }
        userId = translateUserId(userId, true /*allowAll*/, "runGrantRevokePermission");
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runGrantRevokePermission");
        if (grant) {
            mPermissionManager.grantRuntimePermission(pkg, perm, userId);
            mPermissionManager.grantRuntimePermission(pkg, perm, translatedUserId);
        } else {
            mPermissionManager.revokeRuntimePermission(pkg, perm, userId);
            mPermissionManager.revokeRuntimePermission(pkg, perm, translatedUserId);
        }
        return 0;
    }
@@ -2327,11 +2317,9 @@ class PackageManagerShellCommand extends ShellCommand {
                return 1;
        }

        userId = translateUserId(userId, true /*allowAll*/, "runSetAppLink");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        final PackageInfo info = mInterface.getPackageInfo(pkg, 0, userId);
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runSetAppLink");
        final PackageInfo info = mInterface.getPackageInfo(pkg, 0, translatedUserId);
        if (info == null) {
            getErrPrintWriter().println("Error: package " + pkg + " not found.");
            return 1;
@@ -2342,7 +2330,7 @@ class PackageManagerShellCommand extends ShellCommand {
            return 1;
        }

        if (!mInterface.updateIntentVerificationStatus(pkg, newMode, userId)) {
        if (!mInterface.updateIntentVerificationStatus(pkg, newMode, translatedUserId)) {
            getErrPrintWriter().println("Error: unable to update app link status for " + pkg);
            return 1;
        }
@@ -2371,11 +2359,9 @@ class PackageManagerShellCommand extends ShellCommand {
            return 1;
        }

        userId = translateUserId(userId, true /*allowAll*/, "runGetAppLink");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        final PackageInfo info = mInterface.getPackageInfo(pkg, 0, userId);
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runGetAppLink");
        final PackageInfo info = mInterface.getPackageInfo(pkg, 0, translatedUserId);
        if (info == null) {
            getErrPrintWriter().println("Error: package " + pkg + " not found.");
            return 1;
@@ -2388,7 +2374,7 @@ class PackageManagerShellCommand extends ShellCommand {
        }

        getOutPrintWriter().println(linkStateToString(
                mInterface.getIntentVerificationStatus(pkg, userId)));
                mInterface.getIntentVerificationStatus(pkg, translatedUserId)));

        return 0;
    }
@@ -2763,14 +2749,15 @@ class PackageManagerShellCommand extends ShellCommand {
            }
            pkgName = componentName.getPackageName();
        }
        userId = translateUserId(userId, true /*allowAll*/, "runInstallCreate");
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runSetHomeActivity");
        final CompletableFuture<Boolean> future = new CompletableFuture<>();
        final RemoteCallback callback = new RemoteCallback(res -> future.complete(res != null));
        try {
            IRoleManager roleManager = android.app.role.IRoleManager.Stub.asInterface(
                    ServiceManager.getServiceOrThrow(Context.ROLE_SERVICE));
            roleManager.addRoleHolderAsUser(RoleManager.ROLE_HOME, pkgName,
                    0, userId, callback);
                    0, translatedUserId, callback);
            boolean success = future.get();
            if (success) {
                pw.println("Success");
@@ -2859,14 +2846,12 @@ class PackageManagerShellCommand extends ShellCommand {
            }
        }

        userId = translateUserId(userId, true /*allowAll*/, "runSetHarmfulAppWarning");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runSetHarmfulAppWarning");
        final String packageName = getNextArgRequired();
        final String warning = getNextArg();

        mInterface.setHarmfulAppWarning(packageName, warning, userId);
        mInterface.setHarmfulAppWarning(packageName, warning, translatedUserId);

        return 0;
    }
@@ -2884,12 +2869,10 @@ class PackageManagerShellCommand extends ShellCommand {
            }
        }

        userId = translateUserId(userId, true /*allowAll*/, "runGetHarmfulAppWarning");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
        }
        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_NULL, "runGetHarmfulAppWarning");
        final String packageName = getNextArgRequired();
        final CharSequence warning = mInterface.getHarmfulAppWarning(packageName, userId);
        final CharSequence warning = mInterface.getHarmfulAppWarning(packageName, translatedUserId);
        if (!TextUtils.isEmpty(warning)) {
            getOutPrintWriter().println(warning);
            return 0;
@@ -2917,21 +2900,22 @@ class PackageManagerShellCommand extends ShellCommand {
        throw new IllegalArgumentException("ABI " + abi + " not supported on this device");
    }

    private int translateUserId(int userId, boolean allowAll, String logContext) {
        return ActivityManager.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),
                userId, allowAll, true, logContext, "pm command");
    private int translateUserId(int userId, int allUserId, String logContext) {
        final boolean allowAll = (allUserId != UserHandle.USER_NULL);
        final int translatedUserId = ActivityManager.handleIncomingUser(Binder.getCallingPid(),
                Binder.getCallingUid(), userId, allowAll, true, logContext, "pm command");
        return translatedUserId == UserHandle.USER_ALL ? allUserId : translatedUserId;
    }

    private int doCreateSession(SessionParams params, String installerPackageName, int userId)
            throws RemoteException {
        userId = translateUserId(userId, true /*allowAll*/, "doCreateSession");
        if (userId == UserHandle.USER_ALL) {
            userId = UserHandle.USER_SYSTEM;
            params.installFlags |= PackageManager.INSTALL_ALL_USERS;
        }

        final int translatedUserId =
                translateUserId(userId, UserHandle.USER_SYSTEM, "doCreateSession");
        final int sessionId = mInterface.getPackageInstaller()
                .createSession(params, installerPackageName, userId);
                .createSession(params, installerPackageName, translatedUserId);
        return sessionId;
    }