Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a433084f authored by Cody Kesting's avatar Cody Kesting Committed by Automerger Merge Worker
Browse files

Merge "Restrict VPN Diagnostics callbacks to underlying networks." into...

Merge "Restrict VPN Diagnostics callbacks to underlying networks." into rvc-dev am: bb2144e4 am: 7059c017 am: d2a7c216

Change-Id: I38dce2e4ee1b5b579e697e6175ab5c97ef65a40c
parents 3f36ea8b d2a7c216
Loading
Loading
Loading
Loading
+6 −3
Original line number Diff line number Diff line
@@ -7967,10 +7967,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
            return false;
        }

        final Network[] underlyingNetworks;
        synchronized (mVpns) {
            if (getVpnIfOwner(callbackUid) != null) {
                return true;
            final Vpn vpn = getVpnIfOwner(callbackUid);
            underlyingNetworks = (vpn == null) ? null : vpn.getUnderlyingNetworks();
        }
        if (underlyingNetworks != null) {
            if (Arrays.asList(underlyingNetworks).contains(nai.network)) return true;
        }

        // Administrator UIDs also contains the Owner UID
+26 −2
Original line number Diff line number Diff line
@@ -307,6 +307,8 @@ public class ConnectivityServiceTest {

    private static final long TIMESTAMP = 1234L;

    private static final int NET_ID = 110;

    private static final String CLAT_PREFIX = "v4-";
    private static final String MOBILE_IFNAME = "test_rmnet_data0";
    private static final String WIFI_IFNAME = "test_wlan0";
@@ -1015,6 +1017,7 @@ public class ConnectivityServiceTest {
        private int mVpnType = VpnManager.TYPE_VPN_SERVICE;

        private VpnInfo mVpnInfo;
        private Network[] mUnderlyingNetworks;

        public MockVpn(int userId) {
            super(startHandlerThreadAndReturnLooper(), mServiceContext, mNetworkManagementService,
@@ -1104,9 +1107,21 @@ public class ConnectivityServiceTest {
            return super.getVpnInfo();
        }

        private void setVpnInfo(VpnInfo vpnInfo) {
        private synchronized void setVpnInfo(VpnInfo vpnInfo) {
            mVpnInfo = vpnInfo;
        }

        @Override
        public synchronized Network[] getUnderlyingNetworks() {
            if (mUnderlyingNetworks != null) return mUnderlyingNetworks;

            return super.getUnderlyingNetworks();
        }

        /** Don't override behavior for {@link Vpn#setUnderlyingNetworks}. */
        private synchronized void overrideUnderlyingNetworks(Network[] underlyingNetworks) {
            mUnderlyingNetworks = underlyingNetworks;
        }
    }

    private void mockVpn(int uid) {
@@ -6824,9 +6839,10 @@ public class ConnectivityServiceTest {

    @Test
    public void testCheckConnectivityDiagnosticsPermissionsActiveVpn() throws Exception {
        final Network network = new Network(NET_ID);
        final NetworkAgentInfo naiWithoutUid =
                new NetworkAgentInfo(
                        null, null, null, null, null, new NetworkCapabilities(), 0,
                        null, null, network, null, null, new NetworkCapabilities(), 0,
                        mServiceContext, null, null, mService, null, null, null, 0);

        setupLocationPermissions(Build.VERSION_CODES.Q, true, AppOpsManager.OPSTR_FINE_LOCATION,
@@ -6839,11 +6855,19 @@ public class ConnectivityServiceTest {
        info.ownerUid = Process.myUid();
        info.vpnIface = "interface";
        mMockVpn.setVpnInfo(info);
        mMockVpn.overrideUnderlyingNetworks(new Network[] {network});
        assertTrue(
                "Active VPN permission not applied",
                mService.checkConnectivityDiagnosticsPermissions(
                        Process.myPid(), Process.myUid(), naiWithoutUid,
                        mContext.getOpPackageName()));

        mMockVpn.overrideUnderlyingNetworks(null);
        assertFalse(
                "VPN shouldn't receive callback on non-underlying network",
                mService.checkConnectivityDiagnosticsPermissions(
                        Process.myPid(), Process.myUid(), naiWithoutUid,
                        mContext.getOpPackageName()));
    }

    @Test