receive_imf: trim() "Chat-Group-Name{,-Changed}:" headers content (#3650)

It's a w/a for "Space added before long group names after MIME serialization/deserialization"
issue. DC itself never creates group names with leading/trailing whitespace, so it can be safely
removed. On the sender side there's no trim() because group names anyway go through
improve_single_line_input(). And I believe we should send the exact name we have in our db. Also
there's no check for leading/trailing whitespace because there may be existing user databases with
group names having such whitespaces.
This commit is contained in:
iequidoo
2022-11-22 16:27:34 -03:00
committed by iequidoo
parent 6f0985dcaa
commit 9783da5d8e
3 changed files with 35 additions and 2 deletions

View File

@@ -25,6 +25,7 @@
- fix detection of "All mail", "Trash", "Junk" etc folders. #3760 - fix detection of "All mail", "Trash", "Junk" etc folders. #3760
- fetch messages sequentially to fix reactions on partially downloaded messages #3688 - fetch messages sequentially to fix reactions on partially downloaded messages #3688
- Fix a bug where one malformed message blocked receiving any further messages #3769 - Fix a bug where one malformed message blocked receiving any further messages #3769
- strip leading/trailing whitespace from "Chat-Group-Name{,-Changed}:" headers content #3650
## 1.101.0 ## 1.101.0

View File

@@ -405,6 +405,29 @@ def test_forward_own_message(acfactory, lp):
assert msg_in.is_forwarded() assert msg_in.is_forwarded()
def test_long_group_name(acfactory, lp):
"""See bug https://github.com/deltachat/deltachat-core-rust/issues/3650 "Space added before long
group names after MIME serialization/deserialization".
When the mailadm bot creates a group with botadmin, the bot creates is as
"pytest-supportuser-282@x.testrun.org support group" (for example). But in the botadmin's
account object, the group chat is called " pytest-supportuser-282@x.testrun.org support group"
(with an additional space character in the beginning).
"""
ac1, ac2 = acfactory.get_online_accounts(2)
lp.sec("ac1: creating group chat and sending a message")
group_name = "pytest-supportuser-282@x.testrun.org support group"
group = ac1.create_group_chat(group_name)
group.add_contact(ac2)
group.send_text("message")
# wait for other account to receive
ev = ac2._evtracker.get_matching("DC_EVENT_INCOMING_MSG")
msg_in = ac2.get_message_by_id(ev.data2)
assert msg_in.chat.get_name() == group_name
def test_send_self_message(acfactory, lp): def test_send_self_message(acfactory, lp):
ac1 = acfactory.new_online_configuring_account(mvbox_move=True) ac1 = acfactory.new_online_configuring_account(mvbox_move=True)
acfactory.bring_accounts_online() acfactory.bring_accounts_online()

View File

@@ -1510,7 +1510,10 @@ async fn create_or_lookup_group(
let grpname = mime_parser let grpname = mime_parser
.get_header(HeaderDef::ChatGroupName) .get_header(HeaderDef::ChatGroupName)
.context("Chat-Group-Name vanished")?; .context("Chat-Group-Name vanished")?
// W/a for "Space added before long group names after MIME serialization/deserialization
// #3650" issue. DC itself never creates group names with leading/trailing whitespace.
.trim();
let new_chat_id = ChatId::create_multiuser_record( let new_chat_id = ChatId::create_multiuser_record(
context, context,
Chattype::Group, Chattype::Group,
@@ -1618,9 +1621,15 @@ async fn apply_group_changes(
{ {
better_msg = Some(stock_str::msg_add_member(context, &added_member, from_id).await); better_msg = Some(stock_str::msg_add_member(context, &added_member, from_id).await);
recreate_member_list = true; recreate_member_list = true;
} else if let Some(old_name) = mime_parser.get_header(HeaderDef::ChatGroupNameChanged) { } else if let Some(old_name) = mime_parser
.get_header(HeaderDef::ChatGroupNameChanged)
// See create_or_lookup_group() for explanation
.map(|s| s.trim())
{
if let Some(grpname) = mime_parser if let Some(grpname) = mime_parser
.get_header(HeaderDef::ChatGroupName) .get_header(HeaderDef::ChatGroupName)
// See create_or_lookup_group() for explanation
.map(|grpname| grpname.trim())
.filter(|grpname| grpname.len() < 200) .filter(|grpname| grpname.len() < 200)
{ {
if chat_id if chat_id