diff --git a/Changelog.md b/Changelog.md index 2d2e71d1..4ac271bf 100644 --- a/Changelog.md +++ b/Changelog.md @@ -2,6 +2,12 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) +## [Bridge 1.8.1] James + +### Fixed +* GODT-1165: Handle UID FETCH with sequence range of empty mailbox. + + ## [Bridge 1.8.0] James ### Added diff --git a/Makefile b/Makefile index 1ba1de71..dd78382c 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ TARGET_OS?=${GOOS} .PHONY: build build-ie build-nogui build-ie-nogui build-launcher build-launcher-ie versioner hasher # Keep version hardcoded so app build works also without Git repository. -BRIDGE_APP_VERSION?=1.8.0+git +BRIDGE_APP_VERSION?=1.8.1+git IE_APP_VERSION?=1.3.3+git APP_VERSION:=${BRIDGE_APP_VERSION} SRC_ICO:=logo.ico diff --git a/internal/store/mailbox_ids.go b/internal/store/mailbox_ids.go index f8da95d1..44465780 100644 --- a/internal/store/mailbox_ids.go +++ b/internal/store/mailbox_ids.go @@ -38,6 +38,11 @@ func (storeMailbox *Mailbox) GetAPIIDsFromUIDRange(start, stop uint32) (apiIDs [ b := storeMailbox.txGetIMAPIDsBucket(tx) c := b.Cursor() + // GODT-1153 If the mailbox is empty we should reply BAD to client. + if uid, _ := c.Last(); uid == nil { + return nil + } + // If the start range is a wildcard, the range can only refer to the last message in the mailbox. if start == 0 { _, apiID := c.Last() @@ -74,6 +79,11 @@ func (storeMailbox *Mailbox) GetAPIIDsFromSequenceRange(start, stop uint32) (api b := storeMailbox.txGetIMAPIDsBucket(tx) c := b.Cursor() + // GODT-1153 If the mailbox is empty we should reply BAD to client. + if uid, _ := c.Last(); uid == nil { + return nil + } + // If the start range is a wildcard, the range can only refer to the last message in the mailbox. if start == 0 { _, apiID := c.Last() @@ -318,5 +328,10 @@ func (storeMailbox *Mailbox) GetUIDByHeader(header *mail.Header) (foundUID uint3 func (storeMailbox *Mailbox) txGetFinalUID(b *bolt.Bucket) uint32 { uid, _ := b.Cursor().Last() + + if uid == nil { + panic(errors.New("cannot get final UID of empty mailbox")) + } + return btoi(uid) } diff --git a/test/features/bridge/imap/message/fetch.feature b/test/features/bridge/imap/message/fetch.feature index 2170f0e1..0acb62a9 100644 --- a/test/features/bridge/imap/message/fetch.feature +++ b/test/features/bridge/imap/message/fetch.feature @@ -27,7 +27,7 @@ Feature: IMAP fetch messages Then IMAP response is "OK" And IMAP response has 5 messages - Scenario: Fetch first few messages of inbox + Scenario: Fetch first few messages of inbox by UID Given there are 10 messages in mailbox "INBOX" for "user" And there is IMAP client logged in as "user" And there is IMAP client selected in "INBOX" @@ -108,12 +108,22 @@ Feature: IMAP fetch messages And IMAP response has 10 messages # This test is wrong! RFC says it should return "BAD" (GODT-1153). - Scenario: Fetch of empty mailbox + Scenario Outline: Fetch range of empty mailbox Given there is IMAP client logged in as "user" And there is IMAP client selected in "Folders/mbox" - When IMAP client fetches "1:*" + When IMAP client fetches "" Then IMAP response is "OK" And IMAP response has 0 messages + When IMAP client fetches by UID "" + Then IMAP response is "OK" + And IMAP response has 0 messages + + Examples: + | range | + | 1 | + | 1,5,6 | + | 1:* | + | * | Scenario: Fetch of big mailbox Given there are 100 messages in mailbox "Folders/mbox" for "user" @@ -123,7 +133,26 @@ Feature: IMAP fetch messages Then IMAP response is "OK" And IMAP response has 100 messages + Scenario: Fetch of big mailbox by UID + Given there are 100 messages in mailbox "Folders/mbox" for "user" + And there is IMAP client logged in as "user" + And there is IMAP client selected in "Folders/mbox" + When IMAP client fetches by UID "1:*" + Then IMAP response is "OK" + And IMAP response has 100 messages + Scenario: Fetch returns also messages that are marked as deleted + Given there are messages in mailbox "Folders/mbox" for "user" + | from | to | subject | body | read | starred | deleted | + | john.doe@mail.com | user@pm.me | foo | hello | false | false | false | + | jane.doe@mail.com | name@pm.me | bar | world | true | true | true | + And there is IMAP client logged in as "user" + And there is IMAP client selected in "Folders/mbox" + When IMAP client fetches "1:*" + Then IMAP response is "OK" + And IMAP response has 2 message + + Scenario: Fetch by UID returns also messages that are marked as deleted Given there are messages in mailbox "Folders/mbox" for "user" | from | to | subject | body | read | starred | deleted | | john.doe@mail.com | user@pm.me | foo | hello | false | false | false |