Add per user VPN support
VPNs are now per user instead of global. A VPN set by user A routes only
user A's traffic and no other user can access it.
Change-Id: Ia66463637b6bd088b05768076a1db897fe95c46c
diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java
index 733de94..d7dc7f5 100644
--- a/core/java/android/net/VpnService.java
+++ b/core/java/android/net/VpnService.java
@@ -36,6 +36,7 @@
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
+import java.util.List;
/**
* VpnService is a base class for applications to extend and build their
@@ -253,8 +254,8 @@
public class Builder {
private final VpnConfig mConfig = new VpnConfig();
- private final StringBuilder mAddresses = new StringBuilder();
- private final StringBuilder mRoutes = new StringBuilder();
+ private final List<LinkAddress> mAddresses = new ArrayList<LinkAddress>();
+ private final List<RouteInfo> mRoutes = new ArrayList<RouteInfo>();
public Builder() {
mConfig.user = VpnService.this.getClass().getName();
@@ -328,9 +329,7 @@
if (address.isAnyLocalAddress()) {
throw new IllegalArgumentException("Bad address");
}
-
- mAddresses.append(' ')
- .append(address.getHostAddress()).append('/').append(prefixLength);
+ mAddresses.add(new LinkAddress(address, prefixLength));
return this;
}
@@ -364,8 +363,7 @@
}
}
}
-
- mRoutes.append(' ').append(address.getHostAddress()).append('/').append(prefixLength);
+ mRoutes.add(new RouteInfo(new LinkAddress(address, prefixLength), null));
return this;
}
@@ -466,8 +464,8 @@
* @see VpnService
*/
public ParcelFileDescriptor establish() {
- mConfig.addresses = mAddresses.toString();
- mConfig.routes = mRoutes.toString();
+ mConfig.addresses = mAddresses;
+ mConfig.routes = mRoutes;
try {
return getService().establishVpn(mConfig);
diff --git a/core/java/com/android/internal/net/VpnConfig.java b/core/java/com/android/internal/net/VpnConfig.java
index 956653b..abf99a3 100644
--- a/core/java/com/android/internal/net/VpnConfig.java
+++ b/core/java/com/android/internal/net/VpnConfig.java
@@ -21,10 +21,14 @@
import android.content.Intent;
import android.os.Parcel;
import android.os.Parcelable;
+import android.net.RouteInfo;
+import android.net.LinkAddress;
import com.android.internal.util.Preconditions;
+import java.net.InetAddress;
import java.util.List;
+import java.util.ArrayList;
/**
* A simple container used to carry information in VpnBuilder, VpnDialogs,
@@ -61,14 +65,42 @@
public String interfaze;
public String session;
public int mtu = -1;
- public String addresses;
- public String routes;
+ public List<LinkAddress> addresses = new ArrayList<LinkAddress>();
+ public List<RouteInfo> routes = new ArrayList<RouteInfo>();
public List<String> dnsServers;
public List<String> searchDomains;
public PendingIntent configureIntent;
public long startTime = -1;
public boolean legacy;
+ public void addLegacyRoutes(String routesStr) {
+ if (routesStr.trim().equals("")) {
+ return;
+ }
+ String[] routes = routesStr.trim().split(" ");
+ for (String route : routes) {
+ //each route is ip/prefix
+ String[] split = route.split("/");
+ RouteInfo info = new RouteInfo(new LinkAddress
+ (InetAddress.parseNumericAddress(split[0]), Integer.parseInt(split[1])), null);
+ this.routes.add(info);
+ }
+ }
+
+ public void addLegacyAddresses(String addressesStr) {
+ if (addressesStr.trim().equals("")) {
+ return;
+ }
+ String[] addresses = addressesStr.trim().split(" ");
+ for (String address : addresses) {
+ //each address is ip/prefix
+ String[] split = address.split("/");
+ LinkAddress addr = new LinkAddress(InetAddress.parseNumericAddress(split[0]),
+ Integer.parseInt(split[1]));
+ this.addresses.add(addr);
+ }
+ }
+
@Override
public int describeContents() {
return 0;
@@ -80,8 +112,8 @@
out.writeString(interfaze);
out.writeString(session);
out.writeInt(mtu);
- out.writeString(addresses);
- out.writeString(routes);
+ out.writeTypedList(addresses);
+ out.writeTypedList(routes);
out.writeStringList(dnsServers);
out.writeStringList(searchDomains);
out.writeParcelable(configureIntent, flags);
@@ -98,8 +130,8 @@
config.interfaze = in.readString();
config.session = in.readString();
config.mtu = in.readInt();
- config.addresses = in.readString();
- config.routes = in.readString();
+ in.readTypedList(config.addresses, LinkAddress.CREATOR);
+ in.readTypedList(config.routes, RouteInfo.CREATOR);
config.dnsServers = in.createStringArrayList();
config.searchDomains = in.createStringArrayList();
config.configureIntent = in.readParcelable(null);