summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2012-12-27 19:47:35 +0100
committerArne Schwabe <arne@rfc2549.org>2012-12-27 19:47:35 +0100
commitbbbefe26e6c160bca867dce3188b3679f0fcf2fc (patch)
tree8fd78a979459a78c9fad50043366e1d1d890dd68
parent501b58833bd95950e871e83ca21b34fd72991228 (diff)
Make changes needed to provide an external API
-rw-r--r--AndroidManifest.xml19
-rw-r--r--src/de/blinkt/openvpn/ConfigConverter.java14
-rw-r--r--src/de/blinkt/openvpn/ConfigParser.java18
-rw-r--r--src/de/blinkt/openvpn/LaunchVPN.java65
-rw-r--r--src/de/blinkt/openvpn/LogWindow.java2
-rw-r--r--src/de/blinkt/openvpn/OpenVPN.java4
-rw-r--r--src/de/blinkt/openvpn/OpenVPNThread.java10
-rw-r--r--src/de/blinkt/openvpn/OpenVpnManagementThread.java7
-rw-r--r--src/de/blinkt/openvpn/OpenVpnService.java22
-rw-r--r--src/de/blinkt/openvpn/ProfileManager.java8
-rw-r--r--src/de/blinkt/openvpn/VPNLaunchHelper.java74
-rw-r--r--src/de/blinkt/openvpn/VpnProfile.java2
12 files changed, 147 insertions, 98 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index b15156d6..2bd0be0e 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -29,8 +29,15 @@
<!-- <uses-permission android:name="com.android.vending.BILLING" /> -->
<uses-sdk
- android:minSdkVersion="14"
- android:targetSdkVersion="14" />
+ android:minSdkVersion="15"
+ android:targetSdkVersion="15" />
+
+ <permission
+ android:name="de.blinkt.openvpn.REMOTE_API"
+ android:description="@string/permission_description"
+ android:label="Control OpenVPN"
+ android:permissionGroup="android.permission-group.NETWORK"
+ android:protectionLevel="dangerous" />
<application
android:allowBackup="true"
@@ -61,6 +68,12 @@
<action android:name="android.net.VpnService" />
</intent-filter>
</service>
+ <service android:name=".api.ExternalOpenVPNService"
+ android:permission="de.blinkt.openvpn.REMOTE_API">
+ <intent-filter>
+ <action android:name="de.blinkt.openvpn.api.IOpenVPNAPIService" />
+ </intent-filter>
+ </service>
<receiver android:name=".OnBootReceiver" >
<intent-filter>
@@ -126,4 +139,4 @@
android:grantUriPermissions="true" />
</application>
-</manifest>
+</manifest> \ No newline at end of file
diff --git a/src/de/blinkt/openvpn/ConfigConverter.java b/src/de/blinkt/openvpn/ConfigConverter.java
index 40aa24e0..5065436c 100644
--- a/src/de/blinkt/openvpn/ConfigConverter.java
+++ b/src/de/blinkt/openvpn/ConfigConverter.java
@@ -350,17 +350,9 @@ public class ConfigConverter extends ListActivity {
mResult.mPKCS12Filename = embedFile(mResult.mPKCS12Filename,true);
- if(mResult.mUsername != null && !mResult.mUsername.equals("")){
- String data =embedFile(mResult.mUsername);
- mResult.mUsername=null;
- if(data!=null) {
- data = data.replace(VpnProfile.INLINE_TAG, "");
- String[] parts = data.split("\n");
- if(parts.length >= 2) {
- mResult.mUsername=parts[0];
- mResult.mPassword=parts[1];
- }
- }
+ if(mResult.mUsername == null && mResult.mPassword != null ){
+ String data =embedFile(mResult.mPassword);
+ ConfigParser.useEmbbedUserAuth(mResult, data);
}
}
diff --git a/src/de/blinkt/openvpn/ConfigParser.java b/src/de/blinkt/openvpn/ConfigParser.java
index cdec964e..faf0dbd9 100644
--- a/src/de/blinkt/openvpn/ConfigParser.java
+++ b/src/de/blinkt/openvpn/ConfigParser.java
@@ -242,7 +242,7 @@ public class ConfigParser {
// This method is far too long
- VpnProfile convertProfile() throws ConfigParseError{
+ public VpnProfile convertProfile() throws ConfigParseError{
boolean noauthtypeset=true;
VpnProfile np = new VpnProfile("converted Profile");
// Pull, client, tls-client
@@ -461,7 +461,6 @@ public class ConfigParser {
Vector<String> authuser = getOption("auth-user-pass",0,1);
if(authuser !=null){
-
if(noauthtypeset) {
np.mAuthenticationType=VpnProfile.TYPE_USERPASS;
} else if(np.mAuthenticationType==VpnProfile.TYPE_CERTIFICATES) {
@@ -470,7 +469,10 @@ public class ConfigParser {
np.mAuthenticationType=VpnProfile.TYPE_USERPASS_KEYSTORE;
}
if(authuser.size()>1) {
- np.mUsername=authuser.get(1);
+ // Set option value to password get to get canche to embed later.
+ np.mUsername=null;
+ np.mPassword=authuser.get(1);
+ useEmbbedUserAuth(np,authuser.get(1));
}
}
@@ -483,6 +485,16 @@ public class ConfigParser {
return np;
}
+
+ static public void useEmbbedUserAuth(VpnProfile np,String inlinedata)
+ {
+ String data = inlinedata.replace(VpnProfile.INLINE_TAG, "");
+ String[] parts = data.split("\n");
+ if(parts.length >= 2) {
+ np.mUsername=parts[0];
+ np.mPassword=parts[1];
+ }
+ }
private void checkIgnoreAndInvalidOptions(VpnProfile np) throws ConfigParseError {
for(String option:unsupportedOptions)
diff --git a/src/de/blinkt/openvpn/LaunchVPN.java b/src/de/blinkt/openvpn/LaunchVPN.java
index bc0a4cf2..e45bee3b 100644
--- a/src/de/blinkt/openvpn/LaunchVPN.java
+++ b/src/de/blinkt/openvpn/LaunchVPN.java
@@ -218,55 +218,7 @@ public class LaunchVPN extends ListActivity implements OnItemClickListener {
}
- private boolean writeMiniVPN() {
- File mvpnout = new File(getCacheDir(),VpnProfile.MINIVPN);
- if (mvpnout.exists() && mvpnout.canExecute())
- return true;
-
- IOException e2 = null;
-
- try {
-
-
- InputStream mvpn;
-
- try {
- mvpn = getAssets().open("minivpn." + Build.CPU_ABI);
- }
- catch (IOException errabi) {
- OpenVPN.logInfo("Failed getting assets for archicture " + Build.CPU_ABI);
- e2=errabi;
- mvpn = getAssets().open("minivpn." + Build.CPU_ABI2);
-
- }
-
-
- FileOutputStream fout = new FileOutputStream(mvpnout);
-
- byte buf[]= new byte[4096];
-
- int lenread = mvpn.read(buf);
- while(lenread> 0) {
- fout.write(buf, 0, lenread);
- lenread = mvpn.read(buf);
- }
- fout.close();
-
- if(!mvpnout.setExecutable(true)) {
- OpenVPN.logMessage(0, "","Failed to set minivpn executable");
- return false;
- }
-
-
- return true;
- } catch (IOException e) {
- if(e2!=null)
- OpenVPN.logMessage(0, "",e2.getLocalizedMessage());
- OpenVPN.logMessage(0, "",e.getLocalizedMessage());
- e.printStackTrace();
- return false;
- }
- }
+
private void askForPW(final int type) {
@@ -407,22 +359,11 @@ public class LaunchVPN extends ListActivity implements OnItemClickListener {
@Override
public void run() {
- startOpenVpn();
- }
-
- void startOpenVpn() {
- if(!writeMiniVPN()) {
- OpenVPN.logMessage(0, "", "Error writing minivpn binary");
- return;
- }
- OpenVPN.logMessage(0, "", getString(R.string.building_configration));
-
- Intent startVPN = mSelectedProfile.prepareIntent(getBaseContext());
- if(startVPN!=null)
- startService(startVPN);
+ VPNLaunchHelper.startOpenVpn(mSelectedProfile, getBaseContext());
finish();
}
+
}
diff --git a/src/de/blinkt/openvpn/LogWindow.java b/src/de/blinkt/openvpn/LogWindow.java
index 790e143a..ad3af278 100644
--- a/src/de/blinkt/openvpn/LogWindow.java
+++ b/src/de/blinkt/openvpn/LogWindow.java
@@ -296,7 +296,7 @@ public class LogWindow extends ListActivity implements StateListener {
@Override
protected void onStop() {
super.onStop();
- OpenVPN.removeSpeedListener(this);
+ OpenVPN.removeStateListener(this);
}
@Override
diff --git a/src/de/blinkt/openvpn/OpenVPN.java b/src/de/blinkt/openvpn/OpenVPN.java
index 0ae681bc..2d7b7db6 100644
--- a/src/de/blinkt/openvpn/OpenVPN.java
+++ b/src/de/blinkt/openvpn/OpenVPN.java
@@ -125,13 +125,13 @@ public class OpenVPN {
}
- synchronized static void addStateListener(StateListener sl){
+ public synchronized static void addStateListener(StateListener sl){
stateListener.add(sl);
if(mLaststate!=null)
sl.updateState(mLaststate, mLaststatemsg);
}
- synchronized static void removeSpeedListener(StateListener sl) {
+ public synchronized static void removeStateListener(StateListener sl) {
stateListener.remove(sl);
}
diff --git a/src/de/blinkt/openvpn/OpenVPNThread.java b/src/de/blinkt/openvpn/OpenVPNThread.java
index 7d58552a..3922e679 100644
--- a/src/de/blinkt/openvpn/OpenVPNThread.java
+++ b/src/de/blinkt/openvpn/OpenVPNThread.java
@@ -40,7 +40,8 @@ public class OpenVPNThread implements Runnable {
startOpenVPNThreadArgs(mArgv);
Log.i(TAG, "Giving up");
} catch (Exception e) {
- Log.e(TAG, "Got " + e.toString());
+ e.printStackTrace();
+ Log.e(TAG, "OpenVPNThread Got " + e.toString());
} finally {
int exitvalue = 0;
try {
@@ -105,12 +106,13 @@ public class OpenVPNThread implements Runnable {
while(true) {
String logline = br.readLine();
+ if(logline==null)
+ return;
+
if (logline.startsWith(DUMP_PATH_STRING))
mDumpPath = logline.substring(DUMP_PATH_STRING.length());
- if(logline==null) {
- return;
- }
+
OpenVPN.logMessage(0, "P:", logline);
}
diff --git a/src/de/blinkt/openvpn/OpenVpnManagementThread.java b/src/de/blinkt/openvpn/OpenVpnManagementThread.java
index 4e26c44b..ee458200 100644
--- a/src/de/blinkt/openvpn/OpenVpnManagementThread.java
+++ b/src/de/blinkt/openvpn/OpenVpnManagementThread.java
@@ -563,4 +563,11 @@ public class OpenVpnManagementThread implements Runnable {
}
}
+ public static boolean protectFD(ParcelFileDescriptor fd) {
+ boolean hasBeenProtected=false;
+ for (OpenVpnManagementThread mt : active) {
+ hasBeenProtected = hasBeenProtected || mt.mOpenVPNService.protect(fd.getFd());
+ }
+ return hasBeenProtected;
+ }
}
diff --git a/src/de/blinkt/openvpn/OpenVpnService.java b/src/de/blinkt/openvpn/OpenVpnService.java
index 603f86ce..f4550c13 100644
--- a/src/de/blinkt/openvpn/OpenVpnService.java
+++ b/src/de/blinkt/openvpn/OpenVpnService.java
@@ -120,7 +120,7 @@ public class OpenVpnService extends VpnService implements StateListener {
private void jbNotificationExtras(boolean lowpriority,
android.app.Notification.Builder nbuilder) {
try {
- if( lowpriority) {
+ if(lowpriority) {
Method setpriority = nbuilder.getClass().getMethod("setPriority", int.class);
// PRIORITY_MIN == -2
setpriority.invoke(nbuilder, -2 );
@@ -195,8 +195,8 @@ public class OpenVpnService extends VpnService implements StateListener {
String prefix = getPackageName();
String[] argv = intent.getStringArrayExtra(prefix + ".ARGV");
String nativelibdir = intent.getStringExtra(prefix + ".nativelib");
-
String profileUUID = intent.getStringExtra(prefix + ".profileUUID");
+
mProfile = ProfileManager.get(profileUUID);
showNotification("Starting VPN " + mProfile.mName,"Starting VPN " + mProfile.mName, false,0);
@@ -317,12 +317,12 @@ public class OpenVpnService extends VpnService implements StateListener {
String bconfig[] = new String[6];
- bconfig[0]= getString(R.string.last_openvpn_tun_config);
- bconfig[1] = String.format(getString(R.string.local_ip_info,mLocalIP.mIp,mLocalIP.len,mLocalIPv6, mMtu));
- bconfig[2] = String.format(getString(R.string.dns_server_info, joinString(mDnslist)));
- bconfig[3] = String.format(getString(R.string.dns_domain_info, mDomain));
- bconfig[4] = String.format(getString(R.string.routes_info, joinString(mRoutes)));
- bconfig[5] = String.format(getString(R.string.routes_info6, joinString(mRoutesv6)));
+ bconfig[0]= getString(R.string.last_openvpn_tun_config);
+ bconfig[1] = getString(R.string.local_ip_info,mLocalIP.mIp,mLocalIP.len,mLocalIPv6, mMtu);
+ bconfig[2] = getString(R.string.dns_server_info, joinString(mDnslist));
+ bconfig[3] = getString(R.string.dns_domain_info, mDomain);
+ bconfig[4] = getString(R.string.routes_info, joinString(mRoutes));
+ bconfig[5] = getString(R.string.routes_info6, joinString(mRoutesv6));
String session = mProfile.mName;
if(mLocalIP!=null)
@@ -393,11 +393,11 @@ public class OpenVpnService extends VpnService implements StateListener {
public void addRoute(String dest, String mask) {
CIDRIP route = new CIDRIP(dest, mask);
if(route.len == 32 && !mask.equals("255.255.255.255")) {
- OpenVPN.logMessage(0, "", String.format(getString(R.string.route_not_cidr,dest,mask)));
+ OpenVPN.logMessage(0, "", getString(R.string.route_not_cidr,dest,mask));
}
if(route.normalise())
- OpenVPN.logMessage(0, "", String.format(getString(R.string.route_not_netip,dest,route.len,route.mIp)));
+ OpenVPN.logMessage(0, "", getString(R.string.route_not_netip,dest,route.len,route.mIp));
mRoutes.add(route);
}
@@ -420,7 +420,7 @@ public class OpenVpnService extends VpnService implements StateListener {
else
mLocalIP.len=31;
} else {
- OpenVPN.logMessage(0, "", String.format(getString(R.string.ip_not_cidr, local,netmask,mode)));
+ OpenVPN.logMessage(0, "", getString(R.string.ip_not_cidr, local,netmask,mode));
}
}
}
diff --git a/src/de/blinkt/openvpn/ProfileManager.java b/src/de/blinkt/openvpn/ProfileManager.java
index 9457b53f..9f17a68e 100644
--- a/src/de/blinkt/openvpn/ProfileManager.java
+++ b/src/de/blinkt/openvpn/ProfileManager.java
@@ -31,9 +31,13 @@ public class ProfileManager {
private static VpnProfile mLastConnectedVpn=null;
private HashMap<String,VpnProfile> profiles=new HashMap<String, VpnProfile>();
+ private static VpnProfile tmpprofile=null;
public static VpnProfile get(String key) {
+ if (tmpprofile!=null && tmpprofile.getUUIDString().equals(key))
+ return tmpprofile;
+
if(instance==null)
return null;
return instance.profiles.get(key);
@@ -122,6 +126,10 @@ public class ProfileManager {
}
+ public static void setTemporaryProfile(VpnProfile tmp) {
+ ProfileManager.tmpprofile = tmp;
+ }
+
public void saveProfile(Context context,VpnProfile profile) {
// First let basic settings save its state
diff --git a/src/de/blinkt/openvpn/VPNLaunchHelper.java b/src/de/blinkt/openvpn/VPNLaunchHelper.java
new file mode 100644
index 00000000..8389462a
--- /dev/null
+++ b/src/de/blinkt/openvpn/VPNLaunchHelper.java
@@ -0,0 +1,74 @@
+package de.blinkt.openvpn;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Build;
+
+public class VPNLaunchHelper {
+ static private boolean writeMiniVPN(Context context) {
+ File mvpnout = new File(context.getCacheDir(),VpnProfile.MINIVPN);
+ if (mvpnout.exists() && mvpnout.canExecute())
+ return true;
+
+ IOException e2 = null;
+
+ try {
+ InputStream mvpn;
+
+ try {
+ mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI);
+ }
+ catch (IOException errabi) {
+ OpenVPN.logInfo("Failed getting assets for archicture " + Build.CPU_ABI);
+ e2=errabi;
+ mvpn = context.getAssets().open("minivpn." + Build.CPU_ABI2);
+
+ }
+
+
+ FileOutputStream fout = new FileOutputStream(mvpnout);
+
+ byte buf[]= new byte[4096];
+
+ int lenread = mvpn.read(buf);
+ while(lenread> 0) {
+ fout.write(buf, 0, lenread);
+ lenread = mvpn.read(buf);
+ }
+ fout.close();
+
+ if(!mvpnout.setExecutable(true)) {
+ OpenVPN.logMessage(0, "","Failed to set minivpn executable");
+ return false;
+ }
+
+
+ return true;
+ } catch (IOException e) {
+ if(e2!=null)
+ OpenVPN.logMessage(0, "",e2.getLocalizedMessage());
+ OpenVPN.logMessage(0, "",e.getLocalizedMessage());
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+
+ public static void startOpenVpn(VpnProfile startprofile, Context context) {
+ if(!writeMiniVPN(context)) {
+ OpenVPN.logMessage(0, "", "Error writing minivpn binary");
+ return;
+ }
+ OpenVPN.logMessage(0, "", context.getString(R.string.building_configration));
+
+ Intent startVPN = startprofile.prepareIntent(context);
+ if(startVPN!=null)
+ context.startService(startVPN);
+
+ }
+}
diff --git a/src/de/blinkt/openvpn/VpnProfile.java b/src/de/blinkt/openvpn/VpnProfile.java
index 4c3c05f0..d8b22ae6 100644
--- a/src/de/blinkt/openvpn/VpnProfile.java
+++ b/src/de/blinkt/openvpn/VpnProfile.java
@@ -595,7 +595,7 @@ public class VpnProfile implements Serializable{
//! Return an error if somethign is wrong
- int checkProfile(Context context) {
+ public int checkProfile(Context context) {
if(mAuthenticationType==TYPE_KEYSTORE || mAuthenticationType==TYPE_USERPASS_KEYSTORE) {
if(mAlias==null)
return R.string.no_keystore_cert_selected;