Don't grant visibility based on non-exported components

This change ensures that unexported components are not considered when
determining visibility between apps.

Fixes: 142382342
Test: atest AppEnumerationTests
Change-Id: I0ef0c3f141d2b8206787f4d39dfe3209b72c0dbb
This commit is contained in:
Patrick Baumann
2019-10-09 10:12:10 -07:00
parent 9d9e19c5d3
commit 5863233a3d

View File

@@ -202,19 +202,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())
@@ -223,19 +223,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;