mirror of
https://github.com/decke/smtprelay.git
synced 2025-12-25 16:42:28 -07:00
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:
31
config.go
31
config.go
@@ -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
15
main.go
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user