diff options
| author | David Lönnhager <david.l@mullvad.net> | 2024-06-05 13:09:22 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2024-08-16 09:13:30 +0200 |
| commit | 39c0a267382e51831652ff0966df8fb180b989d8 (patch) | |
| tree | d84c652f51f4306d35780a2315c5f131e6bf1f9f | |
| parent | 5317b3d8565c4a4085499dd4a0add728404f3146 (diff) | |
| download | mullvadvpn-39c0a267382e51831652ff0966df8fb180b989d8.tar.xz mullvadvpn-39c0a267382e51831652ff0966df8fb180b989d8.zip | |
Parse shadowsocks ports in relay list
| -rw-r--r-- | mullvad-api/src/relay_list.rs | 9 | ||||
| -rw-r--r-- | mullvad-management-interface/proto/management_interface.proto | 4 | ||||
| -rw-r--r-- | mullvad-management-interface/src/types/conversions/relay_list.rs | 50 | ||||
| -rw-r--r-- | mullvad-relay-selector/tests/relay_selector.rs | 6 | ||||
| -rw-r--r-- | mullvad-types/src/relay_list.rs | 6 |
5 files changed, 69 insertions, 6 deletions
diff --git a/mullvad-api/src/relay_list.rs b/mullvad-api/src/relay_list.rs index 6039abab66..5bccea9d67 100644 --- a/mullvad-api/src/relay_list.rs +++ b/mullvad-api/src/relay_list.rs @@ -9,7 +9,7 @@ use talpid_types::net::wireguard; use std::{ collections::BTreeMap, future::Future, - net::{Ipv4Addr, Ipv6Addr}, + net::{IpAddr, Ipv4Addr, Ipv6Addr}, time::Duration, }; @@ -244,6 +244,9 @@ struct Wireguard { port_ranges: Vec<(u16, u16)>, ipv4_gateway: Ipv4Addr, ipv6_gateway: Ipv6Addr, + /// Shadowsocks port ranges available on all WireGuard relays + #[serde(default)] + shadowsocks_port_ranges: Vec<(u16, u16)>, relays: Vec<WireGuardRelay>, } @@ -253,6 +256,7 @@ impl From<&Wireguard> for relay_list::WireguardEndpointData { port_ranges: wg.port_ranges.clone(), ipv4_gateway: wg.ipv4_gateway, ipv6_gateway: wg.ipv6_gateway, + shadowsocks_port_ranges: wg.shadowsocks_port_ranges.clone(), udp2tcp_ports: vec![], } } @@ -305,6 +309,8 @@ struct WireGuardRelay { public_key: wireguard::PublicKey, #[serde(default)] daita: bool, + #[serde(default)] + shadowsocks_extra_addr_in: Vec<IpAddr>, } impl WireGuardRelay { @@ -315,6 +321,7 @@ impl WireGuardRelay { relay_list::RelayEndpointData::Wireguard(relay_list::WireguardRelayEndpointData { public_key: self.public_key, daita: self.daita, + shadowsocks_extra_addr_in: self.shadowsocks_extra_addr_in, }), ) } diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto index 7e78cffde8..e2881dbf90 100644 --- a/mullvad-management-interface/proto/management_interface.proto +++ b/mullvad-management-interface/proto/management_interface.proto @@ -631,6 +631,7 @@ message Relay { message WireguardRelayEndpointData { bytes public_key = 1; bool daita = 2; + repeated string shadowsocks_extra_addr_in = 3; } message Location { @@ -686,7 +687,8 @@ message WireguardEndpointData { repeated PortRange port_ranges = 1; string ipv4_gateway = 2; string ipv6_gateway = 3; - repeated uint32 udp2tcp_ports = 4; + repeated PortRange shadowsocks_port_ranges = 4; + repeated uint32 udp2tcp_ports = 5; } message PortRange { diff --git a/mullvad-management-interface/src/types/conversions/relay_list.rs b/mullvad-management-interface/src/types/conversions/relay_list.rs index 4e0a363702..83f56b1595 100644 --- a/mullvad-management-interface/src/types/conversions/relay_list.rs +++ b/mullvad-management-interface/src/types/conversions/relay_list.rs @@ -65,18 +65,29 @@ impl From<mullvad_types::relay_list::WireguardEndpointData> for proto::Wireguard port_ranges: wireguard .port_ranges .into_iter() - .map(|(first, last)| proto::PortRange { - first: u32::from(first), - last: u32::from(last), - }) + .map(proto::PortRange::from) .collect(), ipv4_gateway: wireguard.ipv4_gateway.to_string(), ipv6_gateway: wireguard.ipv6_gateway.to_string(), + shadowsocks_port_ranges: wireguard + .shadowsocks_port_ranges + .into_iter() + .map(proto::PortRange::from) + .collect(), udp2tcp_ports: wireguard.udp2tcp_ports.into_iter().map(u32::from).collect(), } } } +impl From<(u16, u16)> for proto::PortRange { + fn from(range: (u16, u16)) -> Self { + proto::PortRange { + first: u32::from(range.0), + last: u32::from(range.1), + } + } +} + impl From<mullvad_types::relay_list::RelayListCountry> for proto::RelayListCountry { fn from(country: mullvad_types::relay_list::RelayListCountry) -> Self { let mut proto_country = proto::RelayListCountry { @@ -123,6 +134,11 @@ impl From<mullvad_types::relay_list::Relay> for proto::Relay { proto::WireguardRelayEndpointData { public_key: data.public_key.as_bytes().to_vec(), daita: data.daita, + shadowsocks_extra_addr_in: data + .shadowsocks_extra_addr_in + .iter() + .map(|addr| addr.to_string()) + .collect(), }, )), _ => None, @@ -238,6 +254,17 @@ impl TryFrom<proto::Relay> for mullvad_types::relay_list::Relay { mullvad_types::relay_list::WireguardRelayEndpointData { public_key: bytes_to_pubkey(&data.public_key)?, daita: data.daita, + shadowsocks_extra_addr_in: data + .shadowsocks_extra_addr_in + .iter() + .map(|addr| { + addr.parse().map_err(|_err| { + FromProtobufTypeError::InvalidArgument( + "invalid relay IPv6 address", + ) + }) + }) + .collect::<Result<_, FromProtobufTypeError>>()?, }, ) } @@ -360,6 +387,20 @@ impl TryFrom<proto::WireguardEndpointData> for mullvad_types::relay_list::Wiregu let ipv6_gateway = Ipv6Addr::from_str(&wireguard.ipv6_gateway) .map_err(|_| FromProtobufTypeError::InvalidArgument("Invalid IPv6 gateway"))?; + let shadowsocks_port_ranges = wireguard + .shadowsocks_port_ranges + .into_iter() + .map(|range| { + let first = u16::try_from(range.first).map_err(|_| { + FromProtobufTypeError::InvalidArgument("invalid shadowsocks port") + })?; + let last = u16::try_from(range.last).map_err(|_| { + FromProtobufTypeError::InvalidArgument("invalid shadowsocks port") + })?; + Ok((first, last)) + }) + .collect::<Result<Vec<(u16, u16)>, FromProtobufTypeError>>()?; + let udp2tcp_ports = wireguard .udp2tcp_ports .into_iter() @@ -373,6 +414,7 @@ impl TryFrom<proto::WireguardEndpointData> for mullvad_types::relay_list::Wiregu port_ranges, ipv4_gateway, ipv6_gateway, + shadowsocks_port_ranges, udp2tcp_ports, }) } diff --git a/mullvad-relay-selector/tests/relay_selector.rs b/mullvad-relay-selector/tests/relay_selector.rs index 053de20c1a..e2808d5ff4 100644 --- a/mullvad-relay-selector/tests/relay_selector.rs +++ b/mullvad-relay-selector/tests/relay_selector.rs @@ -954,6 +954,7 @@ fn test_include_in_country() { "BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=", ) .unwrap(), + shadowsocks_extra_addr_in: vec![], daita: false, }), location: None, @@ -972,6 +973,7 @@ fn test_include_in_country() { "BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=", ) .unwrap(), + shadowsocks_extra_addr_in: vec![], daita: false, }), location: None, @@ -1003,6 +1005,7 @@ fn test_include_in_country() { ipv4_gateway: "10.64.0.1".parse().unwrap(), ipv6_gateway: "fc00:bbbb:bbbb:bb01::1".parse().unwrap(), udp2tcp_ports: vec![], + shadowsocks_port_ranges: vec![], }, }; @@ -1172,6 +1175,7 @@ fn test_daita() { "BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=", ) .unwrap(), + shadowsocks_extra_addr_in: vec![], daita: false, }), location: None, @@ -1190,6 +1194,7 @@ fn test_daita() { "BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=", ) .unwrap(), + shadowsocks_extra_addr_in: vec![], daita: true, }), location: None, @@ -1205,6 +1210,7 @@ fn test_daita() { port_ranges: vec![(53, 53), (4000, 33433), (33565, 51820), (52000, 60000)], ipv4_gateway: "10.64.0.1".parse().unwrap(), ipv6_gateway: "fc00:bbbb:bbbb:bb01::1".parse().unwrap(), + shadowsocks_port_ranges: vec![], udp2tcp_ports: vec![], }, }; diff --git a/mullvad-types/src/relay_list.rs b/mullvad-types/src/relay_list.rs index 054752d592..6c4f9fbf6a 100644 --- a/mullvad-types/src/relay_list.rs +++ b/mullvad-types/src/relay_list.rs @@ -172,6 +172,8 @@ pub struct WireguardEndpointData { /// Gateways to be used with the tunnel pub ipv4_gateway: Ipv4Addr, pub ipv6_gateway: Ipv6Addr, + /// Shadowsocks port ranges available on all WireGuard relays + pub shadowsocks_port_ranges: Vec<(u16, u16)>, pub udp2tcp_ports: Vec<u16>, } @@ -181,6 +183,7 @@ impl Default for WireguardEndpointData { port_ranges: vec![], ipv4_gateway: "0.0.0.0".parse().unwrap(), ipv6_gateway: "::".parse().unwrap(), + shadowsocks_port_ranges: vec![], udp2tcp_ports: vec![], } } @@ -194,6 +197,9 @@ pub struct WireguardRelayEndpointData { /// Whether the server supports DAITA #[serde(default)] pub daita: bool, + /// Optional IP addresses used by Shadowsocks + #[serde(default)] + pub shadowsocks_extra_addr_in: Vec<IpAddr>, } #[derive(Debug, Default, Clone, Deserialize, Serialize)] |
