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

Commit 1ad18702 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Immediately redact VcnTransportInfo.

Redaction of NetworkCapabilities is changing from redacting at
parcel time to redacting immediately when makeCopy() is called.
Update VcnTransportInfo redaction accordingly.

Bug: 183938194
Test: atest VcnTransportInfoTest
Change-Id: I0c9406f426b66fd36b47d11799955def531c16ba
parent 3533c167
Loading
Loading
Loading
Loading
+10 −66
Original line number Diff line number Diff line
@@ -16,23 +16,17 @@

package android.net.vcn;

import static android.net.NetworkCapabilities.REDACT_ALL;
import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
import static android.net.NetworkCapabilities.REDACT_NONE;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.net.NetworkCapabilities;
import android.net.TransportInfo;
import android.net.wifi.WifiInfo;
import android.os.Parcel;
import android.os.Parcelable;
import android.telephony.SubscriptionManager;

import com.android.internal.annotations.VisibleForTesting;

import java.util.Objects;

/**
@@ -55,32 +49,17 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
    @Nullable private final WifiInfo mWifiInfo;
    private final int mSubId;

    /**
     * The redaction scheme to use when parcelling.
     *
     * <p>The TransportInfo/NetworkCapabilities redaction mechanisms rely on redaction being
     * performed at parcelling time. This means that the redaction scheme must be stored for later
     * use.
     *
     * <p>Since the redaction scheme itself is not parcelled, this field is listed as a transient.
     *
     * <p>Defaults to REDACT_ALL when constructed using public constructors, or creating from
     * parcels.
     */
    private final transient long mRedactions;

    public VcnTransportInfo(@NonNull WifiInfo wifiInfo) {
        this(wifiInfo, INVALID_SUBSCRIPTION_ID, REDACT_ALL);
        this(wifiInfo, INVALID_SUBSCRIPTION_ID);
    }

    public VcnTransportInfo(int subId) {
        this(null /* wifiInfo */, subId, REDACT_ALL);
        this(null /* wifiInfo */, subId);
    }

    private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId, long redactions) {
    private VcnTransportInfo(@Nullable WifiInfo wifiInfo, int subId) {
        mWifiInfo = wifiInfo;
        mSubId = subId;
        mRedactions = redactions;
    }

    /**
@@ -102,25 +81,14 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
     * SubscriptionManager#INVALID_SUBSCRIPTION_ID}.
     *
     * @return the Subscription ID if a cellular underlying Network is present, else {@link
     *     android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID}.
     *     android.telephony.SubscriptionManager#INVALID_SUBSCRIPTION_ID}.
     */
    public int getSubId() {
        return mSubId;
    }

    /**
     * Gets the redaction scheme
     *
     * @hide
     */
    @VisibleForTesting(visibility = PRIVATE)
    public long getRedaction() {
        return mRedactions;
    }

    @Override
    public int hashCode() {
        // mRedactions not hashed, as it is a transient, for control of parcelling
        return Objects.hash(mWifiInfo, mSubId);
    }

@@ -128,8 +96,6 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
    public boolean equals(Object o) {
        if (!(o instanceof VcnTransportInfo)) return false;
        final VcnTransportInfo that = (VcnTransportInfo) o;

        // mRedactions not compared, as it is a transient, for control of parcelling
        return Objects.equals(mWifiInfo, that.mWifiInfo) && mSubId == that.mSubId;
    }

@@ -143,31 +109,19 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
    @NonNull
    public TransportInfo makeCopy(long redactions) {
        return new VcnTransportInfo(
                mWifiInfo == null ? null : mWifiInfo.makeCopy(redactions), mSubId, redactions);
                (mWifiInfo == null) ? null : mWifiInfo.makeCopy(redactions), mSubId);
    }

    @Override
    public long getApplicableRedactions() {
        long redactions = REDACT_FOR_NETWORK_SETTINGS;

        // Add additional wifi redactions if necessary
        if (mWifiInfo != null) {
            redactions |= mWifiInfo.getApplicableRedactions();
        }

        return redactions;
    }

    private boolean shouldParcelNetworkSettingsFields() {
        return (mRedactions & NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS) == 0;
        return (mWifiInfo == null) ? REDACT_NONE : mWifiInfo.getApplicableRedactions();
    }

    /** {@inheritDoc} */
    @Override
    public void writeToParcel(@NonNull Parcel dest, int flags) {
        dest.writeInt(shouldParcelNetworkSettingsFields() ? mSubId : INVALID_SUBSCRIPTION_ID);
        dest.writeParcelable(
                shouldParcelNetworkSettingsFields() ? (Parcelable) mWifiInfo : null, flags);
        dest.writeInt(mSubId);
        dest.writeParcelable(mWifiInfo, flags);
    }

    @Override
@@ -181,17 +135,7 @@ public class VcnTransportInfo implements TransportInfo, Parcelable {
                public VcnTransportInfo createFromParcel(Parcel in) {
                    final int subId = in.readInt();
                    final WifiInfo wifiInfo = in.readParcelable(null);

                    // If all fields are their null values, return null TransportInfo to avoid
                    // leaking information about this being a VCN Network (instead of macro
                    // cellular, etc)
                    if (wifiInfo == null && subId == INVALID_SUBSCRIPTION_ID) {
                        return null;
                    }

                    // Prevent further forwarding by redacting everything in future parcels from
                    // this VcnTransportInfo
                    return new VcnTransportInfo(wifiInfo, subId, REDACT_ALL);
                    return new VcnTransportInfo(wifiInfo, subId);
                }

                public VcnTransportInfo[] newArray(int size) {
+25 −32
Original line number Diff line number Diff line
@@ -16,14 +16,17 @@

package android.net.vcn;

import static android.net.NetworkCapabilities.REDACT_ALL;
import static android.net.NetworkCapabilities.REDACT_FOR_ACCESS_FINE_LOCATION;
import static android.net.NetworkCapabilities.REDACT_FOR_LOCAL_MAC_ADDRESS;
import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS;
import static android.net.NetworkCapabilities.REDACT_NONE;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;

import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.os.Parcel;

@@ -38,12 +41,6 @@ public class VcnTransportInfoTest {
    private static final VcnTransportInfo CELL_UNDERLYING_INFO = new VcnTransportInfo(SUB_ID);
    private static final VcnTransportInfo WIFI_UNDERLYING_INFO = new VcnTransportInfo(WIFI_INFO);

    @Test
    public void testRedactionDefaults() {
        assertEquals(REDACT_ALL, CELL_UNDERLYING_INFO.getRedaction());
        assertEquals(REDACT_ALL, WIFI_UNDERLYING_INFO.getRedaction());
    }

    @Test
    public void testGetWifiInfo() {
        assertEquals(WIFI_INFO, WIFI_UNDERLYING_INFO.getWifiInfo());
@@ -59,15 +56,15 @@ public class VcnTransportInfoTest {
    }

    @Test
    public void testMakeCopySetsRedactions() {
    public void testMakeCopyRedactForAccessFineLocation() {
        assertEquals(
                REDACT_FOR_NETWORK_SETTINGS,
                ((VcnTransportInfo) CELL_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS))
                        .getRedaction());
                SUB_ID,
                ((VcnTransportInfo) CELL_UNDERLYING_INFO.makeCopy(REDACT_FOR_ACCESS_FINE_LOCATION))
                        .getSubId());
        assertEquals(
                REDACT_FOR_NETWORK_SETTINGS,
                ((VcnTransportInfo) WIFI_UNDERLYING_INFO.makeCopy(REDACT_FOR_NETWORK_SETTINGS))
                        .getRedaction());
                WifiConfiguration.INVALID_NETWORK_ID,
                ((VcnTransportInfo) WIFI_UNDERLYING_INFO.makeCopy(REDACT_FOR_ACCESS_FINE_LOCATION))
                        .getWifiInfo().getNetworkId());
    }

    @Test
@@ -78,35 +75,31 @@ public class VcnTransportInfoTest {
    }

    @Test
    public void testParcelUnparcel() {
        verifyParcelingIsNull(CELL_UNDERLYING_INFO);
        verifyParcelingIsNull(WIFI_UNDERLYING_INFO);
    }

    private void verifyParcelingIsNull(VcnTransportInfo vcnTransportInfo) {
        // Verify redacted by default
        Parcel parcel = Parcel.obtain();
        vcnTransportInfo.writeToParcel(parcel, 0 /* flags */);
        parcel.setDataPosition(0);

        assertNull(VcnTransportInfo.CREATOR.createFromParcel(parcel));
    public void testApplicableRedactions() {
        assertEquals(REDACT_NONE, CELL_UNDERLYING_INFO.getApplicableRedactions());
        assertEquals(REDACT_FOR_ACCESS_FINE_LOCATION | REDACT_FOR_LOCAL_MAC_ADDRESS
                        | REDACT_FOR_NETWORK_SETTINGS,
                WIFI_UNDERLYING_INFO.getApplicableRedactions());
    }

    @Test
    public void testParcelUnparcelNotRedactedForSysUi() {
        verifyParcelingForSysUi(CELL_UNDERLYING_INFO);
        verifyParcelingForSysUi(WIFI_UNDERLYING_INFO);
    public void testParcelNotRedactedForSysUi() {
        VcnTransportInfo cellRedacted = parcelForSysUi(CELL_UNDERLYING_INFO);
        assertEquals(SUB_ID, cellRedacted.getSubId());
        VcnTransportInfo wifiRedacted = parcelForSysUi(WIFI_UNDERLYING_INFO);
        assertEquals(NETWORK_ID, wifiRedacted.getWifiInfo().getNetworkId());
    }

    private void verifyParcelingForSysUi(VcnTransportInfo vcnTransportInfo) {
    private VcnTransportInfo parcelForSysUi(VcnTransportInfo vcnTransportInfo) {
        // Allow fully unredacted; SysUI will have all the relevant permissions.
        final VcnTransportInfo unRedacted = (VcnTransportInfo) vcnTransportInfo.makeCopy(0);
        final VcnTransportInfo unRedacted = (VcnTransportInfo) vcnTransportInfo.makeCopy(
                REDACT_NONE);
        final Parcel parcel = Parcel.obtain();
        unRedacted.writeToParcel(parcel, 0 /* flags */);
        parcel.setDataPosition(0);

        final VcnTransportInfo unparceled = VcnTransportInfo.CREATOR.createFromParcel(parcel);
        assertEquals(vcnTransportInfo, unparceled);
        assertEquals(REDACT_ALL, unparceled.getRedaction());
        return unparceled;
    }
}