fix import runtime patches, call milter.replacebody only once per mail
This commit is contained in:
@@ -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,19 +346,30 @@ 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:
|
if milter_action is not None:
|
||||||
if milter_action["action"] == "reject":
|
break
|
||||||
self.setreply("554", "5.7.0", milter_action["reason"])
|
|
||||||
return Milter.REJECT
|
|
||||||
|
|
||||||
if milter_action["action"] == "accept":
|
if self._replace_body:
|
||||||
return Milter.ACCEPT
|
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["action"] == "discard":
|
if milter_action is not None:
|
||||||
return Milter.DISCARD
|
if milter_action["action"] == "reject":
|
||||||
|
self.setreply("554", "5.7.0", milter_action["reason"])
|
||||||
|
return Milter.REJECT
|
||||||
|
|
||||||
|
if milter_action["action"] == "accept":
|
||||||
|
return Milter.ACCEPT
|
||||||
|
|
||||||
|
if milter_action["action"] == "discard":
|
||||||
|
return Milter.DISCARD
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.exception(
|
self.logger.exception(
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user