From 08fcccc93dce0b7ecdb16af3b5fd2585b452aaf1 Mon Sep 17 00:00:00 2001 From: Arne Schwabe Date: Tue, 19 Nov 2013 15:44:06 +0100 Subject: Android 4.4 workaround, --- src/de/blinkt/openvpn/core/OpenVPNThread.java | 3 ++ .../openvpn/core/OpenVpnManagementThread.java | 11 ++++++-- src/de/blinkt/openvpn/core/OpenVpnService.java | 33 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) (limited to 'src/de/blinkt/openvpn/core') diff --git a/src/de/blinkt/openvpn/core/OpenVPNThread.java b/src/de/blinkt/openvpn/core/OpenVPNThread.java index 0807b33d..f814ff29 100644 --- a/src/de/blinkt/openvpn/core/OpenVPNThread.java +++ b/src/de/blinkt/openvpn/core/OpenVPNThread.java @@ -137,6 +137,9 @@ public class OpenVPNThread implements Runnable { else if ((flags & M_DEBUG)!=0) logStatus = VpnStatus.LogLevel.VERBOSE; + if (msg.startsWith("MANAGEMENT: CMD")) + logLevel = Math.max(4, logLevel); + VpnStatus.logMessageOpenVPN(logStatus,logLevel,msg); } else { diff --git a/src/de/blinkt/openvpn/core/OpenVpnManagementThread.java b/src/de/blinkt/openvpn/core/OpenVpnManagementThread.java index 03b36144..abca275a 100644 --- a/src/de/blinkt/openvpn/core/OpenVpnManagementThread.java +++ b/src/de/blinkt/openvpn/core/OpenVpnManagementThread.java @@ -273,8 +273,12 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement { } int ovpnlevel = Integer.parseInt(args[2]) & 0x0F; + String msg = args[3]; - VpnStatus.logMessageOpenVPN(level,ovpnlevel, args[3]); + if (msg.startsWith("MANAGEMENT: CMD")) + ovpnlevel = Math.max(4, ovpnlevel); + + VpnStatus.logMessageOpenVPN(level,ovpnlevel, msg); } private void handleHold() { @@ -387,7 +391,10 @@ public class OpenVpnManagementThread implements Runnable, OpenVPNManagement { } else if (needed.equals("IFCONFIG6")) { mOpenVPNService.setLocalIPv6(extra); - } else if (needed.equals("OPENTUN")) { + } else if (needed.equals("PERSIST_TUN_ACTION")) { + // check if tun cfg stayed the same + status = mOpenVPNService.getTunReopenStatus(); + } else if (needed.equals("OPENTUN")) { if(sendTunFD(needed,extra)) return; else diff --git a/src/de/blinkt/openvpn/core/OpenVpnService.java b/src/de/blinkt/openvpn/core/OpenVpnService.java index e4437d2c..ab21fc1b 100644 --- a/src/de/blinkt/openvpn/core/OpenVpnService.java +++ b/src/de/blinkt/openvpn/core/OpenVpnService.java @@ -14,6 +14,7 @@ import android.net.VpnService; import android.os.*; import android.os.Handler.Callback; import android.preference.PreferenceManager; +import android.text.TextUtils; import de.blinkt.openvpn.DisconnectVPN; import de.blinkt.openvpn.LogWindow; import de.blinkt.openvpn.R; @@ -24,6 +25,7 @@ import de.blinkt.openvpn.core.VpnStatus.StateListener; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.security.MessageDigest; import java.util.HashMap; import java.util.Locale; import java.util.Vector; @@ -55,6 +57,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac private long mConnecttime; private boolean mOvpn3 = false; private OpenVPNManagement mManagement; + private String mLastTunCfg; // From: http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java public static String humanReadableByteCount(long bytes, boolean mbit) { @@ -386,6 +389,24 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac } + private String getTunConfigString() + { + // The format of the string is not important, only that + // two identical configurations produce the same result + String cfg="TUNCFG UNQIUE STRING ips:"; + + if (mLocalIP!=null) + cfg+=mLocalIP.toString(); + if (mLocalIPv6!=null) + cfg+=mLocalIPv6.toString(); + + cfg+= "routes: " + TextUtils.join("|",mRoutes) + TextUtils.join("|",mRoutesv6); + cfg+= "dns: " + TextUtils.join("|",mDnslist); + cfg+= "domain: " + mDomain; + cfg+= "mtu: " + mMtu; + return cfg; + } + public ParcelFileDescriptor openTun() { Builder builder = new Builder(); @@ -465,6 +486,8 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac if (mDnslist.size() == 0) VpnStatus.logInfo(R.string.warn_no_dns); + mLastTunCfg = getTunConfigString(); + // Reset information mDnslist.clear(); mRoutes.clear(); @@ -625,6 +648,16 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac return mManagement; } + public String getTunReopenStatus() { + String currentConfiguration = getTunConfigString(); + if(currentConfiguration.equals(mLastTunCfg)) + return "NOACTION"; + else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) + return "OPEN_AFTER_CLOSE"; + else + return "OPEN_BEFORE_CLOSE"; + } + public class LocalBinder extends Binder { public OpenVpnService getService() { // Return this instance of LocalService so clients can call public methods -- cgit v1.2.3