Skip to content

Commit 6443300

Browse files
committed
Rename api to access_mode in mullvad-api
1 parent 85528be commit 6443300

File tree

7 files changed

+169
-140
lines changed

7 files changed

+169
-140
lines changed

mullvad-api/src/api.rs mullvad-api/src/access_mode.rs

+22-72
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,17 @@
77
#[cfg(feature = "api-override")]
88
use crate::ApiEndpoint;
99
use crate::{
10-
proxy::{AllowedClientsProvider, ApiConnectionMode, ConnectionModeProvider, ProxyConfig},
10+
proxy::{AllowedClientsProvider, ApiConnectionMode, ConnectionModeProvider},
1111
AddressCache,
1212
};
13+
use async_trait::async_trait;
1314
use futures::{
1415
channel::{mpsc, oneshot},
1516
StreamExt,
1617
};
17-
use mullvad_encrypted_dns_proxy::state::EncryptedDnsProxyState;
18-
use mullvad_relay_selector::RelaySelector;
19-
use mullvad_types::access_method::{
20-
AccessMethod, AccessMethodSetting, BuiltInAccessMethod, Id, Settings,
21-
};
18+
use mullvad_types::access_method::{AccessMethod, AccessMethodSetting, Id, Settings};
2219
use std::{marker::PhantomData, net::SocketAddr, path::PathBuf};
23-
use talpid_types::net::{proxy::CustomProxy, AllowedEndpoint, Endpoint, TransportProtocol};
20+
use talpid_types::net::{AllowedEndpoint, Endpoint, TransportProtocol};
2421

2522
pub enum Message {
2623
Get(ResponseTx<ResolvedConnectionMode>),
@@ -250,10 +247,7 @@ pub struct AccessModeSelector<P> {
250247
api_endpoint: ApiEndpoint,
251248
cmd_rx: mpsc::UnboundedReceiver<Message>,
252249
cache_dir: PathBuf,
253-
/// Used for selecting a Bridge when the `Mullvad Bridges` access method is used.
254-
relay_selector: RelaySelector,
255-
/// Used for selecting a config for the 'Encrypted DNS proxy' access method.
256-
encrypted_dns_proxy_cache: EncryptedDnsProxyState,
250+
bridge_dns_proxy_provider: Box<dyn BridgeAndDNSProxy>,
257251
access_method_settings: Settings,
258252
address_cache: AddressCache,
259253
access_method_event_sender: mpsc::UnboundedSender<(AccessMethodEvent, oneshot::Sender<()>)>,
@@ -270,7 +264,7 @@ where
270264
{
271265
pub async fn spawn(
272266
cache_dir: PathBuf,
273-
relay_selector: RelaySelector,
267+
mut bridge_dns_proxy_provider: Box<dyn BridgeAndDNSProxy>,
274268
#[cfg_attr(not(feature = "api-override"), allow(unused_mut))]
275269
mut access_method_settings: Settings,
276270
#[cfg(feature = "api-override")] api_endpoint: ApiEndpoint,
@@ -287,16 +281,12 @@ where
287281
}
288282
}
289283

290-
// Initialize the Encrypted DNS cache
291-
let mut encrypted_dns_proxy_cache = EncryptedDnsProxyState::default();
292-
293284
// Always start looking from the position of `Direct`.
294285
let (index, next) = Self::find_next_active(0, &access_method_settings);
295286
let initial_connection_mode = Self::resolve_inner_with_default(
296287
&next,
297-
&relay_selector,
298-
&mut encrypted_dns_proxy_cache,
299288
&address_cache,
289+
&mut *bridge_dns_proxy_provider,
300290
)
301291
.await;
302292

@@ -309,8 +299,7 @@ where
309299
api_endpoint,
310300
cmd_rx,
311301
cache_dir,
312-
relay_selector,
313-
encrypted_dns_proxy_cache,
302+
bridge_dns_proxy_provider,
314303
access_method_settings,
315304
address_cache,
316305
access_method_event_sender,
@@ -537,22 +526,20 @@ where
537526
) -> Option<ResolvedConnectionMode> {
538527
Self::resolve_inner(
539528
&access_method,
540-
&self.relay_selector,
541-
&mut self.encrypted_dns_proxy_cache,
542529
&self.address_cache,
530+
&mut *self.bridge_dns_proxy_provider,
543531
)
544532
.await
545533
}
546534

547535
async fn resolve_inner(
548536
access_method: &AccessMethodSetting,
549-
relay_selector: &RelaySelector,
550-
encrypted_dns_proxy_cache: &mut EncryptedDnsProxyState,
551537
address_cache: &AddressCache,
538+
bridge_dns_proxy_provider: &mut dyn BridgeAndDNSProxy,
552539
) -> Option<ResolvedConnectionMode> {
553-
let connection_mode =
554-
Self::resolve_connection_mode(access_method, relay_selector, encrypted_dns_proxy_cache)
555-
.await?;
540+
let connection_mode = bridge_dns_proxy_provider
541+
.match_access_method(access_method)
542+
.await?;
556543
let endpoint =
557544
resolve_allowed_endpoint::<P>(&connection_mode, address_cache.get_address().await);
558545
Some(ResolvedConnectionMode {
@@ -570,27 +557,18 @@ where
570557
) -> ResolvedConnectionMode {
571558
Self::resolve_inner_with_default(
572559
&access_method,
573-
&self.relay_selector,
574-
&mut self.encrypted_dns_proxy_cache,
575560
&self.address_cache,
561+
&mut *self.bridge_dns_proxy_provider,
576562
)
577563
.await
578564
}
579565

580566
async fn resolve_inner_with_default(
581567
access_method: &AccessMethodSetting,
582-
relay_selector: &RelaySelector,
583-
encrypted_dns_proxy_cache: &mut EncryptedDnsProxyState,
584568
address_cache: &AddressCache,
569+
bridge_dns_proxy_provider: &mut dyn BridgeAndDNSProxy,
585570
) -> ResolvedConnectionMode {
586-
match Self::resolve_inner(
587-
access_method,
588-
relay_selector,
589-
encrypted_dns_proxy_cache,
590-
address_cache,
591-
)
592-
.await
593-
{
571+
match Self::resolve_inner(access_method, address_cache, bridge_dns_proxy_provider).await {
594572
Some(resolved) => resolved,
595573
None => {
596574
log::trace!("Defaulting to direct API connection");
@@ -606,42 +584,14 @@ where
606584
}
607585
}
608586
}
587+
}
609588

610-
async fn resolve_connection_mode(
589+
#[async_trait]
590+
pub trait BridgeAndDNSProxy: Send + Sync {
591+
async fn match_access_method(
592+
&mut self,
611593
access_method: &AccessMethodSetting,
612-
relay_selector: &RelaySelector,
613-
encrypted_dns_proxy_cache: &mut EncryptedDnsProxyState,
614-
) -> Option<ApiConnectionMode> {
615-
let connection_mode = {
616-
match &access_method.access_method {
617-
AccessMethod::BuiltIn(BuiltInAccessMethod::Direct) => ApiConnectionMode::Direct,
618-
AccessMethod::BuiltIn(BuiltInAccessMethod::Bridge) => {
619-
let Some(bridge) = relay_selector.get_bridge_forced() else {
620-
log::warn!("Could not select a Mullvad bridge");
621-
log::debug!("The relay list might be empty");
622-
return None;
623-
};
624-
let proxy = CustomProxy::Shadowsocks(bridge);
625-
ApiConnectionMode::Proxied(ProxyConfig::from(proxy))
626-
}
627-
AccessMethod::BuiltIn(BuiltInAccessMethod::EncryptedDnsProxy) => {
628-
if let Err(error) = encrypted_dns_proxy_cache.fetch_configs("frakta.eu").await {
629-
log::warn!("Failed to fetch new Encrypted DNS Proxy configurations");
630-
log::debug!("{error:#?}");
631-
}
632-
let Some(edp) = encrypted_dns_proxy_cache.next_configuration() else {
633-
log::warn!("Could not select next Encrypted DNS proxy config");
634-
return None;
635-
};
636-
ApiConnectionMode::Proxied(ProxyConfig::from(edp))
637-
}
638-
AccessMethod::Custom(config) => {
639-
ApiConnectionMode::Proxied(ProxyConfig::from(config.clone()))
640-
}
641-
}
642-
};
643-
Some(connection_mode)
644-
}
594+
) -> Option<ApiConnectionMode>;
645595
}
646596

647597
pub fn resolve_allowed_endpoint<P>(

mullvad-api/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use availability::ApiAvailability;
2525
pub mod rest;
2626

2727
mod abortable_stream;
28-
pub mod api;
28+
pub mod access_mode;
2929
mod https_client_with_sni;
3030
pub mod proxy;
3131
mod tls_stream;

mullvad-daemon/src/access_method.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::{settings, Daemon};
2-
use mullvad_api::{api, proxy::ApiConnectionMode, rest, ApiProxy};
2+
use mullvad_api::{access_mode, proxy::ApiConnectionMode, rest, ApiProxy};
33
use mullvad_types::{
44
access_method::{self, AccessMethod, AccessMethodSetting},
55
settings::Settings,
@@ -16,7 +16,7 @@ pub enum Error {
1616
/// Some error occured in the daemon's state of handling
1717
/// [`AccessMethodSetting`]s & [`ApiConnectionMode`]s
1818
#[error("Error occured when handling connection settings & details")]
19-
ApiService(#[from] api::Error),
19+
ApiService(#[from] access_mode::Error),
2020
/// A REST request failed
2121
#[error("Reset request failed")]
2222
Rest(#[from] rest::Error),
@@ -153,9 +153,9 @@ impl Daemon {
153153
#[cfg(not(target_os = "android"))]
154154
pub(crate) async fn test_access_method(
155155
proxy: talpid_types::net::AllowedEndpoint,
156-
access_method_selector: api::AccessModeSelectorHandle,
156+
access_method_selector: access_mode::AccessModeSelectorHandle,
157157
daemon_event_sender: crate::DaemonEventSender<(
158-
api::AccessMethodEvent,
158+
access_mode::AccessMethodEvent,
159159
futures::channel::oneshot::Sender<()>,
160160
)>,
161161
api_proxy: ApiProxy,
@@ -165,13 +165,13 @@ impl Daemon {
165165
.await
166166
.map(|connection_mode| connection_mode.endpoint)?;
167167

168-
api::AccessMethodEvent::Allow { endpoint: proxy }
168+
access_mode::AccessMethodEvent::Allow { endpoint: proxy }
169169
.send(daemon_event_sender.to_unbounded_sender())
170170
.await?;
171171

172172
let result = Self::perform_api_request(api_proxy).await;
173173

174-
api::AccessMethodEvent::Allow { endpoint: reset }
174+
access_mode::AccessMethodEvent::Allow { endpoint: reset }
175175
.send(daemon_event_sender.to_unbounded_sender())
176176
.await?;
177177

@@ -181,9 +181,9 @@ impl Daemon {
181181
#[cfg(target_os = "android")]
182182
pub(crate) async fn test_access_method(
183183
_: talpid_types::net::AllowedEndpoint,
184-
_: api::AccessModeSelectorHandle,
184+
_: access_mode::AccessModeSelectorHandle,
185185
_: crate::DaemonEventSender<(
186-
api::AccessMethodEvent,
186+
access_mode::AccessMethodEvent,
187187
futures::channel::oneshot::Sender<()>,
188188
)>,
189189
api_proxy: ApiProxy,

mullvad-daemon/src/api.rs

+67-1
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,78 @@ use crate::DaemonCommand;
44
use crate::DaemonEventSender;
55
use futures::{channel::mpsc, StreamExt};
66
use mullvad_api::{
7+
access_mode::BridgeAndDNSProxy,
78
availability::ApiAvailability,
89
proxy::{AllowedClientsProvider, ApiConnectionMode, ProxyConfig},
910
};
11+
use mullvad_encrypted_dns_proxy::state::EncryptedDnsProxyState;
12+
use mullvad_management_interface::async_trait;
13+
use mullvad_types::{
14+
access_method::{AccessMethod, AccessMethodSetting, BuiltInAccessMethod},
15+
relay_list::ShadowsocksBridgeProvider,
16+
};
1017
#[cfg(target_os = "android")]
1118
use talpid_core::mpsc::Sender;
12-
use talpid_types::net::{AllowedClients, Connectivity};
19+
use talpid_types::net::{proxy::CustomProxy, AllowedClients, Connectivity};
20+
21+
pub struct BridgeAndDNSProxyProvider<T> {
22+
bridge_provider: T,
23+
encrypted_dns_proxy_cache: EncryptedDnsProxyState,
24+
}
25+
26+
impl<T: ShadowsocksBridgeProvider> BridgeAndDNSProxyProvider<T> {
27+
pub fn new(bridge_provider: T, encrypted_dns_proxy_cache: EncryptedDnsProxyState) -> Self {
28+
Self {
29+
bridge_provider,
30+
encrypted_dns_proxy_cache,
31+
}
32+
}
33+
}
34+
35+
#[async_trait]
36+
impl<T> BridgeAndDNSProxy for BridgeAndDNSProxyProvider<T>
37+
where
38+
T: ShadowsocksBridgeProvider,
39+
{
40+
async fn match_access_method(
41+
&mut self,
42+
access_method: &AccessMethodSetting,
43+
) -> Option<ApiConnectionMode> {
44+
let connection_mode = {
45+
match &access_method.access_method {
46+
AccessMethod::BuiltIn(BuiltInAccessMethod::Direct) => ApiConnectionMode::Direct,
47+
AccessMethod::BuiltIn(BuiltInAccessMethod::Bridge) => {
48+
let Some(bridge) = self.bridge_provider.get_bridge_forced() else {
49+
log::warn!("Could not select a Mullvad bridge");
50+
log::debug!("The relay list might be empty");
51+
return None;
52+
};
53+
let proxy = CustomProxy::Shadowsocks(bridge);
54+
ApiConnectionMode::Proxied(ProxyConfig::from(proxy))
55+
}
56+
AccessMethod::BuiltIn(BuiltInAccessMethod::EncryptedDnsProxy) => {
57+
if let Err(error) = self
58+
.encrypted_dns_proxy_cache
59+
.fetch_configs("frakta.eu")
60+
.await
61+
{
62+
log::warn!("Failed to fetch new Encrypted DNS Proxy configurations");
63+
log::debug!("{error:#?}");
64+
}
65+
let Some(edp) = self.encrypted_dns_proxy_cache.next_configuration() else {
66+
log::warn!("Could not select next Encrypted DNS proxy config");
67+
return None;
68+
};
69+
ApiConnectionMode::Proxied(ProxyConfig::from(edp))
70+
}
71+
AccessMethod::Custom(config) => {
72+
ApiConnectionMode::Proxied(ProxyConfig::from(config.clone()))
73+
}
74+
}
75+
};
76+
Some(connection_mode)
77+
}
78+
}
1379

1480
#[derive(Clone, Copy)]
1581
pub struct AllowedClientsSelector {}

mullvad-daemon/src/lib.rs

+15-9
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub mod version;
3131
mod version_check;
3232

3333
use crate::target_state::PersistentTargetState;
34-
use api::AllowedClientsSelector;
34+
use api::{AllowedClientsSelector, BridgeAndDNSProxyProvider};
3535
use device::{AccountEvent, PrivateAccountAndDevice, PrivateDeviceEvent};
3636
use futures::{
3737
channel::{mpsc, oneshot},
@@ -41,7 +41,8 @@ use futures::{
4141
use geoip::GeoIpHandler;
4242
use leak_checker::{LeakChecker, LeakInfo};
4343
use management_interface::ManagementInterfaceServer;
44-
use mullvad_api::{api::AccessMethodEvent, proxy::AllowedClientsProvider, ApiEndpoint};
44+
use mullvad_api::{access_mode::AccessMethodEvent, proxy::AllowedClientsProvider, ApiEndpoint};
45+
use mullvad_encrypted_dns_proxy::state::EncryptedDnsProxyState;
4546
use mullvad_relay_selector::{RelaySelector, SelectorConfig};
4647
#[cfg(target_os = "android")]
4748
use mullvad_types::account::{PlayPurchase, PlayPurchasePaymentToken};
@@ -196,7 +197,7 @@ pub enum Error {
196197
AccessMethodError(#[source] access_method::Error),
197198

198199
#[error("API connection mode error")]
199-
ApiConnectionModeError(#[source] mullvad_api::api::Error),
200+
ApiConnectionModeError(#[source] mullvad_api::access_mode::Error),
200201
#[error("No custom bridge has been specified")]
201202
NoCustomProxySaved,
202203

@@ -610,7 +611,7 @@ pub struct Daemon {
610611
account_history: account_history::AccountHistory,
611612
device_checker: device::TunnelStateChangeHandler,
612613
account_manager: device::AccountManagerHandle,
613-
access_mode_handler: mullvad_api::api::AccessModeSelectorHandle,
614+
access_mode_handler: mullvad_api::access_mode::AccessModeSelectorHandle,
614615
api_runtime: mullvad_api::Runtime,
615616
api_handle: mullvad_api::rest::MullvadRestHandle,
616617
version_updater_handle: version_check::VersionUpdaterHandle,
@@ -706,10 +707,14 @@ impl Daemon {
706707
.set_config(SelectorConfig::from_settings(settings));
707708
});
708709

710+
let encrypted_dns_proxy_cache = EncryptedDnsProxyState::default();
711+
let bridge_dns_proxy_provider =
712+
BridgeAndDNSProxyProvider::new(relay_selector.clone(), encrypted_dns_proxy_cache);
713+
709714
let (access_mode_handler, access_mode_provider) =
710-
mullvad_api::api::AccessModeSelector::<AllowedClientsSelector>::spawn(
715+
mullvad_api::access_mode::AccessModeSelector::<AllowedClientsSelector>::spawn(
711716
config.cache_dir.clone(),
712-
relay_selector.clone(),
717+
Box::new(bridge_dns_proxy_provider),
713718
settings.api_access_methods.clone(),
714719
#[cfg(feature = "api-override")]
715720
config.endpoint.clone(),
@@ -2892,9 +2897,10 @@ impl Daemon {
28922897
{
28932898
Ok(Some(test_subject)) => test_subject,
28942899
Ok(None) => {
2895-
let error = Error::ApiConnectionModeError(mullvad_api::api::Error::Resolve {
2896-
access_method: access_method.access_method,
2897-
});
2900+
let error =
2901+
Error::ApiConnectionModeError(mullvad_api::access_mode::Error::Resolve {
2902+
access_method: access_method.access_method,
2903+
});
28982904
reply(Err(error));
28992905
return;
29002906
}

0 commit comments

Comments
 (0)