diff options
| author | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-04-23 19:36:06 -0300 |
|---|---|---|
| committer | Janito Vaqueiro Ferreira Filho <janito@mullvad.net> | 2018-05-03 14:51:17 -0300 |
| commit | d4c110b635be72bffb0acfa709f18a37cbe7b4ab (patch) | |
| tree | 8afec9ef5533a381f6e603337c54180bb1531b16 /mullvad-cli/src | |
| parent | 3ca2971a0aeaa8151e714f031f8a836601b10242 (diff) | |
| download | mullvadvpn-d4c110b635be72bffb0acfa709f18a37cbe7b4ab.tar.xz mullvadvpn-d4c110b635be72bffb0acfa709f18a37cbe7b4ab.zip | |
Use `mullvad-ipc-client` in `mullvad-cli`
Diffstat (limited to 'mullvad-cli/src')
| -rw-r--r-- | mullvad-cli/src/main.rs | 10 | ||||
| -rw-r--r-- | mullvad-cli/src/rpc.rs | 90 |
2 files changed, 12 insertions, 88 deletions
diff --git a/mullvad-cli/src/main.rs b/mullvad-cli/src/main.rs index 69b9c8905b..0f92cebff0 100644 --- a/mullvad-cli/src/main.rs +++ b/mullvad-cli/src/main.rs @@ -11,13 +11,9 @@ extern crate clap; extern crate env_logger; #[macro_use] extern crate error_chain; -#[macro_use] -extern crate lazy_static; -#[macro_use] -extern crate log; +extern crate mullvad_ipc_client; extern crate mullvad_types; extern crate serde; -extern crate talpid_ipc; extern crate talpid_types; mod cmds; @@ -31,6 +27,10 @@ error_chain! { Io(io::Error); ParseIntError(::std::num::ParseIntError); } + + links { + RpcError(mullvad_ipc_client::Error, mullvad_ipc_client::ErrorKind); + } } quick_main!(run); diff --git a/mullvad-cli/src/rpc.rs b/mullvad-cli/src/rpc.rs index a355175c55..946f69afc0 100644 --- a/mullvad-cli/src/rpc.rs +++ b/mullvad-cli/src/rpc.rs @@ -1,90 +1,14 @@ -use serde; -use {Result, ResultExt}; +use serde::{Deserialize, Serialize}; -use std::fs::{File, Metadata}; -use std::io::{BufRead, BufReader}; -#[cfg(unix)] -use std::path::Path; -use std::path::PathBuf; +use super::Result; -use talpid_ipc::WsIpcClient; +use mullvad_ipc_client::DaemonRpcClient; pub fn call<T, O>(method: &str, args: &T) -> Result<O> where - T: serde::Serialize, - O: for<'de> serde::Deserialize<'de>, + T: Serialize, + O: for<'de> Deserialize<'de>, { - call_internal(method, args).chain_err(|| "Unable to call backend over RPC") -} - -pub fn call_internal<T, O>(method: &str, args: &T) -> Result<O> -where - T: serde::Serialize, - O: for<'de> serde::Deserialize<'de>, -{ - let (address, _shared_secret) = read_rpc_address().chain_err(|| "Unable to read RPC address")?; - info!("Using RPC address {}", address); - let mut rpc_client = WsIpcClient::new(address).chain_err(|| "Unable to create RPC client")?; - rpc_client - .call(method, args) - .chain_err(|| format!("Unable to call RPC method {}", method)) -} - - -#[cfg(unix)] -lazy_static! { - /// The path to the file where we read the RPC address - static ref RPC_ADDRESS_FILE_PATH: PathBuf = Path::new("/tmp").join(".mullvad_rpc_address"); -} - -#[cfg(not(unix))] -lazy_static! { - /// The path to the file where we read the RPC address - static ref RPC_ADDRESS_FILE_PATH: PathBuf = { - let windows_directory = ::std::env::var_os("WINDIR").unwrap(); - PathBuf::from(windows_directory).join("Temp").join(".mullvad_rpc_address") - }; -} - -fn read_rpc_address() -> Result<(String, String)> { - let file = open_rpc_file()?; - let mut buf_file = BufReader::new(file); - let mut address = String::new(); - buf_file.read_line(&mut address)?; - let mut shared_secret = String::new(); - buf_file.read_line(&mut shared_secret)?; - Ok((address, shared_secret)) -} - -fn open_rpc_file() -> Result<File> { - debug!( - "Trying to read RPC address at {}", - RPC_ADDRESS_FILE_PATH.to_string_lossy() - ); - let file = File::open(&*RPC_ADDRESS_FILE_PATH)?; - ensure_written_by_admin(file.metadata()?).chain_err(|| "Refusing to trust RPC file")?; - - Ok(file) -} - -#[cfg(unix)] -fn ensure_written_by_admin(metadata: Metadata) -> Result<()> { - use std::os::unix::fs::MetadataExt; - - let is_owned_by_root = metadata.uid() == 0; - let is_read_only_by_non_owner = (metadata.mode() & 0o022) == 0; - - ensure!(is_owned_by_root, "RPC file is not owned by root"); - ensure!( - is_read_only_by_non_owner, - "RPC file is writable by non-root users" - ); - - Ok(()) -} - -#[cfg(windows)] -fn ensure_written_by_admin(_metadata: Metadata) -> Result<()> { - // TODO: Check permissions correctly - Ok(()) + let rpc = DaemonRpcClient::new()?; + Ok(rpc.call(method, args)?) } |
