summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Philip P. Moltmann <moltmann@google.com> 2019-05-17 19:56:19 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-05-17 19:56:19 +0000
commit4f09b09f62d48b291b77cf09c207b6570bd88535 (patch)
tree9b3baf7c3d265c67c16e0be7b9ae6a411ce69891
parent60f7cef62bd614fe0bb9a34d6c6529cb414ee8c8 (diff)
parenta4bd150588fc57a7db60ffcdf42cbc3c627024c3 (diff)
Merge "Whitelist all perms on installExistingPackage" into qt-dev
-rw-r--r--core/java/android/app/ApplicationPackageManager.java4
-rw-r--r--core/java/android/content/pm/IPackageInstaller.aidl2
-rw-r--r--core/java/android/content/pm/IPackageManager.aidl2
-rw-r--r--core/java/android/content/pm/PackageInstaller.java9
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java3
-rw-r--r--packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java7
-rw-r--r--services/core/java/com/android/server/pm/PackageInstallerService.java4
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java26
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerShellCommand.java13
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java15
10 files changed, 57 insertions, 28 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 4e22cc15b253..685eedc31303 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -1920,8 +1920,8 @@ public class ApplicationPackageManager extends PackageManager {
private int installExistingPackageAsUser(String packageName, int installReason, int userId)
throws NameNotFoundException {
try {
- int res = mPM.installExistingPackageAsUser(packageName, userId, 0 /*installFlags*/,
- installReason);
+ int res = mPM.installExistingPackageAsUser(packageName, userId,
+ INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS, installReason, null);
if (res == INSTALL_FAILED_INVALID_URI) {
throw new NameNotFoundException("Package " + packageName + " doesn't exist");
}
diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl
index 8e840796e953..b0b2c33e0ddd 100644
--- a/core/java/android/content/pm/IPackageInstaller.aidl
+++ b/core/java/android/content/pm/IPackageInstaller.aidl
@@ -52,7 +52,7 @@ interface IPackageInstaller {
in IntentSender statusReceiver, int userId);
void installExistingPackage(String packageName, int installFlags, int installReason,
- in IntentSender statusReceiver, int userId);
+ in IntentSender statusReceiver, int userId, in List<String> whiteListedPermissions);
void setPermissionsResult(int sessionId, boolean accepted);
}
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 6ab4657d727d..a7eecd7f4306 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -634,7 +634,7 @@ interface IPackageManager {
int getInstallLocation();
int installExistingPackageAsUser(String packageName, int userId, int installFlags,
- int installReason);
+ int installReason, in List<String> whiteListedPermissions);
void verifyPendingInstall(int id, int verificationCode);
void extendVerificationTimeout(int id, int verificationCodeAtTimeout, long millisecondsToDelay);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 89eabc285e38..3cecd7f88045 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -627,6 +627,10 @@ public class PackageInstaller {
* Install the given package, which already exists on the device, for the user for which this
* installer was created.
*
+ * <p>This will
+ * {@link PackageInstaller.SessionParams#setWhitelistedRestrictedPermissions(Set) whitelist
+ * all restricted permissions}.
+ *
* @param packageName The package to install.
* @param installReason Reason for install.
* @param statusReceiver Where to deliver the result.
@@ -639,8 +643,9 @@ public class PackageInstaller {
@Nullable IntentSender statusReceiver) {
Preconditions.checkNotNull(packageName, "packageName cannot be null");
try {
- mInstaller.installExistingPackage(packageName, 0, installReason, statusReceiver,
- mUserId);
+ mInstaller.installExistingPackage(packageName,
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS, installReason,
+ statusReceiver, mUserId, null);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
index ec8bb80bee13..4941f7e42bf6 100644
--- a/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/users/AppRestrictionsHelper.java
@@ -117,7 +117,8 @@ public class AppRestrictionsHelper {
if (info == null || !info.enabled
|| (info.flags&ApplicationInfo.FLAG_INSTALLED) == 0) {
mIPm.installExistingPackageAsUser(packageName, mUser.getIdentifier(),
- 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN);
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_UNKNOWN, null);
if (DEBUG) {
Log.d(TAG, "Installing " + packageName);
}
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
index e840a4be8b80..b216a2a3fb78 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/users/AppRestrictionsHelperTest.java
@@ -16,15 +16,14 @@
package com.android.settingslib.users;
-import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.argThat;
import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.nullable;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.when;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import android.appwidget.AppWidgetManager;
import android.content.Context;
@@ -43,6 +42,7 @@ import android.os.UserHandle;
import android.os.UserManager;
import android.test.suitebuilder.annotation.SmallTest;
import android.view.inputmethod.InputMethodInfo;
+
import com.android.settingslib.BaseTest;
import org.mockito.ArgumentMatcher;
@@ -146,7 +146,8 @@ public class AppRestrictionsHelperTest extends BaseTest {
mHelper.applyUserAppsStates(mockListener);
verify(mIpm, times(1)).installExistingPackageAsUser("app1", testUserId,
- 0 /*installFlags*/, PackageManager.INSTALL_REASON_UNKNOWN);
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_UNKNOWN, null);
verify(mIpm, times(1)).setApplicationHiddenSettingAsUser("app2", false, testUserId);
verify(mockListener).onDisableUiForPackage("app2");
verify(mPm, times(1)).deletePackageAsUser(eq("app3"),
diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java
index 35f21496f2cc..bd8859401856 100644
--- a/services/core/java/com/android/server/pm/PackageInstallerService.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerService.java
@@ -854,9 +854,9 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements
@Override
public void installExistingPackage(String packageName, int installFlags, int installReason,
- IntentSender statusReceiver, int userId) {
+ IntentSender statusReceiver, int userId, List<String> whiteListedPermissions) {
mPm.installExistingPackageAsUser(packageName, userId, installFlags, installReason,
- statusReceiver);
+ whiteListedPermissions, statusReceiver);
}
@Override
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 23aa8f0f13ca..dd48e2dfa2c5 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -13409,8 +13409,9 @@ public class PackageManagerService extends IPackageManager.Stub
installExistingPackageAsUser(
packageName,
userId,
- 0 /*installFlags*/,
- PackageManager.INSTALL_REASON_DEVICE_SETUP);
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_DEVICE_SETUP,
+ null);
return true;
}
@@ -13498,15 +13499,19 @@ public class PackageManagerService extends IPackageManager.Stub
*/
@Override
public int installExistingPackageAsUser(String packageName, int userId, int installFlags,
- int installReason) {
- return installExistingPackageAsUser(packageName, userId, installFlags, installReason, null);
+ int installReason, List<String> whiteListedPermissions) {
+ return installExistingPackageAsUser(packageName, userId, installFlags, installReason,
+ whiteListedPermissions, null);
}
- int installExistingPackageAsUser(String packageName, int userId, int installFlags,
- int installReason, IntentSender intentSender) {
+ int installExistingPackageAsUser(@Nullable String packageName, @UserIdInt int userId,
+ @PackageManager.InstallFlags int installFlags,
+ @PackageManager.InstallReason int installReason,
+ @Nullable List<String> whiteListedPermissions, @Nullable IntentSender intentSender) {
if (DEBUG_INSTALL) {
Log.v(TAG, "installExistingPackageAsUser package=" + packageName + " userId=" + userId
- + " installFlags=" + installFlags + " installReason=" + installReason);
+ + " installFlags=" + installFlags + " installReason=" + installReason
+ + " whiteListedPermissions=" + whiteListedPermissions);
}
final int callingUid = Binder.getCallingUid();
@@ -13569,6 +13574,13 @@ public class PackageManagerService extends IPackageManager.Stub
}
if (installed) {
+ if ((installFlags & PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS)
+ != 0 && pkgSetting.pkg != null) {
+ whiteListedPermissions = pkgSetting.pkg.requestedPermissions;
+ }
+ setWhitelistedRestrictedPermissions(packageName, whiteListedPermissions,
+ PackageManager.FLAG_PERMISSION_WHITELIST_INSTALLER, userId);
+
if (pkgSetting.pkg != null) {
synchronized (mInstallLock) {
// We don't need to freeze for a brand new install
diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
index d9a608d0b2a2..f5c8049dcb25 100644
--- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
+++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java
@@ -1162,7 +1162,7 @@ class PackageManagerShellCommand extends ShellCommand {
private int runInstallExisting() throws RemoteException {
final PrintWriter pw = getOutPrintWriter();
int userId = UserHandle.USER_SYSTEM;
- int installFlags = 0;
+ int installFlags = PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
String opt;
boolean waitTillComplete = false;
while ((opt = getNextOption()) != null) {
@@ -1182,6 +1182,9 @@ class PackageManagerShellCommand extends ShellCommand {
case "--wait":
waitTillComplete = true;
break;
+ case "--restrict-permissions":
+ installFlags &= ~PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
+ break;
default:
pw.println("Error: Unknown option: " + opt);
return 1;
@@ -1201,7 +1204,7 @@ class PackageManagerShellCommand extends ShellCommand {
final IPackageInstaller installer = mInterface.getPackageInstaller();
pw.println("Installing package " + packageName + " for user: " + userId);
installer.installExistingPackage(packageName, installFlags, installReason,
- receiver.getIntentSender(), userId);
+ receiver.getIntentSender(), userId, null);
final Intent result = receiver.getResult();
final int status = result.getIntExtra(PackageInstaller.EXTRA_STATUS,
PackageInstaller.STATUS_FAILURE);
@@ -1210,7 +1213,7 @@ class PackageManagerShellCommand extends ShellCommand {
}
final int res = mInterface.installExistingPackageAsUser(packageName, userId,
- installFlags, installReason);
+ installFlags, installReason, null);
if (res == PackageManager.INSTALL_FAILED_INVALID_URI) {
throw new NameNotFoundException("Package " + packageName + " doesn't exist");
}
@@ -2370,7 +2373,11 @@ class PackageManagerShellCommand extends ShellCommand {
private InstallParams makeInstallParams() {
final SessionParams sessionParams = new SessionParams(SessionParams.MODE_FULL_INSTALL);
final InstallParams params = new InstallParams();
+
params.sessionParams = sessionParams;
+ // Whitelist all permissions by default
+ sessionParams.installFlags |= PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS;
+
String opt;
boolean replaceExisting = true;
while ((opt = getNextOption()) != null) {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 22231c0ab09b..e2e9c420a046 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -9680,7 +9680,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
// Install the profile owner if not present.
if (!mIPackageManager.isPackageAvailable(adminPkg, userHandle)) {
mIPackageManager.installExistingPackageAsUser(adminPkg, userHandle,
- 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY);
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_POLICY, null);
}
} catch (RemoteException e) {
// Does not happen, same process
@@ -10176,7 +10177,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
// Install the app.
mIPackageManager.installExistingPackageAsUser(packageName, userId,
- 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY);
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_POLICY, null);
if (isDemo) {
// Ensure the app is also ENABLED for demo users.
mIPackageManager.setApplicationEnabledSetting(packageName,
@@ -10230,7 +10232,8 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
if (isSystemApp(mIPackageManager, packageName, parentUserId)) {
numberOfAppsInstalled++;
mIPackageManager.installExistingPackageAsUser(packageName, userId,
- 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY);
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_POLICY, null);
} else {
Slog.d(LOG_TAG, "Not enabling " + packageName + " since is not a"
+ " system app");
@@ -10289,9 +10292,9 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
// Install the package.
- result = mIPackageManager
- .installExistingPackageAsUser(packageName, callingUserId,
- 0 /*installFlags*/, PackageManager.INSTALL_REASON_POLICY)
+ result = mIPackageManager.installExistingPackageAsUser(packageName, callingUserId,
+ PackageManager.INSTALL_ALL_WHITELIST_RESTRICTED_PERMISSIONS,
+ PackageManager.INSTALL_REASON_POLICY, null)
== PackageManager.INSTALL_SUCCEEDED;
} catch (RemoteException re) {
// shouldn't happen