Skip to content

Commit a23b04d

Browse files
author
Alexander Krotov
committed
Do not pass SMTP LoginParam into imap module
1 parent 8c5ac06 commit a23b04d

File tree

2 files changed

+42
-20
lines changed

2 files changed

+42
-20
lines changed

src/configure/mod.rs

+9-1
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,15 @@ async fn try_imap_one_param(context: &Context, param: &LoginParam, imap: &mut Im
544544
);
545545
info!(context, "Trying: {}", inf);
546546

547-
if imap.connect(context, &param).await {
547+
if imap
548+
.connect(
549+
context,
550+
&param.imap,
551+
&param.addr,
552+
param.server_flags & DC_LP_AUTH_OAUTH2 != 0,
553+
)
554+
.await
555+
{
548556
info!(context, "success: {}", inf);
549557
return Ok(());
550558
}

src/imap/mod.rs

+33-19
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use crate::dc_receive_imf::{
2222
use crate::events::EventType;
2323
use crate::headerdef::{HeaderDef, HeaderDefMap};
2424
use crate::job::{self, Action};
25-
use crate::login_param::{CertificateChecks, LoginParam};
25+
use crate::login_param::{CertificateChecks, LoginParam, ServerLoginParam};
2626
use crate::message::{self, update_server_uid, MessageState};
2727
use crate::mimeparser;
2828
use crate::oauth2::dc_get_oauth2_access_token;
@@ -153,7 +153,7 @@ struct ImapConfig {
153153
pub imap_pw: String,
154154
pub security: Socket,
155155
pub strict_tls: bool,
156-
pub server_flags: usize,
156+
pub oauth2: bool,
157157
pub selected_folder: Option<String>,
158158
pub selected_mailbox: Option<Mailbox>,
159159
pub selected_folder_needs_expunge: bool,
@@ -174,7 +174,7 @@ impl Default for ImapConfig {
174174
imap_pw: "".into(),
175175
security: Default::default(),
176176
strict_tls: false,
177-
server_flags: 0,
177+
oauth2: false,
178178
selected_folder: None,
179179
selected_mailbox: None,
180180
selected_folder_needs_expunge: false,
@@ -221,7 +221,7 @@ impl Imap {
221221
return Ok(());
222222
}
223223

224-
let server_flags = self.config.server_flags as i32;
224+
let oauth2 = self.config.oauth2;
225225

226226
let connection_res: ImapResult<Client> = if self.config.security == Socket::STARTTLS
227227
|| self.config.security == Socket::Plain
@@ -254,7 +254,7 @@ impl Imap {
254254
let imap_user: &str = config.imap_user.as_ref();
255255
let imap_pw: &str = config.imap_pw.as_ref();
256256

257-
if (server_flags & DC_LP_AUTH_OAUTH2) != 0 {
257+
if oauth2 {
258258
let addr: &str = config.addr.as_ref();
259259

260260
if let Some(token) =
@@ -380,43 +380,57 @@ impl Imap {
380380
let param = LoginParam::from_database(context, "configured_").await;
381381
// the trailing underscore is correct
382382

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+
{
384392
self.ensure_configured_folders(context, true).await
385393
} else {
386394
Err(Error::ConnectionFailed(format!("{}", param)))
387395
}
388396
}
389397

390398
/// 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() {
393409
return false;
394410
}
395411

396412
{
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;
403417

404418
let mut config = &mut self.config;
405419
config.addr = addr.to_string();
406420
config.imap_server = imap_server.to_string();
407421
config.imap_port = imap_port;
408422
config.imap_user = imap_user.to_string();
409423
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 {
412426
CertificateChecks::Automatic => {
413427
provider.map_or(false, |provider| provider.strict_tls)
414428
}
415429
CertificateChecks::Strict => true,
416430
CertificateChecks::AcceptInvalidCertificates
417431
| CertificateChecks::AcceptInvalidCertificates2 => false,
418432
};
419-
config.server_flags = server_flags;
433+
config.oauth2 = oauth2;
420434
}
421435

422436
if let Err(err) = self.setup_handle_if_needed(context).await {
@@ -429,7 +443,7 @@ impl Imap {
429443
Some(ref mut session) => match session.capabilities().await {
430444
Ok(caps) => {
431445
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,);
433447
true
434448
} else {
435449
let can_idle = caps.has_str("IDLE");
@@ -449,7 +463,7 @@ impl Imap {
449463
context,
450464
EventType::ImapConnected(format!(
451465
"IMAP-LOGIN as {}, capabilities: {}",
452-
lp.imap.user, caps_list,
466+
lp.user, caps_list,
453467
))
454468
);
455469
false

0 commit comments

Comments
 (0)