diff options
author | Arne Schwabe <arne@rfc2549.org> | 2012-12-27 19:47:35 +0100 |
---|---|---|
committer | Arne Schwabe <arne@rfc2549.org> | 2012-12-27 19:47:35 +0100 |
commit | 1c8e1f9adb41d69829886538e9b2b25a9aeb7bbb (patch) | |
tree | 90a37b04858799a40f16600f81edae0840f4a576 | |
parent | 5420d42b057ad6e0d606088fa9e0836824db8b14 (diff) |
Make changes needed to provide an external API
-rw-r--r-- | AndroidManifest.xml | 19 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/ConfigConverter.java | 14 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/ConfigParser.java | 18 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/LaunchVPN.java | 65 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/LogWindow.java | 2 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/OpenVPN.java | 4 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/OpenVPNThread.java | 10 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/OpenVpnManagementThread.java | 7 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/OpenVpnService.java | 22 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/ProfileManager.java | 8 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/VPNLaunchHelper.java | 74 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/VpnProfile.java | 2 |
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; |