diff options
| -rw-r--r-- | AndroidManifest.xml | 11 | ||||
| -rw-r--r-- | res/menu/import_menu.xml | 14 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/ConfigConverter.java | 4 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/ConfigParser.java | 89 | 
4 files changed, 74 insertions, 44 deletions
| diff --git a/AndroidManifest.xml b/AndroidManifest.xml index f92ec38a..b7c382b9 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -18,8 +18,8 @@  <manifest xmlns:android="http://schemas.android.com/apk/res/android"      xmlns:tools="http://schemas.android.com/tools"      package="de.blinkt.openvpn" -    android:versionCode="61" -    android:versionName="0.5.34" > +    android:versionCode="62" +    android:versionName="0.5.34a" >      <uses-permission android:name="android.permission.INTERNET" />      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> @@ -30,7 +30,8 @@      <!-- <uses-permission android:name="com.android.vending.BILLING" /> -->      <uses-sdk -        android:minSdkVersion="15" +        android:minSdkVersion="16" +        android:maxSdkVersion="16"          android:targetSdkVersion="17" />      <permission @@ -100,6 +101,7 @@          <activity              android:name=".ConfigConverter"              android:label="Convert Config File" +            android:uiOptions="splitActionBarWhenNarrow"              tools:ignore="ExportedActivity" >              <intent-filter android:label="@string/import_config" >                  <action android:name="android.intent.action.VIEW" /> @@ -153,7 +155,6 @@              android:targetActivity=".LaunchVPN" >              <intent-filter>                  <action android:name="android.intent.action.CREATE_SHORTCUT" /> -                  <category android:name="android.intent.category.DEFAULT" />              </intent-filter>          </activity-alias> @@ -166,4 +167,4 @@              tools:ignore="ExportedContentProvider" />      </application> -</manifest>
\ No newline at end of file +</manifest> diff --git a/res/menu/import_menu.xml b/res/menu/import_menu.xml index c29db10e..1bed5a6b 100644 --- a/res/menu/import_menu.xml +++ b/res/menu/import_menu.xml @@ -1,12 +1,5 @@  <?xml version="1.0" encoding="utf-8"?>
  <menu xmlns:android="http://schemas.android.com/apk/res/android" >
 -
 -    <item
 -        android:id="@+id/ok"
 -        android:icon="@android:drawable/ic_menu_save"
 -        android:showAsAction="ifRoom|withText"
 -        android:title="@string/add_profile"
 -        android:titleCondensed="@string/import_vpn"/>
      <item
          android:id="@+id/cancel"
          android:icon="@android:drawable/ic_menu_close_clear_cancel"
 @@ -14,5 +7,12 @@          android:title="@android:string/cancel"
          android:titleCondensed="@string/cancel"/>
 +    <item
 +        android:id="@+id/ok"
 +        android:icon="@android:drawable/ic_menu_save"
 +        android:showAsAction="ifRoom|withText"
 +        android:title="@string/add_profile"
 +        android:titleCondensed="@string/import_vpn"/>
 +
  </menu>
\ No newline at end of file diff --git a/src/de/blinkt/openvpn/ConfigConverter.java b/src/de/blinkt/openvpn/ConfigConverter.java index 5065436c..d715e8b7 100644 --- a/src/de/blinkt/openvpn/ConfigConverter.java +++ b/src/de/blinkt/openvpn/ConfigConverter.java @@ -194,6 +194,10 @@ public class ConfigConverter extends ListActivity {  		String newname = mPossibleName; +		// 	Default to  +		if(mResult.mName!=null && !ConfigParser.CONVERTED_PROFILE.equals(mResult.mName)) +			newname=mResult.mName; +			  		while(vpl.getProfileByName(newname)!=null) {  			i++;  			if(i==1) diff --git a/src/de/blinkt/openvpn/ConfigParser.java b/src/de/blinkt/openvpn/ConfigParser.java index 724772eb..9e286312 100644 --- a/src/de/blinkt/openvpn/ConfigParser.java +++ b/src/de/blinkt/openvpn/ConfigParser.java @@ -16,24 +16,31 @@ import java.util.Vector;  public class ConfigParser { +	public static final String CONVERTED_PROFILE = "converted Profile";  	private HashMap<String, Vector<Vector<String>>> options = new HashMap<String, Vector<Vector<String>>>(); -	 +	private HashMap<String, Vector<String>> meta = new HashMap<String, Vector<String>>(); + +  	private boolean extraRemotesAsCustom=false; -	 +  	public void parseConfig(Reader reader) throws IOException, ConfigParseError { -	 -		BufferedReader br =new BufferedReader(reader); -		@SuppressWarnings("unused") -		int lineno=0; +		BufferedReader br =new BufferedReader(reader);  		while (true){  			String line = br.readLine();  			if(line==null)  				break; -			lineno++; -			Vector<String> args = parseline(line); + +			// Check for OpenVPN Access Server Meta information +			if (line.startsWith("# OVPN_ACCESS_SERVER_")) { +				Vector<String> metaarg = parsemeta(line); +				meta.put(metaarg.get(0),metaarg); +				continue; +			} +			Vector<String> args = parseline(line);	 +  			if(args.size() ==0)  				continue; @@ -51,6 +58,16 @@ public class ConfigParser {  		}  	} +	private Vector<String> parsemeta(String line) { +		String meta = line.split("#\\sOVPN_ACCESS_SERVER_", 2)[1]; +		String[] parts = meta.split("=",2); +		Vector<String> rval = new Vector<String>(); +		for(String p:parts) +			rval.add(p); +		return rval; + +	} +  	private void checkinlinefile(Vector<String> args, BufferedReader br) throws IOException, ConfigParseError {  		String arg0 = args.get(0);  		// CHeck for <foo> @@ -241,12 +258,12 @@ public class ConfigParser {  			"topology",  			"win-sys",  	}; -	 -	 + +  	// This method is far too long  	public VpnProfile convertProfile() throws ConfigParseError{  		boolean noauthtypeset=true; -		VpnProfile np = new VpnProfile("converted Profile"); +		VpnProfile np = new VpnProfile(CONVERTED_PROFILE);  		// Pull, client, tls-client  		np.clearDefaults(); @@ -255,7 +272,7 @@ public class ConfigParser {  			options.remove("pull");  			options.remove("client");  		} -		 +  		Vector<String> secret = getOption("secret", 1, 2);  		if(secret!=null)   		{ @@ -265,9 +282,9 @@ public class ConfigParser {  			np.mTLSAuthFilename=secret.get(1);  			if(secret.size()==3)  				np.mTLSAuthDirection=secret.get(2); -			 +  		} -		 +  		Vector<Vector<String>> routes = getAllOption("route", 1, 4);  		if(routes!=null) {  			String routeopt = ""; @@ -284,7 +301,7 @@ public class ConfigParser {  				} catch (NumberFormatException ne) {  					throw new ConfigParseError("Could not parse netmask of route " + netmask);  				} -			 +  			}  			np.mCustomRoutes=routeopt;  		} @@ -304,7 +321,7 @@ public class ConfigParser {  				}  			}  		} -		 +  		Vector<String> direction = getOption("key-direction", 1, 1);  		if(direction!=null)  			np.mTLSAuthDirection=direction.get(1); @@ -331,12 +348,12 @@ public class ConfigParser {  			if(!mode.get(1).equals("p2p"))  				throw new ConfigParseError("Invalid mode for --mode specified, need p2p");  		} -		 +  		Vector<String> port = getOption("port", 1,1);  		if(port!=null){  			np.mServerPort = port.get(1);  		} -		 +  		Vector<String> proto = getOption("proto", 1,1);  		if(proto!=null){  			np.mUseUdp=isUdpProto(proto.get(1));; @@ -356,7 +373,7 @@ public class ConfigParser {  				np.mServerName = remote.get(1);  			}  		} -		 +  		Vector<Vector<String>> dhcpoptions = getAllOption("dhcp-option", 2, 2); @@ -381,7 +398,7 @@ public class ConfigParser {  			CIDRIP cidr = new CIDRIP(ifconfig.get(1), ifconfig.get(2));  			np.mIPv4Address=cidr.toString();  		} -		 +  		if(getOption("remote-random-hostname", 0, 0)!=null)  			np.mUseRandomHostname=true; @@ -399,7 +416,7 @@ public class ConfigParser {  		if(auth!=null)  			np.mAuth = auth.get(1); -		 +  		Vector<String> ca = getOption("ca",1,1);  		if(ca!=null){  			np.mCaFilename = ca.get(1); @@ -433,28 +450,28 @@ public class ConfigParser {  			np.mVerb=verb.get(1);  		} -		 +  		if(getOption("nobind", 0, 0) != null)  			np.mNobind=true; -		 +  		if(getOption("persist-tun", 0,0) != null)  			np.mPersistTun=true; -		 +  		Vector<String> connectretry = getOption("connect-retry", 1, 1);  		if(connectretry!=null)  			np.mConnectRetry =connectretry.get(1); -		 +  		Vector<String> connectretrymax = getOption("connect-retry-max", 1, 1);  		if(connectretrymax!=null)  			np.mConnectRetryMax =connectretrymax.get(1); -		 +  		Vector<Vector<String>> remotetls = getAllOption("remote-cert-tls", 1, 1);  		if(remotetls!=null)  			if(remotetls.get(0).get(1).equals("server"))  				np.mExpectTLSCert=true;  			else  				options.put("remotetls",remotetls); -		 +  		Vector<String> authuser = getOption("auth-user-pass",0,1);  		if(authuser !=null){  			if(noauthtypeset) { @@ -465,15 +482,23 @@ public class ConfigParser {  				np.mAuthenticationType=VpnProfile.TYPE_USERPASS_KEYSTORE;  			}  			if(authuser.size()>1) { -				// Set option value to password get to get canche to embed later. +				// Set option value to password get to get cance to embed later.  				np.mUsername=null;  				np.mPassword=authuser.get(1);  				useEmbbedUserAuth(np,authuser.get(1));  			} -			  		} -		 +		// Parse OpenVPN Access Server extra +		Vector<String> friendlyname = meta.get("FRIENDLY_NAME"); +		if(friendlyname !=null && friendlyname.size() > 1) +			np.mName=friendlyname.get(1); + + +		Vector<String> ocusername = meta.get("USERNAME"); +		if(ocusername !=null && ocusername.size() > 1) +			np.mUsername=ocusername.get(1); +  		// Check the other options  		if(remotes !=null && remotes.size()>1 && extraRemotesAsCustom) {  			// first is already added @@ -487,7 +512,7 @@ public class ConfigParser {  		return np;  	} -	 +  	public void useExtraRemotesAsCustom(boolean b) {  		this.extraRemotesAsCustom = b;  	} @@ -505,7 +530,7 @@ public class ConfigParser {  			throw new ConfigParseError("Unsupported option to --proto " + proto);  		return isudp;  	} -	 +  	static public void useEmbbedUserAuth(VpnProfile np,String inlinedata)  	{  		String data = inlinedata.replace(VpnProfile.INLINE_TAG, ""); | 
