summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Ivan Chiang <chiangi@google.com> 2020-08-10 16:43:33 +0800
committer Ivan Chiang <chiangi@google.com> 2020-09-01 05:27:07 +0000
commit42c44f3601c788582dad1ff53d82c20d42ef9fbc (patch)
treebd60cf0ca19e1c0a113c485bfd8cdfd403ddca32
parent78c2d2ca94f52accd3bb23ecd394bbf311be2448 (diff)
Revoke the uri permission when the file is deleted
When the file is deleted, renamed or moved, revoke all uri permissions with the file Bug: 157474195 Test: manual test with DocumentsUI Test: atest DocumentsTest#testAfterMoveDocumentInStorage_revokeUriPermission Change-Id: I4ffb183630aadb2d87b0965e8cecf88af15f4534 Merged-In: I4ffb183630aadb2d87b0965e8cecf88af15f4534 (cherry picked from commit 9efd606f43abe36f9fcf7f0d1ab0d059c51be514)
-rw-r--r--core/java/com/android/internal/content/FileSystemProvider.java11
-rw-r--r--packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java6
2 files changed, 17 insertions, 0 deletions
diff --git a/core/java/com/android/internal/content/FileSystemProvider.java b/core/java/com/android/internal/content/FileSystemProvider.java
index 4b80a5ff03de..ff8dd6e17a45 100644
--- a/core/java/com/android/internal/content/FileSystemProvider.java
+++ b/core/java/com/android/internal/content/FileSystemProvider.java
@@ -87,6 +87,14 @@ public abstract class FileSystemProvider extends DocumentsProvider {
protected abstract Uri buildNotificationUri(String docId);
+ /**
+ * Callback indicating that the given document has been deleted or moved. This gives
+ * the provider a hook to revoke the uri permissions.
+ */
+ protected void onDocIdDeleted(String docId) {
+ // Default is no-op
+ }
+
@Override
public boolean onCreate() {
throw new UnsupportedOperationException(
@@ -221,6 +229,7 @@ public abstract class FileSystemProvider extends DocumentsProvider {
}
final String afterDocId = getDocIdForFile(after);
+ onDocIdDeleted(docId);
moveInMediaStore(visibleFileBefore, getFileForDocId(afterDocId, true));
if (!TextUtils.equals(docId, afterDocId)) {
@@ -246,6 +255,7 @@ public abstract class FileSystemProvider extends DocumentsProvider {
}
final String docId = getDocIdForFile(after);
+ onDocIdDeleted(sourceDocumentId);
moveInMediaStore(visibleFileBefore, getFileForDocId(docId, true));
return docId;
@@ -295,6 +305,7 @@ public abstract class FileSystemProvider extends DocumentsProvider {
throw new IllegalStateException("Failed to delete " + file);
}
+ onDocIdDeleted(docId);
removeFromMediaStore(visibleFile, isDirectory);
}
diff --git a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
index f844cc163bbe..af722ed62b4d 100644
--- a/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
+++ b/packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java
@@ -385,6 +385,12 @@ public class ExternalStorageProvider extends FileSystemProvider {
}
@Override
+ protected void onDocIdDeleted(String docId) {
+ Uri uri = DocumentsContract.buildDocumentUri(AUTHORITY, docId);
+ getContext().revokeUriPermission(uri, ~0);
+ }
+
+ @Override
public Cursor queryRoots(String[] projection) throws FileNotFoundException {
final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
synchronized (mRootsLock) {