Skip to content

Commit a91317f

Browse files
authored
Merge pull request #609 from swimos/tls-client-defaut
Outgoing TLS for server
2 parents b197fd2 + 96881fc commit a91317f

File tree

4 files changed

+79
-43
lines changed

4 files changed

+79
-43
lines changed

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/net/mod.rs

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,25 +17,26 @@ mod server;
1717
#[cfg(test)]
1818
mod tests;
1919

20-
use std::{net::SocketAddr, sync::Arc};
20+
use std::net::SocketAddr;
2121

2222
pub use client::RustlsClientNetworking;
23+
use futures::future::Either;
2324
use futures::TryFutureExt;
2425
use futures::{future::BoxFuture, FutureExt};
2526
pub use server::{RustlsListener, RustlsServerNetworking};
2627
use swimos_api::net::Scheme;
28+
use swimos_remote::net::plain::TokioPlainTextNetworking;
2729
use swimos_remote::net::{
28-
dns::{BoxDnsResolver, Resolver},
29-
ClientConnections, ConnResult, IoResult, ServerConnections,
30+
dns::BoxDnsResolver, ClientConnections, ConnResult, IoResult, ServerConnections,
3031
};
3132

3233
use crate::{
33-
config::{CertFormat, CertificateFile, TlsConfig},
34+
config::{CertFormat, CertificateFile},
3435
errors::TlsError,
3536
maybe::MaybeTlsStream,
3637
};
3738

38-
use self::server::MaybeRustlsListener;
39+
use self::server::MaybeRustTlsListener;
3940

4041
fn load_cert_file(file: CertificateFile) -> Result<Vec<rustls::Certificate>, TlsError> {
4142
let CertificateFile { format, body } = file;
@@ -49,29 +50,32 @@ fn load_cert_file(file: CertificateFile) -> Result<Vec<rustls::Certificate>, Tls
4950
Ok(certs.into_iter().map(rustls::Certificate).collect())
5051
}
5152

52-
/// Combined implementation of [`ClientConnections`] and [`ServerConnections`] that wraps both
53-
/// [`RustlsClientNetworking`] and [`RustlsServerNetworking`]. The server part is adapted to
53+
/// Combined implementation of [`ClientConnections`] and [`ServerConnections`] that wraps
54+
/// [`RustlsClientNetworking`], [`RustlsServerNetworking`] and [`TokioPlainTextNetworking`]. The server part is adapted to
5455
/// produce [`MaybeTlsStream`] connections so that there is a unified client/server socket type,
5556
/// inducing an implementation of [`super::ExternalConnections`].
5657
#[derive(Clone)]
5758
pub struct RustlsNetworking {
5859
client: RustlsClientNetworking,
59-
server: RustlsServerNetworking,
60+
server: Either<TokioPlainTextNetworking, RustlsServerNetworking>,
6061
}
6162

6263
impl RustlsNetworking {
63-
pub fn new(client: RustlsClientNetworking, server: RustlsServerNetworking) -> Self {
64-
RustlsNetworking { client, server }
64+
pub fn new_plain_text(
65+
client: RustlsClientNetworking,
66+
server: TokioPlainTextNetworking,
67+
) -> Self {
68+
RustlsNetworking {
69+
client,
70+
server: Either::Left(server),
71+
}
6572
}
6673

67-
pub fn try_from_config(resolver: Arc<Resolver>, config: TlsConfig) -> Result<Self, TlsError> {
68-
let TlsConfig {
69-
client: client_conf,
70-
server: server_conf,
71-
} = config;
72-
let client = RustlsClientNetworking::try_from_config(resolver, client_conf)?;
73-
let server = RustlsServerNetworking::try_from(server_conf)?;
74-
Ok(RustlsNetworking { client, server })
74+
pub fn new_tls(client: RustlsClientNetworking, server: RustlsServerNetworking) -> Self {
75+
RustlsNetworking {
76+
client,
77+
server: Either::Right(server),
78+
}
7579
}
7680
}
7781

@@ -99,15 +103,21 @@ impl ClientConnections for RustlsNetworking {
99103
impl ServerConnections for RustlsNetworking {
100104
type ServerSocket = MaybeTlsStream;
101105

102-
type ListenerType = MaybeRustlsListener;
106+
type ListenerType = MaybeRustTlsListener;
103107

104108
fn bind(
105109
&self,
106110
addr: SocketAddr,
107111
) -> BoxFuture<'static, ConnResult<(SocketAddr, Self::ListenerType)>> {
108-
self.server
109-
.make_listener(addr)
110-
.map_ok(|(addr, listener)| (addr, MaybeRustlsListener::from(listener)))
111-
.boxed()
112+
match &self.server {
113+
Either::Left(plain_text_server) => plain_text_server
114+
.bind(addr)
115+
.map_ok(|(addr, listener)| (addr, MaybeRustTlsListener::from(listener)))
116+
.boxed(),
117+
Either::Right(tls_server) => tls_server
118+
.make_listener(addr)
119+
.map_ok(|(addr, listener)| (addr, MaybeRustTlsListener::from(listener)))
120+
.boxed(),
121+
}
112122
}
113123
}

runtime/swimos_tls/src/net/server.rs

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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 [`RustlsListener`] 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, RustlsListener>,
233233
}
234234

235-
impl From<RustlsListener> for MaybeRustlsListener {
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<RustlsListener> for MaybeRustTlsListener {
236244
fn from(inner: RustlsListener) -> Self {
237-
MaybeRustlsListener { inner }
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(RustlsListener { 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
}

server/swimos_server_app/src/server/builder/mod.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,11 @@ use ratchet::{
2222
NoExtProvider, WebSocketStream,
2323
};
2424
use swimos_api::{agent::Agent, error::StoreError, store::StoreDisabled};
25-
use swimos_remote::net::{dns::Resolver, plain::TokioPlainTextNetworking, ExternalConnections};
26-
use swimos_tls::{RustlsNetworking, TlsConfig};
25+
use swimos_remote::net::plain::TokioPlainTextNetworking;
26+
use swimos_remote::net::{dns::Resolver, ExternalConnections};
27+
use swimos_tls::{
28+
ClientConfig, RustlsClientNetworking, RustlsNetworking, RustlsServerNetworking, TlsConfig,
29+
};
2730
use swimos_utilities::routing::route_pattern::RoutePattern;
2831

2932
use crate::{
@@ -175,10 +178,15 @@ impl ServerBuilder {
175178
introspection,
176179
};
177180
if let Some(tls_conf) = tls_config {
178-
let networking = RustlsNetworking::try_from_config(resolver, tls_conf)?;
181+
let client = RustlsClientNetworking::try_from_config(resolver, tls_conf.client)?;
182+
let server = RustlsServerNetworking::try_from(tls_conf.server)?;
183+
let networking = RustlsNetworking::new_tls(client, server);
179184
Ok(with_store(bind_to, routes, networking, config)?)
180185
} else {
181-
let networking = TokioPlainTextNetworking::new(resolver);
186+
let client =
187+
RustlsClientNetworking::try_from_config(resolver.clone(), ClientConfig::default())?;
188+
let server = TokioPlainTextNetworking::new(resolver);
189+
let networking = RustlsNetworking::new_plain_text(client, server);
182190
Ok(with_store(bind_to, routes, networking, config)?)
183191
}
184192
}

0 commit comments

Comments
 (0)