@@ -7,8 +7,6 @@ use parking_lot::RwLock;
7
7
use rustls:: internal:: pemfile:: { certs, pkcs8_private_keys} ;
8
8
use rustls:: { NoClientAuth , ServerConfig } ;
9
9
use sqlx:: PgPool ;
10
- use std:: io:: Cursor ;
11
- use std:: ops:: Deref ;
12
10
use std:: sync:: Arc ;
13
11
use tokio:: io:: { AsyncRead , AsyncWrite } ;
14
12
use tokio:: net:: { TcpListener , ToSocketAddrs } ;
@@ -33,21 +31,20 @@ impl Acceptor {
33
31
} )
34
32
}
35
33
36
- fn create_server_config ( db_cert : & mut Cert ) -> Result < Arc < ServerConfig > > {
37
- let ( private, cert) = match ( & mut db_cert. private , & mut db_cert. cert ) {
38
- ( Some ( ref mut private) , Some ( ref mut cert) ) => ( private, cert) ,
34
+ fn create_server_config ( db_cert : & Cert ) -> Result < Arc < ServerConfig > > {
35
+ let ( private, cert) = match ( & db_cert. private , & db_cert. cert ) {
36
+ ( Some ( ref private) , Some ( ref cert) ) => ( private, cert) ,
39
37
_ => return Err ( anyhow ! ( "Cert has no Cert or Private" ) ) ,
40
38
} ;
41
39
42
- let mut private = Cursor :: new ( private) ;
43
- let mut privates = pkcs8_private_keys ( & mut private)
40
+ let mut privates = pkcs8_private_keys ( & mut private. as_bytes ( ) )
44
41
. map_err ( |_| anyhow ! ( "Private is invalid {:?}" , private) ) ?;
45
42
let private = privates
46
43
. pop ( )
47
44
. ok_or_else ( || anyhow ! ( "Private Vec is empty {:?}" , privates) ) ?;
48
45
49
- let mut cert = Cursor :: new ( cert ) ;
50
- let cert = certs ( & mut cert) . map_err ( |_| anyhow ! ( "Cert is invalid {:?}" , cert) ) ?;
46
+ let cert =
47
+ certs ( & mut cert. as_bytes ( ) ) . map_err ( |_| anyhow ! ( "Cert is invalid {:?}" , cert) ) ?;
51
48
52
49
let mut config = ServerConfig :: new ( NoClientAuth :: new ( ) ) ;
53
50
config. set_single_cert ( cert, private) ?;
@@ -57,18 +54,22 @@ impl Acceptor {
57
54
}
58
55
59
56
async fn load_cert ( & self ) -> Result < TlsAcceptor > {
60
- let new_cert = CertFacade :: first_cert ( & self . pool ) . await ? ;
57
+ let new_cert = CertFacade :: first_cert ( & self . pool ) . await ;
61
58
62
- // could probably be improved
63
- let mut db_cert = match ( new_cert, self . config . read ( ) . deref ( ) ) {
64
- ( Some ( new_cert) , ( Some ( cert) , server_config) ) if & new_cert == cert => {
65
- return Ok ( TlsAcceptor :: from ( Arc :: clone ( server_config) ) )
66
- }
67
- ( Some ( new_cert) , _) => new_cert,
59
+ let db_cert = match ( new_cert, & * self . config . read ( ) ) {
60
+ ( Ok ( Some ( new_cert) ) , ( cert, _) ) if Some ( & new_cert) != cert. as_ref ( ) => new_cert,
68
61
( _, ( _, server_config) ) => return Ok ( TlsAcceptor :: from ( Arc :: clone ( server_config) ) ) ,
69
62
} ;
70
63
71
- let server_config = Acceptor :: create_server_config ( & mut db_cert) ?;
64
+ let server_config = match Acceptor :: create_server_config ( & db_cert) {
65
+ Ok ( server_config) => server_config,
66
+ Err ( e) => {
67
+ log:: error!( "{:?}" , e) ;
68
+ let ( _, server_config) = & * self . config . read ( ) ;
69
+ return Ok ( TlsAcceptor :: from ( Arc :: clone ( server_config) ) ) ;
70
+ }
71
+ } ;
72
+
72
73
* self . config . write ( ) = ( Some ( db_cert) , Arc :: clone ( & server_config) ) ;
73
74
Ok ( TlsAcceptor :: from ( server_config) )
74
75
}
@@ -83,12 +84,14 @@ fn stream(
83
84
84
85
listener
85
86
. zip ( repeat ( acceptor) )
86
- . map ( |( stream, acceptor) | async move {
87
- let acceptor = acceptor. load_cert ( ) . await ?;
88
- Ok ( acceptor. accept ( stream?) . await ?)
87
+ . map ( |( conn, acceptor) | conn. map ( |c| ( c, acceptor) ) )
88
+ . err_into ( )
89
+ . map_ok ( |( conn, acceptor) | async move {
90
+ let tls = acceptor. load_cert ( ) . await ?;
91
+ Ok ( tls. accept ( conn) . await ?)
89
92
} )
90
- . buffer_unordered ( 100 )
91
- . inspect_err ( |err| log:: error!( "Stream error: {}" , err) )
93
+ . try_buffer_unordered ( 100 )
94
+ . inspect_err ( |err| log:: error!( "Stream error: {:? }" , err) )
92
95
. filter ( |stream| futures_util:: future:: ready ( stream. is_ok ( ) ) )
93
96
}
94
97
0 commit comments