fix import runtime patches, call milter.replacebody only once per mail

This commit is contained in:
2021-02-17 18:08:39 +01:00
parent 5a746f5636
commit 0db61ed833
3 changed files with 30 additions and 19 deletions

View File

@@ -22,7 +22,7 @@ __all__ = [
__version__ = "1.1.4" __version__ = "1.1.4"
import _runtime_patches from pymodmilter import _runtime_patches
import Milter import Milter
import logging import logging
@@ -116,13 +116,13 @@ class Rule:
class MilterMessage(MIMEPart): class MilterMessage(MIMEPart):
def replace_header(self, _name, _value, occ=None): def replace_header(self, _name, _value, idx=None):
_name = _name.lower() _name = _name.lower()
counter = 0 counter = 0
for i, (k, v) in zip(range(len(self._headers)), self._headers): for i, (k, v) in zip(range(len(self._headers)), self._headers):
if k.lower() == _name: if k.lower() == _name:
counter += 1 counter += 1
if not occ or counter == occ: if not idx or counter == idx:
self._headers[i] = self.policy.header_store_parse( self._headers[i] = self.policy.header_store_parse(
k, _value) k, _value)
break break
@@ -130,14 +130,14 @@ class MilterMessage(MIMEPart):
else: else:
raise KeyError(_name) raise KeyError(_name)
def remove_header(self, name, occ=None): def remove_header(self, name, idx=None):
name = name.lower() name = name.lower()
newheaders = [] newheaders = []
counter = 0 counter = 0
for k, v in self._headers: for k, v in self._headers:
if k.lower() == name: if k.lower() == name:
counter += 1 counter += 1
if counter != occ: if counter != idx:
newheaders.append((k, v)) newheaders.append((k, v))
else: else:
newheaders.append((k, v)) newheaders.append((k, v))
@@ -163,6 +163,7 @@ class ModifyMilter(Milter.Base):
def set_rules(rules): def set_rules(rules):
ModifyMilter._rules = rules ModifyMilter._rules = rules
@staticmethod
def set_loglevel(level): def set_loglevel(level):
ModifyMilter._loglevel = level ModifyMilter._loglevel = level
@@ -174,13 +175,14 @@ class ModifyMilter(Milter.Base):
self.rules = ModifyMilter._rules.copy() self.rules = ModifyMilter._rules.copy()
self.msg = None self.msg = None
self._replace_body = False
def addheader(self, field, value, idx=-1): def addheader(self, field, value, idx=-1):
value = replace_illegal_chars(Header(s=value).encode()) value = replace_illegal_chars(Header(s=value).encode())
self.logger.debug(f"milter: addheader: {field}: {value}") self.logger.debug(f"milter: addheader: {field}: {value}")
super().addheader(field, value, idx) super().addheader(field, value, idx)
def chgheaer(self, field, value, idx=1): def chgheader(self, field, value, idx=1):
value = replace_illegal_chars(Header(s=value).encode()) value = replace_illegal_chars(Header(s=value).encode())
if value: if value:
self.logger.debug(f"milter: chgheader: {field}[{idx}]: {value}") self.logger.debug(f"milter: chgheader: {field}[{idx}]: {value}")
@@ -211,11 +213,7 @@ class ModifyMilter(Milter.Base):
self.addheader(field, value) self.addheader(field, value)
def replacebody(self): def replacebody(self):
data = self.msg.as_bytes(policy=SMTP) self._replace_body = True
body_pos = data.find(b"\r\n\r\n") + 4
self.logger.debug("milter: replacebody")
super().replacebody(data[body_pos:])
del data
def connect(self, IPname, family, hostaddr): def connect(self, IPname, family, hostaddr):
try: try:
@@ -348,9 +346,20 @@ class ModifyMilter(Milter.Base):
def eom(self): def eom(self):
try: try:
self.msg = self._fp.close() self.msg = self._fp.close()
milter_action = None
for rule in self.rules: for rule in self.rules:
milter_action = rule.execute(self) milter_action = rule.execute(self)
if milter_action is not None:
break
if self._replace_body:
data = self.msg.as_bytes(policy=SMTP)
body_pos = data.find(b"\r\n\r\n") + 4
self.logger.debug("milter: replacebody")
super().replacebody(data[body_pos:])
del data
if milter_action is not None: if milter_action is not None:
if milter_action["action"] == "reject": if milter_action["action"] == "reject":
self.setreply("554", "5.7.0", milter_action["reason"]) self.setreply("554", "5.7.0", milter_action["reason"])

View File

@@ -277,7 +277,7 @@ def replace_links(milter, repl, pretend=False,
if text_content is not None: if text_content is not None:
logger.info("replace links in text body") logger.info("replace links in text body")
content = text_content content = "test content"
text_body.set_content( text_body.set_content(
content.encode(), maintype="text", subtype="plain") content.encode(), maintype="text", subtype="plain")

View File

@@ -260,9 +260,11 @@ def main():
rc = 0 rc = 0
try: try:
Milter.runmilter("pymodmilter", socketname=socket, timeout=30) Milter.runmilter("pymodmilter", socketname=socket, timeout=30)
logger.info("pymodmilter stopped")
except Milter.milter.error as e: except Milter.milter.error as e:
logger.error(e) logger.error(e)
rc = 255 rc = 255
sys.exit(rc) sys.exit(rc)