From c2e1d58b901fe4292a91429d94f24bf47ccb3759 Mon Sep 17 00:00:00 2001 From: James Hillyerd Date: Mon, 2 Apr 2018 19:43:05 -0700 Subject: [PATCH] policy: Accept Root config instead of SMTP for #33 --- cmd/inbucket/main.go | 2 +- pkg/policy/address.go | 14 +++++++++----- pkg/policy/address_test.go | 32 +++++++++++++++++++------------ pkg/server/smtp/handler_test.go | 34 ++++++++++++++++----------------- 4 files changed, 46 insertions(+), 36 deletions(-) diff --git a/cmd/inbucket/main.go b/cmd/inbucket/main.go index ba5f236..bb81c81 100644 --- a/cmd/inbucket/main.go +++ b/cmd/inbucket/main.go @@ -118,7 +118,7 @@ func main() { startupLog.Fatal().Err(err).Str("module", "storage").Msg("Fatal storage error") } msgHub := msghub.New(rootCtx, conf.Web.MonitorHistory) - addrPolicy := &policy.Addressing{Config: conf.SMTP} + addrPolicy := &policy.Addressing{Config: conf} mmanager := &message.StoreManager{Store: store, Hub: msgHub} // Start Retention scanner. retentionScanner := storage.NewRetentionScanner(conf.Storage, store, shutdownChan) diff --git a/pkg/policy/address.go b/pkg/policy/address.go index f8cded9..25cee9e 100644 --- a/pkg/policy/address.go +++ b/pkg/policy/address.go @@ -12,7 +12,7 @@ import ( // Addressing handles email address policy. type Addressing struct { - Config config.SMTP + Config *config.Root } // NewRecipient parses an address into a Recipient. @@ -41,10 +41,12 @@ func (a *Addressing) NewRecipient(address string) (*Recipient, error) { // ShouldAcceptDomain indicates if Inbucket accepts mail destined for the specified domain. func (a *Addressing) ShouldAcceptDomain(domain string) bool { domain = strings.ToLower(domain) - if a.Config.DefaultAccept && !stringutil.SliceContains(a.Config.RejectDomains, domain) { + if a.Config.SMTP.DefaultAccept && + !stringutil.SliceContains(a.Config.SMTP.RejectDomains, domain) { return true } - if !a.Config.DefaultAccept && stringutil.SliceContains(a.Config.AcceptDomains, domain) { + if !a.Config.SMTP.DefaultAccept && + stringutil.SliceContains(a.Config.SMTP.AcceptDomains, domain) { return true } return false @@ -53,10 +55,12 @@ func (a *Addressing) ShouldAcceptDomain(domain string) bool { // ShouldStoreDomain indicates if Inbucket stores mail destined for the specified domain. func (a *Addressing) ShouldStoreDomain(domain string) bool { domain = strings.ToLower(domain) - if a.Config.DefaultStore && !stringutil.SliceContains(a.Config.DiscardDomains, domain) { + if a.Config.SMTP.DefaultStore && + !stringutil.SliceContains(a.Config.SMTP.DiscardDomains, domain) { return true } - if !a.Config.DefaultStore && stringutil.SliceContains(a.Config.StoreDomains, domain) { + if !a.Config.SMTP.DefaultStore && + stringutil.SliceContains(a.Config.SMTP.StoreDomains, domain) { return true } return false diff --git a/pkg/policy/address_test.go b/pkg/policy/address_test.go index 4410f11..56ae27f 100644 --- a/pkg/policy/address_test.go +++ b/pkg/policy/address_test.go @@ -11,9 +11,11 @@ import ( func TestShouldAcceptDomain(t *testing.T) { // Test with default accept. ap := &policy.Addressing{ - Config: config.SMTP{ - DefaultAccept: true, - RejectDomains: []string{"a.deny.com", "deny.com"}, + Config: &config.Root{ + SMTP: config.SMTP{ + DefaultAccept: true, + RejectDomains: []string{"a.deny.com", "deny.com"}, + }, }, } testCases := []struct { @@ -36,9 +38,11 @@ func TestShouldAcceptDomain(t *testing.T) { } // Test with default reject. ap = &policy.Addressing{ - Config: config.SMTP{ - DefaultAccept: false, - AcceptDomains: []string{"a.allow.com", "allow.com"}, + Config: &config.Root{ + SMTP: config.SMTP{ + DefaultAccept: false, + AcceptDomains: []string{"a.allow.com", "allow.com"}, + }, }, } testCases = []struct { @@ -64,9 +68,11 @@ func TestShouldAcceptDomain(t *testing.T) { func TestShouldStoreDomain(t *testing.T) { // Test with storage enabled. ap := &policy.Addressing{ - Config: config.SMTP{ - DefaultStore: false, - StoreDomains: []string{"store.com", "a.store.com"}, + Config: &config.Root{ + SMTP: config.SMTP{ + DefaultStore: false, + StoreDomains: []string{"store.com", "a.store.com"}, + }, }, } testCases := []struct { @@ -89,9 +95,11 @@ func TestShouldStoreDomain(t *testing.T) { } // Test with storage disabled. ap = &policy.Addressing{ - Config: config.SMTP{ - DefaultStore: true, - DiscardDomains: []string{"discard.com", "a.discard.com"}, + Config: &config.Root{ + SMTP: config.SMTP{ + DefaultStore: true, + DiscardDomains: []string{"discard.com", "a.discard.com"}, + }, }, } testCases = []struct { diff --git a/pkg/server/smtp/handler_test.go b/pkg/server/smtp/handler_test.go index e4d441a..41abff5 100644 --- a/pkg/server/smtp/handler_test.go +++ b/pkg/server/smtp/handler_test.go @@ -361,41 +361,39 @@ func (m *mockConn) SetReadDeadline(t time.Time) error { return nil } func (m *mockConn) SetWriteDeadline(t time.Time) error { return nil } func setupSMTPServer(ds storage.Store) (s *Server, buf *bytes.Buffer, teardown func()) { - // Test Server Config - cfg := config.SMTP{ - Addr: "127.0.0.1:2500", - Domain: "inbucket.local", - MaxRecipients: 5, - MaxMessageBytes: 5000, - DefaultAccept: true, - RejectDomains: []string{"deny.com"}, - Timeout: 5, + cfg := &config.Root{ + SMTP: config.SMTP{ + Addr: "127.0.0.1:2500", + Domain: "inbucket.local", + MaxRecipients: 5, + MaxMessageBytes: 5000, + DefaultAccept: true, + RejectDomains: []string{"deny.com"}, + Timeout: 5, + }, } - - // Capture log output + // Capture log output. buf = new(bytes.Buffer) log.SetOutput(buf) - - // Create a server, don't start it + // Create a server, don't start it. shutdownChan := make(chan bool) teardown = func() { close(shutdownChan) } - apolicy := &policy.Addressing{Config: cfg} + addrPolicy := &policy.Addressing{Config: cfg} manager := &message.StoreManager{Store: ds} - s = NewServer(cfg, shutdownChan, manager, apolicy) + s = NewServer(cfg.SMTP, shutdownChan, manager, addrPolicy) return s, buf, teardown } var sessionNum int func setupSMTPSession(server *Server) net.Conn { - // Pair of pipes to communicate + // Pair of pipes to communicate. serverConn, clientConn := net.Pipe() - // Start the session + // Start the session. server.wg.Add(1) sessionNum++ go server.startSession(sessionNum, &mockConn{serverConn}) - return clientConn }