@@ -312,12 +312,7 @@ func (mbox *MailboxView) Search(numKind imapserver.NumKind, criteria *imap.Searc
312312 mbox .mutex .Lock ()
313313 defer mbox .mutex .Unlock ()
314314
315- for _ , seqSet := range criteria .SeqNum {
316- mbox .staticNumSet (seqSet )
317- }
318- for _ , uidSet := range criteria .UID {
319- mbox .staticNumSet (uidSet )
320- }
315+ mbox .staticSearchCriteria (criteria )
321316
322317 data := imap.SearchData {UID : numKind == imapserver .NumKindUID }
323318
@@ -363,6 +358,24 @@ func (mbox *MailboxView) Search(numKind imapserver.NumKind, criteria *imap.Searc
363358 return & data , nil
364359}
365360
361+ func (mbox * MailboxView ) staticSearchCriteria (criteria * imap.SearchCriteria ) {
362+ for _ , seqSet := range criteria .SeqNum {
363+ mbox .staticNumSet (seqSet )
364+ }
365+ for _ , uidSet := range criteria .UID {
366+ mbox .staticNumSet (uidSet )
367+ }
368+
369+ for i := range criteria .Not {
370+ mbox .staticSearchCriteria (& criteria .Not [i ])
371+ }
372+ for i := range criteria .Or {
373+ for j := range criteria .Or [i ] {
374+ mbox .staticSearchCriteria (& criteria.Or [i ][j ])
375+ }
376+ }
377+ }
378+
366379func (mbox * MailboxView ) Store (w * imapserver.FetchWriter , numSet imap.NumSet , flags * imap.StoreFlags , options * imap.StoreOptions ) error {
367380 mbox .forEach (numSet , func (seqNum uint32 , msg * message ) {
368381 msg .store (flags )
0 commit comments