GODT-1777: Message de-duplication in SMTP

This commit is contained in:
James Houlahan
2022-10-20 12:10:59 +02:00
parent 8e34b51c77
commit c9808d07df
7 changed files with 732 additions and 2 deletions

View File

@ -0,0 +1,58 @@
Feature: SMTP sending the same message twice
Background:
Given there exists an account with username "user@pm.me" and password "password"
And there exists an account with username "bridgetest@protonmail.com" and password "password"
And bridge starts
And the user logs in with username "user@pm.me" and password "password"
And the user logs in with username "bridgetest@protonmail.com" and password "password"
And user "user@pm.me" connects and authenticates SMTP client "1"
And SMTP client "1" sends the following message from "user@pm.me" to "bridgetest@protonmail.com":
"""
From: Bridge Test <user@pm.me>
To: Internal Bridge <bridgetest@protonmail.com>
Subject: Hello
World
"""
And it succeeds
Scenario: The exact same message is not sent twice
When SMTP client "1" sends the following message from "user@pm.me" to "bridgetest@protonmail.com":
"""
From: Bridge Test <user@pm.me>
To: Internal Bridge <bridgetest@protonmail.com>
Subject: Hello
World
"""
Then it succeeds
When user "user@pm.me" connects and authenticates IMAP client "1"
Then IMAP client "1" eventually sees the following messages in "Sent":
| from | to | subject | body |
| user@pm.me | bridgetest@protonmail.com | Hello | World |
When user "bridgetest@protonmail.com" connects and authenticates IMAP client "2"
Then IMAP client "2" eventually sees the following messages in "Inbox":
| from | to | subject | body |
| user@pm.me | bridgetest@protonmail.com | Hello | World |
Scenario: Slight change means different message and is sent twice
When SMTP client "1" sends the following message from "user@pm.me" to "bridgetest@protonmail.com":
"""
From: Bridge Test <user@pm.me>
To: Internal Bridge <bridgetest@protonmail.com>
Subject: Hello.
World
"""
Then it succeeds
When user "user@pm.me" connects and authenticates IMAP client "1"
Then IMAP client "1" eventually sees the following messages in "Sent":
| from | to | subject | body |
| user@pm.me | bridgetest@protonmail.com | Hello | World |
| user@pm.me | bridgetest@protonmail.com | Hello. | World |
When user "bridgetest@protonmail.com" connects and authenticates IMAP client "2"
Then IMAP client "2" eventually sees the following messages in "Inbox":
| from | to | subject | body |
| user@pm.me | bridgetest@protonmail.com | Hello | World |
| user@pm.me | bridgetest@protonmail.com | Hello. | World |

View File

@ -0,0 +1,48 @@
Feature: SMTP sending with APPENDing to Sent
Background:
Given there exists an account with username "user@pm.me" and password "password"
And there exists an account with username "bridgetest@protonmail.com" and password "password"
And bridge starts
And the user logs in with username "user@pm.me" and password "password"
And user "user@pm.me" connects and authenticates SMTP client "1"
And user "user@pm.me" connects and authenticates IMAP client "1"
Scenario: Send message and append to Sent
# First do sending.
When SMTP client "1" sends the following message from "user@pm.me" to "bridgetest@protonmail.com":
"""
To: Internal Bridge <bridgetest@protonmail.com>
Subject: Manual send and append
Message-ID: bridgemessage42
hello
"""
Then it succeeds
And the body in the "POST" request to "/mail/v4/messages" is:
"""
{
"Message": {
"Subject": "Manual send and append",
"ExternalID": "bridgemessage42"
}
}
"""
And IMAP client "1" eventually sees the following messages in "Sent":
| to | subject | body | message-id |
| bridgetest@protonmail.com | Manual send and append | hello | <bridgemessage42> |
# Then simulate manual append to Sent mailbox - message should be detected as a duplicate.
When IMAP client "1" appends the following message to "Sent":
"""
To: Internal Bridge <bridgetest@protonmail.com>
Subject: Manual send and append
Message-ID: bridgemessage42
hello
"""
Then it succeeds
And IMAP client "1" eventually sees the following messages in "Sent":
| to | subject | body | message-id |
| bridgetest@protonmail.com | Manual send and append | hello | <bridgemessage42> |

View File

@ -36,6 +36,7 @@ type Message struct {
Subject string `bdd:"subject"`
Body string `bdd:"body"`
Attachments string `bdd:"attachments"`
MessageID string `bdd:"message-id"`
From string `bdd:"from"`
To string `bdd:"to"`
@ -96,6 +97,7 @@ func newMessageFromIMAP(msg *imap.Message) Message {
Subject: msg.Envelope.Subject,
Body: body,
Attachments: strings.Join(xslices.Map(m.Attachments, func(att message.Attachment) string { return att.Name }), ", "),
MessageID: msg.Envelope.MessageId,
Unread: !slices.Contains(msg.Flags, imap.SeenFlag),
}