Report IMAP seen transitions during fetch
Debian Trixie package bundle / packages (push) Successful in 22m23s

This commit is contained in:
Mario Fetka
2026-07-29 10:51:02 +02:00
parent 074917ab25
commit 969a71076b
+19 -19
View File
@@ -1666,7 +1666,8 @@ FetchFlagResponderBodyHeaderFields(void *param1, void *param2, void *param3)
return(STATUS_ABORT);
}
if (ConnWrite(session->client.conn, " {0}\r\n", sizeof(" {0}\r\n") - 1) != -1) {
if (ConnWrite(session->client.conn, " {2}\r\n\r\n",
sizeof(" {2}\r\n\r\n") - 1) != -1) {
MemFree(resultHeader);
return(STATUS_CONTINUE);
}
@@ -3308,26 +3309,21 @@ __inline static long
SetMessageSeenFlag(ImapSession *session, FetchStruct *FetchRequest)
{
long ccode;
unsigned long oldFlags;
unsigned long newFlags;
char *ptr;
if (NMAPSendCommandF(session->store.conn, "FLAG %" PRIx64 " +%lu\r\n", FetchRequest->message->guid, (unsigned long)STORE_MSG_FLAG_SEEN) != -1) {
ccode = NMAPReadResponse(session->store.conn, session->store.response, sizeof(session->store.response), TRUE);
if (ccode == 1000) {
if (!(FetchRequest->flags & F_FLAGS)) {
/* This fetch request does allow flags responses, but we have to wait for later to send them to the client */
ptr = strchr(session->store.response, ' ');
if (ptr) {
newFlags = atol(ptr + 1);
RememberFlags(session->folder.selected.events.flags, FetchRequest->message->guid, newFlags);
}
}
return(STATUS_CONTINUE);
}
return(CheckForNMAPCommError(ccode));
oldFlags = FetchRequest->message->flags;
newFlags = oldFlags;
ccode = StoreMessageFlag(session->store.conn,
FetchRequest->message->guid, "+",
STORE_MSG_FLAG_SEEN, &newFlags);
if (ccode == STATUS_CONTINUE) {
FetchRequest->message->flags = newFlags;
if (!(FetchRequest->flags & F_FLAGS) && newFlags != oldFlags)
RememberFlags(session->folder.selected.events.flags,
FetchRequest->message->guid, newFlags);
}
return(STATUS_NMAP_COMM_ERROR);
return ccode;
}
__inline static long
@@ -3490,8 +3486,12 @@ SendResponseForMessage(ImapSession *session, FetchStruct *FetchRequest)
if (FetchRequest->flags & (F_BINARY | F_BINARY_SIZE))
ccode = PrepareBinaryResults(session, FetchRequest);
if (ccode == STATUS_CONTINUE &&
(ccode = SetSeenFlag(session, FetchRequest)) == STATUS_CONTINUE)
(ccode = SetSeenFlag(session, FetchRequest)) == STATUS_CONTINUE) {
ccode = SendResponseForFetchFlags(session, FetchRequest);
if (ccode == STATUS_CONTINUE &&
!(FetchRequest->flags & F_FLAGS))
ccode = EventsSend(session, STORE_EVENT_FLAG);
}
}
BinaryResultsFree(FetchRequest);
MessageDetailsFree(&(FetchRequest->messageDetail));