diff options
author | Kenny Guy <kennyguy@google.com> | 2014-07-17 13:01:25 +0100 |
---|---|---|
committer | Kenny Guy <kennyguy@google.com> | 2014-07-17 12:14:13 +0000 |
commit | 2df1892f411de6fa93ba487e3c4d23a079b74fcb (patch) | |
tree | a58e04ec34fccb0341714e278ddb56303dd76775 /services | |
parent | 9d32507a8608f82d430fcaf1de0eb81de93dcdea (diff) | |
download | frameworks_base-2df1892f411de6fa93ba487e3c4d23a079b74fcb.zip frameworks_base-2df1892f411de6fa93ba487e3c4d23a079b74fcb.tar.gz frameworks_base-2df1892f411de6fa93ba487e3c4d23a079b74fcb.tar.bz2 |
Check for exported and category before starting activity.
Make LauncherAppService check that component passed to
startActivityAsUser is exported and has the category
Intent.CATEGORY_LAUNCHER before starting it.
Bug: 15989072
Change-Id: I29d03fae49ff0ca8d7f7524f5e71895d62ff3cae
Diffstat (limited to 'services')
-rw-r--r-- | services/core/java/com/android/server/pm/LauncherAppsService.java | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java index 65cb6c9..09cf392 100644 --- a/services/core/java/com/android/server/pm/LauncherAppsService.java +++ b/services/core/java/com/android/server/pm/LauncherAppsService.java @@ -269,13 +269,39 @@ public class LauncherAppsService extends SystemService { Intent launchIntent = new Intent(Intent.ACTION_MAIN); launchIntent.addCategory(Intent.CATEGORY_LAUNCHER); - launchIntent.setComponent(component); launchIntent.setSourceBounds(sourceBounds); launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + launchIntent.setPackage(component.getPackageName()); long ident = Binder.clearCallingIdentity(); try { - mContext.startActivityAsUser(launchIntent, opts, user); + IPackageManager pm = AppGlobals.getPackageManager(); + ActivityInfo info = pm.getActivityInfo(component, 0, user.getIdentifier()); + if (!info.exported) { + throw new SecurityException("Cannot launch non-exported components " + + component); + } + + // Check that the component actually has Intent.CATEGORY_LAUCNCHER + // as calling startActivityAsUser ignores the category and just + // resolves based on the component if present. + List<ResolveInfo> apps = mPm.queryIntentActivitiesAsUser(launchIntent, + PackageManager.NO_CROSS_PROFILE, // We only want the apps for this user + user.getIdentifier()); + final int size = apps.size(); + for (int i = 0; i < size; ++i) { + ActivityInfo activityInfo = apps.get(i).activityInfo; + if (activityInfo.packageName.equals(component.getPackageName()) && + activityInfo.name.equals(component.getClassName())) { + // Found an activity with category launcher that matches + // this component so ok to launch. + launchIntent.setComponent(component); + mContext.startActivityAsUser(launchIntent, opts, user); + return; + } + } + throw new SecurityException("Attempt to launch activity without " + + " category Intent.CATEGORY_LAUNCHER " + component); } finally { Binder.restoreCallingIdentity(ident); } |