diff options
author | Arne Schwabe <arne@rfc2549.org> | 2012-08-08 00:37:54 +0200 |
---|---|---|
committer | Arne Schwabe <arne@rfc2549.org> | 2012-08-08 00:37:54 +0200 |
commit | 668db7df968c8e2828c888261b65f14490d78396 (patch) | |
tree | 83e1903fc50f3634a274540ce094ac396726bb47 /src/de/blinkt/openvpn | |
parent | a300294c85697837c33fe90e06d23f676185713f (diff) |
Use management-client and management-signal (closes issue #65)
Diffstat (limited to 'src/de/blinkt/openvpn')
-rw-r--r-- | src/de/blinkt/openvpn/OpenVpnManagementThread.java | 18 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/OpenVpnService.java | 44 | ||||
-rw-r--r-- | src/de/blinkt/openvpn/VpnProfile.java | 4 |
3 files changed, 34 insertions, 32 deletions
diff --git a/src/de/blinkt/openvpn/OpenVpnManagementThread.java b/src/de/blinkt/openvpn/OpenVpnManagementThread.java index 7a0beb1d..3f0d8439 100644 --- a/src/de/blinkt/openvpn/OpenVpnManagementThread.java +++ b/src/de/blinkt/openvpn/OpenVpnManagementThread.java @@ -18,6 +18,7 @@ import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
+import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.os.Build;
import android.os.ParcelFileDescriptor;
@@ -34,16 +35,17 @@ public class OpenVpnManagementThread implements Runnable { private int mBytecountinterval=2;
private long mLastIn=0;
private long mLastOut=0;
- private String mCurrentstate;
+ private String mCurrentstate;
+ private LocalServerSocket mServerSocket;
private static Vector<OpenVpnManagementThread> active=new Vector<OpenVpnManagementThread>();
static private native void jniclose(int fdint);
static private native byte[] rsasign(byte[] input,int pkey) throws InvalidKeyException;
- public OpenVpnManagementThread(VpnProfile profile, LocalSocket mgmtsocket, OpenVpnService openVpnService) {
+ public OpenVpnManagementThread(VpnProfile profile, LocalServerSocket mgmtsocket, OpenVpnService openVpnService) {
mProfile = profile;
- mSocket = mgmtsocket;
+ mServerSocket = mgmtsocket;
mOpenVPNService = openVpnService;
}
@@ -67,16 +69,14 @@ public class OpenVpnManagementThread implements Runnable { Log.i(TAG, "Managment Socket Thread started");
byte [] buffer =new byte[2048];
// mSocket.setSoTimeout(5); // Setting a timeout cannot be that bad
- InputStream instream = null;
- try {
- instream = mSocket.getInputStream();
- } catch (IOException e) {
- e.printStackTrace();
- }
+
String pendingInput="";
active.add(this);
try {
+ // Wait for a client to connect
+ mSocket= mServerSocket.accept();
+ InputStream instream = mSocket.getInputStream();
while(true) {
int numbytesread = instream.read(buffer);
diff --git a/src/de/blinkt/openvpn/OpenVpnService.java b/src/de/blinkt/openvpn/OpenVpnService.java index c28802f6..f56e873b 100644 --- a/src/de/blinkt/openvpn/OpenVpnService.java +++ b/src/de/blinkt/openvpn/OpenVpnService.java @@ -27,6 +27,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.net.ConnectivityManager; +import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; import android.net.VpnService; @@ -114,14 +115,14 @@ public class OpenVpnService extends VpnService implements StateListener { - private LocalSocket openManagmentInterface(int tries) { + private LocalServerSocket openManagmentInterface(int tries) { // Could take a while to open connection String socketname = (getCacheDir().getAbsolutePath() + "/" + "mgmtsocket"); LocalSocket sock = new LocalSocket(); while(tries > 0 && !sock.isConnected()) { try { - sock.connect(new LocalSocketAddress(socketname, + sock.bind(new LocalSocketAddress(socketname, LocalSocketAddress.Namespace.FILESYSTEM)); } catch (IOException e) { // wait 300 ms before retrying @@ -131,7 +132,16 @@ public class OpenVpnService extends VpnService implements StateListener { } tries--; } - return sock; + + try { + LocalServerSocket lss = new LocalServerSocket(sock.getFileDescriptor()); + return lss; + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return null; + } @@ -171,19 +181,19 @@ public class OpenVpnService extends VpnService implements StateListener { } catch (InterruptedException e) { } } + // Open the Management Interface + LocalServerSocket mgmtsocket = openManagmentInterface(8); - // See if there is a managment socket we can connect to and kill the process too - LocalSocket mgmtsocket = openManagmentInterface(1); if(mgmtsocket!=null) { - // Fire and forget :) - new OpenVpnManagementThread(mProfile,mgmtsocket,this).managmentCommand("signal SIGINT\n"); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - } - //checkForRemainingMiniVpns(); + // start a Thread that handles incoming messages of the managment socket + mSocketManager = new OpenVpnManagementThread(mProfile,mgmtsocket,this); + mSocketManagerThread = new Thread(mSocketManager,"OpenVPNMgmtThread"); + mSocketManagerThread.start(); + OpenVPN.logInfo("started Socket Thread"); + registerNetworkStateReceiver(); } + // Start a new session by creating a new thread. OpenVPNThread serviceThread = new OpenVPNThread(this, argv,nativelibdir); @@ -192,16 +202,6 @@ public class OpenVpnService extends VpnService implements StateListener { - // Open the Management Interface - mgmtsocket = openManagmentInterface(8); - - if(mgmtsocket!=null) { - // start a Thread that handles incoming messages of the managment socket - mSocketManager = new OpenVpnManagementThread(mProfile,mgmtsocket,this); - mSocketManagerThread = new Thread(mSocketManager,"OpenVPNMgmtThread"); - mSocketManagerThread.start(); - registerNetworkStateReceiver(); - } return START_NOT_STICKY; } diff --git a/src/de/blinkt/openvpn/VpnProfile.java b/src/de/blinkt/openvpn/VpnProfile.java index 199f6b54..c03dff74 100644 --- a/src/de/blinkt/openvpn/VpnProfile.java +++ b/src/de/blinkt/openvpn/VpnProfile.java @@ -158,7 +158,9 @@ public class VpnProfile implements Serializable{ cfg +=cacheDir.getAbsolutePath() + "/" + "mgmtsocket"; cfg += " unix\n"; - cfg+= "management-query-passwords\n"; + cfg += "management-client\n"; + cfg += "management-signal\n"; + cfg += "management-query-passwords\n"; cfg += "management-hold\n\n"; /* tmp-dir patched out :) |