From cea33bebe2b0c48fa6ad73ac501e3619085846a1 Mon Sep 17 00:00:00 2001 From: Jakub Date: Mon, 8 Nov 2021 13:03:30 +0100 Subject: [PATCH] GODT-1415: Only messages which are in Spam should be moved to INBOX once they are marked as not-a-spam. This is regression of GODT-963 --- internal/imap/mailbox_messages.go | 29 ++++++++++++------- test/fakeapi/labels.go | 11 ++++++- .../bridge/imap/message/update_spam.feature | 24 ++++++++++++++- 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/internal/imap/mailbox_messages.go b/internal/imap/mailbox_messages.go index 990b82cf..c91616ea 100644 --- a/internal/imap/mailbox_messages.go +++ b/internal/imap/mailbox_messages.go @@ -182,7 +182,7 @@ func (im *imapMailbox) addOrRemoveFlags(operation imap.FlagsOp, messageIDs, flag case imap.AnsweredFlag, imap.DraftFlag, imap.RecentFlag: // Not supported. case strings.ToLower(message.AppleMailJunkFlag), strings.ToLower(message.ThunderbirdJunkFlag): - storeMailbox, err := im.storeAddress.GetMailbox("Spam") + spamMailbox, err := im.storeAddress.GetMailbox("Spam") if err != nil { return err } @@ -191,20 +191,27 @@ func (im *imapMailbox) addOrRemoveFlags(operation imap.FlagsOp, messageIDs, flag // No label removal is necessary because Spam and Inbox are both exclusive labels so the backend // will automatically take care of label removal. case imap.AddFlags: - if err := storeMailbox.LabelMessages(messageIDs); err != nil { + if err := spamMailbox.LabelMessages(messageIDs); err != nil { return err } case imap.RemoveFlags: - // when removing junk flag, the message should be moved to the INBOX folder. - if err := storeMailbox.UnlabelMessages(messageIDs); err != nil { - return err + // During spam flag removal only messages which + // are in Spam folder should be moved to Inbox. + // For other messages it is NOOP. + messagesInSpam := []string{} + for _, mID := range messageIDs { + if uid := spamMailbox.GetUIDList([]string{mID}); len(*uid) != 0 { + messagesInSpam = append(messagesInSpam, mID) + } } - inboxMailbox, err := im.storeAddress.GetMailbox("INBOX") - if err != nil { - return err - } - if err := inboxMailbox.LabelMessages(messageIDs); err != nil { - return err + if len(messagesInSpam) != 0 { + inboxMailbox, err := im.storeAddress.GetMailbox("INBOX") + if err != nil { + return err + } + if err := inboxMailbox.LabelMessages(messagesInSpam); err != nil { + return err + } } } } diff --git a/test/fakeapi/labels.go b/test/fakeapi/labels.go index 9660f0b2..aefa5781 100644 --- a/test/fakeapi/labels.go +++ b/test/fakeapi/labels.go @@ -30,7 +30,16 @@ func (api *FakePMAPI) isLabelFolder(labelID string) bool { return bool(label.Exclusive) } } - return labelID == pmapi.InboxLabel || labelID == pmapi.ArchiveLabel || labelID == pmapi.SentLabel + switch labelID { + case pmapi.InboxLabel, + pmapi.TrashLabel, + pmapi.SpamLabel, + pmapi.ArchiveLabel, + pmapi.SentLabel, + pmapi.DraftLabel: + return true + } + return false } func (api *FakePMAPI) ListLabels(context.Context) ([]*pmapi.Label, error) { diff --git a/test/features/bridge/imap/message/update_spam.feature b/test/features/bridge/imap/message/update_spam.feature index a6a3b04e..7cdb89a1 100644 --- a/test/features/bridge/imap/message/update_spam.feature +++ b/test/features/bridge/imap/message/update_spam.feature @@ -20,7 +20,7 @@ Feature: IMAP update messages in Spam folder | john.doe@mail.com | user@pm.me | foo | | jane.doe@mail.com | name@pm.me | bar | - Scenario Outline: Removing flag "junk" or adding flags "nojunk" moves message to INBOX + Scenario Outline: Move from Spam to INBOX when client When IMAP client flags "" message seq "1" Then IMAP response is "OK" And mailbox "INBOX" for "user" has 1 messages @@ -38,3 +38,25 @@ Feature: IMAP update messages in Spam folder | removes | from | junk | | removes | from | Junk | | removes | from | $Junk | + + Scenario Outline: Do not move from Archive to INBOX when client + Given there are messages in mailbox "Archive" for "user" + | id | from | to | subject | body | read | starred | deleted | + | 1 | john.doe@mail.com | user@pm.me | Archived | hello | false | false | false | + And there is IMAP client selected in "Archive" + When IMAP client flags "" message seq "1" + Then IMAP response is "OK" + And mailbox "INBOX" for "user" has 0 messages + And mailbox "Archive" for "user" has 1 messages + And mailbox "Archive" for "user" has messages + | from | to | subject | + | john.doe@mail.com | user@pm.me | Archived | + Examples: + | operation | suffix | flag | + | adds | to | nojunk | + | adds | to | NoJunk | + | removes | from | junk | + | removes | from | Junk | + | removes | from | $Junk | + +