start setting up new scheduler

This commit is contained in:
dignifiedquire
2020-03-17 13:48:03 +01:00
parent efc17983c3
commit ce5b95f8e5
12 changed files with 1400 additions and 1147 deletions

View File

@@ -52,402 +52,403 @@ impl Context {
******************************************************************************/
#[allow(clippy::cognitive_complexity)]
pub(crate) async fn job_configure_imap(context: &Context) -> job::Status {
if !context.sql.is_open().await {
error!(context, "Cannot configure, database not opened.",);
progress!(context, 0);
return job::Status::Finished(Err(format_err!("Database not opened")));
}
if !context.alloc_ongoing().await {
progress!(context, 0);
return job::Status::Finished(Err(format_err!("Cannot allocated ongoing process")));
}
let mut success = false;
let mut imap_connected_here = false;
let mut smtp_connected_here = false;
unimplemented!()
// if !context.sql.is_open().await {
// error!(context, "Cannot configure, database not opened.",);
// progress!(context, 0);
// return job::Status::Finished(Err(format_err!("Database not opened")));
// }
// if !context.alloc_ongoing().await {
// progress!(context, 0);
// return job::Status::Finished(Err(format_err!("Cannot allocated ongoing process")));
// }
// let mut success = false;
// let mut imap_connected_here = false;
// let mut smtp_connected_here = false;
let mut param_autoconfig: Option<LoginParam> = None;
// let mut param_autoconfig: Option<LoginParam> = None;
context.inbox_thread.imap.disconnect(context).await;
context.sentbox_thread.imap.disconnect(context).await;
context.mvbox_thread.imap.disconnect(context).await;
context.smtp.disconnect().await;
// // context.inbox_thread.imap.disconnect(context).await;
// // context.sentbox_thread.imap.disconnect(context).await;
// // context.mvbox_thread.imap.disconnect(context).await;
// // context.smtp.disconnect().await;
info!(context, "Configure ...",);
// info!(context, "Configure ...",);
// Variables that are shared between steps:
let mut param = LoginParam::from_database(context, "").await;
// need all vars here to be mutable because rust thinks the same step could be called multiple times
// and also initialize, because otherwise rust thinks it's used while unitilized, even if thats not the case as the loop goes only forward
let mut param_domain = "undefined.undefined".to_owned();
let mut param_addr_urlencoded: String =
"Internal Error: this value should never be used".to_owned();
let mut keep_flags = 0;
// // Variables that are shared between steps:
// let mut param = LoginParam::from_database(context, "").await;
// // need all vars here to be mutable because rust thinks the same step could be called multiple times
// // and also initialize, because otherwise rust thinks it's used while unitilized, even if thats not the case as the loop goes only forward
// let mut param_domain = "undefined.undefined".to_owned();
// let mut param_addr_urlencoded: String =
// "Internal Error: this value should never be used".to_owned();
// let mut keep_flags = 0;
const STEP_12_USE_AUTOCONFIG: u8 = 12;
const STEP_13_AFTER_AUTOCONFIG: u8 = 13;
// const STEP_12_USE_AUTOCONFIG: u8 = 12;
// const STEP_13_AFTER_AUTOCONFIG: u8 = 13;
let mut step_counter: u8 = 0;
while !context.shall_stop_ongoing().await {
step_counter += 1;
// let mut step_counter: u8 = 0;
// while !context.shall_stop_ongoing().await {
// step_counter += 1;
let success = match step_counter {
// Read login parameters from the database
1 => {
progress!(context, 1);
if param.addr.is_empty() {
error!(context, "Please enter an email address.",);
}
!param.addr.is_empty()
}
// Step 1: Load the parameters and check email-address and password
2 => {
if 0 != param.server_flags & DC_LP_AUTH_OAUTH2 {
// the used oauth2 addr may differ, check this.
// if dc_get_oauth2_addr() is not available in the oauth2 implementation,
// just use the given one.
progress!(context, 10);
if let Some(oauth2_addr) =
dc_get_oauth2_addr(context, &param.addr, &param.mail_pw)
.await
.and_then(|e| e.parse().ok())
{
info!(context, "Authorized address is {}", oauth2_addr);
param.addr = oauth2_addr;
context
.sql
.set_raw_config(context, "addr", Some(param.addr.as_str()))
.await
.ok();
}
progress!(context, 20);
}
true // no oauth? - just continue it's no error
}
3 => {
if let Ok(parsed) = param.addr.parse() {
let parsed: EmailAddress = parsed;
param_domain = parsed.domain;
param_addr_urlencoded =
utf8_percent_encode(&param.addr, NON_ALPHANUMERIC).to_string();
true
} else {
error!(context, "Bad email-address.");
false
}
}
// Step 2: Autoconfig
4 => {
progress!(context, 200);
// let success = match step_counter {
// // Read login parameters from the database
// 1 => {
// progress!(context, 1);
// if param.addr.is_empty() {
// error!(context, "Please enter an email address.",);
// }
// !param.addr.is_empty()
// }
// // Step 1: Load the parameters and check email-address and password
// 2 => {
// if 0 != param.server_flags & DC_LP_AUTH_OAUTH2 {
// // the used oauth2 addr may differ, check this.
// // if dc_get_oauth2_addr() is not available in the oauth2 implementation,
// // just use the given one.
// progress!(context, 10);
// if let Some(oauth2_addr) =
// dc_get_oauth2_addr(context, &param.addr, &param.mail_pw)
// .await
// .and_then(|e| e.parse().ok())
// {
// info!(context, "Authorized address is {}", oauth2_addr);
// param.addr = oauth2_addr;
// context
// .sql
// .set_raw_config(context, "addr", Some(param.addr.as_str()))
// .await
// .ok();
// }
// progress!(context, 20);
// }
// true // no oauth? - just continue it's no error
// }
// 3 => {
// if let Ok(parsed) = param.addr.parse() {
// let parsed: EmailAddress = parsed;
// param_domain = parsed.domain;
// param_addr_urlencoded =
// utf8_percent_encode(&param.addr, NON_ALPHANUMERIC).to_string();
// true
// } else {
// error!(context, "Bad email-address.");
// false
// }
// }
// // Step 2: Autoconfig
// 4 => {
// progress!(context, 200);
if param.mail_server.is_empty()
&& param.mail_port == 0
/*&&param.mail_user.is_empty() -- the user can enter a loginname which is used by autoconfig then */
&& param.send_server.is_empty()
&& param.send_port == 0
&& param.send_user.is_empty()
/*&&param.send_pw.is_empty() -- the password cannot be auto-configured and is no criterion for autoconfig or not */
&& (param.server_flags & !DC_LP_AUTH_OAUTH2) == 0
{
// no advanced parameters entered by the user: query provider-database or do Autoconfig
keep_flags = param.server_flags & DC_LP_AUTH_OAUTH2;
if let Some(new_param) = get_offline_autoconfig(context, &param) {
// got parameters from our provider-database, skip Autoconfig, preserve the OAuth2 setting
param_autoconfig = Some(new_param);
step_counter = STEP_12_USE_AUTOCONFIG - 1; // minus one as step_counter is increased on next loop
}
} else {
// advanced parameters entered by the user: skip Autoconfig
step_counter = STEP_13_AFTER_AUTOCONFIG - 1; // minus one as step_counter is increased on next loop
}
true
}
/* A. Search configurations from the domain used in the email-address, prefer encrypted */
5 => {
if param_autoconfig.is_none() {
let url = format!(
"https://autoconfig.{}/mail/config-v1.1.xml?emailaddress={}",
param_domain, param_addr_urlencoded
);
param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
}
true
}
6 => {
progress!(context, 300);
if param_autoconfig.is_none() {
// the doc does not mention `emailaddress=`, however, Thunderbird adds it, see https://releases.mozilla.org/pub/thunderbird/ , which makes some sense
let url = format!(
"https://{}/.well-known/autoconfig/mail/config-v1.1.xml?emailaddress={}",
param_domain, param_addr_urlencoded
);
param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
}
true
}
/* Outlook section start ------------- */
/* Outlook uses always SSL but different domains (this comment describes the next two steps) */
7 => {
progress!(context, 310);
if param_autoconfig.is_none() {
let url = format!("https://{}/autodiscover/autodiscover.xml", param_domain);
param_autoconfig = outlk_autodiscover(context, &url, &param).ok();
}
true
}
8 => {
progress!(context, 320);
if param_autoconfig.is_none() {
let url = format!(
"https://{}{}/autodiscover/autodiscover.xml",
"autodiscover.", param_domain
);
param_autoconfig = outlk_autodiscover(context, &url, &param).ok();
}
true
}
/* ----------- Outlook section end */
9 => {
progress!(context, 330);
if param_autoconfig.is_none() {
let url = format!(
"http://autoconfig.{}/mail/config-v1.1.xml?emailaddress={}",
param_domain, param_addr_urlencoded
);
param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
}
true
}
10 => {
progress!(context, 340);
if param_autoconfig.is_none() {
// do not transfer the email-address unencrypted
let url = format!(
"http://{}/.well-known/autoconfig/mail/config-v1.1.xml",
param_domain
);
param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
}
true
}
/* B. If we have no configuration yet, search configuration in Thunderbird's centeral database */
11 => {
progress!(context, 350);
if param_autoconfig.is_none() {
/* always SSL for Thunderbird's database */
let url = format!("https://autoconfig.thunderbird.net/v1.1/{}", param_domain);
param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
}
true
}
/* C. Do we have any autoconfig result?
If you change the match-number here, also update STEP_12_COPY_AUTOCONFIG above
*/
STEP_12_USE_AUTOCONFIG => {
progress!(context, 500);
if let Some(ref cfg) = param_autoconfig {
info!(context, "Got autoconfig: {}", &cfg);
if !cfg.mail_user.is_empty() {
param.mail_user = cfg.mail_user.clone();
}
param.mail_server = cfg.mail_server.clone(); /* all other values are always NULL when entering autoconfig */
param.mail_port = cfg.mail_port;
param.send_server = cfg.send_server.clone();
param.send_port = cfg.send_port;
param.send_user = cfg.send_user.clone();
param.server_flags = cfg.server_flags;
/* although param_autoconfig's data are no longer needed from,
it is used to later to prevent trying variations of port/server/logins */
}
param.server_flags |= keep_flags;
true
}
// Step 3: Fill missing fields with defaults
// If you change the match-number here, also update STEP_13_AFTER_AUTOCONFIG above
STEP_13_AFTER_AUTOCONFIG => {
if param.mail_server.is_empty() {
param.mail_server = format!("imap.{}", param_domain,)
}
if param.mail_port == 0 {
param.mail_port = if 0 != param.server_flags & (0x100 | 0x400) {
143
} else {
993
}
}
if param.mail_user.is_empty() {
param.mail_user = param.addr.clone();
}
if param.send_server.is_empty() && !param.mail_server.is_empty() {
param.send_server = param.mail_server.clone();
if param.send_server.starts_with("imap.") {
param.send_server = param.send_server.replacen("imap", "smtp", 1);
}
}
if param.send_port == 0 {
param.send_port = if 0 != param.server_flags & DC_LP_SMTP_SOCKET_STARTTLS as i32
{
587
} else if 0 != param.server_flags & DC_LP_SMTP_SOCKET_PLAIN as i32 {
25
} else {
465
}
}
if param.send_user.is_empty() && !param.mail_user.is_empty() {
param.send_user = param.mail_user.clone();
}
if param.send_pw.is_empty() && !param.mail_pw.is_empty() {
param.send_pw = param.mail_pw.clone()
}
if !dc_exactly_one_bit_set(param.server_flags & DC_LP_AUTH_FLAGS as i32) {
param.server_flags &= !(DC_LP_AUTH_FLAGS as i32);
param.server_flags |= DC_LP_AUTH_NORMAL as i32
}
if !dc_exactly_one_bit_set(param.server_flags & DC_LP_IMAP_SOCKET_FLAGS as i32) {
param.server_flags &= !(DC_LP_IMAP_SOCKET_FLAGS as i32);
param.server_flags |= if param.send_port == 143 {
DC_LP_IMAP_SOCKET_STARTTLS as i32
} else {
DC_LP_IMAP_SOCKET_SSL as i32
}
}
if !dc_exactly_one_bit_set(param.server_flags & (DC_LP_SMTP_SOCKET_FLAGS as i32)) {
param.server_flags &= !(DC_LP_SMTP_SOCKET_FLAGS as i32);
param.server_flags |= if param.send_port == 587 {
DC_LP_SMTP_SOCKET_STARTTLS as i32
} else if param.send_port == 25 {
DC_LP_SMTP_SOCKET_PLAIN as i32
} else {
DC_LP_SMTP_SOCKET_SSL as i32
}
}
/* do we have a complete configuration? */
if param.mail_server.is_empty()
|| param.mail_port == 0
|| param.mail_user.is_empty()
|| param.mail_pw.is_empty()
|| param.send_server.is_empty()
|| param.send_port == 0
|| param.send_user.is_empty()
|| param.send_pw.is_empty()
|| param.server_flags == 0
{
error!(context, "Account settings incomplete.");
false
} else {
true
}
}
14 => {
progress!(context, 600);
/* try to connect to IMAP - if we did not got an autoconfig,
do some further tries with different settings and username variations */
imap_connected_here =
try_imap_connections(context, &mut param, param_autoconfig.is_some()).await;
imap_connected_here
}
15 => {
progress!(context, 800);
smtp_connected_here =
try_smtp_connections(context, &mut param, param_autoconfig.is_some()).await;
smtp_connected_here
}
16 => {
progress!(context, 900);
let create_mvbox = context.get_config_bool(Config::MvboxWatch).await
|| context.get_config_bool(Config::MvboxMove).await;
let imap = &context.inbox_thread.imap;
if let Err(err) = imap.ensure_configured_folders(context, create_mvbox).await {
warn!(context, "configuring folders failed: {:?}", err);
false
} else {
let res = imap.select_with_uidvalidity(context, "INBOX").await;
if let Err(err) = res {
error!(context, "could not read INBOX status: {:?}", err);
false
} else {
true
}
}
}
17 => {
progress!(context, 910);
/* configuration success - write back the configured parameters with the "configured_" prefix; also write the "configured"-flag */
param
.save_to_database(
context,
"configured_", /*the trailing underscore is correct*/
)
.await
.ok();
// if param.mail_server.is_empty()
// && param.mail_port == 0
// /*&&param.mail_user.is_empty() -- the user can enter a loginname which is used by autoconfig then */
// && param.send_server.is_empty()
// && param.send_port == 0
// && param.send_user.is_empty()
// /*&&param.send_pw.is_empty() -- the password cannot be auto-configured and is no criterion for autoconfig or not */
// && (param.server_flags & !DC_LP_AUTH_OAUTH2) == 0
// {
// // no advanced parameters entered by the user: query provider-database or do Autoconfig
// keep_flags = param.server_flags & DC_LP_AUTH_OAUTH2;
// if let Some(new_param) = get_offline_autoconfig(context, &param) {
// // got parameters from our provider-database, skip Autoconfig, preserve the OAuth2 setting
// param_autoconfig = Some(new_param);
// step_counter = STEP_12_USE_AUTOCONFIG - 1; // minus one as step_counter is increased on next loop
// }
// } else {
// // advanced parameters entered by the user: skip Autoconfig
// step_counter = STEP_13_AFTER_AUTOCONFIG - 1; // minus one as step_counter is increased on next loop
// }
// true
// }
// /* A. Search configurations from the domain used in the email-address, prefer encrypted */
// 5 => {
// if param_autoconfig.is_none() {
// let url = format!(
// "https://autoconfig.{}/mail/config-v1.1.xml?emailaddress={}",
// param_domain, param_addr_urlencoded
// );
// param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
// }
// true
// }
// 6 => {
// progress!(context, 300);
// if param_autoconfig.is_none() {
// // the doc does not mention `emailaddress=`, however, Thunderbird adds it, see https://releases.mozilla.org/pub/thunderbird/ , which makes some sense
// let url = format!(
// "https://{}/.well-known/autoconfig/mail/config-v1.1.xml?emailaddress={}",
// param_domain, param_addr_urlencoded
// );
// param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
// }
// true
// }
// /* Outlook section start ------------- */
// /* Outlook uses always SSL but different domains (this comment describes the next two steps) */
// 7 => {
// progress!(context, 310);
// if param_autoconfig.is_none() {
// let url = format!("https://{}/autodiscover/autodiscover.xml", param_domain);
// param_autoconfig = outlk_autodiscover(context, &url, &param).ok();
// }
// true
// }
// 8 => {
// progress!(context, 320);
// if param_autoconfig.is_none() {
// let url = format!(
// "https://{}{}/autodiscover/autodiscover.xml",
// "autodiscover.", param_domain
// );
// param_autoconfig = outlk_autodiscover(context, &url, &param).ok();
// }
// true
// }
// /* ----------- Outlook section end */
// 9 => {
// progress!(context, 330);
// if param_autoconfig.is_none() {
// let url = format!(
// "http://autoconfig.{}/mail/config-v1.1.xml?emailaddress={}",
// param_domain, param_addr_urlencoded
// );
// param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
// }
// true
// }
// 10 => {
// progress!(context, 340);
// if param_autoconfig.is_none() {
// // do not transfer the email-address unencrypted
// let url = format!(
// "http://{}/.well-known/autoconfig/mail/config-v1.1.xml",
// param_domain
// );
// param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
// }
// true
// }
// /* B. If we have no configuration yet, search configuration in Thunderbird's centeral database */
// 11 => {
// progress!(context, 350);
// if param_autoconfig.is_none() {
// /* always SSL for Thunderbird's database */
// let url = format!("https://autoconfig.thunderbird.net/v1.1/{}", param_domain);
// param_autoconfig = moz_autoconfigure(context, &url, &param).ok();
// }
// true
// }
// /* C. Do we have any autoconfig result?
// If you change the match-number here, also update STEP_12_COPY_AUTOCONFIG above
// */
// STEP_12_USE_AUTOCONFIG => {
// progress!(context, 500);
// if let Some(ref cfg) = param_autoconfig {
// info!(context, "Got autoconfig: {}", &cfg);
// if !cfg.mail_user.is_empty() {
// param.mail_user = cfg.mail_user.clone();
// }
// param.mail_server = cfg.mail_server.clone(); /* all other values are always NULL when entering autoconfig */
// param.mail_port = cfg.mail_port;
// param.send_server = cfg.send_server.clone();
// param.send_port = cfg.send_port;
// param.send_user = cfg.send_user.clone();
// param.server_flags = cfg.server_flags;
// /* although param_autoconfig's data are no longer needed from,
// it is used to later to prevent trying variations of port/server/logins */
// }
// param.server_flags |= keep_flags;
// true
// }
// // Step 3: Fill missing fields with defaults
// // If you change the match-number here, also update STEP_13_AFTER_AUTOCONFIG above
// STEP_13_AFTER_AUTOCONFIG => {
// if param.mail_server.is_empty() {
// param.mail_server = format!("imap.{}", param_domain,)
// }
// if param.mail_port == 0 {
// param.mail_port = if 0 != param.server_flags & (0x100 | 0x400) {
// 143
// } else {
// 993
// }
// }
// if param.mail_user.is_empty() {
// param.mail_user = param.addr.clone();
// }
// if param.send_server.is_empty() && !param.mail_server.is_empty() {
// param.send_server = param.mail_server.clone();
// if param.send_server.starts_with("imap.") {
// param.send_server = param.send_server.replacen("imap", "smtp", 1);
// }
// }
// if param.send_port == 0 {
// param.send_port = if 0 != param.server_flags & DC_LP_SMTP_SOCKET_STARTTLS as i32
// {
// 587
// } else if 0 != param.server_flags & DC_LP_SMTP_SOCKET_PLAIN as i32 {
// 25
// } else {
// 465
// }
// }
// if param.send_user.is_empty() && !param.mail_user.is_empty() {
// param.send_user = param.mail_user.clone();
// }
// if param.send_pw.is_empty() && !param.mail_pw.is_empty() {
// param.send_pw = param.mail_pw.clone()
// }
// if !dc_exactly_one_bit_set(param.server_flags & DC_LP_AUTH_FLAGS as i32) {
// param.server_flags &= !(DC_LP_AUTH_FLAGS as i32);
// param.server_flags |= DC_LP_AUTH_NORMAL as i32
// }
// if !dc_exactly_one_bit_set(param.server_flags & DC_LP_IMAP_SOCKET_FLAGS as i32) {
// param.server_flags &= !(DC_LP_IMAP_SOCKET_FLAGS as i32);
// param.server_flags |= if param.send_port == 143 {
// DC_LP_IMAP_SOCKET_STARTTLS as i32
// } else {
// DC_LP_IMAP_SOCKET_SSL as i32
// }
// }
// if !dc_exactly_one_bit_set(param.server_flags & (DC_LP_SMTP_SOCKET_FLAGS as i32)) {
// param.server_flags &= !(DC_LP_SMTP_SOCKET_FLAGS as i32);
// param.server_flags |= if param.send_port == 587 {
// DC_LP_SMTP_SOCKET_STARTTLS as i32
// } else if param.send_port == 25 {
// DC_LP_SMTP_SOCKET_PLAIN as i32
// } else {
// DC_LP_SMTP_SOCKET_SSL as i32
// }
// }
// /* do we have a complete configuration? */
// if param.mail_server.is_empty()
// || param.mail_port == 0
// || param.mail_user.is_empty()
// || param.mail_pw.is_empty()
// || param.send_server.is_empty()
// || param.send_port == 0
// || param.send_user.is_empty()
// || param.send_pw.is_empty()
// || param.server_flags == 0
// {
// error!(context, "Account settings incomplete.");
// false
// } else {
// true
// }
// }
// 14 => {
// progress!(context, 600);
// /* try to connect to IMAP - if we did not got an autoconfig,
// do some further tries with different settings and username variations */
// imap_connected_here =
// try_imap_connections(context, &mut param, param_autoconfig.is_some()).await;
// imap_connected_here
// }
// 15 => {
// progress!(context, 800);
// smtp_connected_here =
// try_smtp_connections(context, &mut param, param_autoconfig.is_some()).await;
// smtp_connected_here
// }
// 16 => {
// progress!(context, 900);
// let create_mvbox = context.get_config_bool(Config::MvboxWatch).await
// || context.get_config_bool(Config::MvboxMove).await;
// let imap = &context.inbox_thread.imap;
// if let Err(err) = imap.ensure_configured_folders(context, create_mvbox).await {
// warn!(context, "configuring folders failed: {:?}", err);
// false
// } else {
// let res = imap.select_with_uidvalidity(context, "INBOX").await;
// if let Err(err) = res {
// error!(context, "could not read INBOX status: {:?}", err);
// false
// } else {
// true
// }
// }
// }
// 17 => {
// progress!(context, 910);
// /* configuration success - write back the configured parameters with the "configured_" prefix; also write the "configured"-flag */
// param
// .save_to_database(
// context,
// "configured_", /*the trailing underscore is correct*/
// )
// .await
// .ok();
context
.sql
.set_raw_config_bool(context, "configured", true)
.await
.ok();
true
}
18 => {
progress!(context, 920);
// we generate the keypair just now - we could also postpone this until the first message is sent, however,
// this may result in a unexpected and annoying delay when the user sends his very first message
// (~30 seconds on a Moto G4 play) and might looks as if message sending is always that slow.
success = e2ee::ensure_secret_key_exists(context).await.is_ok();
info!(context, "key generation completed");
progress!(context, 940);
break; // We are done here
}
_ => {
error!(context, "Internal error: step counter out of bound",);
break;
}
};
// context
// .sql
// .set_raw_config_bool(context, "configured", true)
// .await
// .ok();
// true
// }
// 18 => {
// progress!(context, 920);
// // we generate the keypair just now - we could also postpone this until the first message is sent, however,
// // this may result in a unexpected and annoying delay when the user sends his very first message
// // (~30 seconds on a Moto G4 play) and might looks as if message sending is always that slow.
// success = e2ee::ensure_secret_key_exists(context).await.is_ok();
// info!(context, "key generation completed");
// progress!(context, 940);
// break; // We are done here
// }
// _ => {
// error!(context, "Internal error: step counter out of bound",);
// break;
// }
// };
if !success {
break;
}
}
if imap_connected_here {
context.inbox_thread.imap.disconnect(context).await;
}
if smtp_connected_here {
context.smtp.disconnect().await;
}
// if !success {
// break;
// }
// }
// if imap_connected_here {
// context.inbox_thread.imap.disconnect(context).await;
// }
// if smtp_connected_here {
// context.smtp.disconnect().await;
// }
// remember the entered parameters on success
// and restore to last-entered on failure.
// this way, the parameters visible to the ui are always in-sync with the current configuration.
if success {
LoginParam::from_database(context, "")
.await
.save_to_database(context, "configured_raw_")
.await
.ok();
} else {
LoginParam::from_database(context, "configured_raw_")
.await
.save_to_database(context, "")
.await
.ok();
}
// // remember the entered parameters on success
// // and restore to last-entered on failure.
// // this way, the parameters visible to the ui are always in-sync with the current configuration.
// if success {
// LoginParam::from_database(context, "")
// .await
// .save_to_database(context, "configured_raw_")
// .await
// .ok();
// } else {
// LoginParam::from_database(context, "configured_raw_")
// .await
// .save_to_database(context, "")
// .await
// .ok();
// }
if let Some(provider) = provider::get_provider_info(&param.addr) {
if !provider.after_login_hint.is_empty() {
let mut msg = Message::new(Viewtype::Text);
msg.text = Some(provider.after_login_hint.to_string());
if chat::add_device_msg(context, Some("core-provider-info"), Some(&mut msg))
.await
.is_err()
{
warn!(context, "cannot add after_login_hint as core-provider-info");
}
}
}
// if let Some(provider) = provider::get_provider_info(&param.addr) {
// if !provider.after_login_hint.is_empty() {
// let mut msg = Message::new(Viewtype::Text);
// msg.text = Some(provider.after_login_hint.to_string());
// if chat::add_device_msg(context, Some("core-provider-info"), Some(&mut msg))
// .await
// .is_err()
// {
// warn!(context, "cannot add after_login_hint as core-provider-info");
// }
// }
// }
context.free_ongoing().await;
progress!(context, if success { 1000 } else { 0 });
job::Status::Finished(Ok(()))
// context.free_ongoing().await;
// progress!(context, if success { 1000 } else { 0 });
// job::Status::Finished(Ok(()))
}
#[allow(clippy::unnecessary_unwrap)]
@@ -562,24 +563,25 @@ async fn try_imap_connection(
}
async fn try_imap_one_param(context: &Context, param: &LoginParam) -> Option<bool> {
let inf = format!(
"imap: {}@{}:{} flags=0x{:x} certificate_checks={}",
param.mail_user,
param.mail_server,
param.mail_port,
param.server_flags,
param.imap_certificate_checks
);
info!(context, "Trying: {}", inf);
if context.inbox_thread.imap.connect(context, &param).await {
info!(context, "success: {}", inf);
return Some(true);
}
if context.shall_stop_ongoing().await {
return Some(false);
}
info!(context, "Could not connect: {}", inf);
None
unimplemented!();
// let inf = format!(
// "imap: {}@{}:{} flags=0x{:x} certificate_checks={}",
// param.mail_user,
// param.mail_server,
// param.mail_port,
// param.server_flags,
// param.imap_certificate_checks
// );
// info!(context, "Trying: {}", inf);
// if context.inbox_thread.imap.connect(context, &param).await {
// info!(context, "success: {}", inf);
// return Some(true);
// }
// if context.shall_stop_ongoing().await {
// return Some(false);
// }
// info!(context, "Could not connect: {}", inf);
// None
}
async fn try_smtp_connections(
@@ -613,25 +615,26 @@ async fn try_smtp_connections(
}
async fn try_smtp_one_param(context: &Context, param: &LoginParam) -> Option<bool> {
let inf = format!(
"smtp: {}@{}:{} flags: 0x{:x}",
param.send_user, param.send_server, param.send_port, param.server_flags
);
info!(context, "Trying: {}", inf);
match context.smtp.connect(context, &param).await {
Ok(()) => {
info!(context, "success: {}", inf);
Some(true)
}
Err(err) => {
if context.shall_stop_ongoing().await {
Some(false)
} else {
warn!(context, "could not connect: {}", err);
None
}
}
}
unimplemented!()
// let inf = format!(
// "smtp: {}@{}:{} flags: 0x{:x}",
// param.send_user, param.send_server, param.send_port, param.server_flags
// );
// info!(context, "Trying: {}", inf);
// match context.smtp.connect(context, &param).await {
// Ok(()) => {
// info!(context, "success: {}", inf);
// Some(true)
// }
// Err(err) => {
// if context.shall_stop_ongoing().await {
// Some(false)
// } else {
// warn!(context, "could not connect: {}", err);
// None
// }
// }
// }
}
#[cfg(test)]