diff --git a/cmd/inbucket/main.go b/cmd/inbucket/main.go index 0183998..a54a8d8 100644 --- a/cmd/inbucket/main.go +++ b/cmd/inbucket/main.go @@ -49,18 +49,18 @@ func init() { func main() { // Command line flags. - help := flag.Bool("help", false, "Displays this help") - pidfile := flag.String("pidfile", "", "Write our PID into the specified file") - logfile := flag.String("logfile", "stderr", "Write out log into the specified file") + help := flag.Bool("help", false, "Displays help on flags and env variables.") + pidfile := flag.String("pidfile", "", "Write our PID into the specified file.") + logfile := flag.String("logfile", "stderr", "Write out log into the specified file.") flag.Usage = func() { fmt.Fprintln(os.Stderr, "Usage: inbucket [options]") flag.PrintDefaults() - fmt.Fprintln(os.Stderr, "") - config.Usage() } flag.Parse() if *help { flag.Usage() + fmt.Fprintln(os.Stderr, "") + config.Usage() return } // Process configuration. diff --git a/pkg/config/config.go b/pkg/config/config.go index 11ef51e..d6b4b68 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -11,11 +11,11 @@ import ( const ( prefix = "inbucket" - tableFormat = `Inbucket is configured via the environment. The following environment -variables can be used: + tableFormat = `Inbucket is configured via the environment. The following environment variables +can be used: -KEY DEFAULT REQUIRED DESCRIPTION -{{range .}}{{usage_key .}} {{usage_default .}} {{usage_required .}} {{usage_description .}} +KEY DEFAULT DESCRIPTION +{{range .}}{{usage_key .}} {{usage_default .}} {{usage_description .}} {{end}}` ) @@ -42,16 +42,16 @@ type SMTP struct { Domain string `required:"true" default:"inbucket" desc:"HELO domain"` DomainNoStore string `desc:"Load testing domain"` MaxRecipients int `required:"true" default:"200" desc:"Maximum RCPT TO per message"` - MaxIdle time.Duration `required:"true" default:"300s" desc:"Idle network timeout"` MaxMessageBytes int `required:"true" default:"2048000" desc:"Maximum message size"` StoreMessages bool `required:"true" default:"true" desc:"Store incoming mail?"` + Timeout time.Duration `required:"true" default:"300s" desc:"Idle network timeout"` } // POP3 contains the POP3 server configuration. type POP3 struct { Addr string `required:"true" default:"0.0.0.0:1100" desc:"POP3 server IP4 host:port"` Domain string `required:"true" default:"inbucket" desc:"HELLO domain"` - MaxIdle time.Duration `required:"true" default:"600s" desc:"Idle network timeout"` + Timeout time.Duration `required:"true" default:"600s" desc:"Idle network timeout"` } // Web contains the HTTP server configuration. diff --git a/pkg/server/pop3/handler.go b/pkg/server/pop3/handler.go index 00334fa..72d4355 100644 --- a/pkg/server/pop3/handler.go +++ b/pkg/server/pop3/handler.go @@ -496,7 +496,7 @@ func (ses *Session) sendMessageTop(msg storage.Message, lineCount int) { // Load the users mailbox func (ses *Session) loadMailbox() { - m, err := ses.server.dataStore.GetMessages(ses.user) + m, err := ses.server.store.GetMessages(ses.user) if err != nil { ses.logError("Failed to load messages for %v: %v", ses.user, err) } @@ -522,7 +522,7 @@ func (ses *Session) processDeletes() { for i, msg := range ses.messages { if !ses.retain[i] { ses.logTrace("Deleting %v", msg) - if err := ses.server.dataStore.RemoveMessage(ses.user, msg.ID()); err != nil { + if err := ses.server.store.RemoveMessage(ses.user, msg.ID()); err != nil { ses.logWarn("Error deleting %v: %v", msg, err) } } @@ -536,7 +536,7 @@ func (ses *Session) enterState(state State) { // Calculate the next read or write deadline based on maxIdleSeconds func (ses *Session) nextDeadline() time.Time { - return time.Now().Add(ses.server.maxIdle) + return time.Now().Add(ses.server.timeout) } // Send requested message, store errors in Session.sendError diff --git a/pkg/server/pop3/listener.go b/pkg/server/pop3/listener.go index ee6d2da..2db2d00 100644 --- a/pkg/server/pop3/listener.go +++ b/pkg/server/pop3/listener.go @@ -15,20 +15,20 @@ import ( type Server struct { host string domain string - maxIdle time.Duration - dataStore storage.Store + timeout time.Duration + store storage.Store listener net.Listener globalShutdown chan bool waitgroup *sync.WaitGroup } // New creates a new Server struct -func New(cfg config.POP3, shutdownChan chan bool, ds storage.Store) *Server { +func New(cfg config.POP3, shutdownChan chan bool, store storage.Store) *Server { return &Server{ host: cfg.Addr, domain: cfg.Domain, - dataStore: ds, - maxIdle: cfg.MaxIdle, + store: store, + timeout: cfg.Timeout, globalShutdown: shutdownChan, waitgroup: new(sync.WaitGroup), } diff --git a/pkg/server/smtp/handler.go b/pkg/server/smtp/handler.go index 12338b2..634c56b 100644 --- a/pkg/server/smtp/handler.go +++ b/pkg/server/smtp/handler.go @@ -414,7 +414,7 @@ func (ss *Session) greet() { // Calculate the next read or write deadline based on maxIdle func (ss *Session) nextDeadline() time.Time { - return time.Now().Add(ss.server.maxIdle) + return time.Now().Add(ss.server.timeout) } // Send requested message, store errors in Session.sendError diff --git a/pkg/server/smtp/handler_test.go b/pkg/server/smtp/handler_test.go index e047230..27fa663 100644 --- a/pkg/server/smtp/handler_test.go +++ b/pkg/server/smtp/handler_test.go @@ -366,7 +366,7 @@ func setupSMTPServer(ds storage.Store) (s *Server, buf *bytes.Buffer, teardown f Domain: "inbucket.local", DomainNoStore: "bitbucket.local", MaxRecipients: 5, - MaxIdle: 5, + Timeout: 5, MaxMessageBytes: 5000, StoreMessages: true, } diff --git a/pkg/server/smtp/listener.go b/pkg/server/smtp/listener.go index e56ac93..339e32e 100644 --- a/pkg/server/smtp/listener.go +++ b/pkg/server/smtp/listener.go @@ -42,9 +42,9 @@ type Server struct { domain string domainNoStore string maxRecips int - maxIdle time.Duration maxMessageBytes int storeMessages bool + timeout time.Duration // Dependencies apolicy *policy.Addressing // Address policy. @@ -89,7 +89,7 @@ func NewServer( domain: cfg.Domain, domainNoStore: strings.ToLower(cfg.DomainNoStore), maxRecips: cfg.MaxRecipients, - maxIdle: cfg.MaxIdle, + timeout: cfg.Timeout, maxMessageBytes: cfg.MaxMessageBytes, storeMessages: cfg.StoreMessages, globalShutdown: globalShutdown,