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

Commit 687c6221 authored by Jeff Sharkey's avatar Jeff Sharkey Committed by Android Git Automerger
Browse files

am be17a614: Merge "Require that persistable Uri permissions be taken." into klp-dev

* commit 'be17a614':
  Require that persistable Uri permissions be taken.
parents 4f447cfa be17a614
Loading
Loading
Loading
Loading
+15 −4
Original line number Diff line number Diff line
@@ -5746,11 +5746,10 @@ package android.content {
    method public final int delete(android.net.Uri, java.lang.String, java.lang.String[]);
    method public static deprecated android.content.SyncInfo getCurrentSync();
    method public static java.util.List<android.content.SyncInfo> getCurrentSyncs();
    method public android.net.Uri[] getIncomingUriPermissionGrants(int, int);
    method public static int getIsSyncable(android.accounts.Account, java.lang.String);
    method public static boolean getMasterSyncAutomatically();
    method public android.net.Uri[] getOutgoingUriPermissionGrants(int, int);
    method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String);
    method public java.util.List<android.content.UriPermission> getPersistedUriPermissions();
    method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);
    method public static android.content.SyncAdapterType[] getSyncAdapterTypes();
    method public static boolean getSyncAutomatically(android.accounts.Account, java.lang.String);
@@ -5772,6 +5771,7 @@ package android.content {
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String);
    method public final android.database.Cursor query(android.net.Uri, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, android.os.CancellationSignal);
    method public final void registerContentObserver(android.net.Uri, boolean, android.database.ContentObserver);
    method public void releasePersistableUriPermission(android.net.Uri, int);
    method public static void removePeriodicSync(android.accounts.Account, java.lang.String, android.os.Bundle);
    method public static void removeStatusChangeListener(java.lang.Object);
    method public static void requestSync(android.accounts.Account, java.lang.String, android.os.Bundle);
@@ -5780,6 +5780,7 @@ package android.content {
    method public static void setMasterSyncAutomatically(boolean);
    method public static void setSyncAutomatically(android.accounts.Account, java.lang.String, boolean);
    method public deprecated void startSync(android.net.Uri, android.os.Bundle);
    method public void takePersistableUriPermission(android.net.Uri, int);
    method public final android.net.Uri uncanonicalize(android.net.Uri);
    method public final void unregisterContentObserver(android.database.ContentObserver);
    method public final int update(android.net.Uri, android.content.ContentValues, java.lang.String, java.lang.String[]);
@@ -6517,10 +6518,10 @@ package android.content {
    field public static final int FLAG_DEBUG_LOG_RESOLUTION = 8; // 0x8
    field public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 16; // 0x10
    field public static final int FLAG_FROM_BACKGROUND = 4; // 0x4
    field public static final int FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 64; // 0x40
    field public static final int FLAG_GRANT_READ_URI_PERMISSION = 1; // 0x1
    field public static final int FLAG_GRANT_WRITE_URI_PERMISSION = 2; // 0x2
    field public static final int FLAG_INCLUDE_STOPPED_PACKAGES = 32; // 0x20
    field public static final int FLAG_PERSIST_GRANT_URI_PERMISSION = 64; // 0x40
    field public static final int FLAG_RECEIVER_FOREGROUND = 268435456; // 0x10000000
    field public static final int FLAG_RECEIVER_NO_ABORT = 134217728; // 0x8000000
    field public static final int FLAG_RECEIVER_REGISTERED_ONLY = 1073741824; // 0x40000000
@@ -6913,6 +6914,17 @@ package android.content {
    field public static final int NO_MATCH = -1; // 0xffffffff
  }
  public final class UriPermission implements android.os.Parcelable {
    method public int describeContents();
    method public long getPersistedTime();
    method public android.net.Uri getUri();
    method public boolean isReadPermission();
    method public boolean isWritePermission();
    method public void writeToParcel(android.os.Parcel, int);
    field public static final android.os.Parcelable.Creator CREATOR;
    field public static final long INVALID_TIME = -9223372036854775808L; // 0x8000000000000000L
  }
}
package android.content.pm {
@@ -20956,7 +20968,6 @@ package android.provider {
    method public static boolean deleteDocument(android.content.ContentResolver, android.net.Uri);
    method public static java.lang.String getDocumentId(android.net.Uri);
    method public static android.graphics.Bitmap getDocumentThumbnail(android.content.ContentResolver, android.net.Uri, android.graphics.Point, android.os.CancellationSignal);
    method public static android.net.Uri[] getOpenDocuments(android.content.Context);
    method public static java.lang.String getRootId(android.net.Uri);
    method public static java.lang.String getSearchDocumentsQuery(android.net.Uri);
    field public static final java.lang.String EXTRA_ERROR = "error";
+69 −31
Original line number Diff line number Diff line
@@ -23,9 +23,11 @@ import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.UriPermission;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.ParceledListSlice;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.graphics.Bitmap;
@@ -1130,6 +1132,32 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            Uri uri = Uri.CREATOR.createFromParcel(data);
            int mode = data.readInt();
            takePersistableUriPermission(uri, mode);
            reply.writeNoException();
            return true;
        }

        case RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            Uri uri = Uri.CREATOR.createFromParcel(data);
            int mode = data.readInt();
            releasePersistableUriPermission(uri, mode);
            reply.writeNoException();
            return true;
        }

        case GET_PERSISTED_URI_PERMISSIONS_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            final ParceledListSlice<UriPermission> perms = getPersistedUriPermissions();
            reply.writeNoException();
            perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
            return true;
        }

        case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            IBinder b = data.readStrongBinder();
@@ -1983,19 +2011,6 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
            return true;
        }

        case GET_GRANTED_URI_PERMISSIONS_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            final String sourcePackage = data.readString();
            final String targetPackage = data.readString();
            final int modeFlags = data.readInt();
            final int modeMask = data.readInt();
            final Uri[] uris = getGrantedUriPermissions(
                    sourcePackage, targetPackage, modeFlags, modeMask);
            reply.writeNoException();
            reply.writeParcelableArray(uris, 0);
            return true;
        }

        case PERFORM_IDLE_MAINTENANCE_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            performIdleMaintenance();
@@ -3436,6 +3451,47 @@ class ActivityManagerProxy implements IActivityManager
        data.recycle();
        reply.recycle();
    }

    @Override
    public void takePersistableUriPermission(Uri uri, int mode) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        uri.writeToParcel(data, 0);
        data.writeInt(mode);
        mRemote.transact(TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

    @Override
    public void releasePersistableUriPermission(Uri uri, int mode) throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        uri.writeToParcel(data, 0);
        data.writeInt(mode);
        mRemote.transact(RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION, data, reply, 0);
        reply.readException();
        data.recycle();
        reply.recycle();
    }

    @Override
    public ParceledListSlice<UriPermission> getPersistedUriPermissions() throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
        reply.readException();
        final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel(
                reply);
        data.recycle();
        reply.recycle();
        return perms;
    }

    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
            throws RemoteException {
        Parcel data = Parcel.obtain();
@@ -4567,24 +4623,6 @@ class ActivityManagerProxy implements IActivityManager
        reply.recycle();
    }

    public Uri[] getGrantedUriPermissions(
            String sourcePackage, String targetPackage, int modeFlags, int modeMask)
            throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
        data.writeInterfaceToken(IActivityManager.descriptor);
        data.writeString(sourcePackage);
        data.writeString(targetPackage);
        data.writeInt(modeFlags);
        data.writeInt(modeMask);
        mRemote.transact(GET_GRANTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
        reply.readException();
        final Uri[] uris = (Uri[]) reply.readParcelableArray(null);
        data.recycle();
        reply.recycle();
        return uris;
    }

    public void performIdleMaintenance() throws RemoteException {
        Parcel data = Parcel.obtain();
        Parcel reply = Parcel.obtain();
+10 −7
Original line number Diff line number Diff line
@@ -27,9 +27,11 @@ import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.IntentSender;
import android.content.UriPermission;
import android.content.pm.ApplicationInfo;
import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.ParceledListSlice;
import android.content.pm.ProviderInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
@@ -210,6 +212,9 @@ public interface IActivityManager extends IInterface {
            Uri uri, int mode) throws RemoteException;
    public void revokeUriPermission(IApplicationThread caller, Uri uri,
            int mode) throws RemoteException;
    public void takePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException;
    public void releasePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException;
    public ParceledListSlice<UriPermission> getPersistedUriPermissions() throws RemoteException;

    public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
            throws RemoteException;
@@ -399,10 +404,6 @@ public interface IActivityManager extends IInterface {

    public void restart() throws RemoteException;

    public Uri[] getGrantedUriPermissions(
            String sourcePackage, String targetPackage, int modeFlags, int modeMask)
            throws RemoteException;

    public void performIdleMaintenance() throws RemoteException;

    /*
@@ -686,6 +687,8 @@ public interface IActivityManager extends IInterface {
    int NOTIFY_ACTIVITY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+175;
    int REPORT_ACTIVITY_FULLY_DRAWN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+176;
    int RESTART_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+177;
    int GET_GRANTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+178;
    int PERFORM_IDLE_MAINTENANCE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+179;
    int PERFORM_IDLE_MAINTENANCE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+178;
    int TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+179;
    int RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+180;
    int GET_PERSISTED_URI_PERMISSIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+181;
}
+40 −38
Original line number Diff line number Diff line
@@ -266,12 +266,18 @@ public abstract class ContentResolver {

    /** @hide */
    protected abstract IContentProvider acquireProvider(Context c, String name);
    /** Providing a default implementation of this, to avoid having to change
     * a lot of other things, but implementations of ContentResolver should
     * implement it. @hide */

    /**
     * Providing a default implementation of this, to avoid having to change a
     * lot of other things, but implementations of ContentResolver should
     * implement it.
     *
     * @hide
     */
    protected IContentProvider acquireExistingProvider(Context c, String name) {
        return acquireProvider(c, name);
    }

    /** @hide */
    public abstract boolean releaseProvider(IContentProvider icp);
    /** @hide */
@@ -1616,54 +1622,50 @@ public abstract class ContentResolver {
    }

    /**
     * Return list of all Uri permissions that have been granted <em>to</em> the
     * calling package, and which exactly match the requested flags. For
     * example, to return all Uris that the calling application has
     * <em>non-persistent</em> read access to:
     *
     * <pre class="prettyprint">
     * getIncomingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION,
     *         Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION);
     * </pre>
     * Take a persistable Uri permission grant that has been offered. Once
     * taken, the permission grant will be remembered across device reboots.
     * Only Uri permissions granted with
     * {@link Intent#FLAG_GRANT_PERSISTABLE_URI_PERMISSION} can be persisted. If
     * the grant has already been persisted, taking it again will touch
     * {@link UriPermission#getPersistedTime()}.
     *
     * @param modeFlags any combination of
     *            {@link Intent#FLAG_GRANT_READ_URI_PERMISSION},
     *            {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or
     *            {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}.
     * @param modeMask mask indicating which flags must match.
     * @see #getPersistedUriPermissions()
     */
    public Uri[] getIncomingUriPermissionGrants(int modeFlags, int modeMask) {
    public void takePersistableUriPermission(Uri uri, int modeFlags) {
        try {
            return ActivityManagerNative.getDefault()
                    .getGrantedUriPermissions(null, getPackageName(), modeFlags, modeMask);
            ActivityManagerNative.getDefault().takePersistableUriPermission(uri, modeFlags);
        } catch (RemoteException e) {
            return new Uri[0];
        }
    }

    /**
     * Return list of all Uri permissions that have been granted <em>from</em> the
     * calling package, and which exactly match the requested flags. For
     * example, to return all Uris that the calling application has granted
     * <em>non-persistent</em> read access to:
     * Relinquish a persisted Uri permission grant. The Uri must have been
     * previously made persistent with
     * {@link #takePersistableUriPermission(Uri, int)}. Any non-persistent
     * grants to the calling package will remain intact.
     *
     * <pre class="prettyprint">
     * getOutgoingUriPermissionGrants(Intent.FLAG_GRANT_READ_URI_PERMISSION,
     *         Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_PERSIST_GRANT_URI_PERMISSION);
     * </pre>
     * @see #getPersistedUriPermissions()
     */
    public void releasePersistableUriPermission(Uri uri, int modeFlags) {
        try {
            ActivityManagerNative.getDefault().releasePersistableUriPermission(uri, modeFlags);
        } catch (RemoteException e) {
        }
    }

    /**
     * Return list of all Uri permission grants that have been persisted for the
     * calling app. Only persistable grants taken with
     * {@link #takePersistableUriPermission(Uri, int)} are returned.
     *
     * @param modeFlags any combination of
     *            {@link Intent#FLAG_GRANT_READ_URI_PERMISSION},
     *            {@link Intent#FLAG_GRANT_WRITE_URI_PERMISSION}, or
     *            {@link Intent#FLAG_PERSIST_GRANT_URI_PERMISSION}.
     * @param modeMask mask indicating which flags must match.
     * @see #takePersistableUriPermission(Uri, int)
     * @see #releasePersistableUriPermission(Uri, int)
     */
    public Uri[] getOutgoingUriPermissionGrants(int modeFlags, int modeMask) {
    public List<UriPermission> getPersistedUriPermissions() {
        try {
            return ActivityManagerNative.getDefault()
                    .getGrantedUriPermissions(getPackageName(), null, modeFlags, modeMask);
            return ActivityManagerNative.getDefault().getPersistedUriPermissions().getList();
        } catch (RemoteException e) {
            return new Uri[0];
            throw new RuntimeException("Activity manager has died", e);
        }
    }

+12 −6
Original line number Diff line number Diff line
@@ -3339,12 +3339,18 @@ public class Intent implements Parcelable, Cloneable {

    /**
     * When combined with {@link #FLAG_GRANT_READ_URI_PERMISSION} and/or
     * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, the grant will be remembered
     * until explicitly revoked with
     * {@link Context#revokeUriPermission(Uri, int)}. These grants persist
     * across device reboots.
     * {@link #FLAG_GRANT_WRITE_URI_PERMISSION}, the Uri permission grant can be
     * persisted across device reboots until explicitly revoked with
     * {@link Context#revokeUriPermission(Uri, int)}. This flag only offers the
     * grant for possible persisting; the receiving application must call
     * {@link ContentResolver#takePersistableUriPermission(Uri, int)} to
     * actually persist.
     *
     * @see ContentResolver#takePersistableUriPermission(Uri, int)
     * @see ContentResolver#releasePersistableUriPermission(Uri, int)
     * @see ContentResolver#getPersistedUriPermissions()
     */
    public static final int FLAG_PERSIST_GRANT_URI_PERMISSION = 0x00000040;
    public static final int FLAG_GRANT_PERSISTABLE_URI_PERMISSION = 0x00000040;

    /**
     * If set, the new activity is not kept in the history stack.  As soon as
@@ -7173,7 +7179,7 @@ public class Intent implements Parcelable, Cloneable {
                    setClipData(target.getClipData());
                    addFlags(target.getFlags()
                            & (FLAG_GRANT_READ_URI_PERMISSION | FLAG_GRANT_WRITE_URI_PERMISSION
                                    | FLAG_PERSIST_GRANT_URI_PERMISSION));
                                    | FLAG_GRANT_PERSISTABLE_URI_PERMISSION));
                    return true;
                } else {
                    return false;
Loading