many fixes for message handling with pythons new email lib

This commit is contained in:
2020-11-12 11:56:20 +01:00
parent d07bb965b3
commit 1f23c0e408
2 changed files with 139 additions and 167 deletions

View File

@@ -13,7 +13,6 @@
#
__all__ = [
"make_header",
"actions",
"conditions",
"run",
@@ -26,7 +25,7 @@ import Milter
import logging
from Milter.utils import parse_addr
from email.message import Message
from email.message import MIMEPart
from email.parser import BytesFeedParser
from email.policy import default as default_policy
@@ -98,18 +97,18 @@ class Rule:
return True
def execute(self, milter, msg, pretend=None):
def execute(self, milter, pretend=None):
"""Execute all actions of this rule."""
if pretend is None:
pretend = self.pretend
for action in self.actions:
milter_action = action.execute(milter, msg, pretend=pretend)
milter_action = action.execute(milter, pretend=pretend)
if milter_action is not None:
return milter_action
class MilterMessage(Message):
class MilterMessage(MIMEPart):
def replace_header(self, _name, _value, occ=None):
_name = _name.lower()
counter = 0
@@ -139,12 +138,6 @@ class MilterMessage(Message):
self._headers = newheaders
def remove_surrogates(string):
return string.encode(
"ascii", errors="surrogateescape").decode(
"ascii", errors="replace")
class ModifyMilter(Milter.Base):
"""ModifyMilter based on Milter.Base to implement milter communication"""
@@ -261,12 +254,11 @@ class ModifyMilter(Milter.Base):
def header(self, field, value):
try:
# feed header line to BytesParser
self._fp.feed(field + b": " + value + b"\r\n")
# remove surrogates
field = field.encode("ascii", errors="surrogateescape")
value = value.encode("ascii", errors="surrogateescape")
# remove surrogates from field and value
field = remove_surrogates(field)
value = remove_surrogates(value)
self._fp.feed(field + b": " + value + b"\r\n")
except Exception as e:
self.logger.exception(
f"an exception occured in header method: {e}")
@@ -297,10 +289,9 @@ class ModifyMilter(Milter.Base):
def eom(self):
try:
msg = self._fp.close()
self.msg = self._fp.close()
for rule in self.rules:
milter_action = rule.execute(self, msg)
milter_action = rule.execute(self)
if milter_action is not None:
if milter_action["action"] == "reject":