diff options
| author | Markus Pettersson <markus.pettersson@mullvad.net> | 2024-01-31 11:03:55 +0100 |
|---|---|---|
| committer | Markus Pettersson <markus.pettersson@mullvad.net> | 2024-01-31 12:46:16 +0100 |
| commit | 7cd49c0bb24ad7c104f2f244b9e9258f5663d656 (patch) | |
| tree | f38d1a6689d037a0f93157732468a5a04fb7a933 /mullvad-management-interface | |
| parent | 8dbdc97b7dafaab15dc877538e5ff48af007b46e (diff) | |
| download | mullvadvpn-7cd49c0bb24ad7c104f2f244b9e9258f5663d656.tar.xz mullvadvpn-7cd49c0bb24ad7c104f2f244b9e9258f5663d656.zip | |
Change API access methods settings format
Change API access methods settings format to encode that built-in access
methods always exist by making them distinct values of the
`AccessMethod` settings.
This change was also propagated to the corresponding protobuf
definition, such that any client may make use of this fact as well.
The appropriate settings migration was added.
Diffstat (limited to 'mullvad-management-interface')
4 files changed, 48 insertions, 29 deletions
diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto index 21de18df8e..7fbdb6eba6 100644 --- a/mullvad-management-interface/proto/management_interface.proto +++ b/mullvad-management-interface/proto/management_interface.proto @@ -380,7 +380,11 @@ message NewAccessMethodSetting { AccessMethod access_method = 3; } -message ApiAccessMethodSettings { repeated AccessMethodSetting access_method_settings = 1; } +message ApiAccessMethodSettings { + AccessMethodSetting direct = 1; + AccessMethodSetting mullvad_bridges = 2; + repeated AccessMethodSetting custom = 3; +} message Settings { RelaySettings relay_settings = 1; diff --git a/mullvad-management-interface/src/client.rs b/mullvad-management-interface/src/client.rs index 52dbd72b47..f30b613171 100644 --- a/mullvad-management-interface/src/client.rs +++ b/mullvad-management-interface/src/client.rs @@ -176,19 +176,20 @@ impl MullvadProxyClient { } pub async fn get_api_access_methods(&mut self) -> Result<Vec<AccessMethodSetting>> { - self.0 + let access_method_settings = self + .0 .get_settings(()) .await .map_err(Error::Rpc)? .into_inner() .api_access_methods - .ok_or(Error::ApiAccessMethodSettingsNotFound)? - .access_method_settings - .into_iter() - .map(|api_access_method| { - AccessMethodSetting::try_from(api_access_method).map_err(Error::InvalidResponse) - }) - .collect() + .ok_or(Error::ApiAccessMethodSettingsNotFound) + .and_then(|access_method_settings| { + access_method::Settings::try_from(access_method_settings) + .map_err(Error::InvalidResponse) + })?; + + Ok(access_method_settings.iter().cloned().collect()) } pub async fn get_api_access_method( diff --git a/mullvad-management-interface/src/types/conversions/access_method.rs b/mullvad-management-interface/src/types/conversions/access_method.rs index ec5681d74d..d9758a571c 100644 --- a/mullvad-management-interface/src/types/conversions/access_method.rs +++ b/mullvad-management-interface/src/types/conversions/access_method.rs @@ -5,35 +5,49 @@ mod settings { use crate::types::{proto, FromProtobufTypeError}; use mullvad_types::access_method; - impl From<&access_method::Settings> for proto::ApiAccessMethodSettings { - fn from(settings: &access_method::Settings) -> Self { + impl From<access_method::Settings> for proto::ApiAccessMethodSettings { + fn from(settings: access_method::Settings) -> Self { Self { - access_method_settings: settings - .access_method_settings - .iter() - .map(|method| method.clone().into()) + direct: Some(settings.direct().clone().into()), + mullvad_bridges: Some(settings.mullvad_bridges().clone().into()), + custom: settings + .iter_custom() + .cloned() + .map(|method| method.into()) .collect(), } } } - impl From<access_method::Settings> for proto::ApiAccessMethodSettings { - fn from(settings: access_method::Settings) -> Self { - proto::ApiAccessMethodSettings::from(&settings) - } - } - impl TryFrom<proto::ApiAccessMethodSettings> for access_method::Settings { type Error = FromProtobufTypeError; fn try_from(settings: proto::ApiAccessMethodSettings) -> Result<Self, Self::Error> { - Ok(Self { - access_method_settings: settings - .access_method_settings - .iter() - .map(access_method::AccessMethodSetting::try_from) - .collect::<Result<Vec<access_method::AccessMethodSetting>, _>>()?, - }) + let direct = settings + .direct + .ok_or(FromProtobufTypeError::InvalidArgument( + "Could not deserialize Direct Access Method from protobuf", + )) + .and_then(access_method::AccessMethodSetting::try_from)?; + + let mullvad_bridges = settings + .mullvad_bridges + .ok_or(FromProtobufTypeError::InvalidArgument( + "Could not deserialize Mullvad Bridges Access Method from protobuf", + )) + .and_then(access_method::AccessMethodSetting::try_from)?; + + let custom = settings + .custom + .iter() + .map(access_method::AccessMethodSetting::try_from) + .collect::<Result<Vec<_>, _>>()?; + + Ok(access_method::Settings::new( + direct, + mullvad_bridges, + custom, + )) } } } diff --git a/mullvad-management-interface/src/types/conversions/settings.rs b/mullvad-management-interface/src/types/conversions/settings.rs index a7c4bcd78c..a4d6313158 100644 --- a/mullvad-management-interface/src/types/conversions/settings.rs +++ b/mullvad-management-interface/src/types/conversions/settings.rs @@ -43,7 +43,7 @@ impl From<&mullvad_types::settings::Settings> for proto::Settings { settings.custom_lists.clone(), )), api_access_methods: Some(proto::ApiAccessMethodSettings::from( - &settings.api_access_methods, + settings.api_access_methods.clone(), )), relay_overrides: settings .relay_overrides |
