blob: aad9c69ef32541d6f462a2ed2919d18bb1a58fe8 (
plain) (
tree)
|
|
#! /usr/bin/env python3
import sys
sys.stdin.reconfigure(encoding='utf-8')
sys.stdout.reconfigure(encoding='utf-8')
stdin = sys.stdin
stdout = sys.stdout
mailaddr = sys.argv[1]
inheader = {}
# Change to actual file for logging
logfile = open("/dev/null", "a")
def log(l, i):
logfile.write("{} {}\n".format(i, l))
logfile.flush()
def send(l):
log(l, ">")
stdout.write("{}\n".format(l))
stdout.flush()
def token_and_sid(version, sid, token):
if version < "0.5":
return "{}|{}".format(token, sid)
else:
return "{}|{}".format(sid, token)
log("started", "l")
while True:
line = stdin.readline().strip()
log(line, "<")
if not line:
log("finished", "l")
break
splitted = line.split("|")
if line == "config|ready":
log("in config ready", "l")
send("register|filter|smtp-in|mail-from")
send("register|filter|smtp-in|data-line")
send("register|ready")
if splitted[0] != "filter":
continue
if len(splitted) < 7:
send("invalid filter command: expected >6 fields!")
sys.exit(1)
version = splitted[1]
action = splitted[4]
sid = splitted[5]
token = splitted[6]
token_sid = token_and_sid(version, sid, token)
rest = "|".join(splitted[7:])
if action == "mail-from":
inheader[sid] = True
send("filter-result|{}|rewrite|<{}>".format(token_sid, mailaddr))
continue
if action == "data-line":
if rest == "" and inheader.get(sid, False):
inheader[sid] = False
if rest == "." and not inheader.get(sid):
del(inheader[sid])
if inheader.get(sid, False) and rest.upper().startswith("FROM:"):
send("filter-dataline|{}|From: {}".format(token_sid, mailaddr))
else:
send("filter-dataline|{}|{}".format(token_sid, rest))
continue
send("filter-result|{}|proceed".format(token_sid))
|