@@ -104,6 +104,13 @@ impl<T> Deref for LazyManual<T> {
104
104
}
105
105
}
106
106
107
+ pub mod env {
108
+ pub const API_HOST_VAR : & str = "MULLVAD_API_HOST" ;
109
+ pub const API_ADDR_VAR : & str = "MULLVAD_API_ADDR" ;
110
+ pub const API_FORCE_DIRECT_VAR : & str = "MULLVAD_API_FORCE_DIRECT" ;
111
+ pub const DISABLE_TLS_VAR : & str = "MULLVAD_API_DISABLE_TLS" ;
112
+ }
113
+
107
114
/// A hostname and socketaddr to reach the Mullvad REST API over.
108
115
#[ derive( Debug ) ]
109
116
pub struct ApiEndpoint {
@@ -128,17 +135,30 @@ pub struct ApiEndpoint {
128
135
pub disable_address_cache : bool ,
129
136
#[ cfg( feature = "api-override" ) ]
130
137
pub disable_tls : bool ,
138
+ #[ cfg( feature = "api-override" ) ]
139
+ /// Whether bridges/proxies can be used to access the API or not. This is
140
+ /// useful primarily for testing purposes.
141
+ ///
142
+ /// * If `force_direct` is `true`, bridges and proxies will not be used to
143
+ /// reach the API.
144
+ /// * If `force_direct` is `false`, bridges and proxies can be used to reach the API.
145
+ ///
146
+ /// # Note
147
+ ///
148
+ /// By default, `force_direct` will be `true` if the `api-override` feature
149
+ /// is enabled. This is supposedely less error prone, as common targets such
150
+ /// as Devmole might be unreachable from behind a bridge server.
151
+ ///
152
+ /// To disable `force_direct`, set the environment variable
153
+ /// `MULLVAD_API_FORCE_DIRECT=0` before starting the daemon.
154
+ pub force_direct : bool ,
131
155
}
132
156
133
157
impl ApiEndpoint {
134
158
const API_HOST_DEFAULT : & ' static str = "api.mullvad.net" ;
135
159
const API_IP_DEFAULT : IpAddr = IpAddr :: V4 ( Ipv4Addr :: new ( 45 , 83 , 223 , 196 ) ) ;
136
160
const API_PORT_DEFAULT : u16 = 443 ;
137
161
138
- const API_HOST_VAR : & ' static str = "MULLVAD_API_HOST" ;
139
- const API_ADDR_VAR : & ' static str = "MULLVAD_API_ADDR" ;
140
- const DISABLE_TLS_VAR : & ' static str = "MULLVAD_API_DISABLE_TLS" ;
141
-
142
162
/// Returns the endpoint to connect to the API over.
143
163
///
144
164
/// # Panics
@@ -147,15 +167,19 @@ impl ApiEndpoint {
147
167
/// `MULLVAD_API_DISABLE_TLS` has invalid contents.
148
168
#[ cfg( feature = "api-override" ) ]
149
169
pub fn from_env_vars ( ) -> ApiEndpoint {
150
- let host_var = Self :: read_var ( ApiEndpoint :: API_HOST_VAR ) ;
151
- let address_var = Self :: read_var ( ApiEndpoint :: API_ADDR_VAR ) ;
152
- let disable_tls_var = Self :: read_var ( ApiEndpoint :: DISABLE_TLS_VAR ) ;
170
+ let host_var = Self :: read_var ( env:: API_HOST_VAR ) ;
171
+ let address_var = Self :: read_var ( env:: API_ADDR_VAR ) ;
172
+ let disable_tls_var = Self :: read_var ( env:: DISABLE_TLS_VAR ) ;
173
+ let force_direct = Self :: read_var ( env:: API_FORCE_DIRECT_VAR ) ;
153
174
154
175
let mut api = ApiEndpoint {
155
176
host : None ,
156
177
address : None ,
157
178
disable_address_cache : true ,
158
179
disable_tls : false ,
180
+ force_direct : force_direct
181
+ . map ( |force_direct_env| force_direct_env. to_lowercase ( ) != "0" )
182
+ . unwrap_or ( true ) ,
159
183
} ;
160
184
161
185
match ( host_var, address_var) {
@@ -164,8 +188,8 @@ impl ApiEndpoint {
164
188
use std:: net:: ToSocketAddrs ;
165
189
log:: debug!(
166
190
"{api_addr} not found. Resolving API IP address from {api_host}={host}" ,
167
- api_addr = ApiEndpoint :: API_ADDR_VAR ,
168
- api_host = ApiEndpoint :: API_HOST_VAR
191
+ api_addr = env :: API_ADDR_VAR ,
192
+ api_host = env :: API_HOST_VAR
169
193
) ;
170
194
api. address = format ! ( "{}:{}" , host, ApiEndpoint :: API_PORT_DEFAULT )
171
195
. to_socket_addrs ( )
@@ -181,7 +205,7 @@ impl ApiEndpoint {
181
205
let addr = address. parse ( ) . unwrap_or_else ( |_| {
182
206
panic ! (
183
207
"{api_addr}={address} is not a valid socketaddr" ,
184
- api_addr = ApiEndpoint :: API_ADDR_VAR ,
208
+ api_addr = env :: API_ADDR_VAR ,
185
209
)
186
210
} ) ;
187
211
api. address = Some ( addr) ;
@@ -193,9 +217,9 @@ impl ApiEndpoint {
193
217
if disable_tls_var. is_some ( ) {
194
218
log:: warn!(
195
219
"{disable_tls} is ignored since {api_host} and {api_addr} are not set" ,
196
- disable_tls = ApiEndpoint :: DISABLE_TLS_VAR ,
197
- api_host = ApiEndpoint :: API_HOST_VAR ,
198
- api_addr = ApiEndpoint :: API_ADDR_VAR ,
220
+ disable_tls = env :: DISABLE_TLS_VAR ,
221
+ api_host = env :: API_HOST_VAR ,
222
+ api_addr = env :: API_ADDR_VAR ,
199
223
) ;
200
224
}
201
225
} else {
@@ -226,16 +250,17 @@ impl ApiEndpoint {
226
250
/// `MULLVAD_API_DISABLE_TLS` has invalid contents.
227
251
#[ cfg( not( feature = "api-override" ) ) ]
228
252
pub fn from_env_vars ( ) -> ApiEndpoint {
229
- let host_var = Self :: read_var ( ApiEndpoint :: API_HOST_VAR ) ;
230
- let address_var = Self :: read_var ( ApiEndpoint :: API_ADDR_VAR ) ;
231
- let disable_tls_var = Self :: read_var ( ApiEndpoint :: DISABLE_TLS_VAR ) ;
232
-
233
- if host_var. is_some ( ) || address_var. is_some ( ) || disable_tls_var. is_some ( ) {
253
+ let env_vars = [
254
+ env:: API_HOST_VAR ,
255
+ env:: API_ADDR_VAR ,
256
+ env:: DISABLE_TLS_VAR ,
257
+ env:: API_FORCE_DIRECT_VAR ,
258
+ ] ;
259
+
260
+ if env_vars. map ( Self :: read_var) . iter ( ) . any ( Option :: is_some) {
234
261
log:: warn!(
235
- "These variables are ignored in production builds: {api_host}, {api_addr}, {disable_tls}" ,
236
- api_host = ApiEndpoint :: API_HOST_VAR ,
237
- api_addr = ApiEndpoint :: API_ADDR_VAR ,
238
- disable_tls = ApiEndpoint :: DISABLE_TLS_VAR
262
+ "These variables are ignored in production builds: {env_vars_pretty}" ,
263
+ env_vars_pretty = env_vars. join( ", " )
239
264
) ;
240
265
}
241
266
0 commit comments