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

Commit 403b7fd0 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes from topics...

Merge changes from topics "revert-1645768-revert-1626206-replaceUidRange-MSYTKFNGUE-HIUTVTIGIR", "ti_redaction"

* changes:
  TransportInfo: Add a generic redaction mechanism
  Revert "Revert "Expose uids related APIs in NetworkRequest and N..."
  Revert^2 "Replace the usage of UidRange"
parents 744e27a3 adee4b7b
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -37,9 +37,24 @@ package android.net {
  }

  public final class NetworkCapabilities implements android.os.Parcelable {
    ctor public NetworkCapabilities(@Nullable android.net.NetworkCapabilities, long);
    method @Nullable public java.util.Set<android.util.Range<java.lang.Integer>> getUids();
    field public static final long REDACT_ALL = -1L; // 0xffffffffffffffffL
    field public static final long REDACT_FOR_ACCESS_FINE_LOCATION = 1L; // 0x1L
    field public static final long REDACT_FOR_LOCAL_MAC_ADDRESS = 2L; // 0x2L
    field public static final long REDACT_FOR_NETWORK_SETTINGS = 4L; // 0x4L
    field public static final long REDACT_NONE = 0L; // 0x0L
    field public static final int TRANSPORT_TEST = 7; // 0x7
  }

  public static final class NetworkCapabilities.Builder {
    method @NonNull public android.net.NetworkCapabilities.Builder setUids(@Nullable java.util.Set<android.util.Range<java.lang.Integer>>);
  }

  public static class NetworkRequest.Builder {
    method @NonNull public android.net.NetworkRequest.Builder setUids(@Nullable java.util.Set<android.util.Range<java.lang.Integer>>);
  }

  public class ParseException extends java.lang.RuntimeException {
    ctor public ParseException(@NonNull String);
    ctor public ParseException(@NonNull String, @NonNull Throwable);
@@ -80,6 +95,11 @@ package android.net {
    field @NonNull public static final android.os.Parcelable.Creator<android.net.TestNetworkSpecifier> CREATOR;
  }

  public interface TransportInfo {
    method public default long getApplicableRedactions();
    method @NonNull public default android.net.TransportInfo makeCopy(long);
  }

  public final class VpnTransportInfo implements android.os.Parcelable android.net.TransportInfo {
    ctor public VpnTransportInfo(int);
    method public int describeContents();
+0 −6
Original line number Diff line number Diff line
@@ -261,7 +261,6 @@ package android.net {
  }

  public final class NetworkCapabilities implements android.os.Parcelable {
    ctor public NetworkCapabilities(@Nullable android.net.NetworkCapabilities, boolean);
    method @NonNull public int[] getAdministratorUids();
    method @Nullable public String getSsid();
    method @NonNull public int[] getTransportTypes();
@@ -435,11 +434,6 @@ package android.net {
    field public final int tcpWindowScale;
  }

  public interface TransportInfo {
    method public default boolean hasLocationSensitiveFields();
    method @NonNull public default android.net.TransportInfo makeCopy(boolean);
  }

}

package android.net.apf {
+2 −3
Original line number Diff line number Diff line
@@ -434,7 +434,7 @@ public abstract class NetworkAgent {
        }

        mInitialConfiguration = new InitialConfiguration(context,
                new NetworkCapabilities(nc, /* parcelLocationSensitiveFields */ true),
                new NetworkCapabilities(nc, NetworkCapabilities.REDACT_NONE),
                new LinkProperties(lp), score, config, ni);
    }

@@ -878,8 +878,7 @@ public abstract class NetworkAgent {
        mBandwidthUpdatePending.set(false);
        mLastBwRefreshTime = System.currentTimeMillis();
        final NetworkCapabilities nc =
                new NetworkCapabilities(networkCapabilities,
                        /* parcelLocationSensitiveFields */ true);
                new NetworkCapabilities(networkCapabilities, NetworkCapabilities.REDACT_NONE);
        queueOrSendMessage(reg -> reg.sendNetworkCapabilities(nc));
    }

+136 −27
Original line number Diff line number Diff line
@@ -19,9 +19,11 @@ package android.net;
import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;

import android.annotation.IntDef;
import android.annotation.LongDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.net.ConnectivityManager.NetworkCallback;
@@ -32,6 +34,7 @@ import android.os.Parcelable;
import android.os.Process;
import android.text.TextUtils;
import android.util.ArraySet;
import android.util.Range;
import android.util.proto.ProtoOutputStream;

import com.android.internal.annotations.VisibleForTesting;
@@ -63,6 +66,68 @@ import java.util.StringJoiner;
public final class NetworkCapabilities implements Parcelable {
    private static final String TAG = "NetworkCapabilities";

    /**
     * Mechanism to support redaction of fields in NetworkCapabilities that are guarded by specific
     * app permissions.
     **/
    /**
     * Don't redact any fields since the receiving app holds all the necessary permissions.
     *
     * @hide
     */
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    public static final long REDACT_NONE = 0;

    /**
     * Redact any fields that need {@link android.Manifest.permission#ACCESS_FINE_LOCATION}
     * permission since the receiving app does not hold this permission or the location toggle
     * is off.
     *
     * @see android.Manifest.permission#ACCESS_FINE_LOCATION
     * @hide
     */
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    public static final long REDACT_FOR_ACCESS_FINE_LOCATION = 1 << 0;

    /**
     * Redact any fields that need {@link android.Manifest.permission#LOCAL_MAC_ADDRESS}
     * permission since the receiving app does not hold this permission.
     *
     * @see android.Manifest.permission#LOCAL_MAC_ADDRESS
     * @hide
     */
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    public static final long REDACT_FOR_LOCAL_MAC_ADDRESS = 1 << 1;

    /**
     *
     * Redact any fields that need {@link android.Manifest.permission#NETWORK_SETTINGS}
     * permission since the receiving app does not hold this permission.
     *
     * @see android.Manifest.permission#NETWORK_SETTINGS
     * @hide
     */
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    public static final long REDACT_FOR_NETWORK_SETTINGS = 1 << 2;

    /**
     * Redact all fields in this object that require any relevant permission.
     * @hide
     */
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    public static final long REDACT_ALL = -1L;

    /** @hide */
    @LongDef(flag = true, prefix = { "REDACT_" }, value = {
            REDACT_NONE,
            REDACT_FOR_ACCESS_FINE_LOCATION,
            REDACT_FOR_LOCAL_MAC_ADDRESS,
            REDACT_FOR_NETWORK_SETTINGS,
            REDACT_ALL
    })
    @Retention(RetentionPolicy.SOURCE)
    public @interface RedactionType {}

    // Set to true when private DNS is broken.
    private boolean mPrivateDnsBroken;

@@ -77,32 +142,31 @@ public final class NetworkCapabilities implements Parcelable {
    private String mRequestorPackageName;

    /**
     * Indicates whether parceling should preserve fields that are set based on permissions of
     * the process receiving the {@link NetworkCapabilities}.
     * Indicates what fields should be redacted from this instance.
     */
    private final boolean mParcelLocationSensitiveFields;
    private final @RedactionType long mRedactions;

    public NetworkCapabilities() {
        mParcelLocationSensitiveFields = false;
        mRedactions = REDACT_ALL;
        clearAll();
        mNetworkCapabilities = DEFAULT_CAPABILITIES;
    }

    public NetworkCapabilities(NetworkCapabilities nc) {
        this(nc, false /* parcelLocationSensitiveFields */);
        this(nc, REDACT_ALL);
    }

    /**
     * Make a copy of NetworkCapabilities.
     *
     * @param nc Original NetworkCapabilities
     * @param parcelLocationSensitiveFields Whether to parcel location sensitive data or not.
     * @param redactions bitmask of redactions that needs to be performed on this new instance of
     *                   {@link NetworkCapabilities}.
     * @hide
     */
    @SystemApi
    public NetworkCapabilities(
            @Nullable NetworkCapabilities nc, boolean parcelLocationSensitiveFields) {
        mParcelLocationSensitiveFields = parcelLocationSensitiveFields;
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    public NetworkCapabilities(@Nullable NetworkCapabilities nc, @RedactionType long redactions) {
        mRedactions = redactions;
        if (nc != null) {
            set(nc);
        }
@@ -114,11 +178,13 @@ public final class NetworkCapabilities implements Parcelable {
     * @hide
     */
    public void clearAll() {
        // Ensures that the internal copies maintained by the connectivity stack does not set
        // this bit.
        if (mParcelLocationSensitiveFields) {
        // Ensures that the internal copies maintained by the connectivity stack does not set it to
        // anything other than |REDACT_ALL|.
        if (mRedactions != REDACT_ALL) {
            // This is needed because the current redaction mechanism relies on redaction while
            // parceling.
            throw new UnsupportedOperationException(
                    "Cannot clear NetworkCapabilities when parcelLocationSensitiveFields is set");
                    "Cannot clear NetworkCapabilities when mRedactions is set");
        }
        mNetworkCapabilities = mTransportTypes = mUnwantedNetworkCapabilities = 0;
        mLinkUpBandwidthKbps = mLinkDownBandwidthKbps = LINK_BANDWIDTH_UNSPECIFIED;
@@ -148,12 +214,12 @@ public final class NetworkCapabilities implements Parcelable {
        mLinkDownBandwidthKbps = nc.mLinkDownBandwidthKbps;
        mNetworkSpecifier = nc.mNetworkSpecifier;
        if (nc.getTransportInfo() != null) {
            setTransportInfo(nc.getTransportInfo().makeCopy(mParcelLocationSensitiveFields));
            setTransportInfo(nc.getTransportInfo().makeCopy(mRedactions));
        } else {
            setTransportInfo(null);
        }
        mSignalStrength = nc.mSignalStrength;
        setUids(nc.mUids); // Will make the defensive copy
        mUids = (nc.mUids == null) ? null : new ArraySet<>(nc.mUids);
        setAdministratorUids(nc.getAdministratorUids());
        mOwnerUid = nc.mOwnerUid;
        mUnwantedNetworkCapabilities = nc.mUnwantedNetworkCapabilities;
@@ -1456,9 +1522,8 @@ public final class NetworkCapabilities implements Parcelable {
     * @hide
     */
    public @NonNull NetworkCapabilities setSingleUid(int uid) {
        final ArraySet<UidRange> identity = new ArraySet<>(1);
        identity.add(new UidRange(uid, uid));
        setUids(identity);
        mUids = new ArraySet<>(1);
        mUids.add(new UidRange(uid, uid));
        return this;
    }

@@ -1467,22 +1532,34 @@ public final class NetworkCapabilities implements Parcelable {
     * This makes a copy of the set so that callers can't modify it after the call.
     * @hide
     */
    public @NonNull NetworkCapabilities setUids(Set<UidRange> uids) {
        if (null == uids) {
            mUids = null;
        } else {
            mUids = new ArraySet<>(uids);
        }
    public @NonNull NetworkCapabilities setUids(@Nullable Set<Range<Integer>> uids) {
        mUids = UidRange.fromIntRanges(uids);
        return this;
    }

    /**
     * Get the list of UIDs this network applies to.
     * This returns a copy of the set so that callers can't modify the original object.
     *
     * @return the list of UIDs this network applies to. If {@code null}, then the network applies
     *         to all UIDs.
     * @hide
     */
    public @Nullable Set<UidRange> getUids() {
        return null == mUids ? null : new ArraySet<>(mUids);
    @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
    @SuppressLint("NullableCollection")
    public @Nullable Set<Range<Integer>> getUids() {
        return UidRange.toIntRanges(mUids);
    }

    /**
     * Get the list of UIDs this network applies to.
     * This returns a copy of the set so that callers can't modify the original object.
     * @hide
     */
    public @Nullable Set<UidRange> getUidRanges() {
        if (mUids == null) return null;

        return new ArraySet<>(mUids);
    }

    /**
@@ -2335,6 +2412,23 @@ public final class NetworkCapabilities implements Parcelable {
        }
    }

    /**
     * Returns a bitmask of all the applicable redactions (based on the permissions held by the
     * receiving app) to be performed on this object.
     *
     * @return bitmask of redactions applicable on this instance.
     * @hide
     */
    public @RedactionType long getApplicableRedactions() {
        // Currently, there are no fields redacted in NetworkCapabilities itself, so we just
        // passthrough the redactions required by the embedded TransportInfo. If this changes
        // in the future, modify this method.
        if (mTransportInfo == null) {
            return NetworkCapabilities.REDACT_NONE;
        }
        return mTransportInfo.getApplicableRedactions();
    }

    /**
     * Builder class for NetworkCapabilities.
     *
@@ -2652,6 +2746,21 @@ public final class NetworkCapabilities implements Parcelable {
            return this;
        }

        /**
         * Set the list of UIDs this network applies to.
         *
         * @param uids the list of UIDs this network applies to, or {@code null} if this network
         *             applies to all UIDs.
         * @return this builder
         * @hide
         */
        @NonNull
        @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
        public Builder setUids(@Nullable Set<Range<Integer>> uids) {
            mCaps.setUids(uids);
            return this;
        }

        /**
         * Builds the instance of the capabilities.
         *
+7 −2
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import static android.net.NetworkCapabilities.TRANSPORT_TEST;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.compat.annotation.UnsupportedAppUsage;
import android.net.NetworkCapabilities.NetCapability;
@@ -45,6 +46,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
import android.text.TextUtils;
import android.util.Range;
import android.util.proto.ProtoOutputStream;

import java.util.Arrays;
@@ -277,11 +279,14 @@ public class NetworkRequest implements Parcelable {
         * Set the watched UIDs for this request. This will be reset and wiped out unless
         * the calling app holds the CHANGE_NETWORK_STATE permission.
         *
         * @param uids The watched UIDs as a set of UidRanges, or null for everything.
         * @param uids The watched UIDs as a set of {@code Range<Integer>}, or null for everything.
         * @return The builder to facilitate chaining.
         * @hide
         */
        public Builder setUids(Set<UidRange> uids) {
        @NonNull
        @SystemApi(client = SystemApi.Client.MODULE_LIBRARIES)
        @SuppressLint("MissingGetterMatchingBuilder")
        public Builder setUids(@Nullable Set<Range<Integer>> uids) {
            mNetworkCapabilities.setUids(uids);
            return this;
        }
Loading