When forwarding intents, ignoring the package set in the intent.

Apps should not be allowed to target a specific package in the target user.

BUG: 17025506

Change-Id: I81afa2f8d0a1114d91c001e357366792c63b6577
This commit is contained in:
Nicolas Prevot
2014-08-14 16:58:20 +01:00
parent b734e9d2b8
commit 376e4ba962
2 changed files with 17 additions and 17 deletions

View File

@@ -76,17 +76,19 @@ public class IntentForwarderActivity extends Activity {
}
Intent newIntent = new Intent(intentReceived);
newIntent.setComponent(null);
// Apps should not be allowed to target a specific package in the target user.
newIntent.setPackage(null);
newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT
|Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
int callingUserId = getUserId();
IPackageManager ipm = AppGlobals.getPackageManager();
String resolvedType = newIntent.resolveTypeIfNeeded(getContentResolver());
boolean canForward = false;
Intent selector = newIntent.getSelector();
if (selector == null) {
selector = newIntent;
}
try {
Intent selector = newIntent.getSelector();
if (selector == null) {
selector = newIntent;
}
canForward = ipm.canForwardTo(selector, resolvedType, callingUserId,
userDest.getIdentifier());
} catch (RemoteException e) {

View File

@@ -3192,24 +3192,22 @@ public class PackageManagerService extends IPackageManager.Stub {
if (matches.get(i).getTargetUserId() == targetUserId) return true;
}
}
ArrayList<String> packageNames = null;
SparseArray<ArrayList<String>> fromSource =
mSettings.mCrossProfilePackageInfo.get(sourceUserId);
if (fromSource != null) {
packageNames = fromSource.get(targetUserId);
}
if (packageNames != null && packageNames.contains(intent.getPackage())) {
return true;
}
// We need the package name, so we try to resolve with the loosest flags possible
List<ResolveInfo> resolveInfos = mActivities.queryIntent(
intent, resolvedType, PackageManager.GET_UNINSTALLED_PACKAGES, targetUserId);
int count = resolveInfos.size();
for (int i = 0; i < count; i++) {
ResolveInfo resolveInfo = resolveInfos.get(i);
if (packageNames.contains(resolveInfo.activityInfo.packageName)) {
return true;
if (packageNames != null) {
// We need the package name, so we try to resolve with the loosest flags possible
List<ResolveInfo> resolveInfos = mActivities.queryIntent(intent, resolvedType,
PackageManager.GET_UNINSTALLED_PACKAGES, targetUserId);
int count = resolveInfos.size();
for (int i = 0; i < count; i++) {
ResolveInfo resolveInfo = resolveInfos.get(i);
if (packageNames.contains(resolveInfo.activityInfo.packageName)) {
return true;
}
}
}
}
return false;