imapserver: implement NOTIFY extension from RFC 5465

NOTIFY is like IDLE, but where IDLE watches just the selected mailbox, NOTIFY
can watch all mailboxes. With NOTIFY, a client can also ask a server to
immediately return configurable fetch attributes for new messages, e.g. a
message preview, certain header fields, or simply the entire message.

Mild testing with evolution and fairemail.
This commit is contained in:
Mechiel Lukkien
2025-04-07 23:21:03 +02:00
parent 5a7d5fce98
commit 8bab38eac4
30 changed files with 1926 additions and 161 deletions

View File

@ -959,7 +959,7 @@ func serveEvents(ctx context.Context, log mlog.Log, accountPath string, w http.R
case store.ChangeMailboxKeywords:
taggedChanges = append(taggedChanges, [2]any{"ChangeMailboxKeywords", ChangeMailboxKeywords{c}})
case store.ChangeAddSubscription:
case store.ChangeAddSubscription, store.ChangeRemoveSubscription:
// Webmail does not care about subscriptions.
case store.ChangeAnnotation:
@ -1111,7 +1111,12 @@ func serveEvents(ctx context.Context, log mlog.Log, accountPath string, w http.R
}
case <-pending:
xprocessChanges(comm.Get())
overflow, changes := comm.Get()
if overflow {
writer.xsendEvent(ctx, log, "fatalErr", "out of sync, too many pending changes")
return
}
xprocessChanges(changes)
case <-ctx.Done():
// Work around go vet, it doesn't see defer cancelDrain.