From 8cb52455701bfa5abd3ed4513bdc9f3fe19752ae Mon Sep 17 00:00:00 2001 From: Pavel Maltsev Date: Wed, 7 Mar 2018 14:33:22 -0800 Subject: [PATCH] Mark networks with OEM_PAID always restricted Bug: 68762530 Exempt-From-Owner-Approval: OWNERS have approved, but gerrit doesn't see it Test: runtest -x frameworks/base/tests/net/ -c android.net.NetworkCapabilitiesTest Change-Id: Ieadef7c42634d890281543226203530fb18eb0a3 --- .../java/android/net/NetworkCapabilities.java | 23 ++++++++++++++----- .../android/net/NetworkCapabilitiesTest.java | 19 +++++++++++++-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 2fc8c6857b..cadd445d46 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -315,7 +315,7 @@ public final class NetworkCapabilities implements Parcelable { /** * Capabilities that suggest that a network is restricted. - * {@see #maybeMarkCapabilitiesRestricted}. + * {@see #maybeMarkCapabilitiesRestricted}, {@see #FORCE_RESTRICTED_CAPABILITIES} */ @VisibleForTesting /* package */ static final long RESTRICTED_CAPABILITIES = @@ -326,7 +326,13 @@ public final class NetworkCapabilities implements Parcelable { (1 << NET_CAPABILITY_IA) | (1 << NET_CAPABILITY_IMS) | (1 << NET_CAPABILITY_RCS) | - (1 << NET_CAPABILITY_XCAP) | + (1 << NET_CAPABILITY_XCAP); + + /** + * Capabilities that force network to be restricted. + * {@see #maybeMarkCapabilitiesRestricted}. + */ + private static final long FORCE_RESTRICTED_CAPABILITIES = (1 << NET_CAPABILITY_OEM_PAID); /** @@ -530,16 +536,21 @@ public final class NetworkCapabilities implements Parcelable { * @hide */ public void maybeMarkCapabilitiesRestricted() { + // Check if we have any capability that forces the network to be restricted. + final boolean forceRestrictedCapability = + (mNetworkCapabilities & FORCE_RESTRICTED_CAPABILITIES) != 0; + // Verify there aren't any unrestricted capabilities. If there are we say - // the whole thing is unrestricted. + // the whole thing is unrestricted unless it is forced to be restricted. final boolean hasUnrestrictedCapabilities = - ((mNetworkCapabilities & UNRESTRICTED_CAPABILITIES) != 0); + (mNetworkCapabilities & UNRESTRICTED_CAPABILITIES) != 0; // Must have at least some restricted capabilities. final boolean hasRestrictedCapabilities = - ((mNetworkCapabilities & RESTRICTED_CAPABILITIES) != 0); + (mNetworkCapabilities & RESTRICTED_CAPABILITIES) != 0; - if (hasRestrictedCapabilities && !hasUnrestrictedCapabilities) { + if (forceRestrictedCapability + || (hasRestrictedCapabilities && !hasUnrestrictedCapabilities)) { removeCapability(NET_CAPABILITY_NOT_RESTRICTED); } } diff --git a/tests/net/java/android/net/NetworkCapabilitiesTest.java b/tests/net/java/android/net/NetworkCapabilitiesTest.java index 17932a4eb1..cc51b8eac7 100644 --- a/tests/net/java/android/net/NetworkCapabilitiesTest.java +++ b/tests/net/java/android/net/NetworkCapabilitiesTest.java @@ -273,14 +273,28 @@ public class NetworkCapabilitiesTest { @Test public void testOemPaid() { NetworkCapabilities nc = new NetworkCapabilities(); - nc.maybeMarkCapabilitiesRestricted(); + // By default OEM_PAID is neither in the unwanted or required lists and the network is not + // restricted. + assertFalse(nc.hasUnwantedCapability(NET_CAPABILITY_OEM_PAID)); assertFalse(nc.hasCapability(NET_CAPABILITY_OEM_PAID)); + nc.maybeMarkCapabilitiesRestricted(); assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + // Adding OEM_PAID to capability list should make network restricted. nc.addCapability(NET_CAPABILITY_OEM_PAID); + nc.addCapability(NET_CAPABILITY_INTERNET); // Combine with unrestricted capability. nc.maybeMarkCapabilitiesRestricted(); assertTrue(nc.hasCapability(NET_CAPABILITY_OEM_PAID)); assertFalse(nc.hasCapability(NET_CAPABILITY_NOT_RESTRICTED)); + + // Now let's make request for OEM_PAID network. + NetworkCapabilities nr = new NetworkCapabilities(); + nr.addCapability(NET_CAPABILITY_OEM_PAID); + nr.maybeMarkCapabilitiesRestricted(); + assertTrue(nr.satisfiedByNetworkCapabilities(nc)); + + // Request fails for network with the default capabilities. + assertFalse(nr.satisfiedByNetworkCapabilities(new NetworkCapabilities())); } @Test @@ -295,7 +309,8 @@ public class NetworkCapabilitiesTest { request.addUnwantedCapability(NET_CAPABILITY_WIFI_P2P); request.addUnwantedCapability(NET_CAPABILITY_NOT_METERED); assertTrue(request.satisfiedByNetworkCapabilities(network)); - assertArrayEquals(new int[] {NET_CAPABILITY_WIFI_P2P, NET_CAPABILITY_NOT_METERED}, + assertArrayEquals(new int[] {NET_CAPABILITY_WIFI_P2P, + NET_CAPABILITY_NOT_METERED}, request.getUnwantedCapabilities()); // This is a default capability, just want to make sure its there because we use it below.