Improve mail header matching, add runner watcher
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/mail"
|
||||
"net/textproto"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
@@ -155,15 +156,11 @@ func (c *Condition) CheckHeader(header mail.Header, uev userExistanceVerifier) (
|
||||
// Pre-process & simplify header values: parse all addresses,
|
||||
// extract emails and toss away names, we do not need them
|
||||
for name := range header {
|
||||
for i, v := range header[name] {
|
||||
switch name {
|
||||
case "from",
|
||||
"to",
|
||||
"cc",
|
||||
"bcc",
|
||||
"reply-to":
|
||||
switch textproto.CanonicalMIMEHeaderKey(name) {
|
||||
case "From", "To", "Cc", "Bcc", "Reply-To":
|
||||
for i, v := range header[name] {
|
||||
addr, _ := mail.ParseAddress(v)
|
||||
header[name][i] = addr.Address
|
||||
header[name][i] = strings.Trim(addr.Address, "><")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,6 +43,30 @@ func Test_makeMailHeaderChecker(t *testing.T) {
|
||||
tc: Condition{Headers: []HeaderMatcher{{Name: HeaderMatchNameSubject, Match: "SIMPLE"}}},
|
||||
expecting: true,
|
||||
},
|
||||
{
|
||||
name: "check address (brackets)",
|
||||
mh: types.MailMessageHeader{Raw: map[string][]string{"From": []string{"<some@mail.tld>"}}},
|
||||
tc: Condition{Headers: []HeaderMatcher{{Name: HeaderMatchNameFrom, Match: "some@mail.tld"}}},
|
||||
expecting: true,
|
||||
},
|
||||
{
|
||||
name: "check address (bare)",
|
||||
mh: types.MailMessageHeader{Raw: map[string][]string{"From": []string{"some@mail.tld"}}},
|
||||
tc: Condition{Headers: []HeaderMatcher{{Name: HeaderMatchNameFrom, Match: "some@mail.tld"}}},
|
||||
expecting: true,
|
||||
},
|
||||
{
|
||||
name: "check address (full, quoted)",
|
||||
mh: types.MailMessageHeader{Raw: map[string][]string{"From": []string{`"John Doe" <some@mail.tld>`}}},
|
||||
tc: Condition{Headers: []HeaderMatcher{{Name: HeaderMatchNameFrom, Match: "some@mail.tld"}}},
|
||||
expecting: true,
|
||||
},
|
||||
{
|
||||
name: "check address (full)",
|
||||
mh: types.MailMessageHeader{Raw: map[string][]string{"From": []string{`John Doe <some@mail.tld>`}}},
|
||||
tc: Condition{Headers: []HeaderMatcher{{Name: HeaderMatchNameFrom, Match: "some@mail.tld"}}},
|
||||
expecting: true,
|
||||
},
|
||||
{
|
||||
name: "two matchers, one matches",
|
||||
mh: types.MailMessageHeader{Raw: map[string][]string{"Subject": []string{"SIMPLE"}}},
|
||||
|
||||
@@ -118,7 +118,7 @@ func (svc automationRunner) makeMailScriptRunner(ctx context.Context, mail *type
|
||||
MailMessage: proto.NewMailMessage(mail),
|
||||
}
|
||||
|
||||
svc.logger.Debug("executing script", zap.Any("mail", mail))
|
||||
svc.logger.Debug("preparing mail script runner", zap.Any("mail", mail))
|
||||
|
||||
return func(script *automation.Script) error {
|
||||
if svc.runner == nil {
|
||||
|
||||
@@ -143,5 +143,9 @@ func Init(ctx context.Context, log *zap.Logger, c Config) (err error) {
|
||||
}
|
||||
|
||||
func Watchers(ctx context.Context) {
|
||||
// Reloading automation scripts on change
|
||||
DefaultAutomationRunner.Watch(ctx)
|
||||
|
||||
// Reloading permissions on change
|
||||
DefaultPermissions.Watch(ctx)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user