diff options
| author | Linus Färnstrand <linus@mullvad.net> | 2018-06-13 16:10:27 +0200 |
|---|---|---|
| committer | Linus Färnstrand <linus@mullvad.net> | 2018-06-13 16:34:57 +0200 |
| commit | 33230c43258826bebdbbcb3f19773b4a8b95b51a (patch) | |
| tree | c0370fbbcf60385db42187a52621f1a9c7c31c3c | |
| parent | 37845664043499446a7a4508ae2ef9eb1f487309 (diff) | |
| download | mullvadvpn-33230c43258826bebdbbcb3f19773b4a8b95b51a.tar.xz mullvadvpn-33230c43258826bebdbbcb3f19773b4a8b95b51a.zip | |
Move RPC address file computation into mullvad-paths
| -rw-r--r-- | mullvad-daemon/src/cli.rs | 2 | ||||
| -rw-r--r-- | mullvad-daemon/src/rpc_address_file.rs | 6 | ||||
| -rw-r--r-- | mullvad-daemon/src/system_service.rs | 5 | ||||
| -rw-r--r-- | mullvad-daemon/tests/startup.rs | 5 | ||||
| -rw-r--r-- | mullvad-ipc-client/Cargo.toml | 2 | ||||
| -rw-r--r-- | mullvad-ipc-client/src/lib.rs | 73 | ||||
| -rw-r--r-- | mullvad-paths/src/lib.rs | 3 | ||||
| -rw-r--r-- | mullvad-paths/src/logs.rs | 7 | ||||
| -rw-r--r-- | mullvad-paths/src/rpc_address.rs | 25 |
9 files changed, 63 insertions, 65 deletions
diff --git a/mullvad-daemon/src/cli.rs b/mullvad-daemon/src/cli.rs index 48c039011c..ffb4a62586 100644 --- a/mullvad-daemon/src/cli.rs +++ b/mullvad-daemon/src/cli.rs @@ -1,8 +1,6 @@ use clap::{App, Arg}; use log; -use std::path::PathBuf; - use version; pub struct Config { diff --git a/mullvad-daemon/src/rpc_address_file.rs b/mullvad-daemon/src/rpc_address_file.rs index 25ed92daa4..c8b0f2beee 100644 --- a/mullvad-daemon/src/rpc_address_file.rs +++ b/mullvad-daemon/src/rpc_address_file.rs @@ -2,7 +2,7 @@ use std::fs::{self, File, OpenOptions}; use std::io::{self, Write}; use std::path::{Path, PathBuf}; -use mullvad_ipc_client::rpc_file_path; +use mullvad_paths; error_chain! { errors { @@ -32,7 +32,7 @@ pub fn write(rpc_address: &str, shared_secret: &str) -> Result<()> { // Avoids opening an existing file owned by another user and writing sensitive data to it. remove()?; - let file_path = rpc_file_path().chain_err(|| ErrorKind::UnknownFilePath)?; + let file_path = mullvad_paths::get_rpc_address_path().chain_err(|| ErrorKind::UnknownFilePath)?; if let Some(parent_dir) = file_path.parent() { fs::create_dir_all(parent_dir) @@ -49,7 +49,7 @@ pub fn write(rpc_address: &str, shared_secret: &str) -> Result<()> { /// Removes the RPC file, if it exists. pub fn remove() -> Result<()> { - let file_path = rpc_file_path().chain_err(|| ErrorKind::UnknownFilePath)?; + let file_path = mullvad_paths::get_rpc_address_path().chain_err(|| ErrorKind::UnknownFilePath)?; if let Err(error) = fs::remove_file(&file_path) { if error.kind() == io::ErrorKind::NotFound { diff --git a/mullvad-daemon/src/system_service.rs b/mullvad-daemon/src/system_service.rs index e79628a590..1e602f75bb 100644 --- a/mullvad-daemon/src/system_service.rs +++ b/mullvad-daemon/src/system_service.rs @@ -233,10 +233,7 @@ fn get_service_info() -> Result<ServiceInfo> { start_type: ServiceStartType::AutoStart, error_control: ServiceErrorControl::Normal, executable_path: env::current_exe().unwrap(), - launch_arguments: vec![ - OsString::from("--run-as-service"), - OsString::from("-v"), - ], + launch_arguments: vec![OsString::from("--run-as-service"), OsString::from("-v")], account_name: None, // run as System account_password: None, }) diff --git a/mullvad-daemon/tests/startup.rs b/mullvad-daemon/tests/startup.rs index 93631335dc..f273ee2ca3 100644 --- a/mullvad-daemon/tests/startup.rs +++ b/mullvad-daemon/tests/startup.rs @@ -1,6 +1,7 @@ #[macro_use] extern crate duct; extern crate mullvad_ipc_client; +extern crate mullvad_paths; extern crate os_pipe; extern crate talpid_ipc; @@ -10,8 +11,6 @@ use std::fs::{self, Metadata}; use std::io; use std::time::Duration; -use mullvad_ipc_client::rpc_file_path; - use common::DaemonRunner; use platform_specific::*; @@ -20,7 +19,7 @@ use platform_specific::*; #[cfg(not(windows))] #[test] fn rpc_info_file_permissions() { - let rpc_file = rpc_file_path().unwrap(); + let rpc_file = mullvad_paths::get_rpc_address_path().unwrap(); if let Err(error) = fs::remove_file(&rpc_file) { if error.kind() != io::ErrorKind::NotFound { diff --git a/mullvad-ipc-client/Cargo.toml b/mullvad-ipc-client/Cargo.toml index 88c2006a29..cc16d21585 100644 --- a/mullvad-ipc-client/Cargo.toml +++ b/mullvad-ipc-client/Cargo.toml @@ -11,6 +11,4 @@ mullvad-types = { path = "../mullvad-types" } serde = "1.0" talpid-ipc = { path = "../talpid-ipc" } talpid-types = { path = "../talpid-types" } - -[target.'cfg(windows)'.dependencies] mullvad-paths = { path = "../mullvad-paths" } diff --git a/mullvad-ipc-client/src/lib.rs b/mullvad-ipc-client/src/lib.rs index 53d9c6dffd..48af377793 100644 --- a/mullvad-ipc-client/src/lib.rs +++ b/mullvad-ipc-client/src/lib.rs @@ -1,5 +1,6 @@ #[macro_use] extern crate error_chain; +extern crate mullvad_paths; extern crate mullvad_types; extern crate serde; extern crate talpid_ipc; @@ -20,7 +21,6 @@ use talpid_ipc::WsIpcClient; use talpid_types::net::TunnelOptions; use platform_specific::ensure_written_by_admin; -pub use platform_specific::rpc_file_path; error_chain! { errors { @@ -28,30 +28,30 @@ error_chain! { description("Failed to authenticate the connection with the daemon") } - EmptyRpcFile(file_path: String) { + EmptyRpcFile(path: PathBuf) { description("RPC connection file is empty") - display("RPC connection file \"{}\" is empty", file_path) + display("RPC connection file \"{}\" is empty", path.display()) } - InsecureRpcFile(file_path: String) { + InsecureRpcFile(path: PathBuf) { description( "RPC connection file is insecure because it might not have been written by an \ administrator user" ) display( "RPC connection file \"{}\" is insecure because it might not have been written by \ - an administrator user", file_path + an administrator user", path.display() ) } - MissingRpcCredentials(file_path: String) { + MissingRpcCredentials(path: PathBuf) { description("no credentials found in RPC connection file") - display("no credentials found in RPC connection file {}", file_path) + display("no credentials found in RPC connection file {}", path.display()) } - ReadRpcFileError(file_path: String) { + ReadRpcFileError(path: PathBuf) { description("Failed to read RPC connection information") - display("Failed to read RPC connection information from {}", file_path) + display("Failed to read RPC connection information from {}", path.display()) } RpcCallError(method: String) { @@ -63,10 +63,9 @@ error_chain! { description("Failed to start RPC client") display("Failed to start RPC client to {}", address) } - - UnknownRpcFilePath { - description("Failed to determine RPC connection information file path") - } + } + links { + UnknownRpcAddressPath(mullvad_paths::Error, mullvad_paths::ErrorKind); } } @@ -91,28 +90,23 @@ impl DaemonRpcClient { } fn read_rpc_file() -> Result<(String, String)> { - let file_path = rpc_file_path()?; - let file_path_string = || file_path.display().to_string(); + let file_path = mullvad_paths::get_rpc_address_path()?; let rpc_file = - File::open(&file_path).chain_err(|| ErrorKind::ReadRpcFileError(file_path_string()))?; + File::open(&file_path).chain_err(|| ErrorKind::ReadRpcFileError(file_path.clone()))?; - let file_metadata = rpc_file - .metadata() - .chain_err(|| ErrorKind::ReadRpcFileError(file_path_string()))?; - - ensure_written_by_admin(&file_path, file_metadata)?; + ensure_written_by_admin(&file_path)?; let reader = BufReader::new(rpc_file); let mut lines = reader.lines(); let address = lines .next() - .ok_or_else(|| ErrorKind::EmptyRpcFile(file_path_string()))? - .chain_err(|| ErrorKind::ReadRpcFileError(file_path_string()))?; + .ok_or_else(|| ErrorKind::EmptyRpcFile(file_path.clone()))? + .chain_err(|| ErrorKind::ReadRpcFileError(file_path.clone()))?; let credentials = lines .next() - .ok_or_else(|| ErrorKind::MissingRpcCredentials(file_path_string()))? - .chain_err(|| ErrorKind::ReadRpcFileError(file_path_string()))?; + .ok_or_else(|| ErrorKind::MissingRpcCredentials(file_path.clone()))? + .chain_err(|| ErrorKind::ReadRpcFileError(file_path.clone()))?; Ok((address, credentials)) } @@ -206,17 +200,18 @@ mod platform_specific { use super::*; - pub fn rpc_file_path() -> Result<PathBuf> { - Ok(Path::new("/tmp/.mullvad_rpc_address").to_path_buf()) - } + pub fn ensure_written_by_admin<P: AsRef<Path>>(path: P) -> Result<()> { + let path = path.as_ref(); + let metadata = path + .metadata() + .chain_err(|| ErrorKind::ReadRpcFileError(path.to_owned()))?; - pub fn ensure_written_by_admin<P: AsRef<Path>>(file_path: P, metadata: Metadata) -> Result<()> { let is_owned_by_root = metadata.uid() == 0; let is_read_only_by_non_owner = (metadata.mode() & 0o022) == 0; ensure!( is_owned_by_root && is_read_only_by_non_owner, - ErrorKind::InsecureRpcFile(file_path.as_ref().display().to_string()) + ErrorKind::InsecureRpcFile(path.to_owned()) ); Ok(()) @@ -225,25 +220,9 @@ mod platform_specific { #[cfg(windows)] mod platform_specific { - extern crate mullvad_paths; - use super::*; - use self::mullvad_paths::PRODUCT_NAME; - - pub fn rpc_file_path() -> Result<PathBuf> { - let shared_data_directory = - ::std::env::var_os("ALLUSERSPROFILE").ok_or_else(|| ErrorKind::UnknownRpcFilePath)?; - - Ok(PathBuf::from(shared_data_directory) - .join(PRODUCT_NAME) - .join(".mullvad_rpc_address")) - } - - pub fn ensure_written_by_admin<P: AsRef<Path>>( - _file_path: P, - _metadata: Metadata, - ) -> Result<()> { + pub fn ensure_written_by_admin<P: AsRef<Path>>(_file_path: P) -> Result<()> { // TODO: Check permissions correctly Ok(()) } diff --git a/mullvad-paths/src/lib.rs b/mullvad-paths/src/lib.rs index 8447a77d69..861e8452d8 100644 --- a/mullvad-paths/src/lib.rs +++ b/mullvad-paths/src/lib.rs @@ -31,5 +31,8 @@ pub use logs::{get_log_dir, log_dir}; mod resources; pub use resources::get_resource_dir; +mod rpc_address; +pub use rpc_address::get_rpc_address_path; + mod settings; pub use settings::get_settings_dir; diff --git a/mullvad-paths/src/logs.rs b/mullvad-paths/src/logs.rs index 822fc92c4c..34b7ae312c 100644 --- a/mullvad-paths/src/logs.rs +++ b/mullvad-paths/src/logs.rs @@ -1,7 +1,7 @@ use {ErrorKind, Result, ResultExt}; -use std::fs; use std::env; +use std::fs; use std::path::PathBuf; /// Creates and returns the logging directory. @@ -26,8 +26,7 @@ fn get_default_log_dir() -> Result<PathBuf> { #[cfg(windows)] fn get_default_log_dir() -> Result<PathBuf> { - let program_data_dir = Path::new( - ::std::env::var_os("ALLUSERSPROFILE").ok_or_else(|| ErrorKind::NoProgramDataDir)?, - ); + let program_data_dir = + Path::new(env::var_os("ALLUSERSPROFILE").ok_or_else(|| ErrorKind::NoProgramDataDir)?); Ok(program_data_dir.join(::PRODUCT_NAME)) } diff --git a/mullvad-paths/src/rpc_address.rs b/mullvad-paths/src/rpc_address.rs new file mode 100644 index 0000000000..dd26c17c7d --- /dev/null +++ b/mullvad-paths/src/rpc_address.rs @@ -0,0 +1,25 @@ +use Result; + +use std::env; +use std::path::PathBuf; + +const RPC_ADDRESS_FILENAME: &str = ".mullvad_rpc_address"; + +pub fn get_rpc_address_path() -> Result<PathBuf> { + match env::var_os("MULLVAD_RPC_ADDRESS_PATH") { + Some(path) => Ok(PathBuf::from(path)), + None => get_default_rpc_address_dir().map(|dir| dir.join(RPC_ADDRESS_FILENAME)), + } +} + +#[cfg(unix)] +fn get_default_rpc_address_dir() -> Result<PathBuf> { + Ok(PathBuf::from("/tmp")) +} + +#[cfg(windows)] +fn get_default_rpc_address_dir() -> Result<PathBuf> { + let program_data_dir = + env::var_os("ALLUSERSPROFILE").ok_or_else(|| ::ErrorKind::NoProgramDataDir)?; + Ok(Path::new(program_data_dir).join(::PRODUCT_NAME)) +} |
