This commit is contained in:
2020-03-18 18:26:07 +01:00
parent 45e39fcffc
commit 9741e93089

View File

@@ -158,7 +158,7 @@ class HeaderRule:
occurrences = {} occurrences = {}
# iterate headers # iterate headers
for name, header in headers: for name, value in headers:
# keep track of the occurrence of each header, needed by # keep track of the occurrence of each header, needed by
# Milter.Base.chgheader # Milter.Base.chgheader
if name not in occurrences.keys(): if name not in occurrences.keys():
@@ -167,19 +167,15 @@ class HeaderRule:
occurrences[name] += 1 occurrences[name] += 1
# check if header line matches regex # check if header line matches regex
header_line = str(header) if self.header.search(f"{name}: {value}"):
if self.header.search(header_line):
value = header_line.split(":", 1)[1].strip()
if self.action == "del": if self.action == "del":
# set an empty value to delete the header # set an empty value to delete the header
new_value = "" new_value = ""
else: else:
new_value = self.search.sub(self.value, value) new_value = self.search.sub(self.value, str(value))
if value != new_value: if value != new_value:
header = make_header( modified.append(
decode_header( (name, Header(s=new_value), index, occurrences[name]))
f"{name}: {new_value}"), errors="replace")
modified.append((name, header, index, occurrences[name]))
index += 1 index += 1
return modified return modified
@@ -242,62 +238,59 @@ class HeaderMilter(Milter.Base):
value = value.encode( value = value.encode(
errors="surrogateescape").decode(errors="replace") errors="surrogateescape").decode(errors="replace")
self.logger.debug(f"{self.qid}: received header: {name}: {value}") self.logger.debug(f"{self.qid}: received header: {name}: {value}")
header = make_header( value = make_header(decode_header(value), errors="replace")
decode_header(
f"{name}: {value}"), errors="replace")
self.logger.debug( self.logger.debug(
f"{self.qid}: decoded header: {header}") f"{self.qid}: decoded header: {name}: {value}")
self.headers.append((name, value))
return Milter.CONTINUE
except Exception as e: except Exception as e:
self.logger.exception( self.logger.exception(
f"an exception occured in header function: {e}") f"an exception occured in header function: {e}")
return Milter.TEMPFAIL return Milter.TEMPFAIL
self.headers.append((name, header))
return Milter.CONTINUE
def eom(self): def eom(self):
try: try:
for rule in self.rules: for rule in self.rules:
self.logger.debug(f"{self.qid}: executing rule '{rule.name}'") self.logger.debug(f"{self.qid}: executing rule '{rule.name}'")
modified = rule.execute(self.headers) modified = rule.execute(self.headers)
for name, header, index, occurrence in modified: for name, value, index, occurrence in modified:
header_line = str(header) header = f"{name}: {value}"
value = header.encode().split(":", 1)[1].strip()
if rule.action == "add": if rule.action == "add":
if rule.log: if rule.log:
self.logger.info( self.logger.info(
f"{self.qid}: add: header: " f"{self.qid}: add: header: "
f"{header_line[0:70]}") f"{header[0:70]}")
else: else:
self.logger.debug( self.logger.debug(
f"{self.qid}: add: header: " f"{self.qid}: add: header: "
f"{header_line}") f"{header}")
self.headers.insert(0, (name, header)) self.headers.insert(0, (name, value))
self.addheader(name, value, 1) self.addheader(name, value.encode(), 1)
else: else:
if rule.action == "mod": if rule.action == "mod":
old_header = str(self.headers[index][1]) old_header = "{}: {}".format(*self.headers[index])
if rule.log: if rule.log:
self.logger.info( self.logger.info(
f"{self.qid}: modify: header: " f"{self.qid}: modify: header: "
f"{old_header[0:70]}: {header_line[0:70]}") f"{old_header[0:70]}: {header[0:70]}")
else: else:
self.logger.debug( self.logger.debug(
f"{self.qid}: modify: header " f"{self.qid}: modify: header "
f"(occ. {occurrence}): {old_header}: " f"(occ. {occurrence}): {old_header}: "
f"{header_line}") f"{header}")
self.headers[index] = (name, header) self.headers[index] = (name, value)
elif rule.action == "del": elif rule.action == "del":
if rule.log: if rule.log:
self.logger.info( self.logger.info(
f"{self.qid}: delete: header: " f"{self.qid}: delete: header: "
f"{header_line[0:70]}") f"{header[0:70]}")
else: else:
self.logger.debug( self.logger.debug(
f"{self.qid}: delete: header " f"{self.qid}: delete: header "
f"(occ. {occurrence}): {header_line}") f"(occ. {occurrence}): {header}")
del self.headers[index] del self.headers[index]
self.chgheader(name, occurrence, value) self.chgheader(name, occurrence, value.encode())
return Milter.ACCEPT return Milter.ACCEPT
except Exception as e: except Exception as e:
self.logger.exception( self.logger.exception(