diff options
author | Nicolas Prevot <nprevot@google.com> | 2014-05-29 17:02:19 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-05-29 17:02:20 +0000 |
commit | 1015efb143b51a5d31f2f932528f295cfa1add1f (patch) | |
tree | ce94e750e387f2d5d0e11101b41d913120fdc5db | |
parent | 88d4c398eafa414b73e00b7bed1c98b944e8c183 (diff) | |
parent | c6cf95c0f5f7250c65e40c441fe58d8cbfd114c9 (diff) |
Merge "Making the content resolver work with result intents."
5 files changed, 33 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index af0d443b7ce8..eebb50360144 100755 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -308,7 +308,7 @@ public final class ActiveServices { } ServiceRecord r = res.record; NeededUriGrants neededGrants = mAm.checkGrantUriPermissionFromIntentLocked( - callingUid, r.packageName, service, service.getFlags(), null); + callingUid, r.packageName, service, service.getFlags(), null, r.userId); if (unscheduleServiceRestartLocked(r, callingUid, false)) { if (DEBUG_SERVICE) Slog.v(TAG, "START SERVICE WHILE RESTART PENDING: " + r); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 4b0187f2630b..fd31b4142f22 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -6381,7 +6381,7 @@ public final class ActivityManagerService extends ActivityManagerNative * Like checkGrantUriPermissionLocked, but takes an Intent. */ NeededUriGrants checkGrantUriPermissionFromIntentLocked(int callingUid, - String targetPkg, Intent intent, int mode, NeededUriGrants needed) { + String targetPkg, Intent intent, int mode, NeededUriGrants needed, int targetUserId) { if (DEBUG_URI_PERMISSION) Slog.v(TAG, "Checking URI perm to data=" + (intent != null ? intent.getData() : null) + " clip=" + (intent != null ? intent.getClipData() : null) @@ -6400,11 +6400,28 @@ public final class ActivityManagerService extends ActivityManagerNative if (data == null && clip == null) { return null; } - + final IPackageManager pm = AppGlobals.getPackageManager(); + int targetUid; + if (needed != null) { + targetUid = needed.targetUid; + } else { + try { + targetUid = pm.getPackageUid(targetPkg, targetUserId); + } catch (RemoteException ex) { + return null; + } + if (targetUid < 0) { + if (DEBUG_URI_PERMISSION) { + Slog.v(TAG, "Can't grant URI permission no uid for: " + targetPkg + + " on user " + targetUserId); + } + return null; + } + } if (data != null) { GrantUri grantUri = GrantUri.resolve(UserHandle.getUserId(callingUid), data); - int targetUid = checkGrantUriPermissionLocked(callingUid, targetPkg, grantUri, mode, - needed != null ? needed.targetUid : -1); + targetUid = checkGrantUriPermissionLocked(callingUid, targetPkg, grantUri, mode, + targetUid); if (targetUid > 0) { if (needed == null) { needed = new NeededUriGrants(targetPkg, targetUid, mode); @@ -6416,10 +6433,9 @@ public final class ActivityManagerService extends ActivityManagerNative for (int i=0; i<clip.getItemCount(); i++) { Uri uri = clip.getItemAt(i).getUri(); if (uri != null) { - int targetUid = -1; GrantUri grantUri = GrantUri.resolve(UserHandle.getUserId(callingUid), uri); targetUid = checkGrantUriPermissionLocked(callingUid, targetPkg, grantUri, mode, - needed != null ? needed.targetUid : -1); + targetUid); if (targetUid > 0) { if (needed == null) { needed = new NeededUriGrants(targetPkg, targetUid, mode); @@ -6430,7 +6446,7 @@ public final class ActivityManagerService extends ActivityManagerNative Intent clipIntent = clip.getItemAt(i).getIntent(); if (clipIntent != null) { NeededUriGrants newNeeded = checkGrantUriPermissionFromIntentLocked( - callingUid, targetPkg, clipIntent, mode, needed); + callingUid, targetPkg, clipIntent, mode, needed, targetUserId); if (newNeeded != null) { needed = newNeeded; } @@ -6457,9 +6473,9 @@ public final class ActivityManagerService extends ActivityManagerNative } void grantUriPermissionFromIntentLocked(int callingUid, - String targetPkg, Intent intent, UriPermissionOwner owner) { + String targetPkg, Intent intent, UriPermissionOwner owner, int targetUserId) { NeededUriGrants needed = checkGrantUriPermissionFromIntentLocked(callingUid, targetPkg, - intent, intent != null ? intent.getFlags() : 0, null); + intent, intent != null ? intent.getFlags() : 0, null, targetUserId); if (needed == null) { return; } diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index b429b9379602..32722bc21ad2 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -635,7 +635,7 @@ final class ActivityRecord { final void deliverNewIntentLocked(int callingUid, Intent intent) { // The activity now gets access to the data associated with this Intent. service.grantUriPermissionFromIntentLocked(callingUid, packageName, - intent, getUriPermissionsLocked()); + intent, getUriPermissionsLocked(), userId); // We want to immediately deliver the intent to the activity if // it is currently the top resumed activity... however, if the // device is sleeping, then all activities are stopped, so in that diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index 1804d039fa7a..16ad1533645e 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -2353,7 +2353,7 @@ final class ActivityStack { if (callingUid > 0) { mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, - data, r.getUriPermissionsLocked()); + data, r.getUriPermissionsLocked(), r.userId); } if (DEBUG_RESULTS) Slog.v(TAG, "Send activity result to " + r @@ -2536,10 +2536,13 @@ final class ActivityStack { if (DEBUG_RESULTS) Slog.v(TAG, "Adding result to " + resultTo + " who=" + r.resultWho + " req=" + r.requestCode + " res=" + resultCode + " data=" + resultData); + if (resultTo.userId != r.userId) { + resultData.prepareToLeaveUser(r.userId); + } if (r.info.applicationInfo.uid > 0) { mService.grantUriPermissionFromIntentLocked(r.info.applicationInfo.uid, resultTo.packageName, resultData, - resultTo.getUriPermissionsLocked()); + resultTo.getUriPermissionsLocked(), resultTo.userId); } resultTo.addResultLocked(r, r.resultWho, r.requestCode, resultCode, resultData); diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index ed260173beae..598e524c5cc3 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -1913,7 +1913,7 @@ public final class ActivityStackSupervisor implements DisplayListener { } mService.grantUriPermissionFromIntentLocked(callingUid, r.packageName, - intent, r.getUriPermissionsLocked()); + intent, r.getUriPermissionsLocked(), r.userId); if (newTask) { EventLog.writeEvent(EventLogTags.AM_CREATE_TASK, r.userId, r.task.taskId); |