summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2019-10-10 20:28:35 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2019-10-10 20:28:35 +0000
commitfc2cbb96e9c6a5224c20cd8174007718833425cc (patch)
treead80fec5aba0dcd699bce179f3fcd98dfbfa51c0
parent9319ea66beb66e601b3420ae959e011bc6a1e7ad (diff)
parent5863233a3d719a64e13b9b9ddf72a5ad31e2090f (diff)
Merge "Don't grant visibility based on non-exported components"
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java63
1 files changed, 44 insertions, 19 deletions
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index eb2e31d32beb..05b61689fdcf 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -195,19 +195,19 @@ public class AppsFilter {
return false;
}
for (Intent intent : querying.mQueriesIntents) {
- if (matches(intent, potentialTarget.providers, potentialTarget.activities,
- potentialTarget.services, potentialTarget.receivers)) {
+ if (matches(intent, potentialTarget)) {
return true;
}
}
return false;
}
- private static boolean matches(Intent intent,
- ArrayList<PackageParser.Provider> providerList,
- ArrayList<? extends Component<? extends IntentInfo>>... componentLists) {
- for (int p = providerList.size() - 1; p >= 0; p--) {
- PackageParser.Provider provider = providerList.get(p);
+ private static boolean matches(Intent intent, PackageParser.Package potentialTarget) {
+ for (int p = potentialTarget.providers.size() - 1; p >= 0; p--) {
+ PackageParser.Provider provider = potentialTarget.providers.get(p);
+ if (!provider.info.exported) {
+ continue;
+ }
final ProviderInfo providerInfo = provider.info;
final Uri data = intent.getData();
if ("content".equalsIgnoreCase(intent.getScheme())
@@ -216,19 +216,44 @@ public class AppsFilter {
return true;
}
}
+ for (int s = potentialTarget.services.size() - 1; s >= 0; s--) {
+ PackageParser.Service service = potentialTarget.services.get(s);
+ if (!service.info.exported) {
+ continue;
+ }
+ if (matchesAnyFilter(intent, service)) {
+ return true;
+ }
+ }
+ for (int a = potentialTarget.activities.size() - 1; a >= 0; a--) {
+ PackageParser.Activity activity = potentialTarget.activities.get(a);
+ if (!activity.info.exported) {
+ continue;
+ }
+ if (matchesAnyFilter(intent, activity)) {
+ return true;
+ }
+ }
+ for (int r = potentialTarget.receivers.size() - 1; r >= 0; r--) {
+ PackageParser.Activity receiver = potentialTarget.receivers.get(r);
+ if (!receiver.info.exported) {
+ continue;
+ }
+ if (matchesAnyFilter(intent, receiver)) {
+ return true;
+ }
+ }
+ return false;
+ }
- for (int l = componentLists.length - 1; l >= 0; l--) {
- ArrayList<? extends Component<? extends IntentInfo>> components = componentLists[l];
- for (int c = components.size() - 1; c >= 0; c--) {
- Component<? extends IntentInfo> component = components.get(c);
- ArrayList<? extends IntentInfo> intents = component.intents;
- for (int i = intents.size() - 1; i >= 0; i--) {
- IntentFilter intentFilter = intents.get(i);
- if (intentFilter.match(intent.getAction(), intent.getType(), intent.getScheme(),
- intent.getData(), intent.getCategories(), "AppsFilter") > 0) {
- return true;
- }
- }
+ private static boolean matchesAnyFilter(
+ Intent intent, Component<? extends IntentInfo> component) {
+ ArrayList<? extends IntentInfo> intents = component.intents;
+ for (int i = intents.size() - 1; i >= 0; i--) {
+ IntentFilter intentFilter = intents.get(i);
+ if (intentFilter.match(intent.getAction(), intent.getType(), intent.getScheme(),
+ intent.getData(), intent.getCategories(), "AppsFilter") > 0) {
+ return true;
}
}
return false;