@@ -22,7 +22,7 @@ use crate::dc_receive_imf::{
22
22
use crate :: events:: EventType ;
23
23
use crate :: headerdef:: { HeaderDef , HeaderDefMap } ;
24
24
use crate :: job:: { self , Action } ;
25
- use crate :: login_param:: { CertificateChecks , LoginParam } ;
25
+ use crate :: login_param:: { CertificateChecks , LoginParam , ServerLoginParam } ;
26
26
use crate :: message:: { self , update_server_uid, MessageState } ;
27
27
use crate :: mimeparser;
28
28
use crate :: oauth2:: dc_get_oauth2_access_token;
@@ -153,7 +153,7 @@ struct ImapConfig {
153
153
pub imap_pw : String ,
154
154
pub security : Socket ,
155
155
pub strict_tls : bool ,
156
- pub server_flags : usize ,
156
+ pub oauth2 : bool ,
157
157
pub selected_folder : Option < String > ,
158
158
pub selected_mailbox : Option < Mailbox > ,
159
159
pub selected_folder_needs_expunge : bool ,
@@ -174,7 +174,7 @@ impl Default for ImapConfig {
174
174
imap_pw : "" . into ( ) ,
175
175
security : Default :: default ( ) ,
176
176
strict_tls : false ,
177
- server_flags : 0 ,
177
+ oauth2 : false ,
178
178
selected_folder : None ,
179
179
selected_mailbox : None ,
180
180
selected_folder_needs_expunge : false ,
@@ -221,7 +221,7 @@ impl Imap {
221
221
return Ok ( ( ) ) ;
222
222
}
223
223
224
- let server_flags = self . config . server_flags as i32 ;
224
+ let oauth2 = self . config . oauth2 ;
225
225
226
226
let connection_res: ImapResult < Client > = if self . config . security == Socket :: STARTTLS
227
227
|| self . config . security == Socket :: Plain
@@ -254,7 +254,7 @@ impl Imap {
254
254
let imap_user: & str = config. imap_user . as_ref ( ) ;
255
255
let imap_pw: & str = config. imap_pw . as_ref ( ) ;
256
256
257
- if ( server_flags & DC_LP_AUTH_OAUTH2 ) != 0 {
257
+ if oauth2 {
258
258
let addr: & str = config. addr . as_ref ( ) ;
259
259
260
260
if let Some ( token) =
@@ -380,43 +380,57 @@ impl Imap {
380
380
let param = LoginParam :: from_database ( context, "configured_" ) . await ;
381
381
// the trailing underscore is correct
382
382
383
- if self . connect ( context, & param) . await {
383
+ if self
384
+ . connect (
385
+ context,
386
+ & param. imap ,
387
+ & param. addr ,
388
+ param. server_flags & DC_LP_AUTH_OAUTH2 != 0 ,
389
+ )
390
+ . await
391
+ {
384
392
self . ensure_configured_folders ( context, true ) . await
385
393
} else {
386
394
Err ( Error :: ConnectionFailed ( format ! ( "{}" , param) ) )
387
395
}
388
396
}
389
397
390
398
/// Tries connecting to imap account using the specific login parameters.
391
- pub async fn connect ( & mut self , context : & Context , lp : & LoginParam ) -> bool {
392
- if lp. imap . server . is_empty ( ) || lp. imap . user . is_empty ( ) || lp. imap . password . is_empty ( ) {
399
+ ///
400
+ /// `addr` is used to renew token if OAuth2 authentication is used.
401
+ pub async fn connect (
402
+ & mut self ,
403
+ context : & Context ,
404
+ lp : & ServerLoginParam ,
405
+ addr : & str ,
406
+ oauth2 : bool ,
407
+ ) -> bool {
408
+ if lp. server . is_empty ( ) || lp. user . is_empty ( ) || lp. password . is_empty ( ) {
393
409
return false ;
394
410
}
395
411
396
412
{
397
- let addr = & lp. addr ;
398
- let imap_server = & lp. imap . server ;
399
- let imap_port = lp. imap . port ;
400
- let imap_user = & lp. imap . user ;
401
- let imap_pw = & lp. imap . password ;
402
- let server_flags = lp. server_flags as usize ;
413
+ let imap_server = & lp. server ;
414
+ let imap_port = lp. port ;
415
+ let imap_user = & lp. user ;
416
+ let imap_pw = & lp. password ;
403
417
404
418
let mut config = & mut self . config ;
405
419
config. addr = addr. to_string ( ) ;
406
420
config. imap_server = imap_server. to_string ( ) ;
407
421
config. imap_port = imap_port;
408
422
config. imap_user = imap_user. to_string ( ) ;
409
423
config. imap_pw = imap_pw. to_string ( ) ;
410
- let provider = get_provider_info ( & lp . addr ) ;
411
- config. strict_tls = match lp. imap . certificate_checks {
424
+ let provider = get_provider_info ( & addr) ;
425
+ config. strict_tls = match lp. certificate_checks {
412
426
CertificateChecks :: Automatic => {
413
427
provider. map_or ( false , |provider| provider. strict_tls )
414
428
}
415
429
CertificateChecks :: Strict => true ,
416
430
CertificateChecks :: AcceptInvalidCertificates
417
431
| CertificateChecks :: AcceptInvalidCertificates2 => false ,
418
432
} ;
419
- config. server_flags = server_flags ;
433
+ config. oauth2 = oauth2 ;
420
434
}
421
435
422
436
if let Err ( err) = self . setup_handle_if_needed ( context) . await {
@@ -429,7 +443,7 @@ impl Imap {
429
443
Some ( ref mut session) => match session. capabilities ( ) . await {
430
444
Ok ( caps) => {
431
445
if !context. sql . is_open ( ) . await {
432
- warn ! ( context, "IMAP-LOGIN as {} ok but ABORTING" , lp. imap . user, ) ;
446
+ warn ! ( context, "IMAP-LOGIN as {} ok but ABORTING" , lp. user, ) ;
433
447
true
434
448
} else {
435
449
let can_idle = caps. has_str ( "IDLE" ) ;
@@ -449,7 +463,7 @@ impl Imap {
449
463
context,
450
464
EventType :: ImapConnected ( format!(
451
465
"IMAP-LOGIN as {}, capabilities: {}" ,
452
- lp. imap . user, caps_list,
466
+ lp. user, caps_list,
453
467
) )
454
468
) ;
455
469
false
0 commit comments