summaryrefslogtreecommitdiffhomepage
path: root/mullvad-daemon/src
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2021-02-08 17:22:32 +0100
committerDavid Lönnhager <david.l@mullvad.net>2021-02-10 11:23:23 +0100
commit0a6747ef4a7f0139d0a9f63055deddbb8ada247f (patch)
tree382b99178eee231422200b4d57833490c62b39b6 /mullvad-daemon/src
parentad0b9d39f439487650fca1fe5480b7b61ac03ab6 (diff)
downloadmullvadvpn-0a6747ef4a7f0139d0a9f63055deddbb8ada247f.tar.xz
mullvadvpn-0a6747ef4a7f0139d0a9f63055deddbb8ada247f.zip
Update IPC interface to handle multiple providers
Diffstat (limited to 'mullvad-daemon/src')
-rw-r--r--mullvad-daemon/src/management_interface.rs52
1 files changed, 34 insertions, 18 deletions
diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs
index 7faa0eee14..c87b846387 100644
--- a/mullvad-daemon/src/management_interface.rs
+++ b/mullvad-daemon/src/management_interface.rs
@@ -13,7 +13,7 @@ use mullvad_types::{
location::GeoIpLocation,
relay_constraints::{
BridgeConstraints, BridgeSettings, BridgeState, Constraint, LocationConstraint,
- OpenVpnConstraints, Provider, RelayConstraintsUpdate, RelaySettings, RelaySettingsUpdate,
+ OpenVpnConstraints, Providers, RelayConstraintsUpdate, RelaySettings, RelaySettingsUpdate,
WireguardConstraints,
},
relay_list::{Relay, RelayList, RelayListCountry},
@@ -241,12 +241,20 @@ impl ManagementService for ManagementServiceImpl {
None => Constraint::Any,
Some(location) => convert_proto_location(location),
};
- let provider = match constraints.provider.as_ref() {
- "" => Constraint::Any,
- provider => Constraint::Only(String::from(provider)),
+ let providers = if constraints.providers.is_empty() {
+ Constraint::Any
+ } else {
+ Constraint::Only(
+ Providers::new(constraints.providers.clone().into_iter()).map_err(
+ |_| Status::invalid_argument("must specify at least one provider"),
+ )?,
+ )
};
- BridgeSettings::Normal(BridgeConstraints { location, provider })
+ BridgeSettings::Normal(BridgeConstraints {
+ location,
+ providers,
+ })
}
BridgeSettingType::Local(proxy_settings) => {
let peer = proxy_settings
@@ -928,15 +936,23 @@ fn convert_relay_settings_update(
None
};
+ let providers = if let Some(ref provider_update) = settings.providers {
+ if !provider_update.providers.is_empty() {
+ Some(Constraint::Only(
+ Providers::new(provider_update.providers.clone().into_iter()).map_err(
+ |_| Status::invalid_argument("must specify at least one provider"),
+ )?,
+ ))
+ } else {
+ Some(Constraint::Any)
+ }
+ } else {
+ None
+ };
+
Ok(RelaySettingsUpdate::Normal(RelayConstraintsUpdate {
location,
- provider: settings.provider.map(|provider_update| {
- if !provider_update.provider.is_empty() {
- Constraint::Only(provider_update.provider.clone())
- } else {
- Constraint::Any
- }
- }),
+ providers,
tunnel_protocol,
wireguard_constraints: settings.wireguard_constraints.map(|constraints| {
WireguardConstraints {
@@ -975,7 +991,7 @@ fn convert_relay_settings(settings: &RelaySettings) -> types::RelaySettings {
RelaySettings::Normal(constraints) => {
relay_settings::Endpoint::Normal(types::NormalRelaySettings {
location: convert_location_constraint(&constraints.location),
- provider: convert_provider_constraint(&constraints.provider),
+ providers: convert_providers_constraint(&constraints.providers),
tunnel_type: match constraints.tunnel_protocol {
Constraint::Any => None,
Constraint::Only(TunnelType::Wireguard) => Some(types::TunnelType::Wireguard),
@@ -1070,7 +1086,7 @@ fn convert_bridge_settings(settings: &BridgeSettings) -> types::BridgeSettings {
BridgeSettings::Normal(constraints) => {
BridgeSettingType::Normal(types::bridge_settings::BridgeConstraints {
location: convert_location_constraint(&constraints.location),
- provider: convert_provider_constraint(&constraints.provider),
+ providers: convert_providers_constraint(&constraints.providers),
})
}
BridgeSettings::Custom(proxy_settings) => match proxy_settings {
@@ -1157,10 +1173,10 @@ fn convert_location_constraint(
})
}
-fn convert_provider_constraint(provider: &Constraint<Provider>) -> String {
- match provider.as_ref() {
- Constraint::Any => "".to_string(),
- Constraint::Only(ref provider) => provider.to_string(),
+fn convert_providers_constraint(providers: &Constraint<Providers>) -> Vec<String> {
+ match providers.as_ref() {
+ Constraint::Any => vec![],
+ Constraint::Only(providers) => Vec::from(providers.clone()),
}
}