Skip to content

Commit 85528be

Browse files
committed
Use a static trait implementation instead of a dynamic dispatch
1 parent b428f7a commit 85528be

File tree

4 files changed

+17
-32
lines changed

4 files changed

+17
-32
lines changed

mullvad-api/src/api.rs

+12-23
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use mullvad_relay_selector::RelaySelector;
1919
use mullvad_types::access_method::{
2020
AccessMethod, AccessMethodSetting, BuiltInAccessMethod, Id, Settings,
2121
};
22-
use std::{net::SocketAddr, path::PathBuf};
22+
use std::{marker::PhantomData, net::SocketAddr, path::PathBuf};
2323
use talpid_types::net::{proxy::CustomProxy, AllowedEndpoint, Endpoint, TransportProtocol};
2424

2525
pub enum Message {
@@ -261,7 +261,7 @@ pub struct AccessModeSelector<P> {
261261
current: ResolvedConnectionMode,
262262
/// `index` is used to keep track of the [`AccessMethodSetting`] to use.
263263
index: usize,
264-
provider: P,
264+
provider: PhantomData<P>,
265265
}
266266

267267
impl<P> AccessModeSelector<P>
@@ -276,7 +276,6 @@ where
276276
#[cfg(feature = "api-override")] api_endpoint: ApiEndpoint,
277277
access_method_event_sender: mpsc::UnboundedSender<(AccessMethodEvent, oneshot::Sender<()>)>,
278278
address_cache: AddressCache,
279-
provider: P,
280279
) -> Result<(AccessModeSelectorHandle, AccessModeConnectionModeProvider)> {
281280
let (cmd_tx, cmd_rx) = mpsc::unbounded();
282281

@@ -298,15 +297,14 @@ where
298297
&relay_selector,
299298
&mut encrypted_dns_proxy_cache,
300299
&address_cache,
301-
&provider,
302300
)
303301
.await;
304302

305303
let (change_tx, change_rx) = mpsc::unbounded();
306304

307305
let api_connection_mode = initial_connection_mode.connection_mode.clone();
308306

309-
let selector = AccessModeSelector {
307+
let selector: AccessModeSelector<P> = AccessModeSelector {
310308
#[cfg(feature = "api-override")]
311309
api_endpoint,
312310
cmd_rx,
@@ -319,7 +317,7 @@ where
319317
connection_mode_provider_sender: change_tx,
320318
current: initial_connection_mode,
321319
index,
322-
provider,
320+
provider: PhantomData,
323321
};
324322

325323
tokio::spawn(selector.into_future());
@@ -542,7 +540,6 @@ where
542540
&self.relay_selector,
543541
&mut self.encrypted_dns_proxy_cache,
544542
&self.address_cache,
545-
&self.provider,
546543
)
547544
.await
548545
}
@@ -552,16 +549,12 @@ where
552549
relay_selector: &RelaySelector,
553550
encrypted_dns_proxy_cache: &mut EncryptedDnsProxyState,
554551
address_cache: &AddressCache,
555-
provider: &P,
556552
) -> Option<ResolvedConnectionMode> {
557553
let connection_mode =
558554
Self::resolve_connection_mode(access_method, relay_selector, encrypted_dns_proxy_cache)
559555
.await?;
560-
let endpoint = resolve_allowed_endpoint(
561-
&connection_mode,
562-
address_cache.get_address().await,
563-
provider,
564-
);
556+
let endpoint =
557+
resolve_allowed_endpoint::<P>(&connection_mode, address_cache.get_address().await);
565558
Some(ResolvedConnectionMode {
566559
connection_mode,
567560
endpoint,
@@ -580,7 +573,6 @@ where
580573
&self.relay_selector,
581574
&mut self.encrypted_dns_proxy_cache,
582575
&self.address_cache,
583-
&self.provider,
584576
)
585577
.await
586578
}
@@ -590,27 +582,25 @@ where
590582
relay_selector: &RelaySelector,
591583
encrypted_dns_proxy_cache: &mut EncryptedDnsProxyState,
592584
address_cache: &AddressCache,
593-
provider: &P,
594585
) -> ResolvedConnectionMode {
595586
match Self::resolve_inner(
596587
access_method,
597588
relay_selector,
598589
encrypted_dns_proxy_cache,
599590
address_cache,
600-
provider,
601591
)
602592
.await
603593
{
604594
Some(resolved) => resolved,
605595
None => {
606596
log::trace!("Defaulting to direct API connection");
597+
let endpoint = resolve_allowed_endpoint::<P>(
598+
&ApiConnectionMode::Direct,
599+
address_cache.get_address().await,
600+
);
607601
ResolvedConnectionMode {
608602
connection_mode: ApiConnectionMode::Direct,
609-
endpoint: resolve_allowed_endpoint(
610-
&ApiConnectionMode::Direct,
611-
address_cache.get_address().await,
612-
provider,
613-
),
603+
endpoint,
614604
setting: access_method.clone(),
615605
}
616606
}
@@ -657,7 +647,6 @@ where
657647
pub fn resolve_allowed_endpoint<P>(
658648
connection_mode: &ApiConnectionMode,
659649
fallback: SocketAddr,
660-
provider: &P,
661650
) -> AllowedEndpoint
662651
where
663652
P: AllowedClientsProvider,
@@ -666,6 +655,6 @@ where
666655
Some(endpoint) => endpoint,
667656
None => Endpoint::from_socket_address(fallback, TransportProtocol::Tcp),
668657
};
669-
let clients = provider.allowed_clients(connection_mode);
658+
let clients = P::allowed_clients(connection_mode);
670659
AllowedEndpoint { endpoint, clients }
671660
}

mullvad-api/src/proxy.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl ConnectionModeProvider for StaticConnectionModeProvider {
5454
}
5555

5656
pub trait AllowedClientsProvider: Send + Sync {
57-
fn allowed_clients(&self, connection_mode: &ApiConnectionMode) -> AllowedClients;
57+
fn allowed_clients(connection_mode: &ApiConnectionMode) -> AllowedClients;
5858
}
5959

6060
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]

mullvad-daemon/src/api.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,15 @@ pub struct AllowedClientsSelector {}
1616

1717
impl AllowedClientsProvider for AllowedClientsSelector {
1818
#[cfg(unix)]
19-
fn allowed_clients(&self, connection_mode: &ApiConnectionMode) -> AllowedClients {
19+
fn allowed_clients(connection_mode: &ApiConnectionMode) -> AllowedClients {
2020
match connection_mode {
2121
ApiConnectionMode::Proxied(ProxyConfig::Socks5Local(_)) => AllowedClients::All,
2222
ApiConnectionMode::Direct | ApiConnectionMode::Proxied(_) => AllowedClients::Root,
2323
}
2424
}
2525

2626
#[cfg(windows)]
27-
fn allowed_clients(&self, connection_mode: &ApiConnectionMode) -> AllowedClients {
27+
fn allowed_clients(connection_mode: &ApiConnectionMode) -> AllowedClients {
2828
match connection_mode {
2929
ApiConnectionMode::Proxied(ProxyConfig::Socks5Local(_)) => AllowedClients::all(),
3030
ApiConnectionMode::Direct | ApiConnectionMode::Proxied(_) => {

mullvad-daemon/src/lib.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -706,18 +706,15 @@ impl Daemon {
706706
.set_config(SelectorConfig::from_settings(settings));
707707
});
708708

709-
let selector = AllowedClientsSelector {};
710-
711709
let (access_mode_handler, access_mode_provider) =
712-
mullvad_api::api::AccessModeSelector::spawn(
710+
mullvad_api::api::AccessModeSelector::<AllowedClientsSelector>::spawn(
713711
config.cache_dir.clone(),
714712
relay_selector.clone(),
715713
settings.api_access_methods.clone(),
716714
#[cfg(feature = "api-override")]
717715
config.endpoint.clone(),
718716
internal_event_tx.to_unbounded_sender(),
719717
api_runtime.address_cache().clone(),
720-
selector,
721718
)
722719
.await
723720
.map_err(Error::ApiConnectionModeError)?;
@@ -2846,15 +2843,14 @@ impl Daemon {
28462843
tx: ResponseTx<bool, Error>,
28472844
proxy: talpid_types::net::proxy::CustomProxy,
28482845
) {
2849-
use crate::AllowedClientsSelector;
28502846
use mullvad_api::proxy::{ApiConnectionMode, ProxyConfig};
28512847
use talpid_types::net::AllowedEndpoint;
28522848

28532849
let connection_mode = ApiConnectionMode::Proxied(ProxyConfig::from(proxy.clone()));
28542850
let api_proxy = self.create_limited_api_proxy(connection_mode.clone());
28552851
let proxy_endpoint = AllowedEndpoint {
28562852
endpoint: proxy.get_remote_endpoint().endpoint,
2857-
clients: AllowedClientsSelector {}.allowed_clients(&connection_mode),
2853+
clients: AllowedClientsSelector::allowed_clients(&connection_mode),
28582854
};
28592855

28602856
let daemon_event_sender = self.tx.to_specialized_sender();

0 commit comments

Comments
 (0)