Make sure getActiveNetwork is consistent with default callbacks
Almost clean cherry-pick of ag/3889538.
Bug: 77737389
Test: runtest framework-net
new test don't pass without the main code change, but they
do with it
Change-Id: I0cd83a935ab0b349aa47e065b830e5a43ab9a091
Merged-In: Iaa0285825735d3f16bba6e4946723a437fd9b0b9
Merged-In: Ia8f985b448251f911484e6bd63fa562bffc1b0e4
This commit is contained in:
@@ -901,6 +901,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
deps);
|
||||
}
|
||||
|
||||
private static NetworkCapabilities createDefaultNetworkCapabilitiesForUid(int uid) {
|
||||
final NetworkCapabilities netCap = new NetworkCapabilities();
|
||||
netCap.addCapability(NET_CAPABILITY_INTERNET);
|
||||
netCap.addCapability(NET_CAPABILITY_NOT_RESTRICTED);
|
||||
netCap.removeCapability(NET_CAPABILITY_NOT_VPN);
|
||||
netCap.setSingleUid(uid);
|
||||
return netCap;
|
||||
}
|
||||
|
||||
private NetworkRequest createDefaultInternetRequestForTransport(
|
||||
int transportType, NetworkRequest.Type type) {
|
||||
NetworkCapabilities netCap = new NetworkCapabilities();
|
||||
@@ -1153,12 +1162,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
int vpnNetId = NETID_UNSET;
|
||||
synchronized (mVpns) {
|
||||
final Vpn vpn = mVpns.get(user);
|
||||
// TODO : now that capabilities contain the UID, the appliesToUid test should
|
||||
// be removed as the satisfying test below should be enough.
|
||||
if (vpn != null && vpn.appliesToUid(uid)) vpnNetId = vpn.getNetId();
|
||||
}
|
||||
NetworkAgentInfo nai;
|
||||
if (vpnNetId != NETID_UNSET) {
|
||||
nai = getNetworkAgentInfoForNetId(vpnNetId);
|
||||
if (nai != null) return nai.network;
|
||||
if (nai != null) {
|
||||
final NetworkCapabilities requiredCaps =
|
||||
createDefaultNetworkCapabilitiesForUid(uid);
|
||||
if (requiredCaps.satisfiedByNetworkCapabilities(nai.networkCapabilities)) {
|
||||
return nai.network;
|
||||
}
|
||||
}
|
||||
}
|
||||
nai = getDefaultNetwork();
|
||||
if (nai != null
|
||||
@@ -1373,8 +1390,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
private NetworkCapabilities networkCapabilitiesRestrictedForCallerPermissions(
|
||||
NetworkCapabilities nc, int callerPid, int callerUid) {
|
||||
final NetworkCapabilities newNc = new NetworkCapabilities(nc);
|
||||
if (!checkSettingsPermission(callerPid, callerUid)) newNc.setUids(null);
|
||||
if (!checkSettingsPermission(callerPid, callerUid)) newNc.setSSID(null);
|
||||
if (!checkSettingsPermission(callerPid, callerUid)) {
|
||||
newNc.setUids(null);
|
||||
newNc.setSSID(null);
|
||||
}
|
||||
return newNc;
|
||||
}
|
||||
|
||||
@@ -4255,8 +4274,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
|
||||
// the default network request. This allows callers to keep track of
|
||||
// the system default network.
|
||||
if (type == NetworkRequest.Type.TRACK_DEFAULT) {
|
||||
networkCapabilities = new NetworkCapabilities(mDefaultRequest.networkCapabilities);
|
||||
networkCapabilities.removeCapability(NET_CAPABILITY_NOT_VPN);
|
||||
networkCapabilities = createDefaultNetworkCapabilitiesForUid(Binder.getCallingUid());
|
||||
enforceAccessPermission();
|
||||
} else {
|
||||
networkCapabilities = new NetworkCapabilities(networkCapabilities);
|
||||
|
||||
@@ -4170,4 +4170,53 @@ public class ConnectivityServiceTest {
|
||||
mCm.unregisterNetworkCallback(vpnNetworkCallback);
|
||||
mCm.unregisterNetworkCallback(defaultCallback);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testVpnWithAndWithoutInternet() {
|
||||
final int uid = Process.myUid();
|
||||
|
||||
final TestNetworkCallback defaultCallback = new TestNetworkCallback();
|
||||
mCm.registerDefaultNetworkCallback(defaultCallback);
|
||||
defaultCallback.assertNoCallback();
|
||||
|
||||
mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
|
||||
mWiFiNetworkAgent.connect(true);
|
||||
|
||||
defaultCallback.expectAvailableThenValidatedCallbacks(mWiFiNetworkAgent);
|
||||
assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork());
|
||||
|
||||
MockNetworkAgent vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN);
|
||||
final ArraySet<UidRange> ranges = new ArraySet<>();
|
||||
ranges.add(new UidRange(uid, uid));
|
||||
when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId);
|
||||
vpnNetworkAgent.setUids(ranges);
|
||||
vpnNetworkAgent.connect(true /* validated */, false /* hasInternet */);
|
||||
|
||||
defaultCallback.assertNoCallback();
|
||||
assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork());
|
||||
|
||||
vpnNetworkAgent.disconnect();
|
||||
defaultCallback.assertNoCallback();
|
||||
|
||||
vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN);
|
||||
when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId);
|
||||
vpnNetworkAgent.setUids(ranges);
|
||||
vpnNetworkAgent.connect(true /* validated */, true /* hasInternet */);
|
||||
defaultCallback.expectAvailableThenValidatedCallbacks(vpnNetworkAgent);
|
||||
assertEquals(defaultCallback.getLastAvailableNetwork(), mCm.getActiveNetwork());
|
||||
|
||||
vpnNetworkAgent.disconnect();
|
||||
defaultCallback.expectCallback(CallbackState.LOST, vpnNetworkAgent);
|
||||
defaultCallback.expectAvailableCallbacksValidated(mWiFiNetworkAgent);
|
||||
|
||||
vpnNetworkAgent = new MockNetworkAgent(TRANSPORT_VPN);
|
||||
when(mMockVpn.getNetId()).thenReturn(vpnNetworkAgent.getNetwork().netId);
|
||||
ranges.clear();
|
||||
vpnNetworkAgent.setUids(ranges);
|
||||
|
||||
vpnNetworkAgent.connect(false /* validated */, true /* hasInternet */);
|
||||
defaultCallback.assertNoCallback();
|
||||
|
||||
mCm.unregisterNetworkCallback(defaultCallback);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user