Claim IMAP recent messages on append
Debian Trixie package bundle / packages (push) Successful in 22m43s

This commit is contained in:
Mario Fetka
2026-07-29 10:16:55 +02:00
parent 6770651877
commit 4341e004f9
2 changed files with 16 additions and 12 deletions
+11 -12
View File
@@ -239,14 +239,12 @@ def main() -> int:
b"\r\n"
b"multi-session recent fixture\r\n"
)
first_selected.command_with_literal(
first_append = first_selected.command_with_literal(
f"APPEND {quote(recent)}", recent_payload
)
second_updates = second_selected.command("NOOP")
require_line(second_updates, rb"^\* 1 EXISTS\r\n$",
"second session EXISTS")
require_line(second_updates, rb"^\* 1 RECENT\r\n$",
"second session RECENT claim")
outside = status_values(
client.command(
@@ -258,18 +256,19 @@ def main() -> int:
f"STATUS duplicated a claimed recent message: {outside!r}"
)
first_updates = first_selected.command("NOOP")
require_line(first_updates, rb"^\* 1 EXISTS\r\n$",
"first session EXISTS")
require_line(first_updates, rb"^\* 0 RECENT\r\n$",
"first session no duplicate RECENT")
first_selected.command("NOOP")
second_flags = second_selected.command("FETCH 1 (UID FLAGS)")
require_line(second_flags, rb"\\Recent", "claiming session flag")
first_flags = first_selected.command("FETCH 1 (UID FLAGS)")
if any(re.search(rb"\\Recent", line, re.IGNORECASE)
for line in first_flags):
recent_owners = sum(
any(re.search(rb"\\Recent", line, re.IGNORECASE)
for line in responses)
for responses in (first_flags, second_flags)
)
if recent_owners != 1:
raise IMAPCheckError(
f"first session duplicated the recent flag: {first_flags!r}"
"recent flag was not assigned to exactly one session: "
f"append={first_append!r} first={first_flags!r} "
f"second={second_flags!r}"
)
first_selected.command("CLOSE")
second_selected.command("CLOSE")
+5
View File
@@ -3003,6 +3003,11 @@ ImapCommandAppend(void *param)
if ((ccode = AppendFlags(session->store.conn, messageGuid, flags, &flags)) == STATUS_CONTINUE) {
if ((session->client.state == STATE_SELECTED) && (session->folder.selected.info == folder)) {
if ((ccode = MessageListLoad(session->store.conn, &(session->folder.selected))) == STATUS_CONTINUE) {
if (!session->folder.selected.readOnly)
ccode = FolderSetRecentUid(
session->store.conn, folder);
}
if (ccode == STATUS_CONTINUE) {
ccode = SendExistsAndRecent(
session,
session->folder.selected.messageCount,