rename config option header to headers

This commit is contained in:
2021-10-08 15:27:15 +02:00
parent acecac14da
commit 8307277718
2 changed files with 40 additions and 27 deletions

View File

@@ -32,7 +32,7 @@ class Conditions:
self.logger = logging.getLogger(cfg["name"]) self.logger = logging.getLogger(cfg["name"])
self.logger.setLevel(cfg.get_loglevel(debug)) self.logger.setLevel(cfg.get_loglevel(debug))
for arg in ("local", "hosts", "envfrom", "envto", "header", "metavar", for arg in ("local", "hosts", "envfrom", "envto", "headers", "metavar",
"var"): "var"):
if arg not in cfg: if arg not in cfg:
setattr(self, arg, None) setattr(self, arg, None)
@@ -51,11 +51,12 @@ class Conditions:
cfg[arg], re.IGNORECASE)) cfg[arg], re.IGNORECASE))
except re.error as e: except re.error as e:
raise RuntimeError(e) raise RuntimeError(e)
elif arg == "header": elif arg == "headers":
try: try:
self.header = re.compile( self.headers = []
cfg["header"], for header in cfg["headers"]:
re.IGNORECASE + re.DOTALL + re.MULTILINE) self.headers.append(re.compile(
header, re.IGNORECASE + re.DOTALL + re.MULTILINE))
except re.error as e: except re.error as e:
raise RuntimeError(e) raise RuntimeError(e)
else: else:
@@ -72,7 +73,7 @@ class Conditions:
def __str__(self): def __str__(self):
cfg = [] cfg = []
for arg in ("local", "hosts", "envfrom", "envto", "header", for arg in ("local", "hosts", "envfrom", "envto", "headers",
"var", "metavar"): "var", "metavar"):
if arg in self.cfg: if arg in self.cfg:
cfg.append(f"{arg}={self.cfg[arg]}") cfg.append(f"{arg}={self.cfg[arg]}")
@@ -133,21 +134,33 @@ class Conditions:
return wl_rcpts return wl_rcpts
def update_msginfo_from_match(self, milter, match):
if self.metavar is None:
return
named_subgroups = match.groupdict(default=None)
for group, value in named_subgroups.items():
if value is None:
continue
name = f"{self.metavar}_{group}"
milter.msginfo["vars"][name] = value
def match(self, milter): def match(self, milter):
logger = CustomLogger( logger = CustomLogger(
self.logger, {"qid": milter.qid, "name": self.cfg["name"]}) self.logger, {"qid": milter.qid, "name": self.cfg["name"]})
if self.envfrom is not None: if self.envfrom is not None:
envfrom = milter.msginfo["mailfrom"] envfrom = milter.msginfo["mailfrom"]
if not self.envfrom.match(envfrom): match = self.envfrom.match(envfrom)
if not match:
logger.debug( logger.debug(
f"ignore envelope-from address {envfrom}, " f"ignore envelope-from address {envfrom}, "
f"envfrom does not match") f"envfrom does not match")
return False return False
logger.debug( logger.debug(
f"envfrom matches for " f"envfrom matches for "
f"envelope-from address {envfrom}") f"envelope-from address {envfrom}")
self.update_msginfo_from_match(milter, match)
if self.envto is not None: if self.envto is not None:
envto = milter.msginfo["rcpts"] envto = milter.msginfo["rcpts"]
@@ -155,7 +168,8 @@ class Conditions:
envto = [envto] envto = [envto]
for to in envto: for to in envto:
if not self.envto.match(to): match = self.envto.match(to)
if not match:
logger.debug( logger.debug(
f"ignore envelope-to address {envto}, " f"ignore envelope-to address {envto}, "
f"envto does not match") f"envto does not match")
@@ -164,29 +178,27 @@ class Conditions:
logger.debug( logger.debug(
f"envto matches for " f"envto matches for "
f"envelope-to address {envto}") f"envelope-to address {envto}")
self.update_msginfo_from_match(milter, match)
if self.header is not None: if self.headers is not None:
match = None headers = self.headers.copy()
for field, value in milter.msg.items(): for field, value in milter.msg.items():
header = f"{field}: {value}" header = f"{field}: {value}"
match = self.header.search(header) for h in headers.copy():
if match: match = h.search(header)
logger.debug( if match:
f"header matches for " logger.debug(
f"header: {header}") f"headers matches for "
if self.metavar is not None: f"header: {header}")
named_subgroups = match.groupdict(default=None) self.update_msginfo_from_match(milter, match)
for group, value in named_subgroups.items(): headers.remove(h)
if value is None: if not headers:
continue break
name = f"{self.metavar}_{group}"
milter.msginfo["vars"][name] = value
break
if not match: if headers:
logger.debug( logger.debug(
"ignore message, " "ignore message, "
"header does not match") "headers does not match")
return False return False
if self.var is not None: if self.var is not None:

View File

@@ -118,7 +118,8 @@ class ConditionsConfig(BaseConfig):
"items": {"type": "string"}}, "items": {"type": "string"}},
"envfrom": {"type": "string"}, "envfrom": {"type": "string"},
"envto": {"type": "string"}, "envto": {"type": "string"},
"header": {"type": "string"}, "headers": {"type": "array",
"items": {"type": "string"}},
"var": {"type": "string"}, "var": {"type": "string"},
"whitelist": {"type": "object"}}} "whitelist": {"type": "object"}}}