diff options
author | Jeff Davidson <jpd@google.com> | 2015-06-23 20:42:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-06-23 20:43:06 +0000 |
commit | 8d9ad19341e19256651ef86274a4382f2c09b279 (patch) | |
tree | 8bbaf4b311c295b4749236d456ea698e1b5f77cd /services | |
parent | 90c9e4eb54a9c4b4fbc821b1992f2aee2f2b1e8c (diff) | |
parent | 2a880312086147577e1e814bda6985fa97fb343b (diff) | |
download | frameworks_base-8d9ad19341e19256651ef86274a4382f2c09b279.zip frameworks_base-8d9ad19341e19256651ef86274a4382f2c09b279.tar.gz frameworks_base-8d9ad19341e19256651ef86274a4382f2c09b279.tar.bz2 |
Merge "Default permissions for carrier apps." into mnc-dev
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java | 23 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 98 |
2 files changed, 97 insertions, 24 deletions
diff --git a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java index 62c686c..3ea384c 100644 --- a/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java +++ b/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java @@ -45,7 +45,7 @@ import static android.os.Process.FIRST_APPLICATION_UID; * have phone related permission by default. */ final class DefaultPermissionGrantPolicy { - private static final String TAG = "DefaultPermissionGrantPolicy"; + private static final String TAG = "DefaultPermGrantPolicy"; // must be <= 23 chars private static final boolean DEBUG = false; private static final String PACKAGE_MIME_TYPE = "application/vnd.android.package-archive"; @@ -133,6 +133,7 @@ final class DefaultPermissionGrantPolicy { private PackagesProvider mImePackagesProvider; private PackagesProvider mLocationPackagesProvider; private PackagesProvider mVoiceInteractionPackagesProvider; + private PackagesProvider mCarrierAppPackagesProvider; public DefaultPermissionGrantPolicy(PackageManagerService service) { mService = service; @@ -150,6 +151,10 @@ final class DefaultPermissionGrantPolicy { mVoiceInteractionPackagesProvider = provider; } + public void setCarrierAppPackagesProviderLPw(PackagesProvider provider) { + mCarrierAppPackagesProvider = provider; + } + public void grantDefaultPermissions(int userId) { grantPermissionsToSysComponentsAndPrivApps(userId); grantDefaultSystemHandlerPermissions(userId); @@ -193,11 +198,13 @@ final class DefaultPermissionGrantPolicy { final PackagesProvider imePackagesProvider; final PackagesProvider locationPackagesProvider; final PackagesProvider voiceInteractionPackagesProvider; + final PackagesProvider carrierAppPackagesProvider; synchronized (mService.mPackages) { imePackagesProvider = mImePackagesProvider; locationPackagesProvider = mLocationPackagesProvider; voiceInteractionPackagesProvider = mVoiceInteractionPackagesProvider; + carrierAppPackagesProvider = mCarrierAppPackagesProvider; } String[] imePackageNames = (imePackagesProvider != null) @@ -206,6 +213,8 @@ final class DefaultPermissionGrantPolicy { ? voiceInteractionPackagesProvider.getPackages(userId) : null; String[] locationPackageNames = (locationPackagesProvider != null) ? locationPackagesProvider.getPackages(userId) : null; + String[] carrierAppPackageNames = (carrierAppPackagesProvider != null) + ? carrierAppPackagesProvider.getPackages(userId) : null; synchronized (mService.mPackages) { // Installers @@ -382,6 +391,18 @@ final class DefaultPermissionGrantPolicy { } } } + + // Carrier apps + if (carrierAppPackageNames != null) { + for (String packageName : carrierAppPackageNames) { + PackageParser.Package carrierPackage = getSystemPackageLPr(packageName); + if (carrierPackage != null + && doesPackageSupportRuntimePermissions(carrierPackage)) { + grantRuntimePermissionsLPw(carrierPackage, PHONE_PERMISSIONS, userId); + grantRuntimePermissionsLPw(carrierPackage, LOCATION_PERMISSIONS, userId); + } + } + } } } diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 7a39c2b..d1ef1c9 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -100,6 +100,7 @@ import android.content.pm.IPackageInstaller; import android.content.pm.IPackageManager; import android.content.pm.IPackageMoveObserver; import android.content.pm.IPackageStatsObserver; +import android.content.pm.IPackagesProvider; import android.content.pm.InstrumentationInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.KeySet; @@ -254,14 +255,14 @@ import java.util.concurrent.atomic.AtomicLong; /** * Keep track of all those .apks everywhere. - * + * * This is very central to the platform's security; please run the unit * tests whenever making modifications here: - * + * mmm frameworks/base/tests/AndroidTests adb install -r -f out/target/product/passion/data/app/AndroidTests.apk adb shell am instrument -w -e class com.android.unit_tests.PackageManagerTests com.android.unit_tests/android.test.InstrumentationTestRunner - * + * * {@hide} */ public class PackageManagerService extends IPackageManager.Stub { @@ -509,7 +510,7 @@ public class PackageManagerService extends IPackageManager.Stub { // Packages whose data we have transfered into another package, thus // should no longer exist. final ArraySet<String> mTransferedPackages = new ArraySet<String>(); - + // Broadcast actions that are only available to the system. final ArraySet<String> mProtectedBroadcasts = new ArraySet<String>(); @@ -1092,7 +1093,7 @@ public class PackageManagerService extends IPackageManager.Stub { Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); } } - + void doHandleMessage(Message msg) { switch (msg.what) { case INIT_COPY: { @@ -2502,7 +2503,7 @@ public class PackageManagerService extends IPackageManager.Stub { } return out; } - + @Override public String[] canonicalToCurrentPackageNames(String[] names) { String[] out = new String[names.length]; @@ -2572,7 +2573,7 @@ public class PackageManagerService extends IPackageManager.Stub { pi.protectionLevel = bp.protectionLevel; return pi; } - + @Override public PermissionInfo getPermissionInfo(String name, int flags) { // reader @@ -3052,7 +3053,7 @@ public class PackageManagerService extends IPackageManager.Stub { } return s1.equals(s2); } - + static boolean comparePermissionInfos(PermissionInfo pi1, PermissionInfo pi2) { if (pi1.icon != pi2.icon) return false; if (pi1.logo != pi2.logo) return false; @@ -4214,7 +4215,7 @@ public class PackageManagerService extends IPackageManager.Stub { ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { - intent = intent.getSelector(); + intent = intent.getSelector(); comp = intent.getComponent(); } } @@ -4769,7 +4770,7 @@ public class PackageManagerService extends IPackageManager.Stub { ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { - intent = intent.getSelector(); + intent = intent.getSelector(); comp = intent.getComponent(); } } @@ -4820,7 +4821,7 @@ public class PackageManagerService extends IPackageManager.Stub { ComponentName comp = intent.getComponent(); if (comp == null) { if (intent.getSelector() != null) { - intent = intent.getSelector(); + intent = intent.getSelector(); comp = intent.getComponent(); } } @@ -6247,7 +6248,7 @@ public class PackageManagerService extends IPackageManager.Stub { + "): packages=" + suid.packages); } } - + // Check if we are renaming from an original package name. PackageSetting origPackage = null; String realName = null; @@ -6267,7 +6268,7 @@ public class PackageManagerService extends IPackageManager.Stub { // it is not already done. pkg.setPackageName(renamed); } - + } else { for (int i=pkg.mOriginalPackages.size()-1; i>=0; i--) { if ((origPackage = mSettings.peekPackageLPr( @@ -6297,7 +6298,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } } - + if (mTransferedPackages.contains(pkg.packageName)) { Slog.w(TAG, "Package " + pkg.packageName + " was transferred to another, but its .apk remains"); @@ -6322,24 +6323,24 @@ public class PackageManagerService extends IPackageManager.Stub { // looking up the package under its new name, so getPackageLP // can take care of fiddling things correctly. pkg.setPackageName(origPackage.name); - + // File a report about this. String msg = "New package " + pkgSetting.realName + " renamed to replace old package " + pkgSetting.name; reportSettingsProblem(Log.WARN, msg); - + // Make a note of it. mTransferedPackages.add(origPackage.name); - + // No longer need to retain this. pkgSetting.origPackage = null; } - + if (realName != null) { // Make a note of it. mTransferedPackages.add(pkg.packageName); } - + if (mSettings.isDisabledSystemPackageLPr(pkg.packageName)) { pkg.applicationInfo.flags |= ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; } @@ -6455,7 +6456,7 @@ public class PackageManagerService extends IPackageManager.Stub { } final String pkgName = pkg.packageName; - + final long scanFileTime = scanFile.lastModified(); final boolean forceDex = (scanFlags & SCAN_FORCE_DEX) != 0; pkg.applicationInfo.processName = fixProcessName( @@ -8375,7 +8376,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageParser.ActivityIntentInfo info) { return packageName.equals(info.activity.owner.packageName); } - + @Override protected ResolveInfo newResult(PackageParser.ActivityIntentInfo info, int match, int userId) { @@ -8598,7 +8599,7 @@ public class PackageManagerService extends IPackageManager.Stub { PackageParser.ServiceIntentInfo info) { return packageName.equals(info.service.owner.packageName); } - + @Override protected ResolveInfo newResult(PackageParser.ServiceIntentInfo filter, int match, int userId) { @@ -14153,7 +14154,7 @@ public class PackageManagerService extends IPackageManager.Stub { boolean checkin = false; String packageName = null; - + int opti = 0; while (opti < args.length) { String opt = args[opti]; @@ -15799,4 +15800,55 @@ public class PackageManagerService extends IPackageManager.Stub { } } } + + @Override + public void grantDefaultPermissions(final int userId) { + enforceSystemOrPhoneCaller("grantDefaultPermissions"); + long token = Binder.clearCallingIdentity(); + try { + // We cannot grant the default permissions with a lock held as + // we query providers from other components for default handlers + // such as enabled IMEs, etc. + mHandler.post(new Runnable() { + @Override + public void run() { + mDefaultPermissionPolicy.grantDefaultPermissions(userId); + } + }); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public void setCarrierAppPackagesProvider(final IPackagesProvider provider) { + enforceSystemOrPhoneCaller("setCarrierAppPackagesProvider"); + long token = Binder.clearCallingIdentity(); + try { + PackageManagerInternal.PackagesProvider wrapper = + new PackageManagerInternal.PackagesProvider() { + @Override + public String[] getPackages(int userId) { + try { + return provider.getPackages(userId); + } catch (RemoteException e) { + return null; + } + } + }; + synchronized (mPackages) { + mDefaultPermissionPolicy.setCarrierAppPackagesProviderLPw(wrapper); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + + private static void enforceSystemOrPhoneCaller(String tag) { + int callingUid = Binder.getCallingUid(); + if (callingUid != Process.PHONE_UID && callingUid != Process.SYSTEM_UID) { + throw new SecurityException( + "Cannot call " + tag + " from UID " + callingUid); + } + } } |