diff options
| author | Philip P. Moltmann <moltmann@google.com> | 2018-11-08 22:57:43 +0000 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2018-11-08 22:57:43 +0000 |
| commit | 64da5e6e446723d9d1cbd5d89d5eb72fe90bf5ac (patch) | |
| tree | 50919952c2775103857041ce4684c74ff5bf82d4 /core/java | |
| parent | db0e08c75004e7a1143c3503d11d71cd547a9cc2 (diff) | |
| parent | 12d0ee09bbd580369d597df0739650ebce046ff7 (diff) | |
Merge changes from topic "TestSplitRuntimePermissions"
* changes:
Apply fg/bg state in default grant policy
Do not inherit grant of background location
Split permissions inherit state from their parents
Have a map of background -> foreground permssions
Give 'restorePermissionState' a better name
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/app/AppOpsManagerInternal.java | 18 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageManager.java | 15 | ||||
| -rw-r--r-- | core/java/android/content/pm/PackageParser.java | 26 | ||||
| -rw-r--r-- | core/java/android/permission/PermissionManager.java | 5 |
4 files changed, 51 insertions, 13 deletions
diff --git a/core/java/android/app/AppOpsManagerInternal.java b/core/java/android/app/AppOpsManagerInternal.java index f5d5e6e9a950..7fe21b23738c 100644 --- a/core/java/android/app/AppOpsManagerInternal.java +++ b/core/java/android/app/AppOpsManagerInternal.java @@ -16,6 +16,7 @@ package android.app; +import android.annotation.NonNull; import android.util.SparseIntArray; import com.android.internal.util.function.QuadFunction; @@ -73,4 +74,21 @@ public abstract class AppOpsManagerInternal { * access to app ops for their user. */ public abstract void setDeviceAndProfileOwners(SparseIntArray owners); + + /** + * Sets the app-ops mode for a certain app-op and uid. + * + * <p>Similar as {@link AppOpsManager#setMode} but does not require the package manager to be + * working. Hence this can be used very early during boot. + * + * <p>Only for internal callers. Does <u>not</u> verify that package name belongs to uid. + * + * @param code The op code to set. + * @param uid The UID for which to set. + * @param packageName The package for which to set. + * @param mode The new mode to set. + * @param isPrivileged If the package is privileged + */ + public abstract void setMode(int code, int uid, @NonNull String packageName, int mode, + boolean isPrivileged); } diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 44b3fdaf9fd8..c1ac061e1f79 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -2948,6 +2948,15 @@ public abstract class PackageManager { public static final int FLAG_PERMISSION_REVIEW_REQUIRED = 1 << 6; /** + * Permission flag: The permission has not been explicitly requested by + * the app but has been added automatically by the system. Revoke once + * the app does explicitly request it. + * + * @hide + */ + public static final int FLAG_PERMISSION_REVOKE_WHEN_REQUESTED = 1 << 7; + + /** * Mask for all permission flags. * * @hide @@ -3598,7 +3607,10 @@ public abstract class PackageManager { FLAG_PERMISSION_POLICY_FIXED, FLAG_PERMISSION_REVOKE_ON_UPGRADE, FLAG_PERMISSION_SYSTEM_FIXED, - FLAG_PERMISSION_GRANTED_BY_DEFAULT + FLAG_PERMISSION_GRANTED_BY_DEFAULT, + /* + FLAG_PERMISSION_REVOKE_WHEN_REQUESED + */ }) @Retention(RetentionPolicy.SOURCE) public @interface PermissionFlags {} @@ -6138,6 +6150,7 @@ public abstract class PackageManager { case FLAG_PERMISSION_REVOKE_ON_UPGRADE: return "REVOKE_ON_UPGRADE"; case FLAG_PERMISSION_USER_FIXED: return "USER_FIXED"; case FLAG_PERMISSION_REVIEW_REQUIRED: return "REVIEW_REQUIRED"; + case FLAG_PERMISSION_REVOKE_WHEN_REQUESTED: return "REVOKE_WHEN_REQUESTED"; default: return Integer.toString(flag); } } diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index dc33bde7d3d7..7ef526453e9a 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -2435,7 +2435,7 @@ public class PackageParser { } final int NP = PackageParser.NEW_PERMISSIONS.length; - StringBuilder implicitPerms = null; + StringBuilder newPermsMsg = null; for (int ip=0; ip<NP; ip++) { final PackageParser.NewPermissionInfo npi = PackageParser.NEW_PERMISSIONS[ip]; @@ -2443,19 +2443,20 @@ public class PackageParser { break; } if (!pkg.requestedPermissions.contains(npi.name)) { - if (implicitPerms == null) { - implicitPerms = new StringBuilder(128); - implicitPerms.append(pkg.packageName); - implicitPerms.append(": compat added "); + if (newPermsMsg == null) { + newPermsMsg = new StringBuilder(128); + newPermsMsg.append(pkg.packageName); + newPermsMsg.append(": compat added "); } else { - implicitPerms.append(' '); + newPermsMsg.append(' '); } - implicitPerms.append(npi.name); + newPermsMsg.append(npi.name); pkg.requestedPermissions.add(npi.name); + pkg.implicitPermissions.add(npi.name); } } - if (implicitPerms != null) { - Slog.i(TAG, implicitPerms.toString()); + if (newPermsMsg != null) { + Slog.i(TAG, newPermsMsg.toString()); } @@ -2472,6 +2473,7 @@ public class PackageParser { final String perm = newPerms.get(in); if (!pkg.requestedPermissions.contains(perm)) { pkg.requestedPermissions.add(perm); + pkg.implicitPermissions.add(perm); } } } @@ -6394,6 +6396,9 @@ public class PackageParser { @UnsupportedAppUsage public final ArrayList<String> requestedPermissions = new ArrayList<String>(); + /** Permissions requested but not in the manifest. */ + public final ArrayList<String> implicitPermissions = new ArrayList<>(); + @UnsupportedAppUsage public ArrayList<String> protectedBroadcasts; @@ -6923,6 +6928,8 @@ public class PackageParser { dest.readStringList(requestedPermissions); internStringArrayList(requestedPermissions); + dest.readStringList(implicitPermissions); + internStringArrayList(implicitPermissions); protectedBroadcasts = dest.createStringArrayList(); internStringArrayList(protectedBroadcasts); @@ -7087,6 +7094,7 @@ public class PackageParser { dest.writeParcelableList(instrumentation, flags); dest.writeStringList(requestedPermissions); + dest.writeStringList(implicitPermissions); dest.writeStringList(protectedBroadcasts); // TODO: This doesn't work: b/64295061 diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index fc30eed10983..2ea706613ef8 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -67,15 +67,14 @@ public final class PermissionManager { * such an old app asks for a location permission (i.e. the * {@link SplitPermissionInfo#getSplitPermission()}), then the * {@link Manifest.permission#ACCESS_BACKGROUND_LOCATION} permission (inside - * {@{@link SplitPermissionInfo#getNewPermissions}) is added. + * {@link SplitPermissionInfo#getNewPermissions}) is added. * * <p>Note: Regular apps do not have to worry about this. The platform and permission controller * automatically add the new permissions where needed. * * @return All permissions that are split. */ - public @NonNull - List<SplitPermissionInfo> getSplitPermissions() { + public @NonNull List<SplitPermissionInfo> getSplitPermissions() { return SPLIT_PERMISSIONS; } |
