diff options
| -rw-r--r-- | src/de/blinkt/openvpn/LaunchVPN.java | 1 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/OpenVPNThread.java | 1 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/OpenVpnManagementThread.java | 63 | ||||
| -rw-r--r-- | src/de/blinkt/openvpn/ProfileManager.java | 15 | 
4 files changed, 53 insertions, 27 deletions
| diff --git a/src/de/blinkt/openvpn/LaunchVPN.java b/src/de/blinkt/openvpn/LaunchVPN.java index c50a1767..b084b19d 100644 --- a/src/de/blinkt/openvpn/LaunchVPN.java +++ b/src/de/blinkt/openvpn/LaunchVPN.java @@ -237,6 +237,7 @@ public class LaunchVPN extends ListActivity implements OnItemClickListener {  			minivpnwritten=true;  			return true;  		} catch (IOException e) { +			OpenVPN.logMessage(0, "",e.getLocalizedMessage());  			e.printStackTrace();  			return false;  		} diff --git a/src/de/blinkt/openvpn/OpenVPNThread.java b/src/de/blinkt/openvpn/OpenVPNThread.java index 4c00707b..89cd0a59 100644 --- a/src/de/blinkt/openvpn/OpenVPNThread.java +++ b/src/de/blinkt/openvpn/OpenVPNThread.java @@ -106,6 +106,7 @@ public class OpenVPNThread implements Runnable {  		} catch (IOException e) {
 +			OpenVPN.logMessage(0, "", "Error reading from output of OpenVPN process"+ e.getLocalizedMessage());
  			e.printStackTrace();
  			stopProcess();
  		}
 diff --git a/src/de/blinkt/openvpn/OpenVpnManagementThread.java b/src/de/blinkt/openvpn/OpenVpnManagementThread.java index ce6f718f..753cd98a 100644 --- a/src/de/blinkt/openvpn/OpenVpnManagementThread.java +++ b/src/de/blinkt/openvpn/OpenVpnManagementThread.java @@ -38,7 +38,7 @@ public class OpenVpnManagementThread implements Runnable {  			mSocket.getOutputStream().write(cmd.getBytes());
  			mSocket.getOutputStream().flush();
  		} catch (IOException e) {
 -			e.printStackTrace();
 +			// Ignore socket stack traces
  		}
  	}
 @@ -68,6 +68,7 @@ public class OpenVpnManagementThread implements Runnable {  				try {
  					fds = mSocket.getAncillaryFileDescriptors();
  				} catch (IOException e) {
 +					OpenVPN.logMessage(0, "", "Error reading fds from socket" + e.getLocalizedMessage());
  					e.printStackTrace();
  				}
  				if(fds!=null){
 @@ -95,30 +96,35 @@ public class OpenVpnManagementThread implements Runnable {  	//! Hack O Rama 2000!
  	private void protectFileDescriptor(FileDescriptor fd) {
 +		Exception exp=null;
  		try {
  			Method getInt = FileDescriptor.class.getDeclaredMethod("getInt$");
  			int fdint = (Integer) getInt.invoke(fd);
  			// You can even get more evil by parsing toString() and extract the int from that :)
 -			
 +
  			Log.d("Openvpn", "Got FD from socket: " + fd + " " + fdint);
  			mOpenVPNService.protect(fdint);
 -			
 +
  			//ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(fdint);
  			//pfd.close();
  			jniclose(fdint);
  			return;
  		} catch (NoSuchMethodException e) {
 -			e.printStackTrace();
 +			exp =e;
  		} catch (IllegalArgumentException e) {
 -			e.printStackTrace();
 +			exp =e;
  		} catch (IllegalAccessException e) {
 -			e.printStackTrace();
 +			exp =e;
  		} catch (InvocationTargetException e) {
 -			e.printStackTrace();
 +			exp =e;
 +		}
 +		if(exp!=null) {
 +			exp.printStackTrace();
 +			Log.d("Openvpn", "Failed to retrieve fd from socket: " + fd);
 +			OpenVPN.logMessage(0, "",  "Failed to retrieve fd from socket: " + exp.getLocalizedMessage());
  		}
 -		Log.d("Openvpn", "Failed to retrieve fd from socket: " + fd);
  	}
  	private String processInput(String pendingInput) {
 @@ -200,7 +206,7 @@ public class OpenVpnManagementThread implements Runnable {  			mOpenVPNService.setLocalIP(ifconfigparts[0], ifconfigparts[1],mtu);
  		} else if (needed.equals("IFCONFIG6")) {
  			mOpenVPNService.setLocalIPv6(extra);
 -		
 +
  		} else if (needed.equals("OPENTUN")) {
  			if(sendTunFD(needed,extra))
  				return;
 @@ -218,11 +224,12 @@ public class OpenVpnManagementThread implements Runnable {  	}
  	private boolean sendTunFD (String needed, String extra) {
 +		Exception exp = null;
  		if(!extra.equals("tun")) {
  			// We only support tun
  			String errmsg = String.format("Devicetype %s requested, but only tun is possible with the Android API, sorry!",extra);
  			OpenVPN.logMessage(0, "", errmsg );
 -					
 +
  			return false;
  		}
  		ParcelFileDescriptor pfd = mOpenVPNService.openTun(); 
 @@ -236,33 +243,37 @@ public class OpenVpnManagementThread implements Runnable {  			FileDescriptor fdtosend = new FileDescriptor();
  			setInt.invoke(fdtosend,fdint);
 -			
 +
  			FileDescriptor[] fds = {fdtosend};
  			mSocket.setFileDescriptorsForSend(fds);
 -			
 +
  			Log.d("Openvpn", "Sending FD tosocket: " + fdtosend + " " + fdint + "  " + pfd);
  			// Trigger a send so we can close the fd on our side of the channel
  			// The API documentation fails to mention that it will not reset the file descriptor to
  			// be send and will happily send the file descriptor on every write ...
  			String cmd = String.format("needok '%s' %s\n", needed, "ok");
  			managmentCommand(cmd);
 -			
 +
  			// Set the FileDescriptor to null to stop this mad behavior 
  			mSocket.setFileDescriptorsForSend(null);
 -			
 +
  			pfd.close();			
  			return true;
  		} catch (NoSuchMethodException e) {
 -			e.printStackTrace();
 +			exp =e;
  		} catch (IllegalArgumentException e) {
 -			e.printStackTrace();
 +			exp =e;
  		} catch (IllegalAccessException e) {
 -			e.printStackTrace();
 +			exp =e;
  		} catch (InvocationTargetException e) {
 -			e.printStackTrace();
 +			exp =e;
  		} catch (IOException e) {
 -			e.printStackTrace();
 +			exp =e;
 +		}
 +		if(exp!=null) {
 +			OpenVPN.logMessage(0,"", "Could not send fd over socket:" + exp.getLocalizedMessage());
 +			exp.printStackTrace();
  		}
  		return false;
  	}
 @@ -274,9 +285,15 @@ public class OpenVpnManagementThread implements Runnable {  	private void processPWCommand(String argument) {
  		//argument has the form 	Need 'Private Key' password
 -		int p1 =argument.indexOf('\'');
 -		int p2 = argument.indexOf('\'',p1+1);
 -		//String needed = argument.replace("Need '", "").replace("' password", "");
 +		int p1,p2;
 +		try{
 +			p1 =argument.indexOf('\'');
 +			p2 = argument.indexOf('\'',p1+1);
 +			//String needed = argument.replace("Need '", "").replace("' password", "");
 +		} catch (StringIndexOutOfBoundsException sioob) {
 +			OpenVPN.logMessage(0, "", "Could not parse management Password command: "  + argument);
 +			return;
 +		}
  		String needed = argument.substring(p1+1, p2);
  		String pw=null;
 @@ -313,7 +330,7 @@ public class OpenVpnManagementThread implements Runnable {  			try {
  				mt.mSocket.close();
  			} catch (IOException e) {
 -				e.printStackTrace();
 +				// Ignore close error on maybe already closed socket
  			}
  		}
  		return sendCMD;		
 diff --git a/src/de/blinkt/openvpn/ProfileManager.java b/src/de/blinkt/openvpn/ProfileManager.java index f8193003..d34bdbec 100644 --- a/src/de/blinkt/openvpn/ProfileManager.java +++ b/src/de/blinkt/openvpn/ProfileManager.java @@ -87,9 +87,12 @@ public class ProfileManager {  		} catch (FileNotFoundException e) {  			e.printStackTrace(); +			throw new RuntimeException(e);  		} catch (IOException e) {  			e.printStackTrace(); +			throw new RuntimeException(e); +  		}  	} @@ -98,6 +101,7 @@ public class ProfileManager {  		profiles = new HashMap<String, VpnProfile>();  		SharedPreferences settings =context.getSharedPreferences(PREFS_NAME,Activity.MODE_PRIVATE);  		Set<String> vlist = settings.getStringSet("vpnlist", null); +		Exception exp =null;  		if(vlist==null){  			vlist = new HashSet<String>();  		} @@ -110,13 +114,16 @@ public class ProfileManager {  				profiles.put(vp.getUUID().toString(), vp);  			} catch (StreamCorruptedException e) { -				e.printStackTrace(); +				exp=e;  			} catch (FileNotFoundException e) { -				e.printStackTrace(); +				exp=e;  			} catch (IOException e) { -				e.printStackTrace(); +				exp=e;  			} catch (ClassNotFoundException e) {  -				e.printStackTrace(); +				exp=e; +			} +			if(exp!=null) { +				exp.printStackTrace();  			}  		}  	} | 
