From a09fd4577a4ed27ffb2b6b0ce48f90377ac7a53c Mon Sep 17 00:00:00 2001 From: Simon Laux Date: Mon, 15 Dec 2025 11:35:23 +0100 Subject: [PATCH] fix: add explicit limit for adding relays (5 at the moment) (#7611) closes https://github.com/chatmail/core/issues/7608 --- .../tests/test_multitransport.py | 22 +++++++++++++++++++ src/configure.rs | 16 ++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/deltachat-rpc-client/tests/test_multitransport.py b/deltachat-rpc-client/tests/test_multitransport.py index bdcca57ec..869b2de7b 100644 --- a/deltachat-rpc-client/tests/test_multitransport.py +++ b/deltachat-rpc-client/tests/test_multitransport.py @@ -221,3 +221,25 @@ def test_recognize_self_address(acfactory) -> None: bob_chat.send_text("Hello!") msg = alice.wait_for_incoming_msg().get_snapshot() assert msg.chat == alice.create_chat(bob) + + +def test_transport_limit(acfactory) -> None: + """Test transports limit.""" + account = acfactory.get_online_account() + qr = acfactory.get_account_qr() + + limit = 5 + + for _ in range(1, limit): + account.add_transport_from_qr(qr) + + assert len(account.list_transports()) == limit + + with pytest.raises(JsonRpcError): + account.add_transport_from_qr(qr) + + second_addr = account.list_transports()[1]["addr"] + account.delete_transport(second_addr) + + # test that adding a transport after deleting one works again + account.add_transport_from_qr(qr) diff --git a/src/configure.rs b/src/configure.rs index b0f32392e..e72315e7e 100644 --- a/src/configure.rs +++ b/src/configure.rs @@ -45,6 +45,10 @@ use crate::transport::{ use crate::{EventType, stock_str}; use crate::{chat, provider}; +/// Maximum number of relays +/// see +pub(crate) const MAX_TRANSPORT_RELAYS: usize = 5; + macro_rules! progress { ($context:tt, $progress:expr, $comment:expr) => { assert!( @@ -283,6 +287,18 @@ impl Context { "To use additional relays, set the legacy option \"Settings / Advanced / Show Classic Emails\" to \"All\"." ); } + + if self + .sql + .count("SELECT COUNT(*) FROM transports", ()) + .await? + >= MAX_TRANSPORT_RELAYS + { + bail!( + "You have reached the maximum number of relays ({}).", + MAX_TRANSPORT_RELAYS + ) + } } let provider = match configure(self, param).await {