Skip to content

Commit 34dca18

Browse files
committed
* Changed the default rust client to use TLS for both plain text and TLS servers.
1 parent b197fd2 commit 34dca18

File tree

8 files changed

+130
-71
lines changed

8 files changed

+130
-71
lines changed

client/swimos_client/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use swimos_remote::net::plain::TokioPlainTextNetworking;
4242
use swimos_remote::net::ClientConnections;
4343
use swimos_runtime::downlink::{DownlinkOptions, DownlinkRuntimeConfig};
4444
#[cfg(feature = "tls")]
45-
use swimos_tls::{ClientConfig as TlsConfig, RustlsClientNetworking, TlsError};
45+
use swimos_tls::{ClientConfig as TlsConfig, RustTlsClientNetworking, TlsError};
4646
use swimos_utilities::trigger;
4747
use swimos_utilities::trigger::promise;
4848
use tokio::sync::mpsc;
@@ -106,7 +106,7 @@ impl SwimClientBuilder {
106106
let SwimClientBuilder { config } = self;
107107
Ok(open_client(
108108
config,
109-
RustlsClientNetworking::try_from_config(Arc::new(Resolver::new().await), tls_config)?,
109+
RustTlsClientNetworking::try_from_config(Arc::new(Resolver::new().await), tls_config)?,
110110
)
111111
.await)
112112
}

runtime/swimos_remote/src/net/plain.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,13 @@ impl ClientConnections for TokioPlainTextNetworking {
7171
.boxed()
7272
}
7373

74-
fn lookup(&self, host: String, port: u16) -> BoxFuture<'static, IoResult<Vec<SocketAddr>>> {
75-
self.resolver.resolve(host, port)
76-
}
77-
7874
fn dns_resolver(&self) -> BoxDnsResolver {
7975
Box::new(self.resolver.clone())
8076
}
77+
78+
fn lookup(&self, host: String, port: u16) -> BoxFuture<'static, IoResult<Vec<SocketAddr>>> {
79+
self.resolver.resolve(host, port)
80+
}
8181
}
8282

8383
impl ServerConnections for TokioPlainTextNetworking {

runtime/swimos_tls/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ pub use config::{
2222
};
2323
pub use errors::TlsError;
2424
pub use maybe::MaybeTlsStream;
25-
pub use net::{RustlsClientNetworking, RustlsListener, RustlsNetworking, RustlsServerNetworking};
25+
pub use net::{RustNetworking, RustTlsClientNetworking, RustTlsListener, RustTlsServerNetworking};

runtime/swimos_tls/src/net/client.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ use crate::{config::ClientConfig, errors::TlsError, maybe::MaybeTlsStream};
2929

3030
/// [`ClientConnections`] implementation that supports opening both secure and insecure connections.
3131
#[derive(Clone)]
32-
pub struct RustlsClientNetworking {
32+
pub struct RustTlsClientNetworking {
3333
resolver: Arc<Resolver>,
3434
connector: TlsConnector,
3535
}
3636

37-
impl RustlsClientNetworking {
37+
impl RustTlsClientNetworking {
3838
pub fn new(resolver: Arc<Resolver>, connector: TlsConnector) -> Self {
39-
RustlsClientNetworking {
39+
RustTlsClientNetworking {
4040
resolver,
4141
connector,
4242
}
@@ -75,11 +75,11 @@ impl RustlsClientNetworking {
7575
.with_no_client_auth();
7676

7777
let connector = TlsConnector::from(Arc::new(config));
78-
Ok(RustlsClientNetworking::new(resolver, connector))
78+
Ok(RustTlsClientNetworking::new(resolver, connector))
7979
}
8080
}
8181

82-
impl ClientConnections for RustlsClientNetworking {
82+
impl ClientConnections for RustTlsClientNetworking {
8383
type ClientSocket = MaybeTlsStream;
8484

8585
fn try_open(
@@ -104,7 +104,7 @@ impl ClientConnections for RustlsClientNetworking {
104104
};
105105
async move {
106106
let stream = TcpStream::connect(addr).await?;
107-
let RustlsClientNetworking { connector, .. } = self;
107+
let RustTlsClientNetworking { connector, .. } = self;
108108

109109
let client = connector.connect(domain?, stream).await.map_err(|err| {
110110
let tls_err = TlsError::HandshakeFailed(err);

runtime/swimos_tls/src/net/mod.rs

Lines changed: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ mod tests;
1919

2020
use std::{net::SocketAddr, sync::Arc};
2121

22-
pub use client::RustlsClientNetworking;
22+
pub use client::RustTlsClientNetworking;
23+
use futures::future::Either;
2324
use futures::TryFutureExt;
2425
use futures::{future::BoxFuture, FutureExt};
25-
pub use server::{RustlsListener, RustlsServerNetworking};
26+
pub use server::{RustTlsListener, RustTlsServerNetworking};
2627
use swimos_api::net::Scheme;
28+
use swimos_remote::net::plain::TokioPlainTextNetworking;
2729
use swimos_remote::net::{
2830
dns::{BoxDnsResolver, Resolver},
2931
ClientConnections, ConnResult, IoResult, ServerConnections,
@@ -33,9 +35,10 @@ use crate::{
3335
config::{CertFormat, CertificateFile, TlsConfig},
3436
errors::TlsError,
3537
maybe::MaybeTlsStream,
38+
ClientConfig,
3639
};
3740

38-
use self::server::MaybeRustlsListener;
41+
use self::server::MaybeRustTlsListener;
3942

4043
fn load_cert_file(file: CertificateFile) -> Result<Vec<rustls::Certificate>, TlsError> {
4144
let CertificateFile { format, body } = file;
@@ -49,33 +52,64 @@ fn load_cert_file(file: CertificateFile) -> Result<Vec<rustls::Certificate>, Tls
4952
Ok(certs.into_iter().map(rustls::Certificate).collect())
5053
}
5154

52-
/// Combined implementation of [`ClientConnections`] and [`ServerConnections`] that wraps both
53-
/// [`RustlsClientNetworking`] and [`RustlsServerNetworking`]. The server part is adapted to
55+
/// Combined implementation of [`ClientConnections`] and [`ServerConnections`] that wraps
56+
/// [`RustTlsClientNetworking`], [`RustTlsServerNetworking`] and [`TokioPlainTextNetworking`]. The server part is adapted to
5457
/// produce [`MaybeTlsStream`] connections so that there is a unified client/server socket type,
5558
/// inducing an implementation of [`super::ExternalConnections`].
5659
#[derive(Clone)]
57-
pub struct RustlsNetworking {
58-
client: RustlsClientNetworking,
59-
server: RustlsServerNetworking,
60+
pub struct RustNetworking {
61+
client: RustTlsClientNetworking,
62+
server: Either<TokioPlainTextNetworking, RustTlsServerNetworking>,
6063
}
6164

62-
impl RustlsNetworking {
63-
pub fn new(client: RustlsClientNetworking, server: RustlsServerNetworking) -> Self {
64-
RustlsNetworking { client, server }
65+
impl RustNetworking {
66+
pub fn new_plain_text(
67+
client: RustTlsClientNetworking,
68+
server: TokioPlainTextNetworking,
69+
) -> Self {
70+
RustNetworking {
71+
client,
72+
server: Either::Left(server),
73+
}
74+
}
75+
76+
pub fn new_tls(client: RustTlsClientNetworking, server: RustTlsServerNetworking) -> Self {
77+
RustNetworking {
78+
client,
79+
server: Either::Right(server),
80+
}
6581
}
6682

67-
pub fn try_from_config(resolver: Arc<Resolver>, config: TlsConfig) -> Result<Self, TlsError> {
83+
pub fn try_plain_text_from_config(
84+
resolver: Arc<Resolver>,
85+
client_config: ClientConfig,
86+
) -> Result<Self, TlsError> {
87+
let client = RustTlsClientNetworking::try_from_config(resolver.clone(), client_config)?;
88+
let server = TokioPlainTextNetworking::new(resolver);
89+
Ok(RustNetworking {
90+
client,
91+
server: Either::Left(server),
92+
})
93+
}
94+
95+
pub fn try_tls_from_config(
96+
resolver: Arc<Resolver>,
97+
config: TlsConfig,
98+
) -> Result<Self, TlsError> {
6899
let TlsConfig {
69100
client: client_conf,
70101
server: server_conf,
71102
} = config;
72-
let client = RustlsClientNetworking::try_from_config(resolver, client_conf)?;
73-
let server = RustlsServerNetworking::try_from(server_conf)?;
74-
Ok(RustlsNetworking { client, server })
103+
let client = RustTlsClientNetworking::try_from_config(resolver, client_conf)?;
104+
let server = RustTlsServerNetworking::try_from(server_conf)?;
105+
Ok(RustNetworking {
106+
client,
107+
server: Either::Right(server),
108+
})
75109
}
76110
}
77111

78-
impl ClientConnections for RustlsNetworking {
112+
impl ClientConnections for RustNetworking {
79113
type ClientSocket = MaybeTlsStream;
80114

81115
fn try_open(
@@ -96,18 +130,24 @@ impl ClientConnections for RustlsNetworking {
96130
}
97131
}
98132

99-
impl ServerConnections for RustlsNetworking {
133+
impl ServerConnections for RustNetworking {
100134
type ServerSocket = MaybeTlsStream;
101135

102-
type ListenerType = MaybeRustlsListener;
136+
type ListenerType = MaybeRustTlsListener;
103137

104138
fn bind(
105139
&self,
106140
addr: SocketAddr,
107141
) -> BoxFuture<'static, ConnResult<(SocketAddr, Self::ListenerType)>> {
108-
self.server
109-
.make_listener(addr)
110-
.map_ok(|(addr, listener)| (addr, MaybeRustlsListener::from(listener)))
111-
.boxed()
142+
match &self.server {
143+
Either::Left(plain_text_server) => plain_text_server
144+
.bind(addr)
145+
.map_ok(|(addr, listener)| (addr, MaybeRustTlsListener::from(listener)))
146+
.boxed(),
147+
Either::Right(tls_server) => tls_server
148+
.make_listener(addr)
149+
.map_ok(|(addr, listener)| (addr, MaybeRustTlsListener::from(listener)))
150+
.boxed(),
151+
}
112152
}
113153
}

runtime/swimos_tls/src/net/server.rs

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -37,37 +37,37 @@ use crate::{
3737

3838
/// [`ServerConnections`] implementation that only supports secure connections.
3939
#[derive(Clone)]
40-
pub struct RustlsServerNetworking {
40+
pub struct RustTlsServerNetworking {
4141
acceptor: TlsAcceptor,
4242
}
4343

4444
async fn accept_tls(
4545
acceptor: TlsAcceptor,
4646
addr: SocketAddr,
47-
) -> ConnResult<(SocketAddr, RustlsListener)> {
47+
) -> ConnResult<(SocketAddr, RustTlsListener)> {
4848
let listener = TcpListener::bind(addr).await?;
4949
let bound_to = listener.local_addr()?;
50-
Ok((bound_to, RustlsListener { listener, acceptor }))
50+
Ok((bound_to, RustTlsListener { listener, acceptor }))
5151
}
5252

53-
impl RustlsServerNetworking {
53+
impl RustTlsServerNetworking {
5454
pub fn make_listener(
5555
&self,
5656
addr: SocketAddr,
57-
) -> impl Future<Output = ConnResult<(SocketAddr, RustlsListener)>> + Send + 'static {
58-
let RustlsServerNetworking { acceptor } = self;
57+
) -> impl Future<Output = ConnResult<(SocketAddr, RustTlsListener)>> + Send + 'static {
58+
let RustTlsServerNetworking { acceptor } = self;
5959
let acc = acceptor.clone();
6060
accept_tls(acc, addr)
6161
}
6262
}
6363

64-
impl RustlsServerNetworking {
64+
impl RustTlsServerNetworking {
6565
pub fn new(acceptor: TlsAcceptor) -> Self {
66-
RustlsServerNetworking { acceptor }
66+
RustTlsServerNetworking { acceptor }
6767
}
6868
}
6969

70-
impl TryFrom<ServerConfig> for RustlsServerNetworking {
70+
impl TryFrom<ServerConfig> for RustTlsServerNetworking {
7171
type Error = TlsError;
7272

7373
fn try_from(config: ServerConfig) -> Result<Self, Self::Error> {
@@ -108,14 +108,14 @@ impl TryFrom<ServerConfig> for RustlsServerNetworking {
108108
config.key_log = Arc::new(KeyLogFile::new());
109109
}
110110
let acceptor = TlsAcceptor::from(Arc::new(config));
111-
Ok(RustlsServerNetworking::new(acceptor))
111+
Ok(RustTlsServerNetworking::new(acceptor))
112112
}
113113
}
114114

115-
impl ServerConnections for RustlsServerNetworking {
115+
impl ServerConnections for RustTlsServerNetworking {
116116
type ServerSocket = TlsStream<TcpStream>;
117117

118-
type ListenerType = RustlsListener;
118+
type ListenerType = RustTlsListener;
119119

120120
fn bind(
121121
&self,
@@ -127,16 +127,16 @@ impl ServerConnections for RustlsServerNetworking {
127127

128128
/// A listener that will listen for incoming TCP connections and attempt to negotiate a
129129
/// TLS connection over them.
130-
pub struct RustlsListener {
130+
pub struct RustTlsListener {
131131
listener: TcpListener,
132132
acceptor: TlsAcceptor,
133133
}
134134

135-
impl Listener<TlsStream<TcpStream>> for RustlsListener {
135+
impl Listener<TlsStream<TcpStream>> for RustTlsListener {
136136
type AcceptStream = BoxListenerStream<TlsStream<TcpStream>>;
137137

138138
fn into_stream(self) -> Self::AcceptStream {
139-
let RustlsListener { listener, acceptor } = self;
139+
let RustTlsListener { listener, acceptor } = self;
140140
tls_accept_stream(listener, acceptor).boxed()
141141
}
142142
}
@@ -226,27 +226,45 @@ fn tls_accept_stream(
226226
})
227227
}
228228

229-
/// This wraps connections for a [`RustlsListener`] as [`crate::maybe::MaybeTlsStream`] to unify server and client
229+
/// This wraps connections for [`TcpListener`] and [`RustTlsListener`] as [`crate::maybe::MaybeTlsStream`] to unify server and client
230230
/// connection types.
231-
pub struct MaybeRustlsListener {
232-
inner: RustlsListener,
231+
pub struct MaybeRustTlsListener {
232+
inner: Either<TcpListener, RustTlsListener>,
233233
}
234234

235-
impl From<RustlsListener> for MaybeRustlsListener {
236-
fn from(inner: RustlsListener) -> Self {
237-
MaybeRustlsListener { inner }
235+
impl From<TcpListener> for MaybeRustTlsListener {
236+
fn from(inner: TcpListener) -> Self {
237+
MaybeRustTlsListener {
238+
inner: Either::Left(inner),
239+
}
240+
}
241+
}
242+
243+
impl From<RustTlsListener> for MaybeRustTlsListener {
244+
fn from(inner: RustTlsListener) -> Self {
245+
MaybeRustTlsListener {
246+
inner: Either::Right(inner),
247+
}
238248
}
239249
}
240250

241-
impl Listener<MaybeTlsStream> for MaybeRustlsListener {
251+
impl Listener<MaybeTlsStream> for MaybeRustTlsListener {
242252
type AcceptStream = BoxListenerStream<MaybeTlsStream>;
243253

244254
fn into_stream(self) -> Self::AcceptStream {
245-
let MaybeRustlsListener {
246-
inner: RustlsListener { listener, acceptor },
247-
} = self;
248-
tls_accept_stream(listener, acceptor)
249-
.map_ok(|(sock, scheme, addr)| (MaybeTlsStream::Tls(sock), scheme, addr))
250-
.boxed()
255+
let MaybeRustTlsListener { inner } = self;
256+
257+
match inner {
258+
Either::Left(listener) => listener
259+
.into_stream()
260+
.map_ok(|(sock, scheme, addr)| (MaybeTlsStream::Plain(sock), scheme, addr))
261+
.boxed(),
262+
263+
Either::Right(RustTlsListener { listener, acceptor }) => {
264+
tls_accept_stream(listener, acceptor)
265+
.map_ok(|(sock, scheme, addr)| (MaybeTlsStream::Tls(sock), scheme, addr))
266+
.boxed()
267+
}
268+
}
251269
}
252270
}

runtime/swimos_tls/src/net/tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ use swimos_remote::net::{
2121
};
2222

2323
use crate::{
24-
CertChain, CertificateFile, ClientConfig, PrivateKey, RustlsClientNetworking,
25-
RustlsServerNetworking, ServerConfig,
24+
CertChain, CertificateFile, ClientConfig, PrivateKey, RustTlsClientNetworking,
25+
RustTlsServerNetworking, ServerConfig,
2626
};
2727

2828
const CERTS_PATH: &str = "test-data/certs";
@@ -68,8 +68,8 @@ fn make_client_config() -> ClientConfig {
6868
#[tokio::test]
6969
async fn perform_handshake() {
7070
let server_net =
71-
RustlsServerNetworking::try_from(make_server_config()).expect("Invalid server config.");
72-
let client_net = RustlsClientNetworking::try_from_config(
71+
RustTlsServerNetworking::try_from(make_server_config()).expect("Invalid server config.");
72+
let client_net = RustTlsClientNetworking::try_from_config(
7373
Arc::new(Resolver::new().await),
7474
make_client_config(),
7575
)

0 commit comments

Comments
 (0)