diff options
7 files changed, 51 insertions, 10 deletions
diff --git a/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl b/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl index 0772dcb9..b73284bb 100644 --- a/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl +++ b/main/src/main/aidl/de/blinkt/openvpn/core/IServiceStatus.aidl @@ -16,4 +16,8 @@ interface IServiceStatus { */ void unregisterStatusCallback(in IStatusCallbacks cb); + /** + * + */ + String getLastConnectedVPN(); } diff --git a/main/src/main/java/de/blinkt/openvpn/VpnProfile.java b/main/src/main/java/de/blinkt/openvpn/VpnProfile.java index c39603b2..5b9445be 100644 --- a/main/src/main/java/de/blinkt/openvpn/VpnProfile.java +++ b/main/src/main/java/de/blinkt/openvpn/VpnProfile.java @@ -164,11 +164,14 @@ public class VpnProfile implements Serializable, Cloneable { public boolean mPushPeerInfo = false; public static final boolean mIsOpenVPN22 = false; + public int mVersion=0; + /* Options no longer used in new profiles */ public String mServerName = "openvpn.blinkt.de"; public String mServerPort = "1194"; public boolean mUseUdp = true; + public VpnProfile(String name) { mUuid = UUID.randomUUID(); mName = name; @@ -672,7 +675,7 @@ public class VpnProfile implements Serializable, Cloneable { Intent intent = new Intent(context, OpenVPNService.class); intent.putExtra(prefix + ".profileUUID", mUuid.toString()); - + intent.putExtra(prefix + ".profileVersion", mVersion); return intent; } diff --git a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java index 86a4043a..4e8deac0 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java +++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java @@ -399,7 +399,9 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac if (intent != null && intent.hasExtra(getPackageName() + ".profileUUID")) { String profileUUID = intent.getStringExtra(getPackageName() + ".profileUUID"); - mProfile = ProfileManager.get(this, profileUUID); + int profileVersion = intent.getIntExtra(getPackageName() + ".profileVersion", 0); + // Try for 10s to get current version of the profile + mProfile = ProfileManager.get(this, profileUUID, profileVersion, 100); } else { /* The intent is null when we are set as always-on or the service has been restarted. */ mProfile = ProfileManager.getLastConnectedProfile(this); diff --git a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java index 4b32d9fa..24ae7704 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java +++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNStatusService.java @@ -61,13 +61,17 @@ public class OpenVPNStatusService extends Service implements VpnStatus.LogListen @Override public void registerStatusCallback(IStatusCallbacks cb) throws RemoteException { mCallbacks.register(cb); - } @Override public void unregisterStatusCallback(IStatusCallbacks cb) throws RemoteException { mCallbacks.unregister(cb); } + + @Override + public String getLastConnectedVPN() throws RemoteException { + return VpnStatus.getLastConnectedVPNProfile(); + } }; @Override diff --git a/main/src/main/java/de/blinkt/openvpn/core/ProfileManager.java b/main/src/main/java/de/blinkt/openvpn/core/ProfileManager.java index 2856a069..15ff7651 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/ProfileManager.java +++ b/main/src/main/java/de/blinkt/openvpn/core/ProfileManager.java @@ -129,13 +129,13 @@ public class ProfileManager { ProfileManager.tmpprofile = tmp; } - public static boolean isTempProfile() - { + public static boolean isTempProfile() { return mLastConnectedVpn == tmpprofile; } public void saveProfile(Context context, VpnProfile profile) { + profile.mVersion += 1; ObjectOutputStream vpnfile; try { vpnfile = new ObjectOutputStream(context.openFileOutput((profile.getUUID().toString() + ".vp"), Activity.MODE_PRIVATE)); @@ -188,8 +188,30 @@ public class ProfileManager { } public static VpnProfile get(Context context, String profileUUID) { + return get(context, profileUUID, 0, 10); + } + + public static VpnProfile get(Context context, String profileUUID, int version, int tries) { checkInstance(context); - return get(profileUUID); + VpnProfile profile = get(profileUUID); + int tried = 0; + while ((profile == null || profile.mVersion < version) && (tried++ < tries)) { + try { + Thread.sleep(100); + } catch (InterruptedException ignored) { + } + instance.loadVPNList(context); + profile = get(profileUUID); + int ver = profile == null ? -1 : profile.mVersion; + } + + if (tried != 0) + + { + int ver = profile == null ? -1 : profile.mVersion; + VpnStatus.logError(String.format("Used x %d tries to get current version (%d/%d) of the profile", tried, ver, version)); + } + return profile; } public static VpnProfile getLastConnectedVpn() { diff --git a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java index d6660147..8df1dfed 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java +++ b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java @@ -27,9 +27,12 @@ public class StatusListener { IServiceStatus serviceStatus = IServiceStatus.Stub.asInterface(service); try { /* Check if this a local service ... */ - if (service.queryLocalInterface("de.blinkt.openvpn.core.IServiceStatus") == null) + if (service.queryLocalInterface("de.blinkt.openvpn.core.IServiceStatus") == null) { + VpnStatus.setConnectedVPNProfile(serviceStatus.getLastConnectedVPN()); serviceStatus.registerStatusCallback(mCallback); + } + } catch (RemoteException e) { e.printStackTrace(); } diff --git a/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java b/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java index db0d10bd..84cb4719 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java +++ b/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java @@ -158,14 +158,17 @@ public class VpnStatus { public static LogLevel getEnumByValue(int value) { switch (value) { - case 1: - return INFO; case 2: + return INFO; + case -2: return ERROR; - case 3: + case 1: return WARNING; + case 3: + return VERBOSE; case 4: return DEBUG; + default: return null; } |