summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2013-09-26 20:33:29 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2013-09-26 20:33:29 +0000
commit8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa (patch)
treea8cca32f982d5127cb695917ef1b16aff80ed958
parent8f4e289f8c1f4743a459b232b9e5ac9d58095139 (diff)
parentee2f7df9ee8a4f43c3b0858bad08a4f0a59a627f (diff)
downloadframeworks_base-8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa.zip
frameworks_base-8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa.tar.gz
frameworks_base-8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa.tar.bz2
Merge "Tighten flags enforcement, API to test Uris." into klp-dev
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/provider/DocumentsContract.java25
-rw-r--r--core/java/com/android/internal/util/Preconditions.java12
-rw-r--r--packages/DocumentsUI/src/com/android/documentsui/TestActivity.java7
-rw-r--r--services/java/com/android/server/am/ActivityManagerService.java23
-rw-r--r--services/java/com/android/server/am/UriPermission.java6
6 files changed, 54 insertions, 20 deletions
diff --git a/api/current.txt b/api/current.txt
index 21ca3c0..4f398cf 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -20978,6 +20978,7 @@ package android.provider {
method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
method public static java.lang.String getRootId(android.net.Uri);
method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
+ method public static boolean isDocumentUri(android.content.Context, android.net.Uri);
field public static final java.lang.String EXTRA_ERROR = "error";
field public static final java.lang.String EXTRA_INFO = "info";
field public static final java.lang.String EXTRA_LOADING = "loading";
diff --git a/core/java/android/provider/DocumentsContract.java b/core/java/android/provider/DocumentsContract.java
index 8f22312..4c9af19 100644
--- a/core/java/android/provider/DocumentsContract.java
+++ b/core/java/android/provider/DocumentsContract.java
@@ -21,7 +21,10 @@ import static libcore.io.OsConstants.SEEK_SET;
import android.content.ContentProviderClient;
import android.content.ContentResolver;
+import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ProviderInfo;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.graphics.Bitmap;
@@ -573,6 +576,28 @@ public final class DocumentsContract {
}
/**
+ * Test if the given Uri represents a {@link Document} backed by a
+ * {@link DocumentsProvider}.
+ */
+ public static boolean isDocumentUri(Context context, Uri uri) {
+ final List<String> paths = uri.getPathSegments();
+ if (paths.size() < 2) {
+ return false;
+ }
+ if (!PATH_DOCUMENT.equals(paths.get(0))) {
+ return false;
+ }
+
+ final ProviderInfo info = context.getPackageManager()
+ .resolveContentProvider(uri.getAuthority(), PackageManager.GET_META_DATA);
+ if (info.metaData != null && info.metaData.containsKey(
+ DocumentsContract.META_DATA_DOCUMENT_PROVIDER)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Extract the {@link Root#COLUMN_ROOT_ID} from the given Uri.
*/
public static String getRootId(Uri rootUri) {
diff --git a/core/java/com/android/internal/util/Preconditions.java b/core/java/com/android/internal/util/Preconditions.java
index a327adc..a54b364 100644
--- a/core/java/com/android/internal/util/Preconditions.java
+++ b/core/java/com/android/internal/util/Preconditions.java
@@ -66,4 +66,16 @@ public class Preconditions {
throw new IllegalStateException();
}
}
+
+ /**
+ * Check the requested flags, throwing if any requested flags are outside
+ * the allowed set.
+ */
+ public static void checkFlagsArgument(int requestedFlags, int allowedFlags) {
+ if ((requestedFlags & allowedFlags) != requestedFlags) {
+ throw new IllegalArgumentException("Requested flags 0x"
+ + Integer.toHexString(requestedFlags) + ", but only 0x"
+ + Integer.toHexString(allowedFlags) + " are allowed");
+ }
+ }
}
diff --git a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
index 9861399..57fc7e4 100644
--- a/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
+++ b/packages/DocumentsUI/src/com/android/documentsui/TestActivity.java
@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import android.provider.DocumentsContract;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
@@ -209,6 +210,9 @@ public class TestActivity extends Activity {
if (requestCode == CODE_READ) {
final Uri uri = data != null ? data.getData() : null;
if (uri != null) {
+ if (DocumentsContract.isDocumentUri(this, uri)) {
+ result += "; DOC_ID";
+ }
getContentResolver()
.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
InputStream is = null;
@@ -228,6 +232,9 @@ public class TestActivity extends Activity {
} else if (requestCode == CODE_WRITE) {
final Uri uri = data != null ? data.getData() : null;
if (uri != null) {
+ if (DocumentsContract.isDocumentUri(this, uri)) {
+ result += "; DOC_ID";
+ }
getContentResolver()
.takePersistableUriPermission(uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
OutputStream os = null;
diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java
index 3c11933..babe0e6 100644
--- a/services/java/com/android/server/am/ActivityManagerService.java
+++ b/services/java/com/android/server/am/ActivityManagerService.java
@@ -41,6 +41,7 @@ import com.android.internal.os.TransferPipe;
import com.android.internal.util.FastPrintWriter;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.MemInfoReader;
+import com.android.internal.util.Preconditions;
import com.android.server.AppOpsService;
import com.android.server.AttributeCache;
import com.android.server.IntentResolver;
@@ -6062,12 +6063,8 @@ public final class ActivityManagerService extends ActivityManagerNative
}
// Persistable only supported through Intents
- modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
- | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- if (modeFlags == 0) {
- throw new IllegalArgumentException("Mode flags must be "
- + "FLAG_GRANT_READ_URI_PERMISSION and/or FLAG_GRANT_WRITE_URI_PERMISSION");
- }
+ Preconditions.checkFlagsArgument(modeFlags,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
grantUriPermissionLocked(r.uid, targetPkg, uri, modeFlags,
null);
@@ -6408,11 +6405,8 @@ public final class ActivityManagerService extends ActivityManagerNative
public void takePersistableUriPermission(Uri uri, int modeFlags) {
enforceNotIsolatedCaller("takePersistableUriPermission");
- modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
- | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- if (modeFlags == 0) {
- return;
- }
+ Preconditions.checkFlagsArgument(modeFlags,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
synchronized (this) {
final int callingUid = Binder.getCallingUid();
@@ -6436,11 +6430,8 @@ public final class ActivityManagerService extends ActivityManagerNative
public void releasePersistableUriPermission(Uri uri, int modeFlags) {
enforceNotIsolatedCaller("releasePersistableUriPermission");
- modeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION
- | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
- if (modeFlags == 0) {
- return;
- }
+ Preconditions.checkFlagsArgument(modeFlags,
+ Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
synchronized (this) {
final int callingUid = Binder.getCallingUid();
diff --git a/services/java/com/android/server/am/UriPermission.java b/services/java/com/android/server/am/UriPermission.java
index 7057c24..5868c08 100644
--- a/services/java/com/android/server/am/UriPermission.java
+++ b/services/java/com/android/server/am/UriPermission.java
@@ -22,6 +22,7 @@ import android.os.UserHandle;
import android.util.Log;
import android.util.Slog;
+import com.android.internal.util.Preconditions;
import com.google.android.collect.Sets;
import java.io.PrintWriter;
@@ -131,10 +132,7 @@ final class UriPermission {
* @return if mode changes should trigger persisting.
*/
boolean takePersistableModes(int modeFlags) {
- if ((~persistableModeFlags & modeFlags) != 0) {
- Slog.w(TAG, "Trying to take 0x" + Integer.toHexString(modeFlags) + " but only 0x"
- + Integer.toHexString(persistableModeFlags) + " are available");
- }
+ Preconditions.checkFlagsArgument(modeFlags, persistableModeFlags);
final int before = persistedModeFlags;
persistedModeFlags |= (persistableModeFlags & modeFlags);