Add a new API startProvisionedVpnProfileSession()

Add a new API to return a unique key corresponding to a specific
VPN session, so that when VPN sends ACTION_VPN_MANAGER_ERROR
intent, the app can know if this intent is sent for the session
that the app is using.

Bug: 191413541
Test: atest CtsNetTestCases
Change-Id: I372308f7f4d20acf3ea17a322bc5f39e0bac460f
This commit is contained in:
lucaslin
2022-01-18 15:00:07 +08:00
parent 35ac7e34ce
commit 110b5a96d5
5 changed files with 30 additions and 8 deletions

View File

@@ -26953,7 +26953,8 @@ package android.net {
public class VpnManager {
method public void deleteProvisionedVpnProfile();
method @Nullable public android.content.Intent provisionVpnProfile(@NonNull android.net.PlatformVpnProfile);
method public void startProvisionedVpnProfile();
method @Deprecated public void startProvisionedVpnProfile();
method @NonNull public String startProvisionedVpnProfileSession();
method public void stopProvisionedVpnProfile();
}

View File

@@ -38,7 +38,7 @@ interface IVpnManager {
/** VpnManager APIs */
boolean provisionVpnProfile(in VpnProfile profile, String packageName);
void deleteVpnProfile(String packageName);
void startVpnProfile(String packageName);
String startVpnProfile(String packageName);
void stopVpnProfile(String packageName);
/** Always-on VPN APIs */

View File

@@ -317,17 +317,32 @@ public class VpnManager {
/**
* Request the startup of a previously provisioned VPN.
*
* @return A unique key corresponding to this session.
* @throws SecurityException exception if user or device settings prevent this VPN from being
* setup, or if user consent has not been granted
* setup, or if user consent has not been granted
*/
public void startProvisionedVpnProfile() {
@NonNull
public String startProvisionedVpnProfileSession() {
try {
mService.startVpnProfile(mContext.getOpPackageName());
return mService.startVpnProfile(mContext.getOpPackageName());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
}
/**
* Request the startup of a previously provisioned VPN.
*
* @throws SecurityException exception if user or device settings prevent this VPN from being
* setup, or if user consent has not been granted
* @deprecated This method is replaced by startProvisionedVpnProfileSession which returns a
* session key for the caller to diagnose the errors.
*/
@Deprecated
public void startProvisionedVpnProfile() {
startProvisionedVpnProfileSession();
}
/** Tear down the VPN provided by the calling app (if any) */
public void stopProvisionedVpnProfile() {
try {

View File

@@ -340,17 +340,18 @@ public class VpnManagerService extends IVpnManager.Stub {
* <p>This is designed to serve the VpnManager only; settings-based VPN profiles are managed
* exclusively by the Settings app, and passed into the platform at startup time.
*
* @return A unique key corresponding to this session.
* @throws IllegalArgumentException if no profile was found for the given package name.
* @hide
*/
@Override
public void startVpnProfile(@NonNull String packageName) {
public String startVpnProfile(@NonNull String packageName) {
final int callingUid = Binder.getCallingUid();
verifyCallingUidAndPackage(packageName, callingUid);
final int user = UserHandle.getUserId(callingUid);
synchronized (mVpns) {
throwIfLockdownEnabled();
mVpns.get(user).startVpnProfile(packageName);
return mVpns.get(user).startVpnProfile(packageName);
}
}

View File

@@ -151,6 +151,7 @@ import java.util.Objects;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
@@ -203,6 +204,7 @@ public class Vpn {
private final NetworkInfo mNetworkInfo;
private int mLegacyState;
@VisibleForTesting protected String mPackage;
private String mSessionKey;
private int mOwnerUID;
private boolean mIsPackageTargetingAtLeastQ;
@VisibleForTesting
@@ -2503,6 +2505,7 @@ public class Vpn {
mProfile = profile;
mIpSecManager = (IpSecManager) mContext.getSystemService(Context.IPSEC_SERVICE);
mNetworkCallback = new VpnIkev2Utils.Ikev2VpnNetworkCallback(TAG, this);
mSessionKey = UUID.randomUUID().toString();
}
@Override
@@ -2824,6 +2827,7 @@ public class Vpn {
*/
private void disconnectVpnRunner() {
mActiveNetwork = null;
mSessionKey = null;
mIsRunning = false;
resetIkeState();
@@ -3314,7 +3318,7 @@ public class Vpn {
*
* @param packageName the package name of the app provisioning this profile
*/
public synchronized void startVpnProfile(@NonNull String packageName) {
public synchronized String startVpnProfile(@NonNull String packageName) {
requireNonNull(packageName, "No package name provided");
enforceNotRestrictedUser();
@@ -3332,6 +3336,7 @@ public class Vpn {
}
startVpnProfilePrivileged(profile, packageName);
return mSessionKey;
} finally {
Binder.restoreCallingIdentity(token);
}