mirror of
https://github.com/chatmail/core.git
synced 2026-05-03 21:36:29 +03:00
fix: Set Config::NotifyAboutWrongPw before saving configuration (#5896)
Let's always set `Config::NotifyAboutWrongPw` before saving configuration, better if a wrong password notification is shown once more than not shown at all. It shouldn't be a big problem because reconfiguration is a manual action and isn't done frequently. Also for the same reason reset `Config::NotifyAboutWrongPw` only after a successful addition of the appropriate device message.
This commit is contained in:
@@ -2209,6 +2209,19 @@ def test_configure_error_msgs_wrong_pw(acfactory):
|
|||||||
# Password is wrong so it definitely has to say something about "password"
|
# Password is wrong so it definitely has to say something about "password"
|
||||||
assert "password" in ev.data2
|
assert "password" in ev.data2
|
||||||
|
|
||||||
|
ac1.stop_io()
|
||||||
|
ac1.set_config("mail_pw", "abc") # Wrong mail pw
|
||||||
|
ac1.configure()
|
||||||
|
while True:
|
||||||
|
ev = ac1._evtracker.get_matching("DC_EVENT_CONFIGURE_PROGRESS")
|
||||||
|
print(f"Configuration progress: {ev.data1}")
|
||||||
|
if ev.data1 == 0:
|
||||||
|
break
|
||||||
|
assert "password" in ev.data2
|
||||||
|
# Account will continue to work with the old password, so if it becomes wrong, a notification
|
||||||
|
# must be shown.
|
||||||
|
assert ac1.get_config("notify_about_wrong_pw") == "1"
|
||||||
|
|
||||||
|
|
||||||
def test_configure_error_msgs_invalid_server(acfactory):
|
def test_configure_error_msgs_invalid_server(acfactory):
|
||||||
ac2 = acfactory.get_unconfigured_account()
|
ac2 = acfactory.get_unconfigured_account()
|
||||||
|
|||||||
@@ -111,15 +111,10 @@ impl Context {
|
|||||||
|
|
||||||
let param = EnteredLoginParam::load(self).await?;
|
let param = EnteredLoginParam::load(self).await?;
|
||||||
let old_addr = self.get_config(Config::ConfiguredAddr).await?;
|
let old_addr = self.get_config(Config::ConfiguredAddr).await?;
|
||||||
|
let configured_param = configure(self, ¶m).await?;
|
||||||
let configured_param_res = configure(self, ¶m).await;
|
|
||||||
self.set_config_internal(Config::NotifyAboutWrongPw, None)
|
|
||||||
.await?;
|
|
||||||
|
|
||||||
on_configure_completed(self, configured_param_res?, old_addr).await?;
|
|
||||||
|
|
||||||
self.set_config_internal(Config::NotifyAboutWrongPw, Some("1"))
|
self.set_config_internal(Config::NotifyAboutWrongPw, Some("1"))
|
||||||
.await?;
|
.await?;
|
||||||
|
on_configure_completed(self, configured_param, old_addr).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -417,7 +412,8 @@ async fn configure(ctx: &Context, param: &EnteredLoginParam) -> Result<Configure
|
|||||||
configured_param.oauth2,
|
configured_param.oauth2,
|
||||||
r,
|
r,
|
||||||
);
|
);
|
||||||
let mut imap_session = match imap.connect(ctx).await {
|
let configuring = true;
|
||||||
|
let mut imap_session = match imap.connect(ctx, configuring).await {
|
||||||
Ok(session) => session,
|
Ok(session) => session,
|
||||||
Err(err) => bail!("{}", nicer_configuration_error(ctx, err.to_string()).await),
|
Err(err) => bail!("{}", nicer_configuration_error(ctx, err.to_string()).await),
|
||||||
};
|
};
|
||||||
|
|||||||
28
src/imap.rs
28
src/imap.rs
@@ -290,7 +290,11 @@ impl Imap {
|
|||||||
/// Calling this function is not enough to perform IMAP operations. Use [`Imap::prepare`]
|
/// Calling this function is not enough to perform IMAP operations. Use [`Imap::prepare`]
|
||||||
/// instead if you are going to actually use connection rather than trying connection
|
/// instead if you are going to actually use connection rather than trying connection
|
||||||
/// parameters.
|
/// parameters.
|
||||||
pub(crate) async fn connect(&mut self, context: &Context) -> Result<Session> {
|
pub(crate) async fn connect(
|
||||||
|
&mut self,
|
||||||
|
context: &Context,
|
||||||
|
configuring: bool,
|
||||||
|
) -> Result<Session> {
|
||||||
let now = tools::Time::now();
|
let now = tools::Time::now();
|
||||||
let until_can_send = max(
|
let until_can_send = max(
|
||||||
min(self.conn_last_try, now)
|
min(self.conn_last_try, now)
|
||||||
@@ -416,19 +420,12 @@ impl Imap {
|
|||||||
warn!(context, "IMAP failed to login: {err:#}.");
|
warn!(context, "IMAP failed to login: {err:#}.");
|
||||||
first_error.get_or_insert(format_err!("{message} ({err:#})"));
|
first_error.get_or_insert(format_err!("{message} ({err:#})"));
|
||||||
|
|
||||||
let lock = context.wrong_pw_warning_mutex.lock().await;
|
let _lock = context.wrong_pw_warning_mutex.lock().await;
|
||||||
if self.login_failed_once
|
if !configuring
|
||||||
|
&& self.login_failed_once
|
||||||
&& err_str.to_lowercase().contains("authentication")
|
&& err_str.to_lowercase().contains("authentication")
|
||||||
&& context.get_config_bool(Config::NotifyAboutWrongPw).await?
|
&& context.get_config_bool(Config::NotifyAboutWrongPw).await?
|
||||||
{
|
{
|
||||||
if let Err(e) = context
|
|
||||||
.set_config_internal(Config::NotifyAboutWrongPw, None)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
warn!(context, "{e:#}.");
|
|
||||||
}
|
|
||||||
drop(lock);
|
|
||||||
|
|
||||||
let mut msg = Message::new(Viewtype::Text);
|
let mut msg = Message::new(Viewtype::Text);
|
||||||
msg.text.clone_from(&message);
|
msg.text.clone_from(&message);
|
||||||
if let Err(e) = chat::add_device_msg_with_importance(
|
if let Err(e) = chat::add_device_msg_with_importance(
|
||||||
@@ -440,6 +437,12 @@ impl Imap {
|
|||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
warn!(context, "Failed to add device message: {e:#}.");
|
warn!(context, "Failed to add device message: {e:#}.");
|
||||||
|
} else {
|
||||||
|
context
|
||||||
|
.set_config_internal(Config::NotifyAboutWrongPw, None)
|
||||||
|
.await
|
||||||
|
.log_err(context)
|
||||||
|
.ok();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
self.login_failed_once = true;
|
self.login_failed_once = true;
|
||||||
@@ -456,7 +459,8 @@ impl Imap {
|
|||||||
/// Ensure that IMAP client is connected, folders are created and IMAP capabilities are
|
/// Ensure that IMAP client is connected, folders are created and IMAP capabilities are
|
||||||
/// determined.
|
/// determined.
|
||||||
pub(crate) async fn prepare(&mut self, context: &Context) -> Result<Session> {
|
pub(crate) async fn prepare(&mut self, context: &Context) -> Result<Session> {
|
||||||
let mut session = match self.connect(context).await {
|
let configuring = false;
|
||||||
|
let mut session = match self.connect(context, configuring).await {
|
||||||
Ok(session) => session,
|
Ok(session) => session,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
self.connectivity.set_err(context, &err).await;
|
self.connectivity.set_err(context, &err).await;
|
||||||
|
|||||||
Reference in New Issue
Block a user