diff options
6 files changed, 53 insertions, 30 deletions
diff --git a/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java b/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java index 38057005..a0763337 100644 --- a/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java +++ b/main/src/main/java/de/blinkt/openvpn/LaunchVPN.java @@ -195,9 +195,9 @@ public class LaunchVPN extends Activity {  					askForPW(needpw);  				} else {  					SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);         -					boolean showlogwindow = prefs.getBoolean("showlogwindow", true); +					boolean showLogWindow = prefs.getBoolean("showlogwindow", true); -					if(!mhideLog && showlogwindow) +					if(!mhideLog && showLogWindow)  						showLogWindow();  					new startOpenVpnThread().start();  				} diff --git a/main/src/main/java/de/blinkt/openvpn/OnBootReceiver.java b/main/src/main/java/de/blinkt/openvpn/OnBootReceiver.java index b5884585..a9c458db 100644 --- a/main/src/main/java/de/blinkt/openvpn/OnBootReceiver.java +++ b/main/src/main/java/de/blinkt/openvpn/OnBootReceiver.java @@ -20,7 +20,7 @@ public class OnBootReceiver extends BroadcastReceiver {  		final String action = intent.getAction();  		if(Intent.ACTION_BOOT_COMPLETED.equals(action)) { -			VpnProfile bootProfile = ProfileManager.getOnBootProfile(context); +			VpnProfile bootProfile = ProfileManager.getLastConnectedProfile(context, true);  			if(bootProfile != null) {  				launchVPN(bootProfile, context);  			}		 diff --git a/main/src/main/java/de/blinkt/openvpn/VpnProfile.java b/main/src/main/java/de/blinkt/openvpn/VpnProfile.java index 6028d2e5..44ea8203 100644 --- a/main/src/main/java/de/blinkt/openvpn/VpnProfile.java +++ b/main/src/main/java/de/blinkt/openvpn/VpnProfile.java @@ -582,21 +582,15 @@ public class VpnProfile implements Serializable { -    public Intent prepareIntent(Context context) { -        String prefix = context.getPackageName(); +    public Intent prepareStartService(Context context) { +        Intent intent = getStartServiceIntent(context); -        Intent intent = new Intent(context, OpenVPNService.class);          if (mAuthenticationType == VpnProfile.TYPE_KEYSTORE || mAuthenticationType == VpnProfile.TYPE_USERPASS_KEYSTORE) {              if (getKeyStoreCertificates(context) == null)                  return null;          } -        intent.putExtra(prefix + ".ARGV", buildOpenvpnArgv(context.getCacheDir())); -        intent.putExtra(prefix + ".profileUUID", mUuid.toString()); - -        ApplicationInfo info = context.getApplicationInfo(); -        intent.putExtra(prefix + ".nativelib", info.nativeLibraryDir);          try {              FileWriter cfg = new FileWriter(context.getCacheDir().getAbsolutePath() + "/" + OVPNCONFIGFILE); @@ -610,6 +604,18 @@ public class VpnProfile implements Serializable {          return intent;      } +    public Intent getStartServiceIntent(Context context) { +        String prefix = context.getPackageName(); + +        Intent intent = new Intent(context, OpenVPNService.class); +        intent.putExtra(prefix + ".ARGV", buildOpenvpnArgv(context.getCacheDir())); +        intent.putExtra(prefix + ".profileUUID", mUuid.toString()); + +        ApplicationInfo info = context.getApplicationInfo(); +        intent.putExtra(prefix + ".nativelib", info.nativeLibraryDir); +        return intent; +    } +      public String[] getKeyStoreCertificates(Context context) {          return getKeyStoreCertificates(context, 5);      } 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 df60325b..06612743 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java +++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVPNService.java @@ -24,6 +24,7 @@ import android.os.Message;  import android.os.ParcelFileDescriptor;  import android.preference.PreferenceManager;  import android.text.TextUtils; +import android.util.Log;  import java.lang.reflect.InvocationTargetException;  import java.lang.reflect.Method; @@ -310,18 +311,32 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac              return START_REDELIVER_INTENT;          } -        if (intent == null) -            return START_NOT_STICKY; +        /* The intent is null when the service has been restarted */ +        if (intent == null) { +            mProfile = ProfileManager.getLastConnectedProfile(this, false); + +            /* Got no profile, just stop */ +            if (mProfile==null) { +                Log.d("OpenVPN", "Got no last connected profile on null intent. Stopping"); +                stopSelf(startId); +                return START_NOT_STICKY; +            } +            /* Do the asynchronous keychain certificate stuff */ +            mProfile.checkForRestart(this); + +            /* Recreate the intent */ +            intent = mProfile.getStartServiceIntent(this); + +        } else { +            String profileUUID = intent.getStringExtra(getPackageName() + ".profileUUID"); +            mProfile = ProfileManager.get(this, profileUUID); +        } +          // Extract information from the intent.          String prefix = getPackageName();          String[] argv = intent.getStringArrayExtra(prefix + ".ARGV"); -        String nativelibdir = intent.getStringExtra(prefix + ".nativelib"); -        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 nativeLibraryDirectory = intent.getStringExtra(prefix + ".nativelib");          String startTitle = getString(R.string.start_vpn_title, mProfile.mName);          String startTicker = getString(R.string.start_vpn_ticker, mProfile.mName); @@ -387,7 +402,7 @@ public class OpenVPNService extends VpnService implements StateListener, Callbac          } else {              HashMap<String, String> env = new HashMap<String, String>(); -            processThread = new OpenVPNThread(this, argv, env, nativelibdir); +            processThread = new OpenVPNThread(this, argv, env, nativeLibraryDirectory);          }          synchronized (mProcessLock) { @@ -402,11 +417,11 @@ 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 /* +         * Fixing will also allow to handle challenge/responsee authentication */          if (mProfile.needUserPWInput(true) != 0)              return START_NOT_STICKY; -        return START_REDELIVER_INTENT; +        return START_STICKY;      }      private OpenVPNManagement instantiateOpenVPN3Core() { 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 be7bbfa7..2a26152e 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/ProfileManager.java +++ b/main/src/main/java/de/blinkt/openvpn/core/ProfileManager.java @@ -28,7 +28,7 @@ public class ProfileManager { -	private static final String ONBOOTPROFILE = "onBootProfile"; +	private static final String LAST_CONNECTED_PROFILE = "lastConnectedProfile"; @@ -70,7 +70,7 @@ public class ProfileManager {  	public static void setConntectedVpnProfileDisconnected(Context c) {  		SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);  		Editor prefsedit = prefs.edit(); -		prefsedit.putString(ONBOOTPROFILE, null); +		prefsedit.putString(LAST_CONNECTED_PROFILE, null);  		prefsedit.apply();  	} @@ -79,21 +79,23 @@ public class ProfileManager {  		SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);  		Editor prefsedit = prefs.edit(); -		prefsedit.putString(ONBOOTPROFILE, connectedrofile.getUUIDString()); +		prefsedit.putString(LAST_CONNECTED_PROFILE, connectedrofile.getUUIDString());  		prefsedit.apply();  		mLastConnectedVpn=connectedrofile;  	} -	public static VpnProfile getOnBootProfile(Context c) { +	public static VpnProfile getLastConnectedProfile(Context c, boolean onBoot) {  		SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(c);  		boolean useStartOnBoot = prefs.getBoolean("restartvpnonboot", false); +        if (onBoot && !useStartOnBoot) +            return null; -		String mBootProfileUUID = prefs.getString(ONBOOTPROFILE,null); -		if(useStartOnBoot && mBootProfileUUID!=null) -			return get(c, mBootProfileUUID); +		String lastConnectedProfile = prefs.getString(LAST_CONNECTED_PROFILE, null); +		if(lastConnectedProfile!=null) +			return get(c, lastConnectedProfile);  		else   			return null;  	} diff --git a/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java b/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java index 45dcb62f..15926506 100644 --- a/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java +++ b/main/src/main/java/de/blinkt/openvpn/core/VPNLaunchHelper.java @@ -75,7 +75,7 @@ public class VPNLaunchHelper {  		VpnStatus.logInfo(R.string.building_configration); -		Intent startVPN = startprofile.prepareIntent(context); +		Intent startVPN = startprofile.prepareStartService(context);  		if(startVPN!=null)  			context.startService(startVPN);  | 
