From 4d604c81db87b2d7d92064aec2a954dfe3b84326 Mon Sep 17 00:00:00 2001 From: lifr Date: Wed, 24 Mar 2021 18:38:37 +0800 Subject: [PATCH] Add session ID to VpnTransportInfo - This will be visible only to apps with the NETWORK_SETTINGS permissions (signature), and will be redacted for all other callers. - This string is expected to be the same as set by VpnService#setSession, and in general, VpnConfig.session. But it will be a general API that Vpn.java can call when setting the VpnTransportInfo. - This string cannot be updated once the VPN NetworkAgent is connected. Bug: 171872481 Test: atest ConnectivityServiceTest atest VpnTransportInfoTest atest android.net.cts.NetworkAgentTest Change-Id: I8d09e25b83f7ee8be21ec9c9bd3c72a251f1370d --- framework/api/module-lib-current.txt | 4 ++- .../src/android/net/VpnTransportInfo.java | 32 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/framework/api/module-lib-current.txt b/framework/api/module-lib-current.txt index 8b99d219cb..38d6438822 100644 --- a/framework/api/module-lib-current.txt +++ b/framework/api/module-lib-current.txt @@ -115,10 +115,12 @@ package android.net { } public final class VpnTransportInfo implements android.os.Parcelable android.net.TransportInfo { - ctor public VpnTransportInfo(int); + ctor public VpnTransportInfo(int, @Nullable String); method public int describeContents(); + method @NonNull public android.net.VpnTransportInfo makeCopy(long); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field @Nullable public final String sessionId; field public final int type; } diff --git a/framework/src/android/net/VpnTransportInfo.java b/framework/src/android/net/VpnTransportInfo.java index cd8f4c06de..ba83a44d0d 100644 --- a/framework/src/android/net/VpnTransportInfo.java +++ b/framework/src/android/net/VpnTransportInfo.java @@ -17,11 +17,14 @@ package android.net; import static android.annotation.SystemApi.Client.MODULE_LIBRARIES; +import static android.net.NetworkCapabilities.REDACT_FOR_NETWORK_SETTINGS; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; +import android.text.TextUtils; import java.util.Objects; @@ -38,8 +41,26 @@ public final class VpnTransportInfo implements TransportInfo, Parcelable { /** Type of this VPN. */ public final int type; - public VpnTransportInfo(int type) { + @Nullable + public final String sessionId; + + @Override + public long getApplicableRedactions() { + return REDACT_FOR_NETWORK_SETTINGS; + } + + /** + * Create a copy of a {@link VpnTransportInfo} with the sessionId redacted if necessary. + */ + @NonNull + public VpnTransportInfo makeCopy(long redactions) { + return new VpnTransportInfo(type, + ((redactions & REDACT_FOR_NETWORK_SETTINGS) != 0) ? null : sessionId); + } + + public VpnTransportInfo(int type, @Nullable String sessionId) { this.type = type; + this.sessionId = sessionId; } @Override @@ -47,17 +68,17 @@ public final class VpnTransportInfo implements TransportInfo, Parcelable { if (!(o instanceof VpnTransportInfo)) return false; VpnTransportInfo that = (VpnTransportInfo) o; - return this.type == that.type; + return (this.type == that.type) && TextUtils.equals(this.sessionId, that.sessionId); } @Override public int hashCode() { - return Objects.hash(type); + return Objects.hash(type, sessionId); } @Override public String toString() { - return String.format("VpnTransportInfo{type=%d}", type); + return String.format("VpnTransportInfo{type=%d, sessionId=%s}", type, sessionId); } @Override @@ -68,12 +89,13 @@ public final class VpnTransportInfo implements TransportInfo, Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(type); + dest.writeString(sessionId); } public static final @NonNull Creator CREATOR = new Creator() { public VpnTransportInfo createFromParcel(Parcel in) { - return new VpnTransportInfo(in.readInt()); + return new VpnTransportInfo(in.readInt(), in.readString()); } public VpnTransportInfo[] newArray(int size) { return new VpnTransportInfo[size];