summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2014-02-04 10:03:13 +0100
committerArne Schwabe <arne@rfc2549.org>2014-02-04 10:03:13 +0100
commit1705a3d66d5c2bc8b0c59b2e53c56ed7f6003f56 (patch)
tree2af9a91382e16ee10f021646272fd07af5f9e9de
parentde196596a6f93c797e4332c8dc463ccb90ece3f5 (diff)
Add UI/config parsing for excluded routes
-rwxr-xr-xres/values/strings.xml2
-rw-r--r--res/xml/vpn_routing.xml12
-rw-r--r--src/de/blinkt/openvpn/VpnProfile.java29
-rw-r--r--src/de/blinkt/openvpn/core/ConfigParser.java28
-rw-r--r--src/de/blinkt/openvpn/fragments/Settings_Routing.java17
5 files changed, 70 insertions, 18 deletions
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 2998a9a4..faa41385 100755
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -83,7 +83,9 @@
<string name="default_route_summary">Redirects all Traffic over the VPN</string>
<string name="use_default_title">Use default Route</string>
<string name="custom_route_message">Enter custom routes. Only enter destination in CIDR format. \"10.0.0.0/8 2002::/16\" would direct the networks 10.0.0.0/8 and 2002::/16 over the VPN.</string>
+ <string name="custom_route_message_excluded">Routes that should NOT be routed over the VPN. Use the same syntax as for included routes.</string>
<string name="custom_routes_title">Custom Routes</string>
+ <string name="custom_routes_title_excluded">Excluded Networks</string>
<string name="log_verbosity_level">Log verbosity level</string>
<string name="float_summary">Allows authenticated packets from any IP</string>
<string name="float_title">Allow floating server</string>
diff --git a/res/xml/vpn_routing.xml b/res/xml/vpn_routing.xml
index 298f488f..c547518b 100644
--- a/res/xml/vpn_routing.xml
+++ b/res/xml/vpn_routing.xml
@@ -24,6 +24,12 @@
android:dialogMessage="@string/custom_route_message"
android:key="customRoutes"
android:title="@string/custom_routes_title" />
+
+ <EditTextPreference
+ android:dependency="useDefaultRoute"
+ android:dialogMessage="@string/custom_route_message_excluded"
+ android:key="excludedRoutes"
+ android:title="@string/custom_routes_title_excluded" />
</PreferenceCategory>
<PreferenceCategory android:title="@string/ipv6" >
<CheckBoxPreference
@@ -37,6 +43,12 @@
android:dialogMessage="@string/custom_route_message"
android:key="customRoutesv6"
android:title="@string/custom_routes_title" />
+
+ <EditTextPreference
+ android:dependency="useDefaultRoute"
+ android:dialogMessage="@string/custom_route_message_excluded"
+ android:key="excludedRoutesv6"
+ android:title="@string/custom_routes_title_excluded" />
</PreferenceCategory>
</PreferenceScreen> \ No newline at end of file
diff --git a/src/de/blinkt/openvpn/VpnProfile.java b/src/de/blinkt/openvpn/VpnProfile.java
index 215efe78..d18fc72a 100644
--- a/src/de/blinkt/openvpn/VpnProfile.java
+++ b/src/de/blinkt/openvpn/VpnProfile.java
@@ -11,7 +11,6 @@ import android.preference.PreferenceManager;
import android.security.KeyChain;
import android.security.KeyChainException;
import android.util.Base64;
-import android.widget.Toast;
import de.blinkt.openvpn.core.NativeUtils;
import de.blinkt.openvpn.core.VpnStatus;
@@ -129,6 +128,8 @@ public class VpnProfile implements Serializable {
private UUID mUuid;
public boolean mAllowLocalLAN;
private int mProfileVersion;
+ public String mExcludedRoutes;
+ public String mExcludedRoutesv6;
public VpnProfile(String name) {
mUuid = UUID.randomUUID();
@@ -324,11 +325,17 @@ public class VpnProfile implements Serializable {
if (mUseDefaultRoute)
routes += "route 0.0.0.0 0.0.0.0 vpn_gateway\n";
else
- for (String route : getCustomRoutes()) {
+ {
+ for (String route : getCustomRoutes(mCustomRoutes)) {
routes += "route " + route + " vpn_gateway\n";
numroutes++;
}
+ for (String route: getCustomRoutes(mExcludedRoutes)) {
+ routes += "route " + route + " net_gateway";
+ }
+ }
+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT && !mAllowLocalLAN)
cfg+="redirect-private block-local\n";
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && mAllowLocalLAN)
@@ -338,7 +345,7 @@ public class VpnProfile implements Serializable {
if (mUseDefaultRoutev6)
cfg += "route-ipv6 ::/0\n";
else
- for (String route : getCustomRoutesv6()) {
+ for (String route : getCustomRoutesv6(mCustomRoutesv6)) {
routes += "route-ipv6 " + route + "\n";
numroutes++;
}
@@ -346,7 +353,7 @@ public class VpnProfile implements Serializable {
// Round number to next 100
if (numroutes > 90) {
numroutes = ((numroutes / 100) + 1) * 100;
- cfg += "# Alot of routes are set, increase max-routes\n";
+ cfg += "# A lot of routes are set, increase max-routes\n";
cfg += "max-routes " + numroutes + "\n";
}
cfg += routes;
@@ -470,13 +477,13 @@ public class VpnProfile implements Serializable {
return true;
}
- private Collection<String> getCustomRoutes() {
+ private Collection<String> getCustomRoutes(String routes) {
Vector<String> cidrRoutes = new Vector<String>();
- if (mCustomRoutes == null) {
+ if (routes == null) {
// No routes set, return empty vector
return cidrRoutes;
}
- for (String route : mCustomRoutes.split("[\n \t]")) {
+ for (String route : routes.split("[\n \t]")) {
if (!route.equals("")) {
String cidrroute = cidrToIPAndNetmask(route);
if (cidrroute == null)
@@ -489,13 +496,13 @@ public class VpnProfile implements Serializable {
return cidrRoutes;
}
- private Collection<String> getCustomRoutesv6() {
+ private Collection<String> getCustomRoutesv6(String routes) {
Vector<String> cidrRoutes = new Vector<String>();
- if (mCustomRoutesv6 == null) {
+ if (routes == null) {
// No routes set, return empty vector
return cidrRoutes;
}
- for (String route : mCustomRoutesv6.split("[\n \t]")) {
+ for (String route : routes.split("[\n \t]")) {
if (!route.equals("")) {
cidrRoutes.add(route);
}
@@ -703,7 +710,7 @@ public class VpnProfile implements Serializable {
if (mIPv4Address == null || cidrToIPAndNetmask(mIPv4Address) == null)
return R.string.ipv4_format_error;
}
- if (!mUseDefaultRoute && getCustomRoutes() == null)
+ if (!mUseDefaultRoute && (getCustomRoutes(mCustomRoutes) == null || getCustomRoutes(mExcludedRoutes) ==null))
return R.string.custom_route_format_error;
// Everything okay
diff --git a/src/de/blinkt/openvpn/core/ConfigParser.java b/src/de/blinkt/openvpn/core/ConfigParser.java
index 895f048e..6ce7467f 100644
--- a/src/de/blinkt/openvpn/core/ConfigParser.java
+++ b/src/de/blinkt/openvpn/core/ConfigParser.java
@@ -322,14 +322,23 @@ public class ConfigParser {
Vector<Vector<String>> routes = getAllOption("route", 1, 4);
if(routes!=null) {
String routeopt = "";
- for(Vector<String> route:routes){
+ String routeExcluded = "";
+ for(Vector<String> route:routes){
String netmask = "255.255.255.255";
- if(route.size() >= 3)
+ String gateway = "vpn_gateway";
+
+ if(route.size() >= 3)
netmask = route.get(2);
+ if (route.size() >= 4)
+ gateway = route.get(3);
+
String net = route.get(1);
try {
CIDRIP cidr = new CIDRIP(net, netmask);
- routeopt+=cidr.toString() + " ";
+ if (gateway.equals("net_gateway"))
+ routeExcluded += cidr.toString() + " ";
+ else
+ routeopt+=cidr.toString() + " ";
} catch (ArrayIndexOutOfBoundsException aioob) {
throw new ConfigParseError("Could not parse netmask of route " + netmask);
} catch (NumberFormatException ne) {
@@ -338,9 +347,20 @@ public class ConfigParser {
}
np.mCustomRoutes=routeopt;
+ np.mExcludedRoutes=routeExcluded;
}
- // Also recognize tls-auth [inline] direction ...
+ Vector<Vector<String>> routesV6 = getAllOption("route-ipv6", 1, 4);
+ if (routesV6!=null) {
+ String customIPv6Routes = "";
+ for (Vector<String> route:routesV6){
+ customIPv6Routes += route.get(1) + " ";
+ }
+
+ np.mCustomRoutesv6 = customIPv6Routes;
+ }
+
+ // Also recognize tls-auth [inline] direction ...
Vector<Vector<String>> tlsauthoptions = getAllOption("tls-auth", 1, 2);
if(tlsauthoptions!=null) {
for(Vector<String> tlsauth:tlsauthoptions) {
diff --git a/src/de/blinkt/openvpn/fragments/Settings_Routing.java b/src/de/blinkt/openvpn/fragments/Settings_Routing.java
index 7216e0ff..c6f0dcf8 100644
--- a/src/de/blinkt/openvpn/fragments/Settings_Routing.java
+++ b/src/de/blinkt/openvpn/fragments/Settings_Routing.java
@@ -14,17 +14,22 @@ public class Settings_Routing extends OpenVpnPreferencesFragment implements OnPr
private CheckBoxPreference mUseDefaultRoutev6;
private CheckBoxPreference mRouteNoPull;
private CheckBoxPreference mLocalVPNAccess;
+ private EditTextPreference mExcludedRoutes;
+ private EditTextPreference mExcludedRoutesv6;
- @Override
+ @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.vpn_routing);
- mCustomRoutes = (EditTextPreference) findPreference("customRoutes");
+ mCustomRoutes = (EditTextPreference) findPreference("customRoutes");
mUseDefaultRoute = (CheckBoxPreference) findPreference("useDefaultRoute");
mCustomRoutesv6 = (EditTextPreference) findPreference("customRoutesv6");
mUseDefaultRoutev6 = (CheckBoxPreference) findPreference("useDefaultRoutev6");
+ mExcludedRoutes = (EditTextPreference) findPreference("excludedRoutes");
+ mExcludedRoutesv6 = (EditTextPreference) findPreference("excludedRoutesv6");
+
mRouteNoPull = (CheckBoxPreference) findPreference("routenopull");
mLocalVPNAccess = (CheckBoxPreference) findPreference("unblockLocal");
@@ -43,6 +48,9 @@ public class Settings_Routing extends OpenVpnPreferencesFragment implements OnPr
mCustomRoutes.setText(mProfile.mCustomRoutes);
mCustomRoutesv6.setText(mProfile.mCustomRoutesv6);
+ mExcludedRoutes.setText(mProfile.mExcludedRoutes);
+ mExcludedRoutes.setText(mProfile.mExcludedRoutesv6);
+
mRouteNoPull.setChecked(mProfile.mRoutenopull);
mLocalVPNAccess.setChecked(mProfile.mAllowLocalLAN);
@@ -61,12 +69,15 @@ public class Settings_Routing extends OpenVpnPreferencesFragment implements OnPr
mProfile.mCustomRoutesv6 = mCustomRoutesv6.getText();
mProfile.mRoutenopull = mRouteNoPull.isChecked();
mProfile.mAllowLocalLAN =mLocalVPNAccess.isChecked();
+ mProfile.mExcludedRoutes = mExcludedRoutes.getText();
+ mProfile.mExcludedRoutesv6 = mExcludedRoutesv6.getText();
}
@Override
public boolean onPreferenceChange(Preference preference,
Object newValue) {
- if( preference == mCustomRoutes || preference == mCustomRoutesv6 )
+ if( preference == mCustomRoutes || preference == mCustomRoutesv6
+ || preference == mExcludedRoutes || preference == mExcludedRoutesv6)
preference.setSummary((String)newValue);
saveSettings();