From fe357c3c8356f0d003b23dc6d9947b2ec4b0aa7a Mon Sep 17 00:00:00 2001 From: emersion Date: Fri, 11 Jan 2019 18:48:12 +0100 Subject: [PATCH] smtp: add debug upstream --- maddy.go | 2 ++ smtp.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/maddy.go b/maddy.go index f0e2379..2312471 100644 --- a/maddy.go +++ b/maddy.go @@ -22,6 +22,8 @@ var Directives = []string{ "compress", "proxy", "pgp", + "debug", + "auth", } func Start(blocks []caddyfile.ServerBlock) error { diff --git a/smtp.go b/smtp.go index d1d6668..8f629c2 100644 --- a/smtp.go +++ b/smtp.go @@ -3,7 +3,9 @@ package maddy import ( "bytes" "errors" + "fmt" "io" + "os" "strings" "time" @@ -17,12 +19,10 @@ import ( "github.com/emersion/go-smtp/backendutil" "github.com/mholt/caddy/caddyfile" "golang.org/x/crypto/openpgp" - - "fmt" - "os" ) func newSMTPServer(tokens map[string][]caddyfile.Token) (server, error) { + // TODO: disallow both proxy and debug to be specified at the same time var be smtp.Backend if tokens, ok := tokens["proxy"]; ok { var err error @@ -32,6 +32,22 @@ func newSMTPServer(tokens map[string][]caddyfile.Token) (server, error) { } } + if tokens, ok := tokens["debug"]; ok { + var err error + be, err = newSMTPDebug(caddyfile.NewDispenserTokens("", tokens)) + if err != nil { + return nil, err + } + } + + if tokens, ok := tokens["auth"]; ok { + var err error + be, err = newSMTPAuth(caddyfile.NewDispenserTokens("", tokens), be) + if err != nil { + return nil, err + } + } + if tokens, ok := tokens["pgp"]; ok { var err error be, err = newSMTPPGP(caddyfile.NewDispenserTokens("", tokens), be) @@ -73,6 +89,39 @@ func newSMTPProxy(d caddyfile.Dispenser) (smtp.Backend, error) { return nil, nil } +type debugUser struct{} + +func (u debugUser) Send(from string, to []string, r io.Reader) error { + fmt.Println("MAIL FROM:", from) + for _, addr := range to { + fmt.Println("RCPT TO:", addr) + } + io.Copy(os.Stdout, r) + return nil +} + +func (u debugUser) Logout() error { + return nil +} + +type debugBackend struct{} + +func (be debugBackend) Login(username, password string) (smtp.User, error) { + return debugUser{}, nil +} + +func (be debugBackend) AnonymousLogin() (smtp.User, error) { + return debugUser{}, nil +} + +func newSMTPDebug(d caddyfile.Dispenser) (smtp.Backend, error) { + return debugBackend{}, nil +} + +func newSMTPAuth(d caddyfile.Dispenser, be smtp.Backend) (smtp.Backend, error) { + return nil, nil // TODO +} + type keyRing struct { pgppubkey.Source } @@ -107,7 +156,6 @@ func newVerifier(be smtp.Backend) smtp.Backend { // TODO: don't print Authentication-Results on a single line authRes := "Authentication-Results: " + msgauth.Format(identity, results) + "\r\n" - fmt.Println(authRes) r = io.MultiReader(strings.NewReader(authRes), &b) return from, to, r, nil }, @@ -130,7 +178,6 @@ func newRelay(be smtp.Backend) smtp.Backend { // TODO: add comments with TLS information r = io.MultiReader(strings.NewReader(received), r) - io.Copy(os.Stdout, r) return from, to, r, nil }, }