summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2014-09-29 10:21:44 +0200
committerArne Schwabe <arne@rfc2549.org>2014-09-29 10:21:44 +0200
commit6b0c533a7ca8c2fd5df320b3f5531a978c112705 (patch)
tree6d1efdbf4b00364bbd79957eb4ba39e2d06a1b68
parent51a6e69932d8077f985ee818df0a1114d268c19f (diff)
Implement restart of service (closes issue #286)
-rw-r--r--main/src/main/java/de/blinkt/openvpn/LaunchVPN.java2
-rw-r--r--main/src/main/java/de/blinkt/openvpn/VpnProfile.java29
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java10
3 files changed, 33 insertions, 8 deletions
diff --git a/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java b/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java
index 34d9f8ff..38057005 100644
--- a/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java
+++ b/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java
@@ -188,7 +188,7 @@ public class LaunchVPN extends Activity {
if(requestCode==START_VPN_PROFILE) {
if(resultCode == Activity.RESULT_OK) {
- int needpw = mSelectedProfile.needUserPWInput();
+ int needpw = mSelectedProfile.needUserPWInput(false);
if(needpw !=0) {
VpnStatus.updateStateString("USER_VPN_PASSWORD", "", R.string.state_user_vpn_password,
ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT);
diff --git a/main/src/main/java/de/blinkt/openvpn/VpnProfile.java b/main/src/main/java/de/blinkt/openvpn/VpnProfile.java
index 09bf4c87..6028d2e5 100644
--- a/main/src/main/java/de/blinkt/openvpn/VpnProfile.java
+++ b/main/src/main/java/de/blinkt/openvpn/VpnProfile.java
@@ -41,6 +41,7 @@ import java.util.Collection;
import java.util.Locale;
import java.util.UUID;
import java.util.Vector;
+import java.util.concurrent.Future;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
@@ -175,7 +176,8 @@ public class VpnProfile implements Serializable {
escapedString = escapedString.replace("\n", "\\n");
if (escapedString.equals(unescaped) && !escapedString.contains(" ") &&
- !escapedString.contains("#") && !escapedString.contains(";"))
+ !escapedString.contains("#") && !escapedString.contains(";")
+ && !escapedString.equals(""))
return unescaped;
else
return '"' + escapedString + '"';
@@ -636,6 +638,21 @@ public class VpnProfile implements Serializable {
return false;
}
+ public void checkForRestart(final Context context) {
+ /* This method is called when OpenVPNService is restarted */
+
+ if ((mAuthenticationType == VpnProfile.TYPE_KEYSTORE || mAuthenticationType == VpnProfile.TYPE_USERPASS_KEYSTORE)
+ && mPrivateKey==null) {
+ new Thread( new Runnable() {
+ @Override
+ public void run() {
+ getKeyStoreCertificates(context);
+
+ }
+ }).start();
+ }
+ }
+
class NoCertReturnedException extends Exception {
public NoCertReturnedException (String msg) {
@@ -842,21 +859,23 @@ public class VpnProfile implements Serializable {
return false;
}
- public int needUserPWInput() {
+ public int needUserPWInput(boolean ignoreTransient) {
if ((mAuthenticationType == TYPE_PKCS12 || mAuthenticationType == TYPE_USERPASS_PKCS12) &&
(mPKCS12Password == null || mPKCS12Password.equals(""))) {
- if (mTransientPCKS12PW == null)
+ if (ignoreTransient || mTransientPCKS12PW == null)
return R.string.pkcs12_file_encryption_key;
}
if (mAuthenticationType == TYPE_CERTIFICATES || mAuthenticationType == TYPE_USERPASS_CERTIFICATES) {
if (requireTLSKeyPassword() && TextUtils.isEmpty(mKeyPassword))
- if (mTransientPCKS12PW == null) {
+ if (ignoreTransient || mTransientPCKS12PW == null) {
return R.string.private_key_password;
}
}
- if (isUserPWAuth() && !(!TextUtils.isEmpty(mUsername) && (!TextUtils.isEmpty(mPassword) || mTransientPW != null))) {
+ if (isUserPWAuth() &&
+ (TextUtils.isEmpty(mUsername) ||
+ (TextUtils.isEmpty(mPassword) && (mTransientPW == null || ignoreTransient)))) {
return R.string.password;
}
return 0;
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 6fa8e27c..df60325b 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java
@@ -320,6 +320,8 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
String profileUUID = intent.getStringExtra(prefix + ".profileUUID");
mProfile = ProfileManager.get(this, profileUUID);
+ // Will refetch the private key of the store on restart
+ mProfile.checkForRestart(this);
String startTitle = getString(R.string.start_vpn_title, mProfile.mName);
String startTicker = getString(R.string.start_vpn_ticker, mProfile.mName);
@@ -399,8 +401,12 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
ProfileManager.setConnectedVpnProfile(this, mProfile);
+ /* TODO: At the moment we have no way to handle asynchronous PW input
+ * Fixing will also allow to handle challenge/responsee authentication /*
+ if (mProfile.needUserPWInput(true) != 0)
+ return START_NOT_STICKY;
- return START_NOT_STICKY;
+ return START_REDELIVER_INTENT;
}
private OpenVPNManagement instantiateOpenVPN3Core() {
@@ -504,7 +510,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac
if ((Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && !release.startsWith("4.4.3")
&& !release.startsWith("4.4.4") && !release.startsWith("4.4.5") && !release.startsWith("4.4.6"))
&& mMtu < 1280) {
- VpnStatus.logInfo(String.format("Forcing MTU to 1280 instead of %d to workaround Android Bug #70916", mMtu));
+ VpnStatus.logInfo(String.format(Locale.US, "Forcing MTU to 1280 instead of %d to workaround Android Bug #70916", mMtu));
builder.setMtu(1280);
} else {
builder.setMtu(mMtu);