Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6463ae6d authored by Ivan Chiang's avatar Ivan Chiang Committed by Huizi Yang
Browse files

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 9efd606f)
(cherry picked from commit 42c44f36)
parent 985fe7bd
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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);
    }

+6 −0
Original line number Diff line number Diff line
@@ -384,6 +384,12 @@ public class ExternalStorageProvider extends FileSystemProvider {
        return DocumentsContract.buildChildDocumentsUri(AUTHORITY, docId);
    }

    @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));