From 395c0909ddff57cb90274ab3eb45e9980ea4a6dc Mon Sep 17 00:00:00 2001 From: lucaslin Date: Wed, 24 Aug 2022 14:55:53 +0800 Subject: [PATCH] Have a method to stop VPN and send event to VPN app Have a method to stop VPN and send CATEGORY_EVENT_DEACTIVATED_BY_USER event to VPN app. Both of prepareInternal() and stopVpnProfile() have the same behavior, so have a method for them to reduce the duplicate. Bug: 236409954 Test: atest FrameworksNetTests:VpnTest Change-Id: I54b550e6f972a13f61cbcf15ee1fb9fe3c313d7b --- .../com/android/server/connectivity/Vpn.java | 56 +++++++++---------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 931c692b5f01..e4934c630f89 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1196,25 +1196,7 @@ public class Vpn { mContext.unbindService(mConnection); cleanupVpnStateLocked(); } else if (mVpnRunner != null) { - // Build intent first because the sessionKey will be reset after performing - // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in - // VpnRunner.exit() to prevent design being changed in the future. - // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from - // ConnectivityServiceTest. - final int ownerUid = mOwnerUID; - Intent intent = null; - if (SdkLevel.isAtLeastT() && isVpnApp(mPackage)) { - intent = buildVpnManagerEventIntent( - VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER, - -1 /* errorClass */, -1 /* errorCode*/, mPackage, - getSessionKeyLocked(), makeVpnProfileStateLocked(), - null /* underlyingNetwork */, null /* nc */, null /* lp */); - } - // cleanupVpnStateLocked() is called from mVpnRunner.exit() - mVpnRunner.exit(); - if (intent != null && isVpnApp(mPackage)) { - notifyVpnManagerVpnStopped(mPackage, ownerUid, intent); - } + stopVpnRunnerAndNotifyAppLocked(mPackage); } try { @@ -4074,6 +4056,29 @@ public class Vpn { } } + @GuardedBy("this") + private void stopVpnRunnerAndNotifyAppLocked(@NonNull String packageName) { + // Build intent first because the sessionKey will be reset after performing + // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in + // VpnRunner.exit() to prevent design being changed in the future. + // TODO(b/230548427): Remove SDK check once VPN related stuff are decoupled from + // ConnectivityServiceTest. + final int ownerUid = mOwnerUID; + Intent intent = null; + if (SdkLevel.isAtLeastT() && isVpnApp(packageName)) { + intent = buildVpnManagerEventIntent( + VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER, + -1 /* errorClass */, -1 /* errorCode*/, packageName, + getSessionKeyLocked(), makeVpnProfileStateLocked(), + null /* underlyingNetwork */, null /* nc */, null /* lp */); + } + // cleanupVpnStateLocked() is called from mVpnRunner.exit() + mVpnRunner.exit(); + if (intent != null && isVpnApp(packageName)) { + notifyVpnManagerVpnStopped(packageName, ownerUid, intent); + } + } + /** * Stops an already running VPN Profile for the given package. * @@ -4090,18 +4095,7 @@ public class Vpn { // To stop the VPN profile, the caller must be the current prepared package and must be // running an Ikev2VpnProfile. if (isCurrentIkev2VpnLocked(packageName)) { - // Build intent first because the sessionKey will be reset after performing - // VpnRunner.exit(). Also, cache mOwnerUID even if ownerUID will not be changed in - // VpnRunner.exit() to prevent design being changed in the future. - final int ownerUid = mOwnerUID; - final Intent intent = buildVpnManagerEventIntent( - VpnManager.CATEGORY_EVENT_DEACTIVATED_BY_USER, - -1 /* errorClass */, -1 /* errorCode*/, packageName, - getSessionKeyLocked(), makeVpnProfileStateLocked(), - null /* underlyingNetwork */, null /* nc */, null /* lp */); - - mVpnRunner.exit(); - notifyVpnManagerVpnStopped(packageName, ownerUid, intent); + stopVpnRunnerAndNotifyAppLocked(packageName); } }