Merge "Default grants: handle update system packages" into mnc-dev

This commit is contained in:
Svetoslav Ganov
2015-07-29 21:54:13 +00:00
committed by Android (Google) Code Review

View File

@@ -170,29 +170,22 @@ final class DefaultPermissionGrantPolicy {
synchronized (mService.mPackages) { synchronized (mService.mPackages) {
for (PackageParser.Package pkg : mService.mPackages.values()) { for (PackageParser.Package pkg : mService.mPackages.values()) {
if (!isSysComponentOrPersistentPlatformSignedPrivApp(pkg) if (!isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg)
|| !doesPackageSupportRuntimePermissions(pkg)) { || !doesPackageSupportRuntimePermissions(pkg)
|| pkg.requestedPermissions.isEmpty()) {
continue; continue;
} }
Set<String> permissions = new ArraySet<>();
final int permissionCount = pkg.requestedPermissions.size(); final int permissionCount = pkg.requestedPermissions.size();
for (int i = 0; i < permissionCount; i++) { for (int i = 0; i < permissionCount; i++) {
String permission = pkg.requestedPermissions.get(i); String permission = pkg.requestedPermissions.get(i);
BasePermission bp = mService.mSettings.mPermissions.get(permission); BasePermission bp = mService.mSettings.mPermissions.get(permission);
if (bp != null && bp.isRuntime()) { if (bp != null && bp.isRuntime()) {
final int flags = mService.getPermissionFlags(permission, permissions.add(permission);
pkg.packageName, userId);
if ((flags & PackageManager.FLAG_PERMISSION_SYSTEM_FIXED) == 0) {
mService.grantRuntimePermission(pkg.packageName, permission, userId);
mService.updatePermissionFlags(permission, pkg.packageName,
PackageManager.MASK_PERMISSION_FLAGS,
PackageManager.FLAG_PERMISSION_SYSTEM_FIXED
| PackageManager.FLAG_PERMISSION_GRANTED_BY_DEFAULT, userId);
if (DEBUG) {
Log.i(TAG, "Granted " + permission + " to system component "
+ pkg.packageName);
}
} }
} }
if (!permissions.isEmpty()) {
grantRuntimePermissionsLPw(pkg, permissions, true, userId);
} }
} }
} }
@@ -739,7 +732,7 @@ final class DefaultPermissionGrantPolicy {
private PackageParser.Package getSystemPackageLPr(String packageName) { private PackageParser.Package getSystemPackageLPr(String packageName) {
PackageParser.Package pkg = getPackageLPr(packageName); PackageParser.Package pkg = getPackageLPr(packageName);
if (pkg != null && pkg.isSystemApp()) { if (pkg != null && pkg.isSystemApp()) {
return !isSysComponentOrPersistentPlatformSignedPrivApp(pkg) ? pkg : null; return !isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg) ? pkg : null;
} }
return null; return null;
} }
@@ -756,18 +749,36 @@ final class DefaultPermissionGrantPolicy {
private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions, private void grantRuntimePermissionsLPw(PackageParser.Package pkg, Set<String> permissions,
boolean systemFixed, boolean overrideUserChoice, int userId) { boolean systemFixed, boolean overrideUserChoice, int userId) {
if (pkg.requestedPermissions.isEmpty()) {
return;
}
List<String> requestedPermissions = pkg.requestedPermissions; List<String> requestedPermissions = pkg.requestedPermissions;
Set<String> grantablePermissions = null;
if (pkg.isUpdatedSystemApp()) { if (pkg.isUpdatedSystemApp()) {
PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName); PackageSetting sysPs = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
if (sysPs != null) { if (sysPs != null) {
if (sysPs.pkg.requestedPermissions.isEmpty()) {
return;
}
if (!requestedPermissions.equals(sysPs.pkg.requestedPermissions)) {
grantablePermissions = new ArraySet<>(requestedPermissions);
requestedPermissions = sysPs.pkg.requestedPermissions; requestedPermissions = sysPs.pkg.requestedPermissions;
} }
} }
}
final int permissionCount = requestedPermissions.size(); final int grantablePermissionCount = requestedPermissions.size();
for (int i = 0; i < permissionCount; i++) { for (int i = 0; i < grantablePermissionCount; i++) {
String permission = requestedPermissions.get(i); String permission = requestedPermissions.get(i);
// If there is a disabled system app it may request a permission the updated
// version ot the data partition doesn't, In this case skip the permission.
if (grantablePermissions != null && !grantablePermissions.contains(permission)) {
continue;
}
if (permissions.contains(permission)) { if (permissions.contains(permission)) {
final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId); final int flags = mService.getPermissionFlags(permission, pkg.packageName, userId);
@@ -803,12 +814,19 @@ final class DefaultPermissionGrantPolicy {
} }
} }
private boolean isSysComponentOrPersistentPlatformSignedPrivApp(PackageParser.Package pkg) { private boolean isSysComponentOrPersistentPlatformSignedPrivAppLPr(PackageParser.Package pkg) {
if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) { if (UserHandle.getAppId(pkg.applicationInfo.uid) < FIRST_APPLICATION_UID) {
return true; return true;
} }
if ((pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) == 0 if (!pkg.isPrivilegedApp()) {
|| (pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) { return false;
}
PackageSetting sysPkg = mService.mSettings.getDisabledSystemPkgLPr(pkg.packageName);
if (sysPkg != null) {
if ((sysPkg.pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
return false;
}
} else if ((pkg.applicationInfo.flags & ApplicationInfo.FLAG_PERSISTENT) == 0) {
return false; return false;
} }
return PackageManagerService.compareSignatures(mService.mPlatformPackage.mSignatures, return PackageManagerService.compareSignatures(mService.mPlatformPackage.mSignatures,