diff options
author | Clark Scheff <clark@cyngn.com> | 2014-09-06 15:00:02 -0700 |
---|---|---|
committer | Adnan Begovic <adnan@cyngn.com> | 2015-10-12 18:07:29 -0700 |
commit | de43e20765acc4e9e2612f908f2a0e4fa7138442 (patch) | |
tree | 633dfecc42909d4064c8de013e766504e63adc6a | |
parent | 48fea2d5452c90d3dc4356e1e55ff9f673826172 (diff) | |
download | frameworks_base-de43e20765acc4e9e2612f908f2a0e4fa7138442.zip frameworks_base-de43e20765acc4e9e2612f908f2a0e4fa7138442.tar.gz frameworks_base-de43e20765acc4e9e2612f908f2a0e4fa7138442.tar.bz2 |
Allow granting permissions based on signature in <allow-permission/>
This patch allows us to either specify a sharedUserId or a package
signature to use when granting the specific permission.
Change-Id: I8aed78d40316e0e94ac1bfefc7c4a3016a2a9a6b
-rw-r--r-- | services/core/java/com/android/server/SystemConfig.java | 45 | ||||
-rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 18 |
2 files changed, 60 insertions, 3 deletions
diff --git a/services/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java index cd61347..e089aee 100644 --- a/services/core/java/com/android/server/SystemConfig.java +++ b/services/core/java/com/android/server/SystemConfig.java @@ -18,6 +18,7 @@ package com.android.server; import android.app.ActivityManager; import android.content.pm.FeatureInfo; +import android.content.pm.Signature; import android.os.*; import android.os.Process; import android.util.ArrayMap; @@ -99,6 +100,9 @@ public class SystemConfig { // URL-handling state upon factory reset. final ArraySet<String> mLinkedApps = new ArraySet<>(); + final HashMap<Signature, HashSet<String>> mSignatureAllowances + = new HashMap<Signature, HashSet<String>>(); + public static SystemConfig getInstance() { synchronized (SystemConfig.class) { if (sInstance == null) { @@ -144,6 +148,10 @@ public class SystemConfig { return mLinkedApps; } + public HashMap<Signature, HashSet<String>> getSignatureAllowances() { + return mSignatureAllowances; + } + SystemConfig() { // Read configuration from system readPermissions(Environment.buildPath( @@ -290,6 +298,43 @@ public class SystemConfig { perms.add(perm); XmlUtils.skipCurrentTag(parser); + } else if ("allow-permission".equals(name)) { + String perm = parser.getAttributeValue(null, "name"); + if (perm == null) { + Slog.w(TAG, + "<allow-permission> without name at " + + parser.getPositionDescription()); + XmlUtils.skipCurrentTag(parser); + continue; + } + String signature = parser.getAttributeValue(null, "signature"); + if (signature == null) { + Slog.w(TAG, + "<allow-permission> without signature at " + + parser.getPositionDescription()); + XmlUtils.skipCurrentTag(parser); + continue; + } + Signature sig = null; + try { + sig = new Signature(signature); + } catch (IllegalArgumentException e) { + // sig will be null so we will log it below + } + if (sig != null) { + HashSet<String> perms = mSignatureAllowances.get(sig); + if (perms == null) { + perms = new HashSet<String>(); + mSignatureAllowances.put(sig, perms); + } + perms.add(perm); + } else { + Slog.w(TAG, + "<allow-permission> with bad signature at " + + parser.getPositionDescription()); + } + XmlUtils.skipCurrentTag(parser); + } else if ("library".equals(name) && !onlyFeatures) { String lname = parser.getAttributeValue(null, "name"); String lfile = parser.getAttributeValue(null, "file"); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f49285f..ad7b464 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -504,6 +504,7 @@ public class PackageManagerService extends IPackageManager.Stub { final int[] mGlobalGids; final SparseArray<ArraySet<String>> mSystemPermissions; final ArrayMap<String, FeatureInfo> mAvailableFeatures; + final ArrayMap<Signature, HashSet<String>> mSignatureAllowances; // If mac_permissions.xml was found for seinfo labeling. boolean mFoundPolicyFile; @@ -1862,6 +1863,7 @@ public class PackageManagerService extends IPackageManager.Stub { mGlobalGids = systemConfig.getGlobalGids(); mSystemPermissions = systemConfig.getSystemPermissions(); mAvailableFeatures = systemConfig.getAvailableFeatures(); + mSignatureAllowances = systemConfig.getSignatureAllowances(); synchronized (mInstallLock) { // writer @@ -3450,6 +3452,16 @@ public class PackageManagerService extends IPackageManager.Stub { } } + private boolean isAllowedSignature(PackageParser.Package pkg, String permissionName) { + for (Signature pkgSig : pkg.mSignatures) { + HashSet<String> perms = mSignatureAllowances.get(pkgSig); + if (perms != null && perms.contains(permissionName)) { + return true; + } + } + return false; + } + @Override public void grantRuntimePermission(String packageName, String name, final int userId) { if (!sUserManager.exists(userId)) { @@ -8615,9 +8627,9 @@ public class PackageManagerService extends IPackageManager.Stub { == PackageManager.SIGNATURE_MATCH); if (!allowed && (bp.protectionLevel & PermissionInfo.PROTECTION_FLAG_PRIVILEGED) != 0) { - if (isSystemApp(pkg)) { + boolean allowedSig = isAllowedSignature(pkg, perm); + if (isSystemApp(pkg) || allowedSig) { // For updated system applications, a system permission - // is granted only if it had been defined by the original application. if (pkg.isUpdatedSystemApp()) { final PackageSetting sysPs = mSettings .getDisabledSystemPkgLPr(pkg.packageName); @@ -8647,7 +8659,7 @@ public class PackageManagerService extends IPackageManager.Stub { } } } else { - allowed = isPrivilegedApp(pkg); + allowed = isPrivilegedApp(pkg) || allowedSig; } } } |