rename config option header to headers
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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"}}}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user