diff options
author | Jeff Sharkey <jsharkey@android.com> | 2013-09-26 20:33:29 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-09-26 20:33:29 +0000 |
commit | 8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa (patch) | |
tree | a8cca32f982d5127cb695917ef1b16aff80ed958 | |
parent | 8f4e289f8c1f4743a459b232b9e5ac9d58095139 (diff) | |
parent | ee2f7df9ee8a4f43c3b0858bad08a4f0a59a627f (diff) | |
download | frameworks_base-8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa.zip frameworks_base-8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa.tar.gz frameworks_base-8c6c04197e58be6f3e46ba6a38f5d16e4fb091fa.tar.bz2 |
Merge "Tighten flags enforcement, API to test Uris." into klp-dev
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); |