Skip to content

Commit 8fde88a

Browse files
committed
wip
1 parent b5812ce commit 8fde88a

File tree

2 files changed

+26
-8
lines changed

2 files changed

+26
-8
lines changed

imapserver/imapmemserver/mailbox.go

+22-6
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func (mbox *Mailbox) appendBytes(buf []byte, options *imap.AppendOptions) *imap.
150150
mbox.l = append(mbox.l, msg)
151151
mbox.tracker.QueueNumMessages(uint32(len(mbox.l)))
152152

153-
mbox.addFlagsLocked(options.Flags)
153+
mbox.addFlagsLocked(options.Flags, nil)
154154

155155
return &imap.AppendData{
156156
UIDValidity: mbox.uidValidity,
@@ -187,7 +187,7 @@ func (mbox *Mailbox) selectDataLocked() *imap.SelectData {
187187
}
188188
}
189189

190-
func (mbox *Mailbox) addFlagsLocked(flags []imap.Flag) {
190+
func (mbox *Mailbox) addFlagsLocked(flags []imap.Flag, source *imapserver.SessionTracker) bool {
191191
changed := false
192192
for _, flag := range flags {
193193
if _, ok := mbox.flags[canonicalFlag(flag)]; !ok {
@@ -196,8 +196,9 @@ func (mbox *Mailbox) addFlagsLocked(flags []imap.Flag) {
196196
mbox.flags[canonicalFlag(flag)] = struct{}{}
197197
}
198198
if changed {
199-
mbox.tracker.QueueMailboxFlags(flagMapToList(mbox.flags))
199+
mbox.tracker.QueueMailboxFlags(flagMapToList(mbox.flags), source)
200200
}
201+
return changed
201202
}
202203

203204
func (mbox *Mailbox) Expunge(w *imapserver.ExpungeWriter, uids *imap.UIDSet) error {
@@ -390,29 +391,44 @@ func (mbox *MailboxView) staticSearchCriteria(criteria *imap.SearchCriteria) {
390391
}
391392

392393
func (mbox *MailboxView) Store(w *imapserver.FetchWriter, numSet imap.NumSet, flags *imap.StoreFlags, options *imap.StoreOptions) error {
393-
mbox.store(numSet, flags)
394+
newMailboxFlags := mbox.store(numSet, flags)
394395
if !flags.Silent {
396+
if newMailboxFlags != nil {
397+
if err := w.WriteMailboxFlags(newMailboxFlags); err != nil {
398+
return err
399+
}
400+
}
395401
// TODO: this sends message flags updates before mailbox flags update
396402
return mbox.Fetch(w, numSet, &imap.FetchOptions{Flags: true})
397403
}
398404
return nil
399405
}
400406

401-
func (mbox *MailboxView) store(numSet imap.NumSet, flags *imap.StoreFlags) {
407+
func (mbox *MailboxView) store(numSet imap.NumSet, flags *imap.StoreFlags) []imap.Flag {
402408
mbox.mutex.Lock()
403409
defer mbox.mutex.Unlock()
404410

405411
// We need to announce the new flags via a FLAGS response before sending
406412
// FETCH FLAGS responses
413+
var newMailboxFlags []imap.Flag
407414
switch flags.Op {
408415
case imap.StoreFlagsSet, imap.StoreFlagsAdd:
409-
mbox.addFlagsLocked(flags.Flags)
416+
var source *imapserver.SessionTracker
417+
if !flags.Silent {
418+
source = mbox.tracker
419+
}
420+
changed := mbox.addFlagsLocked(flags.Flags, source)
421+
if changed {
422+
newMailboxFlags = flagMapToList(mbox.flags)
423+
}
410424
}
411425

412426
mbox.forEachLocked(numSet, func(seqNum uint32, msg *message) {
413427
msg.store(flags)
414428
mbox.Mailbox.tracker.QueueMessageFlags(seqNum, msg.uid, msg.flagList(), mbox.tracker)
415429
})
430+
431+
return newMailboxFlags
416432
}
417433

418434
func (mbox *MailboxView) Poll(w *imapserver.UpdateWriter, allowExpunge bool) error {

imapserver/tracker.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,13 @@ func (t *MailboxTracker) QueueNumMessages(n uint32) {
7979
}
8080

8181
// QueueMailboxFlags queues a new FLAGS update.
82-
func (t *MailboxTracker) QueueMailboxFlags(flags []imap.Flag) {
82+
//
83+
// If source is not nil, the update won't be dispatched to it.
84+
func (t *MailboxTracker) QueueMailboxFlags(flags []imap.Flag, source *SessionTracker) {
8385
if flags == nil {
8486
flags = []imap.Flag{}
8587
}
86-
t.queueUpdate(&trackerUpdate{mailboxFlags: flags}, nil)
88+
t.queueUpdate(&trackerUpdate{mailboxFlags: flags}, source)
8789
}
8890

8991
// QueueMessageFlags queues a new FETCH FLAGS update.

0 commit comments

Comments
 (0)