From 526e7dd0b67a5e0ac22ec6966686a6116dcecb0a 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 Merged-In: 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 b050e479d2b65..06b18a6467365 100644 --- a/core/java/android/net/IConnectivityManager.aidl +++ b/core/java/android/net/IConnectivityManager.aidl @@ -116,7 +116,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 04d1eef9cba1e..268d6f1616023 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -2708,7 +2708,11 @@ com.android.systemui/com.android.systemui.usb.UsbDebuggingSecondaryUserActivity - + + 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 cd43e9fca5263..cb63b2300b708 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2233,6 +2233,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 @@ + + +