Loading core/java/android/content/pm/parsing/ComponentParseUtils.java +6 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.util.TypedValue; import android.view.Gravity; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DataClass; import com.android.internal.util.XmlUtils; Loading Loading @@ -814,6 +815,11 @@ public class ComponentParseUtils { return exported; } @VisibleForTesting public void setExported(boolean exported) { this.exported = exported; } public List<ParsedProviderIntentInfo> getIntents() { return intents; } Loading services/core/java/com/android/server/pm/AppsFilter.java +11 −5 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import java.io.PrintWriter; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.StringTokenizer; /** * The entity responsible for filtering visibility between apps based on declarations in their Loading Loading @@ -219,12 +220,17 @@ public class AppsFilter { continue; } final Uri data = intent.getData(); if ("content".equalsIgnoreCase(intent.getScheme()) && data != null && Objects.equals(provider.getAuthority(), data.getAuthority())) { if (!"content".equalsIgnoreCase(intent.getScheme()) || data == null || provider.getAuthority() == null) { continue; } StringTokenizer authorities = new StringTokenizer(provider.getAuthority(), ";", false); while (authorities.hasMoreElements()) { if (Objects.equals(authorities.nextElement(), data.getAuthority())) { return true; } } } for (int s = ArrayUtils.size(potentialTarget.getServices()) - 1; s >= 0; s--) { ParsedService service = potentialTarget.getServices().get(s); if (!service.exported) { Loading Loading @@ -632,7 +638,7 @@ public class AppsFilter { private static void log(SettingBase callingPkgSetting, PackageSetting targetPkgSetting, String description, Throwable throwable) { Slog.wtf(TAG, "interaction: " + callingPkgSetting.toString() "interaction: " + callingPkgSetting + " -> " + targetPkgSetting.name + " " + description, throwable); } Loading services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +61 −0 Original line number Diff line number Diff line Loading @@ -28,10 +28,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.parsing.AndroidPackage; import android.content.pm.parsing.ComponentParseUtils; import android.content.pm.parsing.ComponentParseUtils.ParsedActivity; import android.content.pm.parsing.ComponentParseUtils.ParsedActivityIntentInfo; import android.content.pm.parsing.PackageImpl; import android.content.pm.parsing.ParsingPackage; import android.net.Uri; import android.os.Build; import android.os.Process; import android.util.ArrayMap; Loading @@ -49,6 +51,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; Loading Loading @@ -116,6 +119,15 @@ public class AppsFilterTest { .addActivity(activity); } private static ParsingPackage pkgWithProvider(String packageName, String authority) { ComponentParseUtils.ParsedProvider provider = new ComponentParseUtils.ParsedProvider(); provider.setPackageName(packageName); provider.setExported(true); provider.setAuthority(authority); return pkg(packageName) .addProvider(provider); } @Before public void setup() throws Exception { mExisting = new ArrayMap<>(); Loading Loading @@ -148,6 +160,55 @@ public class AppsFilterTest { assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesProvider_FilterMatches() { final AppsFilter appsFilter = new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); appsFilter.onSystemReady(); PackageSetting target = simulateAddPackage(appsFilter, pkgWithProvider("com.some.package", "com.some.authority"), DUMMY_TARGET_UID); PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package", new Intent().setData(Uri.parse("content://com.some.authority"))), DUMMY_CALLING_UID); assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesDifferentProvider_Filters() { final AppsFilter appsFilter = new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); appsFilter.onSystemReady(); PackageSetting target = simulateAddPackage(appsFilter, pkgWithProvider("com.some.package", "com.some.authority"), DUMMY_TARGET_UID); PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package", new Intent().setData(Uri.parse("content://com.some.other.authority"))), DUMMY_CALLING_UID); assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesProviderWithSemiColon_FilterMatches() { final AppsFilter appsFilter = new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); appsFilter.onSystemReady(); PackageSetting target = simulateAddPackage(appsFilter, pkgWithProvider("com.some.package", "com.some.authority;com.some.other.authority"), DUMMY_TARGET_UID); PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package", new Intent().setData(Uri.parse("content://com.some.authority"))), DUMMY_CALLING_UID); assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesAction_NoMatchingAction_Filters() { final AppsFilter appsFilter = Loading Loading
core/java/android/content/pm/parsing/ComponentParseUtils.java +6 −0 Original line number Diff line number Diff line Loading @@ -58,6 +58,7 @@ import android.util.TypedValue; import android.view.Gravity; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.DataClass; import com.android.internal.util.XmlUtils; Loading Loading @@ -814,6 +815,11 @@ public class ComponentParseUtils { return exported; } @VisibleForTesting public void setExported(boolean exported) { this.exported = exported; } public List<ParsedProviderIntentInfo> getIntents() { return intents; } Loading
services/core/java/com/android/server/pm/AppsFilter.java +11 −5 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ import java.io.PrintWriter; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.StringTokenizer; /** * The entity responsible for filtering visibility between apps based on declarations in their Loading Loading @@ -219,12 +220,17 @@ public class AppsFilter { continue; } final Uri data = intent.getData(); if ("content".equalsIgnoreCase(intent.getScheme()) && data != null && Objects.equals(provider.getAuthority(), data.getAuthority())) { if (!"content".equalsIgnoreCase(intent.getScheme()) || data == null || provider.getAuthority() == null) { continue; } StringTokenizer authorities = new StringTokenizer(provider.getAuthority(), ";", false); while (authorities.hasMoreElements()) { if (Objects.equals(authorities.nextElement(), data.getAuthority())) { return true; } } } for (int s = ArrayUtils.size(potentialTarget.getServices()) - 1; s >= 0; s--) { ParsedService service = potentialTarget.getServices().get(s); if (!service.exported) { Loading Loading @@ -632,7 +638,7 @@ public class AppsFilter { private static void log(SettingBase callingPkgSetting, PackageSetting targetPkgSetting, String description, Throwable throwable) { Slog.wtf(TAG, "interaction: " + callingPkgSetting.toString() "interaction: " + callingPkgSetting + " -> " + targetPkgSetting.name + " " + description, throwable); } Loading
services/tests/servicestests/src/com/android/server/pm/AppsFilterTest.java +61 −0 Original line number Diff line number Diff line Loading @@ -28,10 +28,12 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.ApplicationInfo; import android.content.pm.parsing.AndroidPackage; import android.content.pm.parsing.ComponentParseUtils; import android.content.pm.parsing.ComponentParseUtils.ParsedActivity; import android.content.pm.parsing.ComponentParseUtils.ParsedActivityIntentInfo; import android.content.pm.parsing.PackageImpl; import android.content.pm.parsing.ParsingPackage; import android.net.Uri; import android.os.Build; import android.os.Process; import android.util.ArrayMap; Loading @@ -49,6 +51,7 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; Loading Loading @@ -116,6 +119,15 @@ public class AppsFilterTest { .addActivity(activity); } private static ParsingPackage pkgWithProvider(String packageName, String authority) { ComponentParseUtils.ParsedProvider provider = new ComponentParseUtils.ParsedProvider(); provider.setPackageName(packageName); provider.setExported(true); provider.setAuthority(authority); return pkg(packageName) .addProvider(provider); } @Before public void setup() throws Exception { mExisting = new ArrayMap<>(); Loading Loading @@ -148,6 +160,55 @@ public class AppsFilterTest { assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesProvider_FilterMatches() { final AppsFilter appsFilter = new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); appsFilter.onSystemReady(); PackageSetting target = simulateAddPackage(appsFilter, pkgWithProvider("com.some.package", "com.some.authority"), DUMMY_TARGET_UID); PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package", new Intent().setData(Uri.parse("content://com.some.authority"))), DUMMY_CALLING_UID); assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesDifferentProvider_Filters() { final AppsFilter appsFilter = new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); appsFilter.onSystemReady(); PackageSetting target = simulateAddPackage(appsFilter, pkgWithProvider("com.some.package", "com.some.authority"), DUMMY_TARGET_UID); PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package", new Intent().setData(Uri.parse("content://com.some.other.authority"))), DUMMY_CALLING_UID); assertTrue(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesProviderWithSemiColon_FilterMatches() { final AppsFilter appsFilter = new AppsFilter(mFeatureConfigMock, new String[]{}, false, null); appsFilter.onSystemReady(); PackageSetting target = simulateAddPackage(appsFilter, pkgWithProvider("com.some.package", "com.some.authority;com.some.other.authority"), DUMMY_TARGET_UID); PackageSetting calling = simulateAddPackage(appsFilter, pkg("com.some.other.package", new Intent().setData(Uri.parse("content://com.some.authority"))), DUMMY_CALLING_UID); assertFalse(appsFilter.shouldFilterApplication(DUMMY_CALLING_UID, calling, target, 0)); } @Test public void testQueriesAction_NoMatchingAction_Filters() { final AppsFilter appsFilter = Loading