From 4f14e3ba81daa942544fde4df6d1301ab53cde75 Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 12 Jan 2018 22:09:43 +0100 Subject: [PATCH] imap: add support for EXPUNGE --- imap/mailbox.go | 27 +++++++++++++++++++++++++-- imap/user.go | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/imap/mailbox.go b/imap/mailbox.go index b80d9e7..3d79946 100644 --- a/imap/mailbox.go +++ b/imap/mailbox.go @@ -28,6 +28,7 @@ type mailbox struct { initializedLock sync.Mutex total, unread int + deleted map[string]struct{} } func (mbox *mailbox) Name() string { @@ -404,7 +405,16 @@ func (mbox *mailbox) UpdateMessagesFlags(uid bool, seqSet *imap.SeqSet, op imap. err = mbox.u.c.UnlabelMessages(protonmail.LabelStarred, apiIDs) } case imap.DeletedFlag: - // TODO + switch op { + case imap.SetFlags, imap.AddFlags: + for _, apiID := range apiIDs { + mbox.deleted[apiID] = struct{}{} + } + case imap.RemoveFlags: + for _, apiID := range apiIDs { + delete(mbox.deleted, apiID) + } + } } if err != nil { return err @@ -460,5 +470,18 @@ func (mbox *mailbox) MoveMessages(uid bool, seqSet *imap.SeqSet, destName string } func (mbox *mailbox) Expunge() error { - return errNotYetImplemented // TODO + if err := mbox.init(); err != nil { + return err + } + + apiIDs := make([]string, 0, len(mbox.deleted)) + for apiID := range mbox.deleted { + apiIDs = append(apiIDs, apiID) + } + + if err := mbox.u.c.DeleteMessages(apiIDs); err != nil { + return err + } + + return nil } diff --git a/imap/user.go b/imap/user.go index 6c014e8..13cc729 100644 --- a/imap/user.go +++ b/imap/user.go @@ -85,6 +85,7 @@ func (u *user) initMailboxes() error { flags: data.flags, u: u, db: mboxDB, + deleted: make(map[string]struct{}), } }