From b6935eca5baeddadae2133bc732fd32e76a782cc Mon Sep 17 00:00:00 2001 From: Alex Konradi Date: Wed, 13 Nov 2024 16:33:54 -0500 Subject: [PATCH 01/57] QoL improvements for routes & connectors --- rust/net/infra/src/route.rs | 23 ++++++++++++++++++++--- rust/net/infra/src/route/connect.rs | 28 ++++++++++++++++++++-------- rust/net/infra/src/route/proxy.rs | 18 ++++++++++++++++++ rust/net/infra/src/route/resolve.rs | 5 +++-- 4 files changed, 61 insertions(+), 13 deletions(-) diff --git a/rust/net/infra/src/route.rs b/rust/net/infra/src/route.rs index 817e8fc16..05da968e7 100644 --- a/rust/net/infra/src/route.rs +++ b/rust/net/infra/src/route.rs @@ -3,6 +3,7 @@ // SPDX-License-Identifier: AGPL-3.0-only // +use std::net::IpAddr; use std::sync::Arc; mod connect; @@ -29,6 +30,8 @@ pub use tls::*; mod ws; pub use ws::*; +use crate::host::Host; + /// Produces routes to a destination. /// /// A "route" here is a path to a target destination of some kind. It does not @@ -74,9 +77,23 @@ pub struct SimpleRoute { pub inner: Inner, } -pub type HttpsServiceRoute = - HttpsTlsRoute, ConnectionProxyRoute>>>; -pub type WebSocketServiceRoute = WebSocketRoute>; +/// Transport-level route that contains [`UnresolvedHost`] addresses. +pub type UnresolvedTransportRoute = TlsRoute< + DirectOrProxyRoute, ConnectionProxyRoute>>, +>; +/// [`HttpsTlsRoute`] that contains [`UnresolvedHost`] addresses. +pub type UnresolvedHttpsServiceRoute = HttpsTlsRoute; + +/// [`WebSocketRoute`] that contains [`UnresolvedHost`] addresses. +pub type UnresolvedWebsocketServiceRoute = WebSocketRoute>; + +/// Transport-level route that contains [`IpAddr`]s. +pub type TransportRoute = + TlsRoute, ConnectionProxyRoute>>; +/// [`HttpsTlsRoute`] that contains [`IpAddr`]s. +pub type HttpsServiceRoute = HttpsTlsRoute; +/// [`WebSocketRoute`] that contains [`IpAddr`]s. +pub type WebSocketServiceRoute = WebSocketRoute; impl From> for UnresolvedHost { fn from(value: Arc) -> Self { diff --git a/rust/net/infra/src/route/connect.rs b/rust/net/infra/src/route/connect.rs index 7dc3bf575..272adb1e8 100644 --- a/rust/net/infra/src/route/connect.rs +++ b/rust/net/infra/src/route/connect.rs @@ -15,7 +15,8 @@ use tokio_util::either::Either; use crate::errors::TransportConnectError; use crate::route::{ ConnectionProxyRoute, DirectOrProxyRoute, HttpRouteFragment, HttpsTlsRoute, TcpRoute, TlsRoute, - TlsRouteFragment, WebSocketRoute, WebSocketRouteFragment, WebSocketServiceRoute, + TlsRouteFragment, TransportRoute, WebSocketRoute, WebSocketRouteFragment, + WebSocketServiceRoute, }; use crate::ws::WebSocketConnectError; @@ -79,9 +80,9 @@ pub struct ComposedConnector { _error: PhantomData, } -/// Stateless connector that connects [`WebSocketServiceRoute`]s. +/// Stateless connector that connects [`WebSocketServiceRoute`]s. pub type StatelessWebSocketConnector = WebSocketHttpConnector; -/// Stateless connector that connects [`TlsTransportRoute`](super::TlsTransportRoute)s. +/// Stateless connector that connects [`TransportRoute`]s. pub type StatelessTransportConnector = TransportConnector; type TcpConnector = crate::tcp_ssl::StatelessDirect; @@ -100,11 +101,8 @@ const _: () = { DirectProxyConnector, DirectOrProxyRoute, ConnectionProxyRoute>, >(); - assert_is_connector::< - TransportConnector, - TlsRoute, ConnectionProxyRoute>>, - >(); - assert_is_connector::>(); + assert_is_connector::(); + assert_is_connector::(); }; impl ComposedConnector { @@ -251,6 +249,20 @@ where } } +impl, R, Inner> Connector for &C { + type Connection = C::Connection; + + type Error = C::Error; + + fn connect_over( + &self, + over: Inner, + route: R, + ) -> impl Future> + Send { + (*self).connect_over(over, route) + } +} + impl From for WebSocketConnectError { fn from(value: std::io::Error) -> Self { Self::WebSocketError(value.into()) diff --git a/rust/net/infra/src/route/proxy.rs b/rust/net/infra/src/route/proxy.rs index c0c0a9295..224d07d14 100644 --- a/rust/net/infra/src/route/proxy.rs +++ b/rust/net/infra/src/route/proxy.rs @@ -47,6 +47,9 @@ pub enum DirectOrProxyRoute { Proxy(P), } +/// [`RouteProvider`] implementation that returns [`DirectOrProxyRoute`]s. +/// +/// Constructs routes that either connect directly or through a proxy. #[derive(Clone, Debug, PartialEq)] pub enum DirectOrProxyProvider { Direct(D), @@ -77,6 +80,21 @@ pub struct ConnectionProxyRouteProvider

{ pub(crate) inner: P, } +impl DirectOrProxyProvider> { + /// Convenience constructor for a provider that creates proxied routes if a + /// config is provided. + /// + /// Returns `Self::Direct(direct)` if no proxy config is given, otherwise + /// `Self::Proxy` with a `ConnectionProxyRouteProvider` wrapped around + /// `direct`. + pub fn maybe_proxied(direct: D, proxy_config: Option) -> Self { + match proxy_config { + Some(proxy) => Self::Proxy(ConnectionProxyRouteProvider::new(proxy, direct)), + None => Self::Direct(direct), + } + } +} + impl

ConnectionProxyRouteProvider

{ pub fn new(proxy: ConnectionProxyConfig, inner: P) -> Self { Self { proxy, inner } diff --git a/rust/net/infra/src/route/resolve.rs b/rust/net/infra/src/route/resolve.rs index 2511ab3c1..1b676e5d6 100644 --- a/rust/net/infra/src/route/resolve.rs +++ b/rust/net/infra/src/route/resolve.rs @@ -374,7 +374,8 @@ mod test { use crate::certs::RootCertificates; use crate::host::Host; use crate::route::{ - DirectOrProxyRoute, HttpRouteFragment, HttpsServiceRoute, SocksRoute, TlsRouteFragment, + DirectOrProxyRoute, HttpRouteFragment, SocksRoute, TlsRouteFragment, + UnresolvedHttpsServiceRoute, }; use crate::tcp_ssl::proxy::socks; use crate::DnsSource; @@ -611,7 +612,7 @@ mod test { }) } - let unresolved_route: HttpsServiceRoute<_> = HttpsTlsRoute { + let unresolved_route: UnresolvedHttpsServiceRoute = HttpsTlsRoute { inner: TlsRoute { inner: DirectOrProxyRoute::Proxy(socks_route( Host::Domain(UnresolvedHost("proxy-domain".into())), From f062dd5246b7f1f72ac7ff534bf4445956681681 Mon Sep 17 00:00:00 2001 From: Alex Konradi Date: Thu, 14 Nov 2024 13:37:52 -0500 Subject: [PATCH 02/57] Bump dep to subtle v2.6 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 86d8000ba..885fef601 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -141,7 +141,7 @@ sha2 = "0.10" snow = { version = "0.9.6", default-features = false, features = ["hfs"] } static_assertions = "1.1" strum = "0.26" -subtle = "2.5" +subtle = "2.6" syn = "2.0" syn-mid = "0.6" test-case = "3.3" From a1da0bdd8c3f3b18435cfee16368eb7b1ca2b241 Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Wed, 13 Nov 2024 19:12:36 -0800 Subject: [PATCH 03/57] backup: Use a hash map optimized for u64 Most of our map lookups are based on IDs represented as integers; using a full hash function for this is overkill. The intmap crate hashes integers with a single (wrapping) multiplication instead. We do a *lot* of validation of recipients, so this is a noticeable if modest speedup. --- Cargo.lock | 7 ++ acknowledgments/acknowledgments.html | 16 ++++- acknowledgments/acknowledgments.md | 12 ++++ acknowledgments/acknowledgments.plist | 16 +++++ rust/message-backup/Cargo.toml | 1 + rust/message-backup/src/backup.rs | 30 ++++---- rust/message-backup/src/backup/chat.rs | 1 - .../src/backup/chat/reactions.rs | 11 +-- rust/message-backup/src/backup/frame.rs | 7 ++ rust/message-backup/src/backup/map.rs | 72 +++++++++++++++++++ rust/message-backup/src/backup/method.rs | 5 ++ 11 files changed, 158 insertions(+), 20 deletions(-) create mode 100644 rust/message-backup/src/backup/map.rs diff --git a/Cargo.lock b/Cargo.lock index b1c102804..20e882cf8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1837,6 +1837,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "intmap" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee87fd093563344074bacf24faa0bb0227fb6969fb223e922db798516de924d6" + [[package]] name = "ipnet" version = "2.10.0" @@ -2267,6 +2273,7 @@ dependencies = [ "hex-literal", "hkdf", "hmac", + "intmap", "itertools 0.13.0", "json5", "libsignal-account-keys", diff --git a/acknowledgments/acknowledgments.html b/acknowledgments/acknowledgments.html index de00089f5..12dc620ad 100644 --- a/acknowledgments/acknowledgments.html +++ b/acknowledgments/acknowledgments.html @@ -46,7 +46,7 @@

Third Party Licenses

Overview of licenses: