From d2121a52a94d9764325f0b52c40c42841b4825f4 Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Wed, 22 Nov 2023 16:58:14 -0800 Subject: [PATCH] message: Prefer To header for BeforeMessageStored event (#446) Signed-off-by: James Hillyerd --- pkg/message/manager.go | 6 +++-- pkg/message/manager_test.go | 44 +++++++++++++++++++++++++++++++++++-- 2 files changed, 46 insertions(+), 4 deletions(-) diff --git a/pkg/message/manager.go b/pkg/message/manager.go index 25f748b..8388251 100644 --- a/pkg/message/manager.go +++ b/pkg/message/manager.go @@ -76,10 +76,12 @@ func (s *StoreManager) Deliver( // Process inbound message through extensions. mailboxes := make([]string, len(recipients)) - toAddrs := make([]mail.Address, len(recipients)) for i, recip := range recipients { mailboxes[i] = recip.Mailbox - toAddrs[i] = recip.Address + } + toAddrs := make([]mail.Address, len(toaddr)) + for i, addr := range toaddr { + toAddrs[i] = *addr } inbound := &event.InboundMessage{ diff --git a/pkg/message/manager_test.go b/pkg/message/manager_test.go index fcc2178..65d44c7 100644 --- a/pkg/message/manager_test.go +++ b/pkg/message/manager_test.go @@ -106,7 +106,7 @@ func TestDeliverRespectsRecipientPolicy(t *testing.T) { assertMessageCount(t, sm, "u2@example.com", 1) } -func TestDeliverEmitsBeforeMessageStoredEvent(t *testing.T) { +func TestDeliverEmitsBeforeMessageStoredEventToHeader(t *testing.T) { sm, extHost := testStoreManager() // Register function to receive event. @@ -118,7 +118,47 @@ func TestDeliverEmitsBeforeMessageStoredEvent(t *testing.T) { return nil }) - // Deliver a message to trigger event. + // Deliver a message to trigger event, To header differs from RCPT TO. + origin, _ := sm.AddrPolicy.ParseOrigin("from@example.com") + recip1, _ := sm.AddrPolicy.NewRecipient("u1@example.com") + recip2, _ := sm.AddrPolicy.NewRecipient("u2@example.com") + if err := sm.Deliver( + origin, + []*policy.Recipient{recip1, recip2}, + "Received: xyz\n", + []byte(`From: from@example.com +To: u1@example.com, u3@external.com +Subject: tsub + +test email`), + ); err != nil { + t.Fatal(err) + } + + require.NotNil(t, got, "BeforeMessageStored listener did not receive InboundMessage") + assert.Equal(t, []string{"u1@example.com", "u2@example.com"}, got.Mailboxes, "Mailboxes not equal") + assert.Equal(t, mail.Address{Name: "", Address: "from@example.com"}, got.From, "From not equal") + assert.Equal(t, []mail.Address{ + {Name: "", Address: "u1@example.com"}, + {Name: "", Address: "u3@external.com"}, + }, got.To, "To not equal") + assert.Equal(t, "tsub", got.Subject, "Subject not equal") + assert.Equal(t, int64(84), got.Size, "Size not equal") +} + +func TestDeliverEmitsBeforeMessageStoredEventRcptTo(t *testing.T) { + sm, extHost := testStoreManager() + + // Register function to receive event. + var got *event.InboundMessage + extHost.Events.BeforeMessageStored.AddListener( + "test", + func(msg event.InboundMessage) *event.InboundMessage { + got = &msg + return nil + }) + + // Deliver a message to trigger event, lacks To header. origin, _ := sm.AddrPolicy.ParseOrigin("from@example.com") recip1, _ := sm.AddrPolicy.NewRecipient("u1@example.com") recip2, _ := sm.AddrPolicy.NewRecipient("u2@example.com")