Move compilation of allowed_recipients to ConfigLoad()

This has several benefits:
- Configuration errors are caught at startup rather than upon a connection
- recipientChecker() has less work to do for each connection
This commit is contained in:
Jonathon Reinhart
2021-03-14 12:26:40 -04:00
parent a896ab2847
commit 7c0ba34025
2 changed files with 24 additions and 22 deletions

View File

@@ -28,7 +28,8 @@ var (
allowedNets = []*net.IPNet{} allowedNets = []*net.IPNet{}
allowedSenderStr = 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 allowedSender *regexp.Regexp
allowedRecipients = flag.String("allowed_recipients", "", "Regular expression for valid TO EMail addresses") allowedRecipStr = flag.String("allowed_recipients", "", "Regular expression for valid TO EMail addresses")
allowedRecipients *regexp.Regexp
allowedUsers = flag.String("allowed_users", "", "Path to file with valid users/passwords") allowedUsers = flag.String("allowed_users", "", "Path to file with valid users/passwords")
remoteHost = flag.String("remote_host", "", "Outgoing SMTP server") remoteHost = flag.String("remote_host", "", "Outgoing SMTP server")
remoteUser = flag.String("remote_user", "", "Username for authentication on outgoing SMTP server") remoteUser = flag.String("remote_user", "", "Username for authentication on outgoing SMTP server")
@@ -61,17 +62,25 @@ func setupAllowedNetworks() {
} }
} }
func setupAllowedSender() { func setupAllowedPatterns() {
if (*allowedSenderStr == "") { var err error
return
if (*allowedSenderStr != "") {
allowedSender, err = regexp.Compile(*allowedSenderStr)
if err != nil {
log.WithField("allowed_sender", *allowedSenderStr).
WithError(err).
Fatal("allowed_sender pattern invalid")
}
} }
var err error if (*allowedRecipStr != "") {
allowedSender, err = regexp.Compile(*allowedSenderStr) allowedRecipients, err = regexp.Compile(*allowedRecipStr)
if err != nil { if err != nil {
log.WithField("allowed_sender", *allowedSenderStr). log.WithField("allowed_recipients", *allowedRecipStr).
WithError(err). WithError(err).
Fatal("allowed_sender pattern invalid") Fatal("allowed_recipients pattern invalid")
}
} }
} }
@@ -86,5 +95,5 @@ func ConfigLoad() {
} }
setupAllowedNetworks() setupAllowedNetworks()
setupAllowedSender() setupAllowedPatterns()
} }

15
main.go
View File

@@ -7,7 +7,6 @@ import (
"net/smtp" "net/smtp"
"net/textproto" "net/textproto"
"os" "os"
"regexp"
"strings" "strings"
"time" "time"
@@ -121,19 +120,13 @@ func senderChecker(peer smtpd.Peer, addr string) error {
} }
func recipientChecker(peer smtpd.Peer, addr string) error { func recipientChecker(peer smtpd.Peer, addr string) error {
if *allowedRecipients == "" { if allowedRecipients == nil {
// Any recipient is permitted
return nil return nil
} }
re, err := regexp.Compile(*allowedRecipients) if allowedRecipients.MatchString(addr) {
if err != nil { // Permitted by regex
log.WithFields(logrus.Fields{
"allowed_recipients": *allowedRecipients,
}).WithError(err).Warn("allowed_recipients pattern invalid")
return smtpd.Error{Code: 451, Message: "Bad recipient address"}
}
if re.MatchString(addr) {
return nil return nil
} }