summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorLinus Färnstrand <linus@mullvad.net>2017-11-02 11:09:59 +0100
committerLinus Färnstrand <linus@mullvad.net>2017-11-02 11:09:59 +0100
commitc9cf96dc6b91bad62a5bf04e943e109a9f14be80 (patch)
treecd4ebe863d5b5635b943ac4450ec0941612cc8f6
parent2761c4a61103a64c42fcea39b41b4f3a5741a55c (diff)
parentf1f244a0e1e2a0c182c6cc7a144ed120a9ab046c (diff)
downloadmullvadvpn-c9cf96dc6b91bad62a5bf04e943e109a9f14be80.tar.xz
mullvadvpn-c9cf96dc6b91bad62a5bf04e943e109a9f14be80.zip
Merge branch 'generalize-constraint'
-rw-r--r--mullvad-cli/src/cmds/relay.rs51
-rw-r--r--mullvad-daemon/src/main.rs16
-rw-r--r--mullvad-daemon/src/settings.rs9
-rw-r--r--mullvad-types/src/relay_constraints.rs68
4 files changed, 68 insertions, 76 deletions
diff --git a/mullvad-cli/src/cmds/relay.rs b/mullvad-cli/src/cmds/relay.rs
index 68582562f9..817ae17b3a 100644
--- a/mullvad-cli/src/cmds/relay.rs
+++ b/mullvad-cli/src/cmds/relay.rs
@@ -1,8 +1,8 @@
-use {Command, Result};
+use {Command, Result, ResultExt};
use clap;
+use std::str::FromStr;
-use mullvad_types::relay_constraints::{HostConstraint, OpenVpnConstraintsUpdate, PortConstraint,
- ProtocolConstraint, RelayConstraints,
+use mullvad_types::relay_constraints::{Constraint, OpenVpnConstraintsUpdate, RelayConstraints,
RelayConstraintsUpdate, TunnelConstraintsUpdate};
use rpc;
@@ -38,7 +38,7 @@ impl Command for Relay {
.arg(
clap::Arg::with_name("protocol")
.required(true)
- .possible_values(&["udp", "tcp"]),
+ .possible_values(&["any", "udp", "tcp"]),
),
),
)
@@ -67,14 +67,14 @@ impl Relay {
let host = value_t_or_exit!(host_matches.value_of("host"), String);
self.update_constraints(RelayConstraintsUpdate {
- host: Some(HostConstraint::Host(host)),
+ host: Some(Constraint::Only(host)),
tunnel: TunnelConstraintsUpdate::OpenVpn(OpenVpnConstraintsUpdate {
port: None,
protocol: None,
}),
})
} else if let Some(port_matches) = matches.subcommand_matches("port") {
- let port = parse_port(port_matches.value_of("port"))?;
+ let port = parse_port(port_matches.value_of("port").unwrap())?;
self.update_constraints(RelayConstraintsUpdate {
host: None,
@@ -84,7 +84,7 @@ impl Relay {
}),
})
} else if let Some(protocol_matches) = matches.subcommand_matches("protocol") {
- let protocol = parse_protocol(protocol_matches.value_of("protocol"))?;
+ let protocol = parse_protocol(protocol_matches.value_of("protocol").unwrap());
self.update_constraints(RelayConstraintsUpdate {
host: None,
@@ -106,30 +106,23 @@ impl Relay {
}
}
-fn parse_port(raw_port: Option<&str>) -> Result<PortConstraint> {
- if let Some(s) = raw_port {
- let res = u16::from_str_radix(s, 10);
- match res {
- Ok(num) => Ok(PortConstraint::Port(num)),
- Err(_) => if s.to_lowercase() == "any" {
- Ok(PortConstraint::Any)
- } else {
- bail!("not 'any' or a short".to_owned())
- },
- }
- } else {
- bail!("not 'any' or a short".to_owned())
+
+fn parse_port(raw_port: &str) -> Result<Constraint<u16>> {
+ match raw_port.to_lowercase().as_str() {
+ "any" => Ok(Constraint::Any),
+ port => Ok(Constraint::Only(
+ u16::from_str(port).chain_err(|| "Invalid port")?,
+ )),
}
}
-fn parse_protocol(raw_protocol: Option<&str>) -> Result<ProtocolConstraint> {
- if let Some(s) = raw_protocol {
- if s.to_lowercase() == "any" {
- return Ok(ProtocolConstraint::Any);
- } else if ["udp", "tcp"].contains(&s) {
- return Ok(ProtocolConstraint::Protocol(TransportProtocol::Udp));
- }
+/// Parses a protocol constraint string. Can be infallible because the possible values are limited
+/// with clap.
+fn parse_protocol(raw_protocol: &str) -> Constraint<TransportProtocol> {
+ match raw_protocol.to_lowercase().as_str() {
+ "any" => Constraint::Any,
+ "udp" => Constraint::Only(TransportProtocol::Udp),
+ "tcp" => Constraint::Only(TransportProtocol::Tcp),
+ _ => unreachable!(),
}
-
- bail!("not 'udp' or 'tcp'".to_owned())
}
diff --git a/mullvad-daemon/src/main.rs b/mullvad-daemon/src/main.rs
index e4edb30527..73a77e2008 100644
--- a/mullvad-daemon/src/main.rs
+++ b/mullvad-daemon/src/main.rs
@@ -49,8 +49,7 @@ use jsonrpc_core::futures::sync::oneshot::Sender as OneshotSender;
use management_interface::{BoxFuture, ManagementInterfaceServer, TunnelCommand};
use mullvad_rpc::{AccountsProxy, HttpHandle};
use mullvad_types::account::{AccountData, AccountToken};
-use mullvad_types::relay_constraints::{HostConstraint, OpenVpnConstraints, PortConstraint,
- ProtocolConstraint, RelayConstraints,
+use mullvad_types::relay_constraints::{Constraint, OpenVpnConstraints, RelayConstraints,
RelayConstraintsUpdate, TunnelConstraints};
use mullvad_types::relay_endpoint::RelayEndpoint;
use mullvad_types::states::{DaemonState, SecurityState, TargetState};
@@ -532,8 +531,8 @@ impl Daemon {
let relay_constraints = self.settings.get_relay_constraints();
let host = match relay_constraints.host {
- HostConstraint::Any => format!("{}", self.relay_iter.next().unwrap().address),
- HostConstraint::Host(host) => host,
+ Constraint::Any => format!("{}", self.relay_iter.next().unwrap().address),
+ Constraint::Only(host) => host,
};
match relay_constraints.tunnel {
@@ -547,13 +546,12 @@ impl Daemon {
constraints: OpenVpnConstraints,
) -> Result<Endpoint> {
let protocol = match constraints.protocol {
- ProtocolConstraint::Any => TransportProtocol::Udp,
- ProtocolConstraint::Protocol(protocol) => protocol,
+ Constraint::Any => TransportProtocol::Udp,
+ Constraint::Only(protocol) => protocol,
};
-
let port = match constraints.port {
- PortConstraint::Any => randomize_port(protocol),
- PortConstraint::Port(port) => port,
+ Constraint::Any => randomize_port(protocol),
+ Constraint::Only(port) => port,
};
RelayEndpoint {
diff --git a/mullvad-daemon/src/settings.rs b/mullvad-daemon/src/settings.rs
index d1a852c11d..10cf63123a 100644
--- a/mullvad-daemon/src/settings.rs
+++ b/mullvad-daemon/src/settings.rs
@@ -3,8 +3,7 @@ extern crate serde_json;
use self::app_dirs::{AppDataType, AppInfo};
-use mullvad_types::relay_constraints::{HostConstraint, OpenVpnConstraints, PortConstraint,
- ProtocolConstraint, RelayConstraints,
+use mullvad_types::relay_constraints::{Constraint, OpenVpnConstraints, RelayConstraints,
RelayConstraintsUpdate, TunnelConstraints};
use std::fs::File;
use std::io;
@@ -52,10 +51,10 @@ impl Default for Settings {
const DEFAULT_SETTINGS: Settings = Settings {
account_token: None,
relay_constraints: RelayConstraints {
- host: HostConstraint::Any,
+ host: Constraint::Any,
tunnel: TunnelConstraints::OpenVpn(OpenVpnConstraints {
- port: PortConstraint::Any,
- protocol: ProtocolConstraint::Any,
+ port: Constraint::Any,
+ protocol: Constraint::Any,
}),
},
};
diff --git a/mullvad-types/src/relay_constraints.rs b/mullvad-types/src/relay_constraints.rs
index 26a3a04f84..aa55e55c22 100644
--- a/mullvad-types/src/relay_constraints.rs
+++ b/mullvad-types/src/relay_constraints.rs
@@ -1,9 +1,27 @@
+use std::fmt;
use talpid_types::net::TransportProtocol;
-#[derive(Debug, Clone, Deserialize, Serialize, Eq, PartialEq)]
+
+#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
+#[serde(rename_all = "snake_case")]
+pub enum Constraint<T: fmt::Debug + Clone + Eq + PartialEq> {
+ Any,
+ Only(T),
+}
+
+impl<T: fmt::Debug + Clone + Eq + PartialEq> Default for Constraint<T> {
+ fn default() -> Self {
+ Constraint::Any
+ }
+}
+
+impl<T: Copy + fmt::Debug + Clone + Eq + PartialEq> Copy for Constraint<T> {}
+
+
+#[derive(Debug, Default, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct RelayConstraints {
- pub host: HostConstraint,
+ pub host: Constraint<String>,
pub tunnel: TunnelConstraints,
}
@@ -17,12 +35,18 @@ impl RelayConstraints {
}
-#[derive(Debug, Clone, Deserialize, Serialize, Eq, PartialEq)]
+#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum TunnelConstraints {
#[serde(rename = "openvpn")] OpenVpn(OpenVpnConstraints),
}
+impl Default for TunnelConstraints {
+ fn default() -> Self {
+ TunnelConstraints::OpenVpn(OpenVpnConstraints::default())
+ }
+}
+
impl TunnelConstraints {
pub fn merge(&mut self, update: TunnelConstraintsUpdate) -> Self {
match *self {
@@ -35,18 +59,18 @@ impl TunnelConstraints {
}
}
-#[derive(Debug, Clone, Deserialize, Serialize, Eq, PartialEq)]
+#[derive(Debug, Default, Clone, Eq, PartialEq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct OpenVpnConstraints {
- pub port: PortConstraint,
- pub protocol: ProtocolConstraint,
+ pub port: Constraint<u16>,
+ pub protocol: Constraint<TransportProtocol>,
}
impl OpenVpnConstraints {
pub fn merge(&mut self, update: OpenVpnConstraintsUpdate) -> Self {
OpenVpnConstraints {
port: update.port.unwrap_or_else(|| self.port.clone()),
- protocol: update.protocol.unwrap_or_else(|| self.protocol.clone()),
+ protocol: update.protocol.unwrap_or(self.protocol),
}
}
}
@@ -55,7 +79,7 @@ impl OpenVpnConstraints {
#[derive(Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct RelayConstraintsUpdate {
- pub host: Option<HostConstraint>,
+ pub host: Option<Constraint<String>>,
pub tunnel: TunnelConstraintsUpdate,
}
@@ -65,31 +89,9 @@ pub enum TunnelConstraintsUpdate {
#[serde(rename = "openvpn")] OpenVpn(OpenVpnConstraintsUpdate),
}
-#[derive(Debug, Deserialize, Serialize)]
+#[derive(Debug, Default, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub struct OpenVpnConstraintsUpdate {
- pub port: Option<PortConstraint>,
- pub protocol: Option<ProtocolConstraint>,
-}
-
-
-#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
-#[serde(rename_all = "snake_case")]
-pub enum HostConstraint {
- Any,
- Host(String),
-}
-
-#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
-#[serde(rename_all = "snake_case")]
-pub enum PortConstraint {
- Any,
- Port(u16),
-}
-
-#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
-#[serde(rename_all = "snake_case")]
-pub enum ProtocolConstraint {
- Any,
- Protocol(TransportProtocol),
+ pub port: Option<Constraint<u16>>,
+ pub protocol: Option<Constraint<TransportProtocol>>,
}