diff options
| author | 2018-09-03 02:41:26 -0700 | |
|---|---|---|
| committer | 2018-09-03 02:41:26 -0700 | |
| commit | b93f9455faa8f729900098f84b0450f9d8f1dfb1 (patch) | |
| tree | 6dd5a90a492932bbed3cdf576ff333ef2181c30a | |
| parent | e408299b69b6834e50f98155faaa45835057cf5f (diff) | |
| parent | 3e35cfe2bdfdeb65484a6d141a2814bbc00e2f20 (diff) | |
Merge "PermissionMonitor: Limit preinstalled apps network permissions" am: e227eeef1c
am: 3e35cfe2bd
Change-Id: I1478c932bf612fd4546c4178fc8f4a0bededf127
| -rw-r--r-- | services/core/java/com/android/server/connectivity/PermissionMonitor.java | 22 | ||||
| -rw-r--r-- | tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java | 102 |
2 files changed, 88 insertions, 36 deletions
diff --git a/services/core/java/com/android/server/connectivity/PermissionMonitor.java b/services/core/java/com/android/server/connectivity/PermissionMonitor.java index e471c7d84b56..7b8571c131b6 100644 --- a/services/core/java/com/android/server/connectivity/PermissionMonitor.java +++ b/services/core/java/com/android/server/connectivity/PermissionMonitor.java @@ -24,6 +24,7 @@ import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; import static android.content.pm.ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; import static android.content.pm.PackageManager.GET_PERMISSIONS; +import android.annotation.NonNull; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -34,6 +35,7 @@ import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.UserInfo; import android.net.Uri; +import android.os.Build; import android.os.INetworkManagementService; import android.os.RemoteException; import android.os.UserHandle; @@ -155,9 +157,8 @@ public class PermissionMonitor { } @VisibleForTesting - boolean isPreinstalledSystemApp(PackageInfo app) { - int flags = app.applicationInfo != null ? app.applicationInfo.flags : 0; - return (flags & (FLAG_SYSTEM | FLAG_UPDATED_SYSTEM_APP)) != 0; + static boolean isVendorApp(@NonNull ApplicationInfo appInfo) { + return appInfo.isVendor() || appInfo.isOem() || appInfo.isProduct(); } @VisibleForTesting @@ -177,7 +178,13 @@ public class PermissionMonitor { } private boolean hasRestrictedNetworkPermission(PackageInfo app) { - if (isPreinstalledSystemApp(app)) return true; + // TODO : remove this check in the future(b/31479477). All apps should just + // request the appropriate permission for their use case since android Q. + if (app.applicationInfo != null + && app.applicationInfo.targetSdkVersion < Build.VERSION_CODES.Q + && isVendorApp(app.applicationInfo)) { + return true; + } return hasPermission(app, CONNECTIVITY_INTERNAL) || hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS); } @@ -186,13 +193,8 @@ public class PermissionMonitor { // This function defines what it means to hold the permission to use // background networks. return hasPermission(app, CHANGE_NETWORK_STATE) - || hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS) - || hasPermission(app, CONNECTIVITY_INTERNAL) || hasPermission(app, NETWORK_STACK) - // TODO : remove this check (b/31479477). Not all preinstalled apps should - // have access to background networks, they should just request the appropriate - // permission for their use case from the list above. - || isPreinstalledSystemApp(app); + || hasRestrictedNetworkPermission(app); } public boolean hasUseBackgroundNetworksPermission(int uid) { diff --git a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java index f025f41f292b..4dc63f249a52 100644 --- a/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java +++ b/tests/net/java/com/android/server/connectivity/PermissionMonitorTest.java @@ -21,7 +21,9 @@ import static android.Manifest.permission.CHANGE_WIFI_STATE; import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS; import static android.Manifest.permission.NETWORK_STACK; -import static android.content.pm.ApplicationInfo.FLAG_SYSTEM; +import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_OEM; +import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_PRODUCT; +import static android.content.pm.ApplicationInfo.PRIVATE_FLAG_VENDOR; import static android.content.pm.PackageManager.GET_PERMISSIONS; import static org.junit.Assert.assertFalse; @@ -34,6 +36,7 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.os.Build; import android.support.test.filters.SmallTest; import android.support.test.runner.AndroidJUnit4; @@ -48,6 +51,10 @@ import org.mockito.MockitoAnnotations; public class PermissionMonitorTest { private static final int MOCK_UID = 10001; private static final String[] MOCK_PACKAGE_NAMES = new String[] { "com.foo.bar" }; + private static final String PARTITION_SYSTEM = "system"; + private static final String PARTITION_OEM = "oem"; + private static final String PARTITION_PRODUCT = "product"; + private static final String PARTITION_VENDOR = "vendor"; @Mock private Context mContext; @Mock private PackageManager mPackageManager; @@ -62,39 +69,53 @@ public class PermissionMonitorTest { mPermissionMonitor = new PermissionMonitor(mContext, null); } - private void expectPermission(String[] permissions, boolean preinstalled) throws Exception { - final PackageInfo packageInfo = packageInfoWithPermissions(permissions, preinstalled); + private void expectPermission(String[] permissions, String partition, + int targetSdkVersion) throws Exception { + final PackageInfo packageInfo = packageInfoWithPermissions(permissions, partition); + packageInfo.applicationInfo.targetSdkVersion = targetSdkVersion; when(mPackageManager.getPackageInfoAsUser( eq(MOCK_PACKAGE_NAMES[0]), eq(GET_PERMISSIONS), anyInt())).thenReturn(packageInfo); } - private PackageInfo packageInfoWithPermissions(String[] permissions, boolean preinstalled) { + private PackageInfo packageInfoWithPermissions(String[] permissions, String partition) { final PackageInfo packageInfo = new PackageInfo(); packageInfo.requestedPermissions = permissions; packageInfo.applicationInfo = new ApplicationInfo(); - packageInfo.applicationInfo.flags = preinstalled ? FLAG_SYSTEM : 0; + int privateFlags = 0; + switch (partition) { + case PARTITION_OEM: + privateFlags = PRIVATE_FLAG_OEM; + break; + case PARTITION_PRODUCT: + privateFlags = PRIVATE_FLAG_PRODUCT; + break; + case PARTITION_VENDOR: + privateFlags = PRIVATE_FLAG_VENDOR; + break; + } + packageInfo.applicationInfo.privateFlags = privateFlags; return packageInfo; } @Test public void testHasPermission() { - PackageInfo app = packageInfoWithPermissions(new String[] {}, false); + PackageInfo app = packageInfoWithPermissions(new String[] {}, PARTITION_SYSTEM); assertFalse(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE)); assertFalse(mPermissionMonitor.hasPermission(app, NETWORK_STACK)); assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS)); assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL)); app = packageInfoWithPermissions(new String[] { - CHANGE_NETWORK_STATE, NETWORK_STACK - }, false); + CHANGE_NETWORK_STATE, NETWORK_STACK + }, PARTITION_SYSTEM); assertTrue(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE)); assertTrue(mPermissionMonitor.hasPermission(app, NETWORK_STACK)); assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS)); assertFalse(mPermissionMonitor.hasPermission(app, CONNECTIVITY_INTERNAL)); app = packageInfoWithPermissions(new String[] { - CONNECTIVITY_USE_RESTRICTED_NETWORKS, CONNECTIVITY_INTERNAL - }, false); + CONNECTIVITY_USE_RESTRICTED_NETWORKS, CONNECTIVITY_INTERNAL + }, PARTITION_SYSTEM); assertFalse(mPermissionMonitor.hasPermission(app, CHANGE_NETWORK_STATE)); assertFalse(mPermissionMonitor.hasPermission(app, NETWORK_STACK)); assertTrue(mPermissionMonitor.hasPermission(app, CONNECTIVITY_USE_RESTRICTED_NETWORKS)); @@ -102,35 +123,64 @@ public class PermissionMonitorTest { } @Test - public void testIsPreinstalledSystemApp() { - PackageInfo app = packageInfoWithPermissions(new String[] {}, false); - assertFalse(mPermissionMonitor.isPreinstalledSystemApp(app)); - - app = packageInfoWithPermissions(new String[] {}, true); - assertTrue(mPermissionMonitor.isPreinstalledSystemApp(app)); + public void testIsVendorApp() { + PackageInfo app = packageInfoWithPermissions(new String[] {}, PARTITION_SYSTEM); + assertFalse(mPermissionMonitor.isVendorApp(app.applicationInfo)); + app = packageInfoWithPermissions(new String[] {}, PARTITION_OEM); + assertTrue(mPermissionMonitor.isVendorApp(app.applicationInfo)); + app = packageInfoWithPermissions(new String[] {}, PARTITION_PRODUCT); + assertTrue(mPermissionMonitor.isVendorApp(app.applicationInfo)); + app = packageInfoWithPermissions(new String[] {}, PARTITION_VENDOR); + assertTrue(mPermissionMonitor.isVendorApp(app.applicationInfo)); } @Test public void testHasUseBackgroundNetworksPermission() throws Exception { - expectPermission(new String[] { CHANGE_NETWORK_STATE }, false); + expectPermission(new String[] { CHANGE_NETWORK_STATE }, + PARTITION_SYSTEM, Build.VERSION_CODES.P); assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); - - expectPermission(new String[] { NETWORK_STACK, CONNECTIVITY_INTERNAL }, false); + expectPermission(new String[] { NETWORK_STACK }, PARTITION_SYSTEM, Build.VERSION_CODES.P); assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); - - // TODO : make this false when b/31479477 is fixed - expectPermission(new String[] {}, true); + expectPermission(new String[] { CONNECTIVITY_INTERNAL }, + PARTITION_SYSTEM, Build.VERSION_CODES.P); assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); - expectPermission(new String[] { CHANGE_WIFI_STATE }, true); + expectPermission(new String[] { CONNECTIVITY_USE_RESTRICTED_NETWORKS }, + PARTITION_SYSTEM, Build.VERSION_CODES.P); assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); - expectPermission(new String[] { NETWORK_STACK, CONNECTIVITY_INTERNAL }, true); + expectPermission(new String[] { CHANGE_NETWORK_STATE }, + PARTITION_VENDOR, Build.VERSION_CODES.P); + assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] { NETWORK_STACK }, + PARTITION_VENDOR, Build.VERSION_CODES.P); + assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] { CONNECTIVITY_INTERNAL }, + PARTITION_VENDOR, Build.VERSION_CODES.P); + assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] { CONNECTIVITY_USE_RESTRICTED_NETWORKS }, + PARTITION_VENDOR, Build.VERSION_CODES.P); assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); - expectPermission(new String[] {}, false); + expectPermission(new String[] {}, PARTITION_SYSTEM, Build.VERSION_CODES.P); assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] { CHANGE_WIFI_STATE }, + PARTITION_SYSTEM, Build.VERSION_CODES.P); + assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] {}, PARTITION_VENDOR, Build.VERSION_CODES.P); + assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] { CHANGE_WIFI_STATE }, + PARTITION_VENDOR, Build.VERSION_CODES.P); + assertTrue(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); - expectPermission(new String[] { CHANGE_WIFI_STATE }, false); + expectPermission(new String[] {}, PARTITION_SYSTEM, Build.VERSION_CODES.Q); + assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] { CHANGE_WIFI_STATE }, + PARTITION_SYSTEM, Build.VERSION_CODES.Q); + assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] {}, PARTITION_VENDOR, Build.VERSION_CODES.Q); + assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); + expectPermission(new String[] { CHANGE_WIFI_STATE }, + PARTITION_VENDOR, Build.VERSION_CODES.Q); assertFalse(mPermissionMonitor.hasUseBackgroundNetworksPermission(MOCK_UID)); } } |