diff --git a/deltachat-jsonrpc/src/api.rs b/deltachat-jsonrpc/src/api.rs index f48c949c1..bdab3bba6 100644 --- a/deltachat-jsonrpc/src/api.rs +++ b/deltachat-jsonrpc/src/api.rs @@ -489,7 +489,7 @@ impl CommandApi { param: EnteredLoginParam, ) -> Result<()> { let ctx = self.get_context(account_id).await?; - ctx.add_or_update_transport(¶m.try_into()?).await + ctx.add_or_update_transport(&mut param.try_into()?).await } /// Deprecated 2025-04. Alias for [Self::add_or_update_transport()]. diff --git a/deltachat-rpc-client/src/deltachat_rpc_client/account.py b/deltachat-rpc-client/src/deltachat_rpc_client/account.py index 1b9f67e12..407e49a2a 100644 --- a/deltachat-rpc-client/src/deltachat_rpc_client/account.py +++ b/deltachat-rpc-client/src/deltachat_rpc_client/account.py @@ -115,6 +115,12 @@ class Account: """Add a new transport.""" yield self._rpc.add_or_update_transport.future(self.id, params) + @futuremethod + def list_transports(self): + """Returns the list of all email accounts that are used as a transport in the current profile.""" + transports = yield self._rpc.list_transports.future(self.id) + return transports + def bring_online(self): """Start I/O and wait until IMAP becomes IDLE.""" self.start_io() diff --git a/deltachat-rpc-client/tests/test_something.py b/deltachat-rpc-client/tests/test_something.py index 2c0b50868..d859140f7 100644 --- a/deltachat-rpc-client/tests/test_something.py +++ b/deltachat-rpc-client/tests/test_something.py @@ -74,6 +74,29 @@ def test_configure_starttls(acfactory) -> None: assert account.is_configured() +def test_lowercase_address(acfactory) -> None: + addr, password = acfactory.get_credentials() + addr_upper = addr.upper() + account = acfactory.get_unconfigured_account() + account.add_or_update_transport( + { + "addr": addr_upper, + "password": password, + }, + ) + assert account.is_configured() + assert addr_upper != addr + assert account.get_config("configured_addr") == addr + assert account.list_transports()[0]["addr"] == addr + + for param in [ + account.get_info()["used_account_settings"], + account.get_info()["entered_account_settings"], + ]: + assert addr in param + assert addr_upper not in param + + def test_configure_ip(acfactory) -> None: addr, password = acfactory.get_credentials() account = acfactory.get_unconfigured_account() @@ -115,7 +138,7 @@ def test_list_transports(acfactory) -> None: "imapUser": addr, }, ) - transports = account._rpc.list_transports(account.id) + transports = account.list_transports() assert len(transports) == 1 params = transports[0] assert params["addr"] == addr diff --git a/src/configure.rs b/src/configure.rs index e0a63c7db..c3fe0afcd 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -16,7 +16,7 @@ pub(crate) mod server_params; use anyhow::{bail, ensure, format_err, Context as _, Result}; use auto_mozilla::moz_autoconfigure; use auto_outlook::outlk_autodiscover; -use deltachat_contact_tools::EmailAddress; +use deltachat_contact_tools::{addr_normalize, EmailAddress}; use futures::FutureExt; use futures_lite::FutureExt as _; use percent_encoding::utf8_percent_encode; @@ -70,9 +70,9 @@ impl Context { /// Deprecated since 2025-02; use `add_transport_from_qr()` /// or `add_or_update_transport()` instead. pub async fn configure(&self) -> Result<()> { - let param = EnteredLoginParam::load(self).await?; + let mut param = EnteredLoginParam::load(self).await?; - self.add_transport_inner(¶m).await + self.add_transport_inner(&mut param).await } /// Configures a new email account using the provided parameters @@ -104,7 +104,7 @@ impl Context { /// from a server encoded in a QR code. /// - [Self::list_transports()] to get a list of all configured transports. /// - [Self::delete_transport()] to remove a transport. - pub async fn add_or_update_transport(&self, param: &EnteredLoginParam) -> Result<()> { + pub async fn add_or_update_transport(&self, param: &mut EnteredLoginParam) -> Result<()> { self.stop_io().await; let result = self.add_transport_inner(param).await; if result.is_err() { @@ -117,7 +117,7 @@ impl Context { Ok(()) } - async fn add_transport_inner(&self, param: &EnteredLoginParam) -> Result<()> { + async fn add_transport_inner(&self, param: &mut EnteredLoginParam) -> Result<()> { ensure!( !self.scheduler.is_running().await, "cannot configure, already running" @@ -126,6 +126,7 @@ impl Context { self.sql.is_open().await, "cannot configure, database not opened." ); + param.addr = addr_normalize(¶m.addr); let old_addr = self.get_config(Config::ConfiguredAddr).await?; if self.is_configured().await? && !addr_cmp(&old_addr.unwrap_or_default(), ¶m.addr) { bail!("Changing your email address is not supported right now. Check back in a few months!");