summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-07-29 06:52:09 -0300
committerJanito Vaqueiro Ferreira Filho <janito@mullvad.net>2019-07-29 06:52:09 -0300
commit8040ffc95132450c5faea766292369d3e6dda283 (patch)
tree62c2445506ceeb87268ef1a42fc4eeff8a96fe65
parent3c392d6f4192983148285df7eb2a7ac9bacc1d1c (diff)
parentdec65fe1757e94e39de9c9476da46a1431fd5a1e (diff)
downloadmullvadvpn-8040ffc95132450c5faea766292369d3e6dda283.tar.xz
mullvadvpn-8040ffc95132450c5faea766292369d3e6dda283.zip
Merge branch 'automatically-retry-key-generation'
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt5
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt2
-rw-r--r--android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt15
-rw-r--r--mullvad-jni/src/lib.rs18
4 files changed, 27 insertions, 13 deletions
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
index f5fbab1526..d16e36a1b6 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MainActivity.kt
@@ -87,6 +87,11 @@ class MainActivity : FragmentActivity() {
}
}
+ override fun onResume() {
+ super.onResume()
+ keyStatusListener.onResume()
+ }
+
override fun onStop() {
unbindService(serviceConnection)
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
index 769a2f1ad9..e88355c274 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/MullvadDaemon.kt
@@ -22,7 +22,7 @@ class MullvadDaemon(val vpnService: MullvadVpnService) {
external fun connect()
external fun disconnect()
- external fun generateWireguardKey(): Boolean
+ external fun generateWireguardKey(): KeygenEvent?
external fun getAccountData(accountToken: String): AccountData?
external fun getCurrentLocation(): GeoIpLocation?
external fun getRelayLocations(): RelayList
diff --git a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt
index 1279f59567..66b7a96e44 100644
--- a/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt
+++ b/android/src/main/kotlin/net/mullvad/mullvadvpn/dataproxy/KeyStatusListener.kt
@@ -4,12 +4,14 @@ import kotlinx.coroutines.launch
import kotlinx.coroutines.Deferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.Job
import net.mullvad.mullvadvpn.MullvadDaemon
import net.mullvad.mullvadvpn.model.KeygenEvent
class KeyStatusListener(val asyncDaemon: Deferred<MullvadDaemon>) {
private var daemon: MullvadDaemon? = null
+ private var retryJob: Job? = null
private val setUpJob = setUp()
@@ -38,8 +40,21 @@ class KeyStatusListener(val asyncDaemon: Deferred<MullvadDaemon>) {
daemon?.onKeygenEvent = { event -> keyStatus = event }
}
+ fun onResume() {
+ if (keyStatus is KeygenEvent.TooManyKeys || keyStatus is KeygenEvent.GenerationFailure) {
+ retryJob?.cancel()
+ retryJob = retryKeyGeneration()
+ }
+ }
+
fun onDestroy() {
setUpJob.cancel()
+ retryJob?.cancel()
daemon?.onKeygenEvent = null
}
+
+ private fun retryKeyGeneration() = GlobalScope.launch(Dispatchers.Default) {
+ setUpJob.join()
+ keyStatus = daemon?.generateWireguardKey()
+ }
}
diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs
index 284bea94d6..5dec981e5e 100644
--- a/mullvad-jni/src/lib.rs
+++ b/mullvad-jni/src/lib.rs
@@ -18,7 +18,6 @@ use jni::{
};
use lazy_static::lazy_static;
use mullvad_daemon::{logging, version, Daemon, DaemonCommandSender};
-use mullvad_types::wireguard::KeygenEvent;
use parking_lot::RwLock;
use std::{
collections::HashMap,
@@ -244,23 +243,18 @@ pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_disconnect(_: J
#[no_mangle]
#[allow(non_snake_case)]
-pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_generateWireguardKey(
- _: JNIEnv,
+pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_generateWireguardKey<'env>(
+ env: JNIEnv<'env>,
_: JObject,
-) -> jboolean {
+) -> JObject<'env> {
match DAEMON_INTERFACE.generate_wireguard_key() {
- Ok(KeygenEvent::NewKey(_)) => JNI_TRUE,
- // TODO: Handle the new result better.
- Ok(keygen_failure) => {
- log::error!("Failed to generate wireguard key {:?}", keygen_failure);
- JNI_FALSE
- }
+ Ok(keygen_event) => keygen_event.into_java(&env),
Err(error) => {
log::error!(
"{}",
- error.display_chain_with_msg("Failed to generate wireguard key")
+ error.display_chain_with_msg("Failed to request to generate wireguard key")
);
- JNI_FALSE
+ JObject::null()
}
}
}