diff options
| author | 2020-08-10 16:43:33 +0800 | |
|---|---|---|
| committer | 2020-09-01 05:27:07 +0000 | |
| commit | 42c44f3601c788582dad1ff53d82c20d42ef9fbc (patch) | |
| tree | bd60cf0ca19e1c0a113c485bfd8cdfd403ddca32 | |
| parent | 78c2d2ca94f52accd3bb23ecd394bbf311be2448 (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.java | 11 | ||||
| -rw-r--r-- | packages/ExternalStorageProvider/src/com/android/externalstorage/ExternalStorageProvider.java | 6 |
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) { |