1- #![ cfg( test) ]
2-
3- // These are basically integration tests for the `connection` submodule, but
4- // they cannot be "real" integration tests because `connection` isn't a public
5- // interface and because `connection` exposes a `#[cfg(test)]`-only API for use
6- // by these tests.
1+ #![ deny( warnings) ]
2+ #![ forbid( unsafe_code) ]
73
84use futures:: prelude:: * ;
95use linkerd_conditional:: Conditional ;
106use linkerd_error:: Infallible ;
117use linkerd_identity:: { Credentials , DerX509 , Name } ;
128use linkerd_io:: { self as io, AsyncRead , AsyncReadExt , AsyncWrite , AsyncWriteExt } ;
13- use linkerd_meshtls_rustls as meshtls;
9+ use linkerd_meshtls as meshtls;
1410use linkerd_proxy_transport:: {
1511 addrs:: * ,
1612 listen:: { Addrs , Bind , BindTcp } ,
1713 ConnectTcp , Keepalive , ListenAddr ,
1814} ;
19- use linkerd_stack:: { ExtractParam , InsertParam , NewService , Param } ;
15+ use linkerd_stack:: {
16+ layer:: Layer , service_fn, ExtractParam , InsertParam , NewService , Param , ServiceExt ,
17+ } ;
2018use linkerd_tls as tls;
2119use linkerd_tls_test_util as test_util;
2220use std:: { future:: Future , net:: SocketAddr , sync:: mpsc, time:: Duration } ;
2321use tokio:: net:: TcpStream ;
24- use tower:: {
25- layer:: Layer ,
26- util:: { service_fn, ServiceExt } ,
27- } ;
28- use tracing:: instrument:: Instrument ;
29-
30- type ServerConn < T , I > = (
31- ( tls:: ConditionalServerTls , T ) ,
32- io:: EitherIo < meshtls:: ServerIo < tls:: server:: DetectIo < I > > , tls:: server:: DetectIo < I > > ,
33- ) ;
34-
35- fn load ( ent : & test_util:: Entity ) -> ( meshtls:: creds:: Store , meshtls:: NewClient , meshtls:: Server ) {
36- let roots_pem = std:: str:: from_utf8 ( ent. trust_anchors ) . expect ( "valid PEM" ) ;
37- let ( mut store, rx) = meshtls:: creds:: watch (
38- ent. name . parse ( ) . unwrap ( ) ,
39- roots_pem,
40- ent. key ,
41- b"fake CSR data" ,
42- )
43- . expect ( "credentials must be readable" ) ;
22+ use tracing:: Instrument ;
4423
45- let expiry = std:: time:: SystemTime :: now ( ) + Duration :: from_secs ( 600 ) ;
46- store
47- . set_certificate ( DerX509 ( ent. crt . to_vec ( ) ) , vec ! [ ] , expiry)
48- . expect ( "certificate must be valid" ) ;
49-
50- ( store, rx. new_client ( ) , rx. server ( ) )
51- }
52-
53- #[ tokio:: test( flavor = "current_thread" ) ]
54- async fn plaintext ( ) {
55- let ( _foo, _, server_tls) = load ( & test_util:: FOO_NS1 ) ;
56- let ( _bar, client_tls, _) = load ( & test_util:: BAR_NS1 ) ;
24+ pub async fn plaintext ( mode : meshtls:: Mode ) {
25+ let ( _foo, _, server_tls) = load ( mode, & test_util:: FOO_NS1 ) ;
26+ let ( _bar, client_tls, _) = load ( mode, & test_util:: BAR_NS1 ) ;
5727 let ( client_result, server_result) = run_test (
5828 client_tls,
5929 Conditional :: None ( tls:: NoClientTls :: NotProvidedByServiceDiscovery ) ,
@@ -76,10 +46,9 @@ async fn plaintext() {
7646 assert_eq ! ( & server_result. result. expect( "ping" ) [ ..] , PING ) ;
7747}
7848
79- #[ tokio:: test( flavor = "current_thread" ) ]
80- async fn proxy_to_proxy_tls_works ( ) {
81- let ( _foo, _, server_tls) = load ( & test_util:: FOO_NS1 ) ;
82- let ( _bar, client_tls, _) = load ( & test_util:: BAR_NS1 ) ;
49+ pub async fn proxy_to_proxy_tls_works ( mode : meshtls:: Mode ) {
50+ let ( _foo, _, server_tls) = load ( mode, & test_util:: FOO_NS1 ) ;
51+ let ( _bar, client_tls, _) = load ( mode, & test_util:: BAR_NS1 ) ;
8352 let server_id = tls:: ServerId ( test_util:: FOO_NS1 . name . parse ( ) . unwrap ( ) ) ;
8453 let ( client_result, server_result) = run_test (
8554 client_tls. clone ( ) ,
@@ -107,13 +76,12 @@ async fn proxy_to_proxy_tls_works() {
10776 assert_eq ! ( & server_result. result. expect( "ping" ) [ ..] , PING ) ;
10877}
10978
110- #[ tokio:: test( flavor = "current_thread" ) ]
111- async fn proxy_to_proxy_tls_pass_through_when_identity_does_not_match ( ) {
112- let ( _foo, _, server_tls) = load ( & test_util:: FOO_NS1 ) ;
79+ pub async fn proxy_to_proxy_tls_pass_through_when_identity_does_not_match ( mode : meshtls:: Mode ) {
80+ let ( _foo, _, server_tls) = load ( mode, & test_util:: FOO_NS1 ) ;
11381
11482 // Misuse the client's identity instead of the server's identity. Any
11583 // identity other than `server_tls.server_identity` would work.
116- let ( _bar, client_tls, _) = load ( & test_util:: BAR_NS1 ) ;
84+ let ( _bar, client_tls, _) = load ( mode , & test_util:: BAR_NS1 ) ;
11785 let sni = test_util:: BAR_NS1 . name . parse :: < Name > ( ) . unwrap ( ) ;
11886
11987 let ( client_result, server_result) = run_test (
@@ -138,6 +106,33 @@ async fn proxy_to_proxy_tls_pass_through_when_identity_does_not_match() {
138106 assert_eq ! ( & server_result. result. unwrap( ) [ ..] , START_OF_TLS ) ;
139107}
140108
109+ type ServerConn < T , I > = (
110+ ( tls:: ConditionalServerTls , T ) ,
111+ io:: EitherIo < meshtls:: ServerIo < tls:: server:: DetectIo < I > > , tls:: server:: DetectIo < I > > ,
112+ ) ;
113+
114+ fn load (
115+ mode : meshtls:: Mode ,
116+ ent : & test_util:: Entity ,
117+ ) -> ( meshtls:: creds:: Store , meshtls:: NewClient , meshtls:: Server ) {
118+ let roots_pem = std:: str:: from_utf8 ( ent. trust_anchors ) . expect ( "valid PEM" ) ;
119+ let ( mut store, rx) = mode
120+ . watch (
121+ ent. name . parse ( ) . unwrap ( ) ,
122+ roots_pem,
123+ ent. key ,
124+ b"fake CSR data" ,
125+ )
126+ . expect ( "credentials must be readable" ) ;
127+
128+ let expiry = std:: time:: SystemTime :: now ( ) + Duration :: from_secs ( 600 ) ;
129+ store
130+ . set_certificate ( DerX509 ( ent. crt . to_vec ( ) ) , vec ! [ ] , expiry)
131+ . expect ( "certificate must be valid" ) ;
132+
133+ ( store, rx. new_client ( ) , rx. server ( ) )
134+ }
135+
141136struct Transported < I , R > {
142137 tls : Option < I > ,
143138
@@ -150,7 +145,8 @@ struct ServerParams {
150145 identity : meshtls:: Server ,
151146}
152147
153- type ClientIo = io:: EitherIo < io:: ScopedIo < TcpStream > , meshtls:: ClientIo < io:: ScopedIo < TcpStream > > > ;
148+ type ClientIo =
149+ io:: EitherIo < io:: ScopedIo < TcpStream > , linkerd_meshtls:: ClientIo < io:: ScopedIo < TcpStream > > > ;
154150
155151/// Runs a test for a single TCP connection. `client` processes the connection
156152/// on the client side and `server` processes the connection on the server
@@ -159,7 +155,7 @@ async fn run_test<C, CF, CR, S, SF, SR>(
159155 client_tls : meshtls:: NewClient ,
160156 client_server_id : Conditional < tls:: ServerId , tls:: NoClientTls > ,
161157 client : C ,
162- server_id : meshtls:: Server ,
158+ server_tls : meshtls:: Server ,
163159 server : S ,
164160) -> (
165161 Transported < tls:: ConditionalClientTls , CR > ,
@@ -184,7 +180,7 @@ where
184180
185181 let detect = tls:: NewDetectTls :: < meshtls:: Server , _ , _ > :: new (
186182 ServerParams {
187- identity : server_id ,
183+ identity : server_tls ,
188184 } ,
189185 move |meta : ( tls:: ConditionalServerTls , Addrs ) | {
190186 let server = server. clone ( ) ;
@@ -233,7 +229,6 @@ where
233229 // type, e.g. `Arc<Mutex>`, but using a channel simplifies the code and
234230 // parallels the server side.
235231 let ( sender, receiver) = mpsc:: channel :: < Transported < tls:: ConditionalClientTls , CR > > ( ) ;
236- let sender_clone = sender. clone ( ) ;
237232
238233 let tls = Some ( client_server_id. clone ( ) . map ( Into :: into) ) ;
239234 let client = async move {
@@ -243,7 +238,7 @@ where
243238 . await ;
244239 match conn {
245240 Err ( e) => {
246- sender_clone
241+ sender
247242 . send ( Transported {
248243 tls : None ,
249244 result : Err ( e) ,
0 commit comments