summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClark Scheff <clark@cyngn.com>2014-09-06 15:00:02 -0700
committerAdnan Begovic <adnan@cyngn.com>2015-10-12 18:07:29 -0700
commitde43e20765acc4e9e2612f908f2a0e4fa7138442 (patch)
tree633dfecc42909d4064c8de013e766504e63adc6a
parent48fea2d5452c90d3dc4356e1e55ff9f673826172 (diff)
downloadframeworks_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.java45
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java18
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;
}
}
}