From 41c1ded7f042a4cf303479550b38fa66d7a18906 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Tue, 5 Aug 2014 11:15:05 -0700 Subject: [PATCH] Allow phone UID to export singleton providers Also add a user variant of replacePreferredActivity for use by SmsApplication. Map user restrictions for SMS/MMS to AppOps perms. Bug: 16681533 Change-Id: I3dfed5fc754e33bb51c6f571851653a7c2770e46 --- core/java/android/app/AppOpsManager.java | 16 ++++++++-------- core/java/android/app/ApplicationPackageManager.java | 13 ++++++++++++- core/java/android/content/pm/IPackageManager.aidl | 2 +- core/java/android/content/pm/PackageManager.java | 9 +++++++++ .../com/android/server/am/ActivityManagerService.java | 4 ++++ .../com/android/server/pm/PackageManagerService.java | 9 ++++++--- 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index caadecb29dc7..a52186a446b5 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -459,15 +459,15 @@ public class AppOpsManager { null, //POST_NOTIFICATION null, //NEIGHBORING_CELLS null, //CALL_PHONE - null, //READ_SMS - null, //WRITE_SMS - null, //RECEIVE_SMS - null, //RECEIVE_EMERGECY_SMS - null, //RECEIVE_MMS + UserManager.DISALLOW_SMS, //READ_SMS + UserManager.DISALLOW_SMS, //WRITE_SMS + UserManager.DISALLOW_SMS, //RECEIVE_SMS + null, //RECEIVE_EMERGENCY_SMS + UserManager.DISALLOW_SMS, //RECEIVE_MMS null, //RECEIVE_WAP_PUSH - null, //SEND_SMS - null, //READ_ICC_SMS - null, //WRITE_ICC_SMS + UserManager.DISALLOW_SMS, //SEND_SMS + UserManager.DISALLOW_SMS, //READ_ICC_SMS + UserManager.DISALLOW_SMS, //WRITE_ICC_SMS null, //WRITE_SETTINGS UserManager.DISALLOW_CREATE_WINDOWS, //SYSTEM_ALERT_WINDOW null, //ACCESS_NOTIFICATIONS diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 18ba8c4b68ea..c75c8b73f4e6 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -1384,7 +1384,18 @@ final class ApplicationPackageManager extends PackageManager { public void replacePreferredActivity(IntentFilter filter, int match, ComponentName[] set, ComponentName activity) { try { - mPM.replacePreferredActivity(filter, match, set, activity); + mPM.replacePreferredActivity(filter, match, set, activity, UserHandle.myUserId()); + } catch (RemoteException e) { + // Should never happen! + } + } + + @Override + public void replacePreferredActivityAsUser(IntentFilter filter, + int match, ComponentName[] set, ComponentName activity, + int userId) { + try { + mPM.replacePreferredActivity(filter, match, set, activity, userId); } catch (RemoteException e) { // Should never happen! } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 7196372edf4f..e27ad7d8d7f5 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -233,7 +233,7 @@ interface IPackageManager { in ComponentName[] set, in ComponentName activity, int userId); void replacePreferredActivity(in IntentFilter filter, int match, - in ComponentName[] set, in ComponentName activity); + in ComponentName[] set, in ComponentName activity, int userId); void clearPackagePreferredActivities(String packageName); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index c5dcd8ea5786..e482bb0bce24 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -3523,6 +3523,15 @@ public abstract class PackageManager { ComponentName[] set, ComponentName activity); /** + * @hide + */ + @Deprecated + public void replacePreferredActivityAsUser(IntentFilter filter, int match, + ComponentName[] set, ComponentName activity, int userId) { + throw new RuntimeException("Not implemented. Must override in a subclass."); + } + + /** * Remove all preferred activity mappings, previously added with * {@link #addPreferredActivity}, from the * system whose activities are implemented in the given package name. diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 9a58c5667471..11fa01d8c440 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -13765,6 +13765,10 @@ public final class ActivityManagerService extends ActivityManagerNative } } else if ("system".equals(componentProcessName)) { result = true; + } else if (UserHandle.isSameApp(aInfo.uid, Process.PHONE_UID) + && (flags & ServiceInfo.FLAG_SINGLE_USER) != 0) { + // Phone app is allowed to export singleuser providers. + result = true; } else { // App with pre-defined UID, check if it's a persistent app result = (aInfo.flags & ApplicationInfo.FLAG_PERSISTENT) != 0; diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index ee6d4d02e75e..b9658e2d2dd3 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -11410,7 +11410,7 @@ public class PackageManagerService extends IPackageManager.Stub { @Override public void replacePreferredActivity(IntentFilter filter, int match, - ComponentName[] set, ComponentName activity) { + ComponentName[] set, ComponentName activity, int userId) { if (filter.countActions() != 1) { throw new IllegalArgumentException( "replacePreferredActivity expects filter to have only 1 action."); @@ -11423,11 +11423,15 @@ public class PackageManagerService extends IPackageManager.Stub { "replacePreferredActivity expects filter to have no data authorities, " + "paths, or types; and at most one scheme."); } + + final int callingUid = Binder.getCallingUid(); + enforceCrossUserPermission(callingUid, userId, true, "replace preferred activity"); + final int callingUserId = UserHandle.getUserId(callingUid); synchronized (mPackages) { if (mContext.checkCallingOrSelfPermission( android.Manifest.permission.SET_PREFERRED_APPLICATIONS) != PackageManager.PERMISSION_GRANTED) { - if (getUidTargetSdkVersionLockedLPr(Binder.getCallingUid()) + if (getUidTargetSdkVersionLockedLPr(callingUid) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring replacePreferredActivity() from uid " + Binder.getCallingUid()); @@ -11437,7 +11441,6 @@ public class PackageManagerService extends IPackageManager.Stub { android.Manifest.permission.SET_PREFERRED_APPLICATIONS, null); } - final int callingUserId = UserHandle.getCallingUserId(); PreferredIntentResolver pir = mSettings.mPreferredActivities.get(callingUserId); if (pir != null) { Intent intent = new Intent(filter.getAction(0)).addCategory(filter.getCategory(0)); -- 2.11.0