summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSvet Ganov <svetoslavganov@google.com>2016-04-26 22:31:11 -0700
committerSvet Ganov <svetoslavganov@google.com>2016-04-27 10:49:21 -0700
commit294b6406798c59e9db5ffa99d042f9b8c6ca6f90 (patch)
treeb0da38c9db2485c9d586f44c4bc6565f438f8bb7 /src
parenteff96c98b69ed6340f2e2d4adb99ab85389fcf19 (diff)
downloadandroid_packages_apps_PackageInstaller-294b6406798c59e9db5ffa99d042f9b8c6ca6f90.tar.gz
android_packages_apps_PackageInstaller-294b6406798c59e9db5ffa99d042f9b8c6ca6f90.tar.bz2
android_packages_apps_PackageInstaller-294b6406798c59e9db5ffa99d042f9b8c6ca6f90.zip
Grant only the requested permissions
If an app requests a permission in a group we were auto granting it all permissions from the group declared as used by the app. The intended behavior is that we grant only the requested permission and requesting a permission from a group where a permission is already granted results in an auto-grant. The intended behavior was to prevent coding around permission groups which a volatile by design. Now if apps target SDK above M we provide the intended behavior, otherwise for apps targeting M we provide an unchenged behavior. bug:28347872 Change-Id: I493714b2c2581340b01b12ce6fedf80f9d3deec5
Diffstat (limited to 'src')
-rw-r--r--src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java50
-rw-r--r--src/com/android/packageinstaller/permission/utils/ArrayUtils.java18
2 files changed, 59 insertions, 9 deletions
diff --git a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
index 78d33d23..807d3a3b 100644
--- a/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
+++ b/src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java
@@ -29,7 +29,6 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.graphics.Typeface;
import android.graphics.drawable.Icon;
-import android.hardware.camera2.utils.ArrayUtils;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
@@ -47,6 +46,7 @@ import com.android.packageinstaller.permission.model.AppPermissionGroup;
import com.android.packageinstaller.permission.model.AppPermissions;
import com.android.packageinstaller.permission.model.Permission;
import com.android.packageinstaller.permission.ui.handheld.GrantPermissionsViewHandlerImpl;
+import com.android.packageinstaller.permission.utils.ArrayUtils;
import com.android.packageinstaller.permission.utils.SafetyNetLogger;
import java.util.ArrayList;
@@ -147,24 +147,36 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
switch (permissionPolicy) {
case DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT: {
if (!group.areRuntimePermissionsGranted()) {
- group.grantRuntimePermissions(false);
+ group.grantRuntimePermissions(false, computeAffectedPermissions(
+ callingPackageInfo, requestedPermission));
}
group.setPolicyFixed();
} break;
case DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY: {
if (group.areRuntimePermissionsGranted()) {
- group.revokeRuntimePermissions(false);
+ group.revokeRuntimePermissions(false, computeAffectedPermissions(
+ callingPackageInfo, requestedPermission));
}
group.setPolicyFixed();
} break;
default: {
if (!group.areRuntimePermissionsGranted()) {
- mRequestGrantPermissionGroups.put(group.getName(),
- new GroupState(group));
+ GroupState state = mRequestGrantPermissionGroups.get(group.getName());
+ if (state == null) {
+ state = new GroupState(group);
+ mRequestGrantPermissionGroups.put(group.getName(), state);
+ }
+ String affectedPermission = computeAffectedPermission(
+ callingPackageInfo, requestedPermission);
+ if (affectedPermission != null) {
+ state.affectedPermissions = ArrayUtils.appendString(
+ state.affectedPermissions, affectedPermission);
+ }
} else {
- group.grantRuntimePermissions(false);
+ group.grantRuntimePermissions(false, computeAffectedPermissions(
+ callingPackageInfo, requestedPermission));
updateGrantResults(group);
}
} break;
@@ -271,10 +283,12 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
GroupState groupState = mRequestGrantPermissionGroups.get(name);
if (groupState.mGroup != null) {
if (granted) {
- groupState.mGroup.grantRuntimePermissions(doNotAskAgain);
+ groupState.mGroup.grantRuntimePermissions(doNotAskAgain,
+ groupState.affectedPermissions);
groupState.mState = GroupState.STATE_ALLOWED;
} else {
- groupState.mGroup.revokeRuntimePermissions(doNotAskAgain);
+ groupState.mGroup.revokeRuntimePermissions(doNotAskAgain,
+ groupState.affectedPermissions);
groupState.mState = GroupState.STATE_DENIED;
}
updateGrantResults(groupState.mGroup);
@@ -286,7 +300,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
private void updateGrantResults(AppPermissionGroup group) {
for (Permission permission : group.getPermissions()) {
- final int index = ArrayUtils.getArrayIndex(
+ final int index = ArrayUtils.indexOf(
mRequestedPermissions, permission.getName());
if (index >= 0) {
mGrantResults[index] = permission.isGranted() ? PackageManager.PERMISSION_GRANTED
@@ -402,6 +416,23 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
SafetyNetLogger.logPermissionsRequested(mAppPermissions.getPackageInfo(), groups);
}
+ private static String[] computeAffectedPermissions(PackageInfo callingPackageInfo,
+ String permission) {
+ String affectedPermission = computeAffectedPermission(callingPackageInfo, permission);
+ if (affectedPermission != null) {
+ return new String[] {permission};
+ }
+ return null;
+ }
+
+ private static String computeAffectedPermission(PackageInfo callingPackageInfo,
+ String permission) {
+ if (callingPackageInfo.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) {
+ return permission;
+ }
+ return null;
+ }
+
private static final class GroupState {
static final int STATE_UNKNOWN = 0;
static final int STATE_ALLOWED = 1;
@@ -409,6 +440,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity
final AppPermissionGroup mGroup;
int mState = STATE_UNKNOWN;
+ String[] affectedPermissions;
GroupState(AppPermissionGroup group) {
mGroup = group;
diff --git a/src/com/android/packageinstaller/permission/utils/ArrayUtils.java b/src/com/android/packageinstaller/permission/utils/ArrayUtils.java
index 4b7a3947..2af641bc 100644
--- a/src/com/android/packageinstaller/permission/utils/ArrayUtils.java
+++ b/src/com/android/packageinstaller/permission/utils/ArrayUtils.java
@@ -16,6 +16,8 @@
package com.android.packageinstaller.permission.utils;
+import android.text.TextUtils;
+
import java.util.Objects;
public final class ArrayUtils {
@@ -42,4 +44,20 @@ public final class ArrayUtils {
}
return -1;
}
+
+ public static String[] appendString(String[] cur, String val) {
+ if (cur == null) {
+ return new String[] { val };
+ }
+ final int N = cur.length;
+ for (int i = 0; i < N; i++) {
+ if (TextUtils.equals(cur[i], val)) {
+ return cur;
+ }
+ }
+ String[] ret = new String[N + 1];
+ System.arraycopy(cur, 0, ret, 0, N);
+ ret[N] = val;
+ return ret;
+ }
}