summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2018-06-13 16:10:27 +0200
committerLinus Färnstrand <linus@mullvad.net>2018-06-13 16:34:57 +0200
commit33230c43258826bebdbbcb3f19773b4a8b95b51a (patch)
treec0370fbbcf60385db42187a52621f1a9c7c31c3c
parent37845664043499446a7a4508ae2ef9eb1f487309 (diff)
downloadmullvadvpn-33230c43258826bebdbbcb3f19773b4a8b95b51a.tar.xz
mullvadvpn-33230c43258826bebdbbcb3f19773b4a8b95b51a.zip
Move RPC address file computation into mullvad-paths
-rw-r--r--mullvad-daemon/src/cli.rs2
-rw-r--r--mullvad-daemon/src/rpc_address_file.rs6
-rw-r--r--mullvad-daemon/src/system_service.rs5
-rw-r--r--mullvad-daemon/tests/startup.rs5
-rw-r--r--mullvad-ipc-client/Cargo.toml2
-rw-r--r--mullvad-ipc-client/src/lib.rs73
-rw-r--r--mullvad-paths/src/lib.rs3
-rw-r--r--mullvad-paths/src/logs.rs7
-rw-r--r--mullvad-paths/src/rpc_address.rs25
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))
+}