am 11591b73: am b3da3db3: Merge "Surface outgoing Uri permission grants." into klp-dev

* commit '11591b738d51e0d8e87e8825dc2fc7eaa517daa3':
  Surface outgoing Uri permission grants.
This commit is contained in:
Jeff Sharkey
2013-10-09 15:12:35 -07:00
committed by Android Git Automerger
6 changed files with 69 additions and 18 deletions

View File

@ -5759,6 +5759,7 @@ package android.content {
method public static java.util.List<android.content.SyncInfo> getCurrentSyncs(); method public static java.util.List<android.content.SyncInfo> getCurrentSyncs();
method public static int getIsSyncable(android.accounts.Account, java.lang.String); method public static int getIsSyncable(android.accounts.Account, java.lang.String);
method public static boolean getMasterSyncAutomatically(); method public static boolean getMasterSyncAutomatically();
method public java.util.List<android.content.UriPermission> getOutgoingPersistedUriPermissions();
method public static java.util.List<android.content.PeriodicSync> getPeriodicSyncs(android.accounts.Account, java.lang.String); 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.util.List<android.content.UriPermission> getPersistedUriPermissions();
method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String); method public java.lang.String[] getStreamTypes(android.net.Uri, java.lang.String);

View File

@ -1160,7 +1160,10 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM
case GET_PERSISTED_URI_PERMISSIONS_TRANSACTION: { case GET_PERSISTED_URI_PERMISSIONS_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor); data.enforceInterface(IActivityManager.descriptor);
final ParceledListSlice<UriPermission> perms = getPersistedUriPermissions(); final String packageName = data.readString();
final boolean incoming = data.readInt() != 0;
final ParceledListSlice<UriPermission> perms = getPersistedUriPermissions(
packageName, incoming);
reply.writeNoException(); reply.writeNoException();
perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE); perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
return true; return true;
@ -3500,10 +3503,13 @@ class ActivityManagerProxy implements IActivityManager
} }
@Override @Override
public ParceledListSlice<UriPermission> getPersistedUriPermissions() throws RemoteException { public ParceledListSlice<UriPermission> getPersistedUriPermissions(
String packageName, boolean incoming) throws RemoteException {
Parcel data = Parcel.obtain(); Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain(); Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor); data.writeInterfaceToken(IActivityManager.descriptor);
data.writeString(packageName);
data.writeInt(incoming ? 1 : 0);
mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0); mRemote.transact(GET_PERSISTED_URI_PERMISSIONS_TRANSACTION, data, reply, 0);
reply.readException(); reply.readException();
final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel( final ParceledListSlice<UriPermission> perms = ParceledListSlice.CREATOR.createFromParcel(

View File

@ -215,7 +215,8 @@ public interface IActivityManager extends IInterface {
int mode) throws RemoteException; int mode) throws RemoteException;
public void takePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException; public void takePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException;
public void releasePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException; public void releasePersistableUriPermission(Uri uri, int modeFlags) throws RemoteException;
public ParceledListSlice<UriPermission> getPersistedUriPermissions() throws RemoteException; public ParceledListSlice<UriPermission> getPersistedUriPermissions(
String packageName, boolean incoming) throws RemoteException;
public void showWaitingForDebugger(IApplicationThread who, boolean waiting) public void showWaitingForDebugger(IApplicationThread who, boolean waiting)
throws RemoteException; throws RemoteException;

View File

@ -1659,8 +1659,9 @@ public abstract class ContentResolver {
} }
/** /**
* Return list of all Uri permission grants that have been persisted for the * Return list of all Uri permission grants that have been persisted by the
* calling app. Only persistable grants taken with * calling app. That is, the returned permissions have been granted
* <em>to</em> the calling app. Only persistable grants taken with
* {@link #takePersistableUriPermission(Uri, int)} are returned. * {@link #takePersistableUriPermission(Uri, int)} are returned.
* *
* @see #takePersistableUriPermission(Uri, int) * @see #takePersistableUriPermission(Uri, int)
@ -1668,7 +1669,23 @@ public abstract class ContentResolver {
*/ */
public List<UriPermission> getPersistedUriPermissions() { public List<UriPermission> getPersistedUriPermissions() {
try { try {
return ActivityManagerNative.getDefault().getPersistedUriPermissions().getList(); return ActivityManagerNative.getDefault()
.getPersistedUriPermissions(mPackageName, true).getList();
} catch (RemoteException e) {
throw new RuntimeException("Activity manager has died", e);
}
}
/**
* Return list of all persisted Uri permission grants that are hosted by the
* calling app. That is, the returned permissions have been granted
* <em>from</em> the calling app. Only grants taken with
* {@link #takePersistableUriPermission(Uri, int)} are returned.
*/
public List<UriPermission> getOutgoingPersistedUriPermissions() {
try {
return ActivityManagerNative.getDefault()
.getPersistedUriPermissions(mPackageName, false).getList();
} catch (RemoteException e) { } catch (RemoteException e) {
throw new RuntimeException("Activity manager has died", e); throw new RuntimeException("Activity manager has died", e);
} }

View File

@ -6489,27 +6489,54 @@ public final class ActivityManagerService extends ActivityManagerNative
} }
@Override @Override
public ParceledListSlice<android.content.UriPermission> getPersistedUriPermissions() { public ParceledListSlice<android.content.UriPermission> getPersistedUriPermissions(
String packageName, boolean incoming) {
enforceNotIsolatedCaller("getPersistedUriPermissions"); enforceNotIsolatedCaller("getPersistedUriPermissions");
Preconditions.checkNotNull(packageName, "packageName");
synchronized (this) {
final int callingUid = Binder.getCallingUid(); final int callingUid = Binder.getCallingUid();
final IPackageManager pm = AppGlobals.getPackageManager();
try {
final int packageUid = pm.getPackageUid(packageName, UserHandle.getUserId(callingUid));
if (packageUid != callingUid) {
throw new SecurityException(
"Package " + packageName + " does not belong to calling UID " + callingUid);
}
} catch (RemoteException e) {
throw new SecurityException("Failed to verify package name ownership");
}
final ArrayList<android.content.UriPermission> result = Lists.newArrayList(); final ArrayList<android.content.UriPermission> result = Lists.newArrayList();
synchronized (this) {
if (incoming) {
final ArrayMap<Uri, UriPermission> perms = mGrantedUriPermissions.get(callingUid); final ArrayMap<Uri, UriPermission> perms = mGrantedUriPermissions.get(callingUid);
if (perms == null) { if (perms == null) {
Slog.w(TAG, "No permission grants found for UID " + callingUid); Slog.w(TAG, "No permission grants found for " + packageName);
} else { } else {
final int size = perms.size(); final int size = perms.size();
for (int i = 0; i < size; i++) { for (int i = 0; i < size; i++) {
final UriPermission perm = perms.valueAt(i); final UriPermission perm = perms.valueAt(i);
if (perm.persistedModeFlags != 0) { if (packageName.equals(perm.targetPkg) && perm.persistedModeFlags != 0) {
result.add(perm.buildPersistedPublicApiObject()); result.add(perm.buildPersistedPublicApiObject());
} }
} }
} }
return new ParceledListSlice<android.content.UriPermission>(result); } else {
final int size = mGrantedUriPermissions.size();
for (int i = 0; i < size; i++) {
final ArrayMap<Uri, UriPermission> perms = mGrantedUriPermissions.valueAt(i);
final int permsSize = perms.size();
for (int j = 0; j < permsSize; j++) {
final UriPermission perm = perms.valueAt(j);
if (packageName.equals(perm.sourcePkg) && perm.persistedModeFlags != 0) {
result.add(perm.buildPersistedPublicApiObject());
} }
} }
}
}
}
return new ParceledListSlice<android.content.UriPermission>(result);
}
@Override @Override
public void showWaitingForDebugger(IApplicationThread who, boolean waiting) { public void showWaitingForDebugger(IApplicationThread who, boolean waiting) {

View File

@ -20,7 +20,6 @@ import android.content.Intent;
import android.net.Uri; import android.net.Uri;
import android.os.UserHandle; import android.os.UserHandle;
import android.util.Log; import android.util.Log;
import android.util.Slog;
import com.android.internal.util.Preconditions; import com.android.internal.util.Preconditions;
import com.google.android.collect.Sets; import com.google.android.collect.Sets;