@@ -117,6 +117,7 @@ static RELAYS: Lazy<RelayList> = Lazy::new(|| RelayList {
117
117
endpoint_data: RelayEndpointData :: Bridge ,
118
118
location: None ,
119
119
} ,
120
+ SHADOWSOCKS_RELAY . clone( ) ,
120
121
] ,
121
122
} ] ,
122
123
} ] ,
@@ -173,6 +174,35 @@ static RELAYS: Lazy<RelayList> = Lazy::new(|| RelayList {
173
174
} ,
174
175
} ) ;
175
176
177
+ /// A Shadowsocks relay with additional addresses
178
+ static SHADOWSOCKS_RELAY : Lazy < Relay > = Lazy :: new ( || Relay {
179
+ hostname : SHADOWSOCKS_RELAY_LOCATION
180
+ . get_hostname ( )
181
+ . unwrap ( )
182
+ . to_owned ( ) ,
183
+ ipv4_addr_in : SHADOWSOCKS_RELAY_IPV4 ,
184
+ ipv6_addr_in : Some ( SHADOWSOCKS_RELAY_IPV6 ) ,
185
+ include_in_country : true ,
186
+ active : true ,
187
+ owned : true ,
188
+ provider : "provider0" . to_string ( ) ,
189
+ weight : 1 ,
190
+ endpoint_data : RelayEndpointData :: Wireguard ( WireguardRelayEndpointData {
191
+ public_key : PublicKey :: from_base64 ( "eaNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=" ) . unwrap ( ) ,
192
+ daita : false ,
193
+ shadowsocks_extra_addr_in : SHADOWSOCKS_RELAY_EXTRA_ADDRS . to_vec ( ) ,
194
+ } ) ,
195
+ location : None ,
196
+ } ) ;
197
+ const SHADOWSOCKS_RELAY_IPV4 : Ipv4Addr = Ipv4Addr :: new ( 123 , 123 , 123 , 1 ) ;
198
+ const SHADOWSOCKS_RELAY_IPV6 : Ipv6Addr = Ipv6Addr :: new ( 0x123 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ) ;
199
+ const SHADOWSOCKS_RELAY_EXTRA_ADDRS : & [ IpAddr ; 2 ] = & [
200
+ IpAddr :: V4 ( Ipv4Addr :: new ( 123 , 123 , 123 , 2 ) ) ,
201
+ IpAddr :: V6 ( Ipv6Addr :: new ( 0x123 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ) ) ,
202
+ ] ;
203
+ static SHADOWSOCKS_RELAY_LOCATION : Lazy < GeographicLocationConstraint > =
204
+ Lazy :: new ( || GeographicLocationConstraint :: hostname ( "se" , "got" , "se1337-wireguard" ) ) ;
205
+
176
206
// Helper functions
177
207
fn unwrap_relay ( get_result : GetRelay ) -> Relay {
178
208
match get_result {
@@ -720,10 +750,7 @@ fn test_selecting_any_relay_will_consider_multihop() {
720
750
/// selected.
721
751
#[ test]
722
752
fn test_selecting_wireguard_over_shadowsocks ( ) {
723
- let RelayListWithExtraShadowsocksIps { relay_list, .. } =
724
- get_relay_list_with_extra_shadowsocks_addresses ( ) ;
725
-
726
- let relay_selector = RelaySelector :: from_list ( SelectorConfig :: default ( ) , relay_list) ;
753
+ let relay_selector = RelaySelector :: from_list ( SelectorConfig :: default ( ) , RELAYS . clone ( ) ) ;
727
754
728
755
let mut query = RelayQueryBuilder :: new ( ) . wireguard ( ) . shadowsocks ( ) . build ( ) ;
729
756
query. wireguard_constraints . use_multihop = Constraint :: Only ( false ) ;
@@ -749,17 +776,13 @@ fn test_selecting_wireguard_over_shadowsocks() {
749
776
/// Test whether extra Shadowsocks IPs are selected when available
750
777
#[ test]
751
778
fn test_selecting_wireguard_over_shadowsocks_extra_ips ( ) {
752
- let RelayListWithExtraShadowsocksIps {
753
- relay_list,
754
- shadowsocks_extra_relay,
755
- shadowsocks_extra_addr_in,
756
- } = get_relay_list_with_extra_shadowsocks_addresses ( ) ;
757
-
758
- let relay_selector = RelaySelector :: from_list ( SelectorConfig :: default ( ) , relay_list) ;
779
+ let relay_selector = RelaySelector :: from_list ( SelectorConfig :: default ( ) , RELAYS . clone ( ) ) ;
759
780
760
781
let mut query = RelayQueryBuilder :: new ( ) . wireguard ( ) . shadowsocks ( ) . build ( ) ;
761
782
query. wireguard_constraints . use_multihop = Constraint :: Only ( false ) ;
762
- query. location = Constraint :: Only ( LocationConstraint :: Location ( shadowsocks_extra_relay) ) ;
783
+ query. location = Constraint :: Only ( LocationConstraint :: Location (
784
+ SHADOWSOCKS_RELAY_LOCATION . clone ( ) ,
785
+ ) ) ;
763
786
764
787
let relay = relay_selector. get_relay_by_query ( query) . unwrap ( ) ;
765
788
match relay {
@@ -768,7 +791,7 @@ fn test_selecting_wireguard_over_shadowsocks_extra_ips() {
768
791
inner : WireguardConfig :: Singlehop { .. } ,
769
792
..
770
793
} => {
771
- assert ! ( shadowsocks_extra_addr_in . contains( & endpoint. ip( ) ) , "{} is not an additional IP" , endpoint) ;
794
+ assert ! ( SHADOWSOCKS_RELAY_EXTRA_ADDRS . contains( & endpoint. ip( ) ) , "{} is not an additional IP" , endpoint) ;
772
795
}
773
796
wrong_relay => panic ! (
774
797
"Relay selector should have picked a Wireguard relay with Shadowsocks, instead chose {wrong_relay:?}"
@@ -779,28 +802,27 @@ fn test_selecting_wireguard_over_shadowsocks_extra_ips() {
779
802
/// Ignore extra IPv4 addresses when overrides are set
780
803
#[ test]
781
804
fn test_selecting_wireguard_ignore_extra_ips_override_v4 ( ) {
782
- let RelayListWithExtraShadowsocksIps {
783
- relay_list,
784
- shadowsocks_extra_relay,
785
- ..
786
- } = get_relay_list_with_extra_shadowsocks_addresses ( ) ;
787
-
788
805
const OVERRIDE_IPV4 : Ipv4Addr = Ipv4Addr :: new ( 1 , 3 , 3 , 7 ) ;
789
806
790
807
let config = mullvad_relay_selector:: SelectorConfig {
791
808
relay_overrides : vec ! [ RelayOverride {
792
- hostname: shadowsocks_extra_relay. get_hostname( ) . unwrap( ) . to_string( ) ,
809
+ hostname: SHADOWSOCKS_RELAY_LOCATION
810
+ . get_hostname( )
811
+ . unwrap( )
812
+ . to_string( ) ,
793
813
ipv4_addr_in: Some ( OVERRIDE_IPV4 ) ,
794
814
ipv6_addr_in: None ,
795
815
} ] ,
796
816
..Default :: default ( )
797
817
} ;
798
818
799
- let relay_selector = RelaySelector :: from_list ( config, relay_list ) ;
819
+ let relay_selector = RelaySelector :: from_list ( config, RELAYS . clone ( ) ) ;
800
820
801
821
let mut query_v4 = RelayQueryBuilder :: new ( ) . wireguard ( ) . shadowsocks ( ) . build ( ) ;
802
822
query_v4. wireguard_constraints . use_multihop = Constraint :: Only ( false ) ;
803
- query_v4. location = Constraint :: Only ( LocationConstraint :: Location ( shadowsocks_extra_relay) ) ;
823
+ query_v4. location = Constraint :: Only ( LocationConstraint :: Location (
824
+ SHADOWSOCKS_RELAY_LOCATION . clone ( ) ,
825
+ ) ) ;
804
826
query_v4. wireguard_constraints . ip_version = Constraint :: Only ( IpVersion :: V4 ) ;
805
827
806
828
let relay = relay_selector. get_relay_by_query ( query_v4) . unwrap ( ) ;
@@ -821,28 +843,27 @@ fn test_selecting_wireguard_ignore_extra_ips_override_v4() {
821
843
/// Ignore extra IPv6 addresses when overrides are set
822
844
#[ test]
823
845
fn test_selecting_wireguard_ignore_extra_ips_override_v6 ( ) {
824
- let RelayListWithExtraShadowsocksIps {
825
- relay_list,
826
- shadowsocks_extra_relay,
827
- ..
828
- } = get_relay_list_with_extra_shadowsocks_addresses ( ) ;
829
-
830
846
const OVERRIDE_IPV6 : Ipv6Addr = Ipv6Addr :: new ( 1 , 0 , 0 , 0 , 0 , 0 , 10 , 10 ) ;
831
847
832
848
let config = SelectorConfig {
833
849
relay_overrides : vec ! [ RelayOverride {
834
- hostname: shadowsocks_extra_relay. get_hostname( ) . unwrap( ) . to_string( ) ,
850
+ hostname: SHADOWSOCKS_RELAY_LOCATION
851
+ . get_hostname( )
852
+ . unwrap( )
853
+ . to_string( ) ,
835
854
ipv4_addr_in: None ,
836
855
ipv6_addr_in: Some ( OVERRIDE_IPV6 ) ,
837
856
} ] ,
838
857
..Default :: default ( )
839
858
} ;
840
859
841
- let relay_selector = RelaySelector :: from_list ( config, relay_list ) ;
860
+ let relay_selector = RelaySelector :: from_list ( config, RELAYS . clone ( ) ) ;
842
861
843
862
let mut query_v6 = RelayQueryBuilder :: new ( ) . wireguard ( ) . shadowsocks ( ) . build ( ) ;
844
863
query_v6. wireguard_constraints . use_multihop = Constraint :: Only ( false ) ;
845
- query_v6. location = Constraint :: Only ( LocationConstraint :: Location ( shadowsocks_extra_relay) ) ;
864
+ query_v6. location = Constraint :: Only ( LocationConstraint :: Location (
865
+ SHADOWSOCKS_RELAY_LOCATION . clone ( ) ,
866
+ ) ) ;
846
867
query_v6. wireguard_constraints . ip_version = Constraint :: Only ( IpVersion :: V6 ) ;
847
868
848
869
let relay = relay_selector. get_relay_by_query ( query_v6) . unwrap ( ) ;
@@ -860,102 +881,6 @@ fn test_selecting_wireguard_ignore_extra_ips_override_v6() {
860
881
}
861
882
}
862
883
863
- struct RelayListWithExtraShadowsocksIps {
864
- relay_list : RelayList ,
865
- shadowsocks_extra_relay : GeographicLocationConstraint ,
866
- shadowsocks_extra_addr_in : Vec < IpAddr > ,
867
- }
868
-
869
- // Return a relay list with a single relay
870
- fn get_relay_list_with_extra_shadowsocks_addresses ( ) -> RelayListWithExtraShadowsocksIps {
871
- static SHADOWSOCKS_EXTRA_IPS_RELAY_NORMAL_IPV4 : Ipv4Addr = Ipv4Addr :: new ( 123 , 123 , 123 , 1 ) ;
872
- static SHADOWSOCKS_EXTRA_IPS_RELAY_NORMAL_IPV6 : Ipv6Addr =
873
- Ipv6Addr :: new ( 0x123 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ) ;
874
- let shadowsocks_extra_addr_in = vec ! [
875
- Ipv4Addr :: new( 123 , 123 , 123 , 2 ) . into( ) ,
876
- Ipv6Addr :: new( 0x123 , 0 , 0 , 0 , 0 , 0 , 0 , 2 ) . into( ) ,
877
- ] ;
878
- let shadowsocks_extra_relay =
879
- GeographicLocationConstraint :: hostname ( "se" , "got" , "se9-wireguard" ) ;
880
-
881
- let relay_list = RelayList {
882
- etag : None ,
883
- countries : vec ! [ RelayListCountry {
884
- name: "Sweden" . to_string( ) ,
885
- code: "se" . to_string( ) ,
886
- cities: vec![ RelayListCity {
887
- name: "Gothenburg" . to_string( ) ,
888
- code: "got" . to_string( ) ,
889
- latitude: 57.70887 ,
890
- longitude: 11.97456 ,
891
- relays: vec![
892
- Relay {
893
- hostname: shadowsocks_extra_relay. get_hostname( ) . unwrap( ) . to_owned( ) ,
894
- ipv4_addr_in: SHADOWSOCKS_EXTRA_IPS_RELAY_NORMAL_IPV4 ,
895
- ipv6_addr_in: Some ( SHADOWSOCKS_EXTRA_IPS_RELAY_NORMAL_IPV6 ) ,
896
- include_in_country: true ,
897
- active: true ,
898
- owned: true ,
899
- provider: "provider0" . to_string( ) ,
900
- weight: 1 ,
901
- endpoint_data: RelayEndpointData :: Wireguard ( WireguardRelayEndpointData {
902
- public_key: PublicKey :: from_base64(
903
- "BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=" ,
904
- )
905
- . unwrap( ) ,
906
- daita: false ,
907
- shadowsocks_extra_addr_in: shadowsocks_extra_addr_in. clone( ) ,
908
- } ) ,
909
- location: None ,
910
- } ,
911
- Relay {
912
- hostname: "se10-wireguard" . to_string( ) ,
913
- ipv4_addr_in: Ipv4Addr :: new( 123 , 123 , 123 , 3 ) ,
914
- ipv6_addr_in: Some ( Ipv6Addr :: new( 0x123 , 0 , 0 , 0 , 0 , 0 , 0 , 3 ) ) ,
915
- include_in_country: true ,
916
- active: true ,
917
- owned: false ,
918
- provider: "provider1" . to_string( ) ,
919
- weight: 1 ,
920
- endpoint_data: RelayEndpointData :: Wireguard ( WireguardRelayEndpointData {
921
- public_key: PublicKey :: from_base64(
922
- "BLNHNoGO88LjV/wDBa7CUUwUzPq/fO2UwcGLy56hKy4=" ,
923
- )
924
- . unwrap( ) ,
925
- daita: false ,
926
- shadowsocks_extra_addr_in: vec![ ] ,
927
- } ) ,
928
- location: None ,
929
- } ,
930
- ] ,
931
- } ] ,
932
- } ] ,
933
- openvpn : OpenVpnEndpointData { ports : vec ! [ ] } ,
934
- bridge : BridgeEndpointData {
935
- shadowsocks : vec ! [ ] ,
936
- } ,
937
- wireguard : WireguardEndpointData {
938
- port_ranges : vec ! [
939
- 53 ..=53 ,
940
- 443 ..=443 ,
941
- 4000 ..=33433 ,
942
- 33565 ..=51820 ,
943
- 52000 ..=60000 ,
944
- ] ,
945
- ipv4_gateway : "10.64.0.1" . parse ( ) . unwrap ( ) ,
946
- ipv6_gateway : "fc00:bbbb:bbbb:bb01::1" . parse ( ) . unwrap ( ) ,
947
- udp2tcp_ports : vec ! [ ] ,
948
- shadowsocks_port_ranges : vec ! [ 100 ..=200 , 1000 ..=2000 ] ,
949
- } ,
950
- } ;
951
-
952
- RelayListWithExtraShadowsocksIps {
953
- relay_list,
954
- shadowsocks_extra_addr_in,
955
- shadowsocks_extra_relay,
956
- }
957
- }
958
-
959
884
/// Construct a query for a Wireguard configuration where UDP2TCP obfuscation is selected and
960
885
/// multihop is explicitly turned off. Assert that the relay selector always return an obfuscator
961
886
/// configuration.
0 commit comments