summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mullvad-management-interface/proto/management_interface.proto2
-rw-r--r--mullvad-management-interface/src/types.rs79
2 files changed, 77 insertions, 4 deletions
diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto
index 0ae7b65c0b..4c6ee5ab71 100644
--- a/mullvad-management-interface/proto/management_interface.proto
+++ b/mullvad-management-interface/proto/management_interface.proto
@@ -529,7 +529,7 @@ message Relay {
Location location = 11;
}
-message WireGuardRelayEndpointData {
+message WireguardRelayEndpointData {
bytes public_key = 1;
}
diff --git a/mullvad-management-interface/src/types.rs b/mullvad-management-interface/src/types.rs
index ef1d353b11..d3404e2298 100644
--- a/mullvad-management-interface/src/types.rs
+++ b/mullvad-management-interface/src/types.rs
@@ -696,8 +696,6 @@ impl From<&mullvad_types::settings::TunnelOptions> for TunnelOptions {
impl From<mullvad_types::relay_list::RelayListCountry> for RelayListCountry {
fn from(country: mullvad_types::relay_list::RelayListCountry) -> Self {
- // FIXME: add endpoint data
-
let mut proto_country = RelayListCountry {
name: country.name,
code: country.code,
@@ -740,7 +738,12 @@ impl From<mullvad_types::relay_list::Relay> for Relay {
MullvadEndpointData::Wireguard(_) => relay::RelayType::Wireguard as i32,
},
endpoint_data: match relay.endpoint_data {
- MullvadEndpointData::Wireguard(data) => Some(data),
+ MullvadEndpointData::Wireguard(data) => Some(to_proto_any(
+ "mullvad_daemon.management_interface/WireguardRelayEndpointData",
+ WireguardRelayEndpointData {
+ public_key: data.public_key.as_bytes().to_vec(),
+ },
+ )),
_ => None,
},
location: relay.location.map(|location| Location {
@@ -755,6 +758,76 @@ impl From<mullvad_types::relay_list::Relay> for Relay {
}
}
+impl TryFrom<Relay> for mullvad_types::relay_list::Relay {
+ type Error = FromProtobufTypeError;
+
+ fn try_from(relay: Relay) -> Result<Self, Self::Error> {
+ use mullvad_types::{
+ location::Location as MullvadLocation,
+ relay_list::{Relay as MullvadRelay, RelayEndpointData as MullvadEndpointData},
+ };
+
+ let endpoint_data = match relay.endpoint_type {
+ i if i == relay::RelayType::Openvpn as i32 => MullvadEndpointData::Openvpn,
+ i if i == relay::RelayType::Bridge as i32 => MullvadEndpointData::Bridge,
+ i if i == relay::RelayType::Wireguard as i32 => {
+ let data = relay
+ .endpoint_data
+ .ok_or(FromProtobufTypeError::InvalidArgument(
+ "missing endpoint wg data",
+ ))?;
+ let data: WireguardRelayEndpointData = try_from_proto_any(
+ "mullvad_daemon.management_interface/WireguardRelayEndpointData",
+ data,
+ )
+ .ok_or(FromProtobufTypeError::InvalidArgument(
+ "invalid endpoint wg data",
+ ))?;
+ MullvadEndpointData::Wireguard(
+ mullvad_types::relay_list::WireguardRelayEndpointData {
+ public_key: bytes_to_pubkey(&data.public_key)?,
+ },
+ )
+ }
+ _ => {
+ return Err(FromProtobufTypeError::InvalidArgument(
+ "invalid relay endpoint type",
+ ))
+ }
+ };
+
+ let ipv6_addr_in = if relay.ipv6_addr_in.is_empty() {
+ None
+ } else {
+ Some(relay.ipv4_addr_in.parse().map_err(|_err| {
+ FromProtobufTypeError::InvalidArgument("invalid relay IPv6 address")
+ })?)
+ };
+
+ Ok(MullvadRelay {
+ hostname: relay.hostname,
+ ipv4_addr_in: relay.ipv4_addr_in.parse().map_err(|_err| {
+ FromProtobufTypeError::InvalidArgument("invalid relay IPv4 address")
+ })?,
+ ipv6_addr_in,
+ include_in_country: relay.include_in_country,
+ active: relay.active,
+ owned: relay.owned,
+ provider: relay.provider,
+ weight: relay.weight,
+ endpoint_data,
+ location: relay.location.map(|location| MullvadLocation {
+ country: location.country,
+ country_code: location.country_code,
+ city: location.city,
+ city_code: location.city_code,
+ latitude: location.latitude,
+ longitude: location.longitude,
+ }),
+ })
+ }
+}
+
impl From<TransportProtocol> for talpid_types::net::TransportProtocol {
fn from(protocol: TransportProtocol) -> Self {
match protocol {