From a896ab284750e1ae4b86b83dd74afb293cd6a3b4 Mon Sep 17 00:00:00 2001 From: Jonathon Reinhart Date: Sun, 14 Mar 2021 12:20:48 -0400 Subject: [PATCH] Move compilation of allowed_sender to ConfigLoad() This has several benefits: - Configuration errors are caught at startup rather than upon a connection - senderChecker() has less work to do for each connection --- config.go | 19 ++++++++++++++++++- main.go | 16 +++++----------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/config.go b/config.go index 36f32e5..5a29ba5 100644 --- a/config.go +++ b/config.go @@ -3,6 +3,7 @@ package main import ( "flag" "net" + "regexp" "github.com/vharitonsky/iniflags" "github.com/sirupsen/logrus" @@ -25,7 +26,8 @@ var ( localForceTLS = flag.Bool("local_forcetls", false, "Force STARTTLS (needs local_cert and local_key)") allowedNetsStr = flag.String("allowed_nets", "127.0.0.0/8 ::1/128", "Networks allowed to send mails") allowedNets = []*net.IPNet{} - allowedSender = flag.String("allowed_sender", "", "Regular expression for valid FROM EMail addresses") + allowedSenderStr = flag.String("allowed_sender", "", "Regular expression for valid FROM EMail addresses") + allowedSender *regexp.Regexp allowedRecipients = flag.String("allowed_recipients", "", "Regular expression for valid TO EMail addresses") allowedUsers = flag.String("allowed_users", "", "Path to file with valid users/passwords") remoteHost = flag.String("remote_host", "", "Outgoing SMTP server") @@ -59,6 +61,20 @@ func setupAllowedNetworks() { } } +func setupAllowedSender() { + if (*allowedSenderStr == "") { + return + } + + var err error + allowedSender, err = regexp.Compile(*allowedSenderStr) + if err != nil { + log.WithField("allowed_sender", *allowedSenderStr). + WithError(err). + Fatal("allowed_sender pattern invalid") + } +} + func ConfigLoad() { iniflags.Parse() @@ -70,4 +86,5 @@ func ConfigLoad() { } setupAllowedNetworks() + setupAllowedSender() } diff --git a/main.go b/main.go index cbd5993..c0e8b64 100644 --- a/main.go +++ b/main.go @@ -103,26 +103,20 @@ func senderChecker(peer smtpd.Peer, addr string) error { } } - if *allowedSender == "" { + if allowedSender == nil { + // Any sender is permitted return nil } - re, err := regexp.Compile(*allowedSender) - if err != nil { - log.WithFields(logrus.Fields{ - "allowed_sender": *allowedSender, - }).WithError(err).Warn("allowed_sender pattern invalid") - return smtpd.Error{Code: 451, Message: "Bad sender address"} - } - - if re.MatchString(addr) { + if allowedSender.MatchString(addr) { + // Permitted by regex return nil } log.WithFields(logrus.Fields{ "sender_address": addr, "peer": peer.Addr, - }).Warn("Sender address not allowed by allowed_sender pattern") + }).Warn("sender address not allowed by allowed_sender pattern") return smtpd.Error{Code: 451, Message: "Bad sender address"} }