diff --git a/cmd/root.go b/cmd/root.go index 9411243..b5b0443 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -83,21 +83,27 @@ func init() { initConfigFromEnv() rootCmd.Flags().StringVarP(&config.DataFile, "db-file", "d", config.DataFile, "Database file to store persistent data") - rootCmd.Flags().StringVarP(&config.SMTPListen, "smtp", "s", config.SMTPListen, "SMTP bind interface and port") - rootCmd.Flags().StringVarP(&config.HTTPListen, "listen", "l", config.HTTPListen, "HTTP bind interface and port for UI") rootCmd.Flags().IntVarP(&config.MaxMessages, "max", "m", config.MaxMessages, "Max number of messages to store") - rootCmd.Flags().StringVar(&config.Webroot, "webroot", config.Webroot, "Set the webroot for web UI & API") - rootCmd.Flags().StringVar(&server.AccessControlAllowOrigin, "api-cors", server.AccessControlAllowOrigin, "Set API CORS Access-Control-Allow-Origin header") rootCmd.Flags().BoolVar(&config.UseMessageDates, "use-message-dates", config.UseMessageDates, "Use message dates as the received dates") rootCmd.Flags().BoolVar(&config.IgnoreDuplicateIDs, "ignore-duplicate-ids", config.IgnoreDuplicateIDs, "Ignore duplicate messages (by Message-Id)") - rootCmd.Flags().BoolVar(&config.DisableHTMLCheck, "disable-html-check", config.DisableHTMLCheck, "Disable the HTML check functionality (web UI & API)") - rootCmd.Flags().BoolVar(&config.BlockRemoteCSSAndFonts, "block-remote-css-and-fonts", config.BlockRemoteCSSAndFonts, "Block access to remote CSS & fonts") - rootCmd.Flags().StringVar(&config.EnableSpamAssassin, "enable-spamassassin", config.EnableSpamAssassin, "Enable integration with SpamAssassin") + rootCmd.Flags().StringVar(&logger.LogFile, "log-file", logger.LogFile, "Log output to file instead of stdout") + rootCmd.Flags().BoolVarP(&logger.QuietLogging, "quiet", "q", logger.QuietLogging, "Quiet logging (errors only)") + rootCmd.Flags().BoolVarP(&logger.VerboseLogging, "verbose", "v", logger.VerboseLogging, "Verbose logging") + // Web UI / API + rootCmd.Flags().StringVarP(&config.HTTPListen, "listen", "l", config.HTTPListen, "HTTP bind interface and port for UI") + rootCmd.Flags().StringVar(&config.Webroot, "webroot", config.Webroot, "Set the webroot for web UI & API") rootCmd.Flags().StringVar(&config.UIAuthFile, "ui-auth-file", config.UIAuthFile, "A password file for web UI & API authentication") rootCmd.Flags().StringVar(&config.UITLSCert, "ui-tls-cert", config.UITLSCert, "TLS certificate for web UI (HTTPS) - requires ui-tls-key") rootCmd.Flags().StringVar(&config.UITLSKey, "ui-tls-key", config.UITLSKey, "TLS key for web UI (HTTPS) - requires ui-tls-cert") + rootCmd.Flags().StringVar(&server.AccessControlAllowOrigin, "api-cors", server.AccessControlAllowOrigin, "Set API CORS Access-Control-Allow-Origin header") + rootCmd.Flags().BoolVar(&config.DisableHTMLCheck, "disable-html-check", config.DisableHTMLCheck, "Disable the HTML check functionality (web UI & API)") + rootCmd.Flags().BoolVar(&config.BlockRemoteCSSAndFonts, "block-remote-css-and-fonts", config.BlockRemoteCSSAndFonts, "Block access to remote CSS & fonts") + rootCmd.Flags().StringVar(&config.EnableSpamAssassin, "enable-spamassassin", config.EnableSpamAssassin, "Enable integration with SpamAssassin") + rootCmd.Flags().BoolVar(&config.AllowUntrustedTLS, "allow-untrusted-tls", config.AllowUntrustedTLS, "Do not verify HTTPS certificates (link checker & screenshots)") + // SMTP server + rootCmd.Flags().StringVarP(&config.SMTPListen, "smtp", "s", config.SMTPListen, "SMTP bind interface and port") rootCmd.Flags().StringVar(&config.SMTPAuthFile, "smtp-auth-file", config.SMTPAuthFile, "A password file for SMTP authentication") rootCmd.Flags().BoolVar(&config.SMTPAuthAcceptAny, "smtp-auth-accept-any", config.SMTPAuthAcceptAny, "Accept any SMTP username and password, including none") rootCmd.Flags().StringVar(&config.SMTPTLSCert, "smtp-tls-cert", config.SMTPTLSCert, "TLS certificate for SMTP (STARTTLS) - requires smtp-tls-key") @@ -109,26 +115,25 @@ func init() { rootCmd.Flags().StringVar(&config.SMTPAllowedRecipients, "smtp-allowed-recipients", config.SMTPAllowedRecipients, "Only allow SMTP recipients matching a regular expression (default allow all)") rootCmd.Flags().BoolVar(&smtpd.DisableReverseDNS, "smtp-disable-rdns", smtpd.DisableReverseDNS, "Disable SMTP reverse DNS lookups") + // SMTP relay rootCmd.Flags().StringVar(&config.SMTPRelayConfigFile, "smtp-relay-config", config.SMTPRelayConfigFile, "SMTP configuration file to allow releasing messages") rootCmd.Flags().BoolVar(&config.SMTPRelayAllIncoming, "smtp-relay-all", config.SMTPRelayAllIncoming, "Relay all incoming messages via external SMTP server (caution!)") + // POP3 server rootCmd.Flags().StringVar(&config.POP3Listen, "pop3", config.POP3Listen, "POP3 server bind interface and port") rootCmd.Flags().StringVar(&config.POP3AuthFile, "pop3-auth-file", config.POP3AuthFile, "A password file for POP3 server authentication (enables POP3 server)") rootCmd.Flags().StringVar(&config.POP3TLSCert, "pop3-tls-cert", config.POP3TLSCert, "Optional TLS certificate for POP3 server - requires pop3-tls-key") rootCmd.Flags().StringVar(&config.POP3TLSKey, "pop3-tls-key", config.POP3TLSKey, "Optional TLS key for POP3 server - requires pop3-tls-cert") + // Tagging + rootCmd.Flags().StringVarP(&config.SMTPCLITags, "tag", "t", config.SMTPCLITags, "Tag new messages matching filters") + rootCmd.Flags().BoolVar(&tools.TagsTitleCase, "tags-title-case", tools.TagsTitleCase, "Convert new tags automatically to TitleCase") + + // Webhook rootCmd.Flags().StringVar(&config.WebhookURL, "webhook-url", config.WebhookURL, "Send a webhook request for new messages") rootCmd.Flags().IntVar(&webhook.RateLimit, "webhook-limit", webhook.RateLimit, "Limit webhook requests per second") - rootCmd.Flags().BoolVar(&config.AllowUntrustedTLS, "allow-untrusted-tls", config.AllowUntrustedTLS, "Do not verify HTTPS certificates (link checker & screenshots)") - - rootCmd.Flags().StringVarP(&config.SMTPCLITags, "tag", "t", config.SMTPCLITags, "Tag new messages matching filters") - rootCmd.Flags().BoolVar(&tools.TagsTitleCase, "tags-title-case", tools.TagsTitleCase, "Convert new tags automatically to TitleCase") - rootCmd.Flags().StringVar(&logger.LogFile, "log-file", logger.LogFile, "Log output to file instead of stdout") - rootCmd.Flags().BoolVarP(&logger.QuietLogging, "quiet", "q", logger.QuietLogging, "Quiet logging (errors only)") - rootCmd.Flags().BoolVarP(&logger.VerboseLogging, "verbose", "v", logger.VerboseLogging, "Verbose logging") - - // deprecated flags 2023/03/12 + // DEPRECATED FLAGS 2023/03/12 rootCmd.Flags().StringVar(&config.UITLSCert, "ui-ssl-cert", config.UITLSCert, "SSL certificate for web UI - requires ui-ssl-key") rootCmd.Flags().StringVar(&config.UITLSKey, "ui-ssl-key", config.UITLSKey, "SSL key for web UI - requires ui-ssl-cert") rootCmd.Flags().StringVar(&config.SMTPTLSCert, "smtp-ssl-cert", config.SMTPTLSCert, "SSL certificate for SMTP - requires smtp-ssl-key") @@ -145,39 +150,72 @@ func init() { // Load settings from environment func initConfigFromEnv() { - // inherit from environment if provided + // General config.DataFile = os.Getenv("MP_DATA_FILE") - if len(os.Getenv("MP_SMTP_BIND_ADDR")) > 0 { - config.SMTPListen = os.Getenv("MP_SMTP_BIND_ADDR") - } - if len(os.Getenv("MP_UI_BIND_ADDR")) > 0 { - config.HTTPListen = os.Getenv("MP_UI_BIND_ADDR") - } if len(os.Getenv("MP_MAX_MESSAGES")) > 0 { config.MaxMessages, _ = strconv.Atoi(os.Getenv("MP_MAX_MESSAGES")) } + if getEnabledFromEnv("MP_USE_MESSAGE_DATES") { + config.UseMessageDates = true + } + if getEnabledFromEnv("MP_IGNORE_DUPLICATE_IDS") { + config.IgnoreDuplicateIDs = true + } + if len(os.Getenv("MP_LOG_FILE")) > 0 { + logger.LogFile = os.Getenv("MP_LOG_FILE") + } + if getEnabledFromEnv("MP_QUIET") { + logger.QuietLogging = true + } + if getEnabledFromEnv("MP_VERBOSE") { + logger.VerboseLogging = true + } - // UI + // Web UI & API + if len(os.Getenv("MP_UI_BIND_ADDR")) > 0 { + config.HTTPListen = os.Getenv("MP_UI_BIND_ADDR") + } + if len(os.Getenv("MP_WEBROOT")) > 0 { + config.Webroot = os.Getenv("MP_WEBROOT") + } config.UIAuthFile = os.Getenv("MP_UI_AUTH_FILE") if err := auth.SetUIAuth(os.Getenv("MP_UI_AUTH")); err != nil { logger.Log().Errorf(err.Error()) } config.UITLSCert = os.Getenv("MP_UI_TLS_CERT") config.UITLSKey = os.Getenv("MP_UI_TLS_KEY") + if len(os.Getenv("MP_API_CORS")) > 0 { + server.AccessControlAllowOrigin = os.Getenv("MP_API_CORS") + } + if getEnabledFromEnv("MP_DISABLE_HTML_CHECK") { + config.DisableHTMLCheck = true + } + if getEnabledFromEnv("MP_BLOCK_REMOTE_CSS_AND_FONTS") { + config.BlockRemoteCSSAndFonts = true + } + if len(os.Getenv("MP_ENABLE_SPAMASSASSIN")) > 0 { + config.EnableSpamAssassin = os.Getenv("MP_ENABLE_SPAMASSASSIN") + } + if getEnabledFromEnv("MP_ALLOW_UNTRUSTED_TLS") { + config.AllowUntrustedTLS = true + } - // SMTP + // SMTP server + if len(os.Getenv("MP_SMTP_BIND_ADDR")) > 0 { + config.SMTPListen = os.Getenv("MP_SMTP_BIND_ADDR") + } config.SMTPAuthFile = os.Getenv("MP_SMTP_AUTH_FILE") if err := auth.SetSMTPAuth(os.Getenv("MP_SMTP_AUTH")); err != nil { logger.Log().Errorf(err.Error()) } + if getEnabledFromEnv("MP_SMTP_AUTH_ACCEPT_ANY") { + config.SMTPAuthAcceptAny = true + } config.SMTPTLSCert = os.Getenv("MP_SMTP_TLS_CERT") config.SMTPTLSKey = os.Getenv("MP_SMTP_TLS_KEY") if getEnabledFromEnv("MP_SMTP_TLS_REQUIRED") { config.SMTPTLSRequired = true } - if getEnabledFromEnv("MP_SMTP_AUTH_ACCEPT_ANY") { - config.SMTPAuthAcceptAny = true - } if getEnabledFromEnv("MP_SMTP_AUTH_ALLOW_INSECURE") { config.SMTPAuthAllowInsecure = true } @@ -194,13 +232,13 @@ func initConfigFromEnv() { smtpd.DisableReverseDNS = true } - // Relay server config + // SMTP relay config.SMTPRelayConfigFile = os.Getenv("MP_SMTP_RELAY_CONFIG") if getEnabledFromEnv("MP_SMTP_RELAY_ALL") { config.SMTPRelayAllIncoming = true } - // POP3 + // POP3 server if len(os.Getenv("MP_POP3_BIND_ADDR")) > 0 { config.POP3Listen = os.Getenv("MP_POP3_BIND_ADDR") } @@ -211,53 +249,20 @@ func initConfigFromEnv() { config.POP3TLSCert = os.Getenv("MP_POP3_TLS_CERT") config.POP3TLSKey = os.Getenv("MP_POP3_TLS_KEY") - // Webhook - if len(os.Getenv("MP_WEBHOOK_URL")) > 0 { - config.WebhookURL = os.Getenv("MP_WEBHOOK_URL") - } - if len(os.Getenv("MP_WEBHOOK_LIMIT")) > 0 { - webhook.RateLimit, _ = strconv.Atoi(os.Getenv("MP_WEBHOOK_LIMIT")) - } - - // Misc options - if len(os.Getenv("MP_WEBROOT")) > 0 { - config.Webroot = os.Getenv("MP_WEBROOT") - } - if len(os.Getenv("MP_API_CORS")) > 0 { - server.AccessControlAllowOrigin = os.Getenv("MP_API_CORS") - } - if getEnabledFromEnv("MP_USE_MESSAGE_DATES") { - config.UseMessageDates = true - } - if getEnabledFromEnv("MP_IGNORE_DUPLICATE_IDS") { - config.IgnoreDuplicateIDs = true - } - if getEnabledFromEnv("MP_DISABLE_HTML_CHECK") { - config.DisableHTMLCheck = true - } - if getEnabledFromEnv("MP_BLOCK_REMOTE_CSS_AND_FONTS") { - config.BlockRemoteCSSAndFonts = true - } - if len(os.Getenv("MP_ENABLE_SPAMASSASSIN")) > 0 { - config.EnableSpamAssassin = os.Getenv("MP_ENABLE_SPAMASSASSIN") - } - if getEnabledFromEnv("MP_ALLOW_UNTRUSTED_TLS") { - config.AllowUntrustedTLS = true - } + // Tagging if len(os.Getenv("MP_TAG")) > 0 { config.SMTPCLITags = os.Getenv("MP_TAG") } if getEnabledFromEnv("MP_TAGS_TITLE_CASE") { tools.TagsTitleCase = getEnabledFromEnv("MP_TAGS_TITLE_CASE") } - if len(os.Getenv("MP_LOG_FILE")) > 0 { - logger.LogFile = os.Getenv("MP_LOG_FILE") + + // Webhook + if len(os.Getenv("MP_WEBHOOK_URL")) > 0 { + config.WebhookURL = os.Getenv("MP_WEBHOOK_URL") } - if getEnabledFromEnv("MP_QUIET") { - logger.QuietLogging = true - } - if getEnabledFromEnv("MP_VERBOSE") { - logger.VerboseLogging = true + if len(os.Getenv("MP_WEBHOOK_LIMIT")) > 0 { + webhook.RateLimit, _ = strconv.Atoi(os.Getenv("MP_WEBHOOK_LIMIT")) } }