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

Commit d2b64d70 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

Add ContentProvider.clearCallingIdentity().

ContentProvider has a getCallingPackage() method, which verifies
the remote package name against the current Binder identity.  When a
provider wants to clear that IPC identity, they need to clear both
the Binder state and the ContentProvider.getCallingPackage() state
together, so add methods to facilitate that.

Also fix subtle bug so we don't try translating relative paths.

Bug: 117627072
Test: atest cts/tests/tests/provider/src/android/provider/cts/MediaStore*
Change-Id: Ifa3e1f745334abf625fdcc314b308a047c49ce73
parent 5b3a6a81
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -9168,6 +9168,7 @@ package android.content {
    method public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    method public int bulkInsert(android.net.Uri, android.content.ContentValues[]);
    method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
    method public android.os.Bundle call(java.lang.String, java.lang.String, android.os.Bundle);
    method public android.net.Uri canonicalize(android.net.Uri);
    method public android.net.Uri canonicalize(android.net.Uri);
    method public final android.content.ContentProvider.CallingIdentity clearCallingIdentity();
    method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    method public abstract int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
    method public final java.lang.String getCallingPackage();
    method public final java.lang.String getCallingPackage();
@@ -9195,6 +9196,7 @@ package android.content {
    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    method public android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    method public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    method public android.database.Cursor query(android.net.Uri, java.lang.String[], android.os.Bundle, android.os.CancellationSignal);
    method public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    method public boolean refresh(android.net.Uri, android.os.Bundle, android.os.CancellationSignal);
    method public final void restoreCallingIdentity(android.content.ContentProvider.CallingIdentity);
    method protected final void setPathPermissions(android.content.pm.PathPermission[]);
    method protected final void setPathPermissions(android.content.pm.PathPermission[]);
    method protected final void setReadPermission(java.lang.String);
    method protected final void setReadPermission(java.lang.String);
    method protected final void setWritePermission(java.lang.String);
    method protected final void setWritePermission(java.lang.String);
@@ -9203,6 +9205,9 @@ package android.content {
    method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
    method public abstract int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
  }
  }
  public final class ContentProvider.CallingIdentity {
  }
  public static abstract interface ContentProvider.PipeDataWriter<T> {
  public static abstract interface ContentProvider.PipeDataWriter<T> {
    method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T);
    method public abstract void writeDataToPipe(android.os.ParcelFileDescriptor, android.net.Uri, java.lang.String, android.os.Bundle, T);
  }
  }
+42 −0
Original line number Original line Diff line number Diff line
@@ -821,6 +821,48 @@ public abstract class ContentProvider implements ComponentCallbacks2 {
        return pkg;
        return pkg;
    }
    }


    /**
     * Opaque token representing the identity of an incoming IPC.
     */
    public final class CallingIdentity {
        /** {@hide} */
        public final long binderToken;
        /** {@hide} */
        public final String callingPackage;

        /** {@hide} */
        public CallingIdentity(long binderToken, String callingPackage) {
            this.binderToken = binderToken;
            this.callingPackage = callingPackage;
        }
    }

    /**
     * Reset the identity of the incoming IPC on the current thread.
     * <p>
     * Internally this calls {@link Binder#clearCallingIdentity()} and also
     * clears any value stored in {@link #getCallingPackage()}.
     *
     * @return Returns an opaque token that can be used to restore the original
     *         calling identity by passing it to
     *         {@link #restoreCallingIdentity}.
     */
    public final @NonNull CallingIdentity clearCallingIdentity() {
        return new CallingIdentity(Binder.clearCallingIdentity(), setCallingPackage(null));
    }

    /**
     * Restore the identity of the incoming IPC on the current thread back to a
     * previously identity that was returned by {@link #clearCallingIdentity}.
     * <p>
     * Internally this calls {@link Binder#restoreCallingIdentity(long)} and
     * also restores any value stored in {@link #getCallingPackage()}.
     */
    public final void restoreCallingIdentity(@NonNull CallingIdentity identity) {
        Binder.restoreCallingIdentity(identity.binderToken);
        mCallingPackage.set(identity.callingPackage);
    }

    /**
    /**
     * Change the authorities of the ContentProvider.
     * Change the authorities of the ContentProvider.
     * This is normally set for you from its manifest information when the provider is first
     * This is normally set for you from its manifest information when the provider is first
+6 −0
Original line number Original line Diff line number Diff line
@@ -1538,6 +1538,9 @@ public class StorageManager {
     * @hide
     * @hide
     */
     */
    public File translateAppToSystem(File file, String packageName) {
    public File translateAppToSystem(File file, String packageName) {
        // We can only translate absolute paths
        if (!file.isAbsolute()) return file;

        try {
        try {
            return new File(mStorageManager.translateAppToSystem(file.getAbsolutePath(),
            return new File(mStorageManager.translateAppToSystem(file.getAbsolutePath(),
                    packageName, mContext.getUserId()));
                    packageName, mContext.getUserId()));
@@ -1553,6 +1556,9 @@ public class StorageManager {
     * @hide
     * @hide
     */
     */
    public File translateSystemToApp(File file, String packageName) {
    public File translateSystemToApp(File file, String packageName) {
        // We can only translate absolute paths
        if (!file.isAbsolute()) return file;

        try {
        try {
            return new File(mStorageManager.translateSystemToApp(file.getAbsolutePath(),
            return new File(mStorageManager.translateSystemToApp(file.getAbsolutePath(),
                    packageName, mContext.getUserId()));
                    packageName, mContext.getUserId()));