@@ -150,7 +150,7 @@ func (mbox *Mailbox) appendBytes(buf []byte, options *imap.AppendOptions) *imap.
150
150
mbox .l = append (mbox .l , msg )
151
151
mbox .tracker .QueueNumMessages (uint32 (len (mbox .l )))
152
152
153
- mbox .addFlagsLocked (options .Flags )
153
+ mbox .addFlagsLocked (options .Flags , nil )
154
154
155
155
return & imap.AppendData {
156
156
UIDValidity : mbox .uidValidity ,
@@ -187,7 +187,7 @@ func (mbox *Mailbox) selectDataLocked() *imap.SelectData {
187
187
}
188
188
}
189
189
190
- func (mbox * Mailbox ) addFlagsLocked (flags []imap.Flag ) {
190
+ func (mbox * Mailbox ) addFlagsLocked (flags []imap.Flag , source * imapserver. SessionTracker ) bool {
191
191
changed := false
192
192
for _ , flag := range flags {
193
193
if _ , ok := mbox .flags [canonicalFlag (flag )]; ! ok {
@@ -196,8 +196,9 @@ func (mbox *Mailbox) addFlagsLocked(flags []imap.Flag) {
196
196
mbox .flags [canonicalFlag (flag )] = struct {}{}
197
197
}
198
198
if changed {
199
- mbox .tracker .QueueMailboxFlags (flagMapToList (mbox .flags ))
199
+ mbox .tracker .QueueMailboxFlags (flagMapToList (mbox .flags ), source )
200
200
}
201
+ return changed
201
202
}
202
203
203
204
func (mbox * Mailbox ) Expunge (w * imapserver.ExpungeWriter , uids * imap.UIDSet ) error {
@@ -390,29 +391,44 @@ func (mbox *MailboxView) staticSearchCriteria(criteria *imap.SearchCriteria) {
390
391
}
391
392
392
393
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 )
394
395
if ! flags .Silent {
396
+ if newMailboxFlags != nil {
397
+ if err := w .WriteMailboxFlags (newMailboxFlags ); err != nil {
398
+ return err
399
+ }
400
+ }
395
401
// TODO: this sends message flags updates before mailbox flags update
396
402
return mbox .Fetch (w , numSet , & imap.FetchOptions {Flags : true })
397
403
}
398
404
return nil
399
405
}
400
406
401
- func (mbox * MailboxView ) store (numSet imap.NumSet , flags * imap.StoreFlags ) {
407
+ func (mbox * MailboxView ) store (numSet imap.NumSet , flags * imap.StoreFlags ) []imap. Flag {
402
408
mbox .mutex .Lock ()
403
409
defer mbox .mutex .Unlock ()
404
410
405
411
// We need to announce the new flags via a FLAGS response before sending
406
412
// FETCH FLAGS responses
413
+ var newMailboxFlags []imap.Flag
407
414
switch flags .Op {
408
415
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
+ }
410
424
}
411
425
412
426
mbox .forEachLocked (numSet , func (seqNum uint32 , msg * message ) {
413
427
msg .store (flags )
414
428
mbox .Mailbox .tracker .QueueMessageFlags (seqNum , msg .uid , msg .flagList (), mbox .tracker )
415
429
})
430
+
431
+ return newMailboxFlags
416
432
}
417
433
418
434
func (mbox * MailboxView ) Poll (w * imapserver.UpdateWriter , allowExpunge bool ) error {
0 commit comments