Properly encode header values after modify
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user