summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorPhilip P. Moltmann <moltmann@google.com>2018-11-08 22:57:43 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-11-08 22:57:43 +0000
commit64da5e6e446723d9d1cbd5d89d5eb72fe90bf5ac (patch)
tree50919952c2775103857041ce4684c74ff5bf82d4 /core/java
parentdb0e08c75004e7a1143c3503d11d71cd547a9cc2 (diff)
parent12d0ee09bbd580369d597df0739650ebce046ff7 (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.java18
-rw-r--r--core/java/android/content/pm/PackageManager.java15
-rw-r--r--core/java/android/content/pm/PackageParser.java26
-rw-r--r--core/java/android/permission/PermissionManager.java5
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;
}