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