@@ -8,15 +8,13 @@ use tokio::io::BufWriter;
8
8
9
9
use super :: capabilities:: Capabilities ;
10
10
use crate :: context:: Context ;
11
- use crate :: log:: { info, warn} ;
11
+ use crate :: log:: { LoggingStream , info, warn} ;
12
12
use crate :: login_param:: { ConnectionCandidate , ConnectionSecurity } ;
13
13
use crate :: net:: dns:: { lookup_host_with_cache, update_connect_timestamp} ;
14
14
use crate :: net:: proxy:: ProxyConfig ;
15
15
use crate :: net:: session:: SessionStream ;
16
16
use crate :: net:: tls:: wrap_tls;
17
- use crate :: net:: {
18
- connect_tcp_inner, connect_tls_inner, run_connection_attempts, update_connection_history,
19
- } ;
17
+ use crate :: net:: { connect_tcp_inner, run_connection_attempts, update_connection_history} ;
20
18
use crate :: tools:: time;
21
19
22
20
#[ derive( Debug ) ]
@@ -126,12 +124,12 @@ impl Client {
126
124
) ;
127
125
let res = match security {
128
126
ConnectionSecurity :: Tls => {
129
- Client :: connect_secure ( resolved_addr, host, strict_tls) . await
127
+ Client :: connect_secure ( & context , resolved_addr, host, strict_tls) . await
130
128
}
131
129
ConnectionSecurity :: Starttls => {
132
- Client :: connect_starttls ( resolved_addr, host, strict_tls) . await
130
+ Client :: connect_starttls ( & context , resolved_addr, host, strict_tls) . await
133
131
}
134
- ConnectionSecurity :: Plain => Client :: connect_insecure ( resolved_addr) . await ,
132
+ ConnectionSecurity :: Plain => Client :: connect_insecure ( & context , resolved_addr) . await ,
135
133
} ;
136
134
match res {
137
135
Ok ( client) => {
@@ -202,8 +200,22 @@ impl Client {
202
200
}
203
201
}
204
202
205
- async fn connect_secure ( addr : SocketAddr , hostname : & str , strict_tls : bool ) -> Result < Self > {
206
- let tls_stream = connect_tls_inner ( addr, hostname, strict_tls, alpn ( addr. port ( ) ) ) . await ?;
203
+ async fn connect_secure (
204
+ context : & Context ,
205
+ addr : SocketAddr ,
206
+ hostname : & str ,
207
+ strict_tls : bool ,
208
+ ) -> Result < Self > {
209
+ let tcp_stream = connect_tcp_inner ( addr) . await ?;
210
+ let account_id = context. get_id ( ) ;
211
+ let events = context. events . clone ( ) ;
212
+ let logging_stream = LoggingStream :: new (
213
+ tcp_stream,
214
+ format ! ( "TLS IMAP stream {hostname} ({addr})" ) ,
215
+ account_id,
216
+ events,
217
+ ) ;
218
+ let tls_stream = wrap_tls ( strict_tls, hostname, alpn ( addr. port ( ) ) , logging_stream) . await ?;
207
219
let buffered_stream = BufWriter :: new ( tls_stream) ;
208
220
let session_stream: Box < dyn SessionStream > = Box :: new ( buffered_stream) ;
209
221
let mut client = Client :: new ( session_stream) ;
@@ -214,9 +226,17 @@ impl Client {
214
226
Ok ( client)
215
227
}
216
228
217
- async fn connect_insecure ( addr : SocketAddr ) -> Result < Self > {
229
+ async fn connect_insecure ( context : & Context , addr : SocketAddr ) -> Result < Self > {
218
230
let tcp_stream = connect_tcp_inner ( addr) . await ?;
219
- let buffered_stream = BufWriter :: new ( tcp_stream) ;
231
+ let account_id = context. get_id ( ) ;
232
+ let events = context. events . clone ( ) ;
233
+ let logging_stream = LoggingStream :: new (
234
+ tcp_stream,
235
+ "some IMAP insecure TLS stream" . to_string ( ) ,
236
+ account_id,
237
+ events,
238
+ ) ;
239
+ let buffered_stream = BufWriter :: new ( logging_stream) ;
220
240
let session_stream: Box < dyn SessionStream > = Box :: new ( buffered_stream) ;
221
241
let mut client = Client :: new ( session_stream) ;
222
242
let _greeting = client
@@ -226,9 +246,23 @@ impl Client {
226
246
Ok ( client)
227
247
}
228
248
229
- async fn connect_starttls ( addr : SocketAddr , host : & str , strict_tls : bool ) -> Result < Self > {
249
+ async fn connect_starttls (
250
+ context : & Context ,
251
+ addr : SocketAddr ,
252
+ host : & str ,
253
+ strict_tls : bool ,
254
+ ) -> Result < Self > {
230
255
let tcp_stream = connect_tcp_inner ( addr) . await ?;
231
256
257
+ let account_id = context. get_id ( ) ;
258
+ let events = context. events . clone ( ) ;
259
+ let tcp_stream = LoggingStream :: new (
260
+ tcp_stream,
261
+ format ! ( "STARTTLS IMAP stream {host} ({addr})" ) ,
262
+ account_id,
263
+ events,
264
+ ) ;
265
+
232
266
// Run STARTTLS command and convert the client back into a stream.
233
267
let buffered_tcp_stream = BufWriter :: new ( tcp_stream) ;
234
268
let mut client = async_imap:: Client :: new ( buffered_tcp_stream) ;
@@ -246,7 +280,6 @@ impl Client {
246
280
let tls_stream = wrap_tls ( strict_tls, host, & [ ] , tcp_stream)
247
281
. await
248
282
. context ( "STARTTLS upgrade failed" ) ?;
249
-
250
283
let buffered_stream = BufWriter :: new ( tls_stream) ;
251
284
let session_stream: Box < dyn SessionStream > = Box :: new ( buffered_stream) ;
252
285
let client = Client :: new ( session_stream) ;
0 commit comments