summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2024-06-05 13:09:22 +0200
committerDavid Lönnhager <david.l@mullvad.net>2024-08-16 09:13:30 +0200
commit39c0a267382e51831652ff0966df8fb180b989d8 (patch)
treed84c652f51f4306d35780a2315c5f131e6bf1f9f
parent5317b3d8565c4a4085499dd4a0add728404f3146 (diff)
downloadmullvadvpn-39c0a267382e51831652ff0966df8fb180b989d8.tar.xz
mullvadvpn-39c0a267382e51831652ff0966df8fb180b989d8.zip
Parse shadowsocks ports in relay list
-rw-r--r--mullvad-api/src/relay_list.rs9
-rw-r--r--mullvad-management-interface/proto/management_interface.proto4
-rw-r--r--mullvad-management-interface/src/types/conversions/relay_list.rs50
-rw-r--r--mullvad-relay-selector/tests/relay_selector.rs6
-rw-r--r--mullvad-types/src/relay_list.rs6
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)]