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
This commit is contained in:
Todd Kennedy
2019-11-26 13:20:59 -08:00
parent f4eb2ca0d7
commit c3c521772a

View File

@@ -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,36 +1839,37 @@ 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 {
final PackageInfo info = mInterface.getPackageInfo(packageName,
PackageManager.MATCH_STATIC_SHARED_LIBRARIES, userId);
if (info == null) {
pw.println("Failure [not installed for " + userId + "]");
return 1;
}
final boolean isSystem =
(info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
// If we are being asked to delete a system app for just one
// user set flag so it disables rather than reverting to system
// version of the app.
if (isSystem) {
flags |= PackageManager.DELETE_SYSTEM_APP;
}
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, translatedUserId);
if (info == null) {
pw.println("Failure [not installed for " + translatedUserId + "]");
return 1;
}
final boolean isSystem =
(info.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
// If we are being asked to delete a system app for just one
// user set flag so it disables rather than reverting to system
// version of the app.
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;
}