From 5d82c218ca9a452c0126237c24a5965bb14fd03d Mon Sep 17 00:00:00 2001 From: James Houlahan Date: Wed, 19 May 2021 15:41:45 +0200 Subject: [PATCH 1/2] GODT-1165: Handle UID FETCH with sequence range of empty mailbox --- internal/store/mailbox_ids.go | 15 ++++++++ .../bridge/imap/message/fetch.feature | 35 +++++++++++++++++-- 2 files changed, 47 insertions(+), 3 deletions(-) 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 | From 4072205709b7409e5a0fd115dc557c37d220f55b Mon Sep 17 00:00:00 2001 From: Jakub Date: Thu, 20 May 2021 08:18:57 +0200 Subject: [PATCH 2/2] Other: version bump and changelog Bridge James 1.8.2 --- Changelog.md | 6 ++++++ Makefile | 2 +- test/features/bridge/no_internet.feature | 2 ++ 3 files changed, 9 insertions(+), 1 deletion(-) 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/test/features/bridge/no_internet.feature b/test/features/bridge/no_internet.feature index 470856b6..5abb1841 100644 --- a/test/features/bridge/no_internet.feature +++ b/test/features/bridge/no_internet.feature @@ -9,6 +9,7 @@ Feature: Servers are closed when no internet Then IMAP client "i1" is logged out And SMTP client "s1" is logged out Given the internet connection is restored + And 1 second pass And there is IMAP client "i2" logged in as "user" And there is SMTP client "s2" logged in as "user" When IMAP client "i2" gets info of "INBOX" @@ -20,6 +21,7 @@ Feature: Servers are closed when no internet Then IMAP client "i2" is logged out And SMTP client "s2" is logged out Given the internet connection is restored + And 1 second pass And there is IMAP client "i3" logged in as "user" And there is SMTP client "s3" logged in as "user" When IMAP client "i3" gets info of "INBOX"