From d55deb0a7163a40fe9772ce659f0a3e3ed340de3 Mon Sep 17 00:00:00 2001 From: rich cannings Date: Tue, 2 Oct 2012 14:53:08 -0700 Subject: [PATCH] Fix package verification with multi-user Fixes the porblem of PackageManagerService always sending Intents to user 0. Bug: 7272549 Change-Id: I25995d8b2b9a24346f4813e6d8d9a84e5d5d2b6b --- .../server/pm/PackageManagerService.java | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 75bc265ffe4f7..a22a66b53cb68 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -851,7 +851,8 @@ public class PackageManagerService extends IPackageManager.Stub { state.setVerifierResponse(Binder.getCallingUid(), PackageManager.VERIFICATION_ALLOW_WITHOUT_SUFFICIENT); broadcastPackageVerified(verificationId, args.packageURI, - PackageManager.VERIFICATION_ALLOW); + PackageManager.VERIFICATION_ALLOW, + state.getInstallArgs().getUser()); try { ret = args.copyApk(mContainerService, true); } catch (RemoteException e) { @@ -859,7 +860,8 @@ public class PackageManagerService extends IPackageManager.Stub { } } else { broadcastPackageVerified(verificationId, args.packageURI, - PackageManager.VERIFICATION_REJECT); + PackageManager.VERIFICATION_REJECT, + state.getInstallArgs().getUser()); } processPendingInstall(args, ret); @@ -889,7 +891,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (state.isInstallAllowed()) { ret = PackageManager.INSTALL_FAILED_INTERNAL_ERROR; broadcastPackageVerified(verificationId, args.packageURI, - response.code); + response.code, state.getInstallArgs().getUser()); try { ret = args.copyApk(mContainerService, true); } catch (RemoteException e) { @@ -5741,14 +5743,15 @@ public class PackageManagerService extends IPackageManager.Stub { } private void broadcastPackageVerified(int verificationId, Uri packageUri, - int verificationCode) { + int verificationCode, UserHandle user) { final Intent intent = new Intent(Intent.ACTION_PACKAGE_VERIFIED); intent.setDataAndType(packageUri, PACKAGE_MIME_TYPE); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.putExtra(PackageManager.EXTRA_VERIFICATION_ID, verificationId); intent.putExtra(PackageManager.EXTRA_VERIFICATION_RESULT, verificationCode); - mContext.sendBroadcast(intent, android.Manifest.permission.PACKAGE_VERIFICATION_AGENT); + mContext.sendBroadcastAsUser(intent, user, + android.Manifest.permission.PACKAGE_VERIFICATION_AGENT); } private ComponentName matchComponentForVerifier(String packageName, @@ -6477,7 +6480,7 @@ public class PackageManagerService extends IPackageManager.Stub { final Intent sufficientIntent = new Intent(verification); sufficientIntent.setComponent(verifierComponent); - mContext.sendBroadcast(sufficientIntent); + mContext.sendBroadcastAsUser(sufficientIntent, getUser()); } } } @@ -6492,7 +6495,7 @@ public class PackageManagerService extends IPackageManager.Stub { * target BroadcastReceivers have run. */ verification.setComponent(requiredVerifierComponent); - mContext.sendOrderedBroadcast(verification, + mContext.sendOrderedBroadcastAsUser(verification, getUser(), android.Manifest.permission.PACKAGE_VERIFICATION_AGENT, new BroadcastReceiver() { @Override @@ -6779,6 +6782,10 @@ public class PackageManagerService extends IPackageManager.Stub { protected boolean isFwdLocked() { return (flags & PackageManager.INSTALL_FORWARD_LOCK) != 0; } + + UserHandle getUser() { + return user; + } } class FileInstallArgs extends InstallArgs {