From 418017e5f9a320b845cf9722fb4aa03d9710b091 Mon Sep 17 00:00:00 2001 From: Benedict Wong Date: Wed, 6 Nov 2019 00:20:15 -0800 Subject: [PATCH] Add separate user consent for Platform VPNs This change adds a new VPN user consent flow (using the same text) for granting the lesser OP_ACTIVATE_PLATFORM_VPN. A new PlatformVpnConfirmDialog is created as a subclass to preserve all logic, but ensure the right appop is granted for the relevant dialog. Intent extras were considered, but are inherently unsafe, since the caller may add any extras that they would want. Bug: 144246835 Test: FrameworksNetTests passing Change-Id: Ia6f36207d43c3748f938430c2780dcf29e5623f3 --- .../android/net/IConnectivityManager.aidl | 2 +- core/java/android/net/VpnManager.java | 17 +++- core/java/android/net/VpnService.java | 2 +- core/res/res/values/config.xml | 6 +- core/res/res/values/symbols.xml | 1 + packages/VpnDialogs/AndroidManifest.xml | 7 ++ .../com/android/vpndialogs/ConfirmDialog.java | 13 +++- .../vpndialogs/PlatformVpnConfirmDialog.java | 29 +++++++ .../android/server/ConnectivityService.java | 27 ++++--- .../com/android/server/connectivity/Vpn.java | 77 +++++++++++++------ .../net/java/android/net/VpnManagerTest.java | 11 ++- .../android/server/connectivity/VpnTest.java | 50 +++++++++++- 12 files changed, 200 insertions(+), 42 deletions(-) create mode 100644 packages/VpnDialogs/src/com/android/vpndialogs/PlatformVpnConfirmDialog.java diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl index 6baa3832403fa..1089a197ff59c 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -117,7 +117,7 @@ interface IConnectivityManager boolean prepareVpn(String oldPackage, String newPackage, int userId); - void setVpnPackageAuthorization(String packageName, int userId, boolean authorized); + void setVpnPackageAuthorization(String packageName, int userId, int vpnType); ParcelFileDescriptor establishVpn(in VpnConfig config); diff --git a/core/java/android/net/VpnManager.java b/core/java/android/net/VpnManager.java index e60cc81bf9d20..f19ba0f5ef51a 100644 --- a/core/java/android/net/VpnManager.java +++ b/core/java/android/net/VpnManager.java @@ -18,6 +18,7 @@ package android.net; import static com.android.internal.util.Preconditions.checkNotNull; +import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.Activity; @@ -30,6 +31,8 @@ import android.os.RemoteException; import com.android.internal.net.VpnProfile; import java.io.IOException; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.security.GeneralSecurityException; /** @@ -47,6 +50,18 @@ import java.security.GeneralSecurityException; * @see Ikev2VpnProfile */ public class VpnManager { + /** Type representing a lack of VPN @hide */ + public static final int TYPE_VPN_NONE = -1; + /** VPN service type code @hide */ + public static final int TYPE_VPN_SERVICE = 1; + /** Platform VPN type code @hide */ + public static final int TYPE_VPN_PLATFORM = 2; + + /** @hide */ + @IntDef(value = {TYPE_VPN_NONE, TYPE_VPN_SERVICE, TYPE_VPN_PLATFORM}) + @Retention(RetentionPolicy.SOURCE) + public @interface VpnType {} + @NonNull private final Context mContext; @NonNull private final IConnectivityManager mService; @@ -54,7 +69,7 @@ public class VpnManager { final Intent intent = new Intent(); final ComponentName componentName = ComponentName.unflattenFromString( Resources.getSystem().getString( - com.android.internal.R.string.config_customVpnConfirmDialogComponent)); + com.android.internal.R.string.config_platformVpnConfirmDialogComponent)); intent.setComponent(componentName); return intent; } diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 4b804b097d596..63e510733907a 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -234,7 +234,7 @@ public class VpnService extends Service { if (!cm.prepareVpn(packageName, null, userId)) { cm.prepareVpn(null, packageName, userId); } - cm.setVpnPackageAuthorization(packageName, userId, true); + cm.setVpnPackageAuthorization(packageName, userId, VpnManager.TYPE_VPN_SERVICE); } catch (RemoteException e) { // ignore } diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 52b92d2660daa..1c9cccb6a1dd4 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2565,7 +2565,11 @@ com.android.systemui/com.android.systemui.usb.UsbResolverActivity - + + com.android.vpndialogs/com.android.vpndialogs.PlatformVpnConfirmDialog + + com.android.vpndialogs/com.android.vpndialogs.ConfirmDialog diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 21d1d3cf9c899..8f56164de6884 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2143,6 +2143,7 @@ + diff --git a/packages/VpnDialogs/AndroidManifest.xml b/packages/VpnDialogs/AndroidManifest.xml index e4de6259e07d4..693ca52b4ed17 100644 --- a/packages/VpnDialogs/AndroidManifest.xml +++ b/packages/VpnDialogs/AndroidManifest.xml @@ -34,6 +34,13 @@ + + +