improve logging and some fixes

This commit is contained in:
2021-03-09 19:09:21 +01:00
parent 16ca8cbbf0
commit 1349570b87
6 changed files with 63 additions and 73 deletions

View File

@@ -160,7 +160,7 @@ def _has_content_before_body_tag(soup):
return False
def _patch_message_body(milter, action, text, html, logger):
def _patch_message_body(milter, action, text_template, html_template, logger):
text_body, text_content = _get_body_content(milter.msg, "plain")
html_body, html_content = _get_body_content(milter.msg, "html")
@@ -171,9 +171,9 @@ def _patch_message_body(milter, action, text, html, logger):
logger.info(f"{action} text disclaimer")
if action == "prepend":
content = f"{text}{text_content}"
content = f"{text_template}{text_content}"
else:
content = f"{text_content}{text}"
content = f"{text_content}{text_template}"
text_body.set_content(
content.encode(), maintype="text", subtype="plain")
@@ -192,9 +192,9 @@ def _patch_message_body(milter, action, text, html, logger):
body = soup
if action == "prepend":
body.insert(0, copy(html))
body.insert(0, copy(html_template))
else:
body.append(html)
body.append(html_template)
html_body.set_content(
str(soup).encode(), maintype="text", subtype="html")
@@ -239,26 +239,28 @@ def _inject_body(milter):
milter.msg.attach(attachment)
def add_disclaimer(milter, text, html, action, policy, pretend=False,
logger=logging.getLogger(__name__)):
def add_disclaimer(milter, text_template, html_template, action, error_policy,
pretend=False, logger=logging.getLogger(__name__)):
"""Append or prepend a disclaimer to the mail body."""
old_headers = milter.msg.items()
try:
try:
_patch_message_body(milter, action, text, html, logger)
_patch_message_body(
milter, action, text_template, html_template, logger)
except RuntimeError as e:
logger.info(f"{e}, inject empty plain and html body")
_inject_body(milter)
_patch_message_body(milter, action, text, html, logger)
_patch_message_body(
milter, action, text_template, html_template, logger)
except Exception as e:
logger.warning(e)
if policy == "ignore":
if error_policy == "ignore":
logger.info(
"unable to add disclaimer to message body, "
"ignore error according to policy")
return
elif policy == "reject":
elif error_policy == "reject":
logger.info(
"unable to add disclaimer to message body, "
"reject message according to policy")
@@ -268,7 +270,8 @@ def add_disclaimer(milter, text, html, action, policy, pretend=False,
logger.info("wrap original message in a new message envelope")
try:
_wrap_message(milter, logger)
_patch_message_body(milter, action, text, html, logger)
_patch_message_body(
milter, action, text_template, html_template, logger)
except Exception as e:
logger.error(e)
raise Exception(
@@ -331,6 +334,9 @@ def store(milter, directory, pretend=False,
class ActionConfig(BaseConfig):
def __init__(self, idx, rule_cfg, cfg, debug):
if "name" in cfg:
assert isinstance(cfg["name"], str), \
f"{rule_cfg['name']}: Action #{idx}: name: invalid value, " \
f"should be string"
cfg["name"] = f"{rule_cfg['name']}: {cfg['name']}"
else:
cfg["name"] = f"{rule_cfg['name']}: Action #{idx}"
@@ -353,7 +359,7 @@ class ActionConfig(BaseConfig):
assert "type" in cfg, \
f"{self['name']}: mandatory parameter 'type' not found"
assert isinstance(cfg["type"], str), \
f"{self['name']}: invalid value, should be string"
f"{self['name']}: type: invalid value, should be string"
self["type"] = cfg["type"]
if self["type"] == "add_header":
@@ -437,13 +443,19 @@ class ActionConfig(BaseConfig):
elif self["type"] == "store":
self["func"] = store
self["need_body"] = True
self.add_string_arg(cfg, "storage_type")
assert self["args"]["storage_type"] in ("file"), \
f"{self['name']}: storage_type: invalid value, " \
f"should be 'file'"
if self["args"]["storage_type"] == "file":
assert "storage_type" in cfg, \
f"{self['name']}: mandatory parameter 'storage_type' not found"
assert isinstance(cfg["type"], str), \
f"{self['name']}: storage_type: invalid value, " \
f"should be string"
self["storage_type"] = cfg["storage_type"]
if self["storage_type"] == "file":
self.add_string_arg(cfg, "directory")
else:
raise RuntimeError(
f"{self['name']}: storage_type: invalid storage type")
else:
raise RuntimeError(f"{self['name']}: type: invalid action type")
@@ -464,9 +476,6 @@ class Action:
def __init__(self, milter_cfg, cfg):
self.logger = cfg.logger
#logger = logging.getLogger(cfg["name"])
#self.logger = CustomLogger(logger, {"name": cfg["name"]})
#self.logger.setLevel(cfg["loglevel"])
if cfg["conditions"] is None:
self.conditions = None
@@ -474,30 +483,10 @@ class Action:
self.conditions = Conditions(milter_cfg, cfg["conditions"])
self.pretend = cfg["pretend"]
self._name = cfg["name"]
self._func = cfg["func"]
self._args = cfg["args"]
action_type = cfg["type"]
if action_type == "add_header":
self._func = add_header
self._need_body = False
elif action_type == "mod_header":
self._func = mod_header
self._need_body = False
elif action_type == "del_header":
self._func = del_header
self._need_body = False
elif action_type == "add_disclaimer":
self._func = add_disclaimer
self._need_body = True
elif action_type == "rewrite_links":
self._func = rewrite_links
self._need_body = True
elif action_type == "store":
self._func = store
self._need_body = True
else:
raise ValueError(f"invalid action type: {action_type}")
self._need_body = cfg["need_body"]
def need_body(self):
"""Return the needs of this action."""
@@ -508,7 +497,8 @@ class Action:
if pretend is None:
pretend = self.pretend
logger = CustomLogger(self.logger, {"qid": milter.qid})
logger = CustomLogger(
self.logger, {"name": self._name, "qid": milter.qid})
return self._func(milter=milter, pretend=pretend,
logger=logger, **self._args)