diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-28 15:01:35 +0000 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2019-05-29 14:00:10 +0000 |
| commit | c84648cfb607891a1b50ccc2da9764f55d6aef86 (patch) | |
| tree | 31d71aba83af38a25f601553e2daaca457c1a3cd | |
| parent | 2df12f0ac81f55b22ab086a60b42749f0ce381c9 (diff) | |
| download | mullvadvpn-c84648cfb607891a1b50ccc2da9764f55d6aef86.tar.xz mullvadvpn-c84648cfb607891a1b50ccc2da9764f55d6aef86.zip | |
Use `VpnServiceTunProvider` on Android
| -rw-r--r-- | mullvad-jni/src/lib.rs | 50 |
1 files changed, 32 insertions, 18 deletions
diff --git a/mullvad-jni/src/lib.rs b/mullvad-jni/src/lib.rs index f50aa9d0c8..e8c7e62f49 100644 --- a/mullvad-jni/src/lib.rs +++ b/mullvad-jni/src/lib.rs @@ -9,7 +9,7 @@ mod vpn_service_tun_provider; use crate::{ daemon_interface::DaemonInterface, from_java::FromJava, into_java::IntoJava, - jni_event_listener::JniEventListener, + jni_event_listener::JniEventListener, vpn_service_tun_provider::VpnServiceTunProvider, }; use jni::{ objects::{GlobalRef, JObject, JString}, @@ -20,7 +20,6 @@ use lazy_static::lazy_static; use mullvad_daemon::{logging, version, Daemon, DaemonCommandSender}; use parking_lot::{Mutex, RwLock}; use std::{collections::HashMap, path::PathBuf, sync::mpsc, thread}; -use talpid_core::tunnel::tun_provider::StubTunProvider; use talpid_types::ErrorExt; const LOG_FILENAME: &str = "daemon.log"; @@ -52,6 +51,7 @@ const CLASSES_TO_LOAD: &[&str] = &[ "net/mullvad/mullvadvpn/model/TunnelStateTransition$Disconnected", "net/mullvad/mullvadvpn/model/TunnelStateTransition$Disconnecting", "net/mullvad/mullvadvpn/MullvadDaemon", + "net/mullvad/mullvadvpn/MullvadVpnService", ]; lazy_static! { @@ -62,6 +62,9 @@ lazy_static! { #[derive(Debug, err_derive::Error)] pub enum Error { + #[error(display = "Failed to create VpnService tunnel provider")] + CreateVpnServiceTunProvider(#[error(cause)] vpn_service_tun_provider::Error), + #[error(display = "Failed to get cache directory path")] GetCacheDir(#[error(cause)] mullvad_paths::Error), @@ -77,13 +80,13 @@ pub enum Error { pub extern "system" fn Java_net_mullvad_mullvadvpn_MullvadDaemon_initialize( env: JNIEnv, this: JObject, - _vpnService: JObject, + vpnService: JObject, ) { let log_dir = start_logging(); load_classes(&env); - if let Err(error) = initialize(&env, &this, log_dir) { + if let Err(error) = initialize(&env, &this, &vpnService, log_dir) { log::error!("{}", error.display_chain()); } } @@ -117,8 +120,15 @@ fn load_class_reference(env: &JNIEnv, name: &str) -> GlobalRef { .expect("Failed to convert local reference to Java class into a global reference") } -fn initialize(env: &JNIEnv, this: &JObject, log_dir: PathBuf) -> Result<(), Error> { - let daemon_command_sender = spawn_daemon(env, this, log_dir)?; +fn initialize( + env: &JNIEnv, + this: &JObject, + vpn_service: &JObject, + log_dir: PathBuf, +) -> Result<(), Error> { + let tun_provider = + VpnServiceTunProvider::new(env, vpn_service).map_err(Error::CreateVpnServiceTunProvider)?; + let daemon_command_sender = spawn_daemon(env, this, tun_provider, log_dir)?; DAEMON_INTERFACE .lock() @@ -130,29 +140,33 @@ fn initialize(env: &JNIEnv, this: &JObject, log_dir: PathBuf) -> Result<(), Erro fn spawn_daemon( env: &JNIEnv, this: &JObject, + tun_provider: VpnServiceTunProvider, log_dir: PathBuf, ) -> Result<DaemonCommandSender, Error> { let listener = JniEventListener::spawn(env, this).map_err(Error::SpawnJniEventListener)?; let (tx, rx) = mpsc::channel(); - thread::spawn(move || match create_daemon(listener, log_dir) { - Ok(daemon) => { - let _ = tx.send(Ok(daemon.command_sender())); - match daemon.run() { - Ok(()) => log::info!("Mullvad daemon has stopped"), - Err(error) => log::error!("{}", error.display_chain()), + thread::spawn( + move || match create_daemon(listener, tun_provider, log_dir) { + Ok(daemon) => { + let _ = tx.send(Ok(daemon.command_sender())); + match daemon.run() { + Ok(()) => log::info!("Mullvad daemon has stopped"), + Err(error) => log::error!("{}", error.display_chain()), + } } - } - Err(error) => { - let _ = tx.send(Err(error)); - } - }); + Err(error) => { + let _ = tx.send(Err(error)); + } + }, + ); rx.recv().unwrap() } fn create_daemon( listener: JniEventListener, + tun_provider: VpnServiceTunProvider, log_dir: PathBuf, ) -> Result<Daemon<JniEventListener>, Error> { let resource_dir = mullvad_paths::get_resource_dir(); @@ -160,7 +174,7 @@ fn create_daemon( let daemon = Daemon::start_with_event_listener_and_tun_provider( listener, - StubTunProvider, + tun_provider, Some(log_dir), resource_dir, cache_dir, |
