Properly encode header values after modify

This commit is contained in:
2020-02-27 23:48:08 +01:00
parent c1ad068197
commit cdc3b72220

View File

@@ -26,6 +26,7 @@ import sys
from Milter.utils import parse_addr
from email.message import EmailMessage
from email.parser import HeaderParser
from email.policy import default as default_policy
from netaddr import IPAddress, IPNetwork, AddrFormatError
@@ -136,11 +137,10 @@ class HeaderRule:
# set an empty value to delete the header
new_value = ""
else:
str(hdr).split(": ", 1)[1].strip()
new_value = self.search.sub(self.value, value)
if value != new_value:
hdr = EmailMessage(policy=default_policy)
hdr[name] = new_value
hdr.add_header(name, new_value)
modified.append((name, hdr, index, occurrences[name]))
index += 1
return modified
@@ -196,8 +196,9 @@ class HeaderMilter(Milter.Base):
def header(self, name, value):
# remove surrogates from value
value = value.encode(errors="surrogateescape").decode(errors="replace")
hdr = EmailMessage(policy=default_policy)
hdr[name] = value
self.logger.debug(f"{self.queueid}: received header: {name}: {value}")
hdr = HeaderParser(policy=default_policy).parsestr(f"{name}: {value}")
self.logger.debug(f"{self.queueid}: decoded header: {name}: {hdr[name]}")
self.headers.append((name, hdr))
return Milter.CONTINUE
@@ -209,7 +210,7 @@ class HeaderMilter(Milter.Base):
for name, hdr, index, occurrence in modified:
value = hdr[name]
encoded_value = bytes(header).decode().split(": ")[1].rstrip()
encoded_value = hdr.as_string().split(": ")[1].rstrip()
mod_header = "{}: {}".format(name, value)
if rule.action == "add":
if rule.log: