Skip to content

Commit

Permalink
cmd/dkim-milter: add support for wildcards
Browse files Browse the repository at this point in the history
Domains can now be matched with wildcards (e.g. "*.example.org").

Note that for now, "*.example.org" matches "a.b.c.example.org". In other
words, the wildcard can cross "." boundaries.
  • Loading branch information
emersion committed Nov 23, 2020
1 parent 54d908f commit 2c5cc09
Showing 1 changed file with 16 additions and 5 deletions.
21 changes: 16 additions & 5 deletions cmd/dkim-milter/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"net/textproto"
"os"
"os/signal"
"path"
"strings"
"syscall"

Expand Down Expand Up @@ -60,7 +61,7 @@ var signHeaderKeys = []string{
const maxVerifications = 5

func init() {
flag.Var(&signDomains, "d", "Domain(s) whose mail should be signed")
flag.Var(&signDomains, "d", "Domain(s) whose mail should be signed (matched using path.Match)")
flag.StringVar(&identity, "i", "", "Server identity (defaults to hostname)")
flag.StringVar(&listenURI, "l", "unix:///tmp/dkim-milter.sock", "Listen URI")
flag.StringVar(&privateKeyPath, "k", "", "Private key (PEM-formatted)")
Expand Down Expand Up @@ -127,12 +128,15 @@ func (s *session) Header(name string, value string, m *milter.Modifier) (milter.
if strings.EqualFold(name, "From") || strings.EqualFold(name, "Sender") {
domain, err := parseAddressDomain(value)
if err != nil {
return nil, fmt.Errorf("dkim-milter: failed to parse header field '%v': %v", name, err)
return nil, fmt.Errorf("dkim-milter: failed to parse header field %q: %v", name, err)
}
domain = strings.ToLower(domain)

for _, d := range signDomains {
if strings.EqualFold(d, domain) {
s.signDomain = d
for _, pattern := range signDomains {
if ok, err := path.Match(pattern, domain); err != nil {
return nil, fmt.Errorf("dkim-milter: failed to match domain %q: %v", domain, err)
} else if ok {
s.signDomain = domain
break
}
}
Expand Down Expand Up @@ -378,6 +382,13 @@ func main() {
log.Fatal("Domain(s) (-d) and private key (-k) must be both specified")
}

for i, pattern := range signDomains {
if _, err := path.Match(pattern, ""); err != nil {
log.Fatalf("Malformed domain pattern %q: %v", pattern, err)
}
signDomains[i] = strings.ToLower(pattern)
}

if privateKeyPath != "" {
var err error
privateKey, err = loadPrivateKey(privateKeyPath)
Expand Down

0 comments on commit 2c5cc09

Please sign in to comment.