]> git.immae.eu Git - perso/Immae/Config/Nix.git/blob - modules/private/mail/filter-rewrite-from.py
Prepare script for opensmtpd next upgrade
[perso/Immae/Config/Nix.git] / modules / private / mail / filter-rewrite-from.py
1 #! /usr/bin/env python3
2 import sys
3
4 sys.stdin.reconfigure(encoding='utf-8')
5 sys.stdout.reconfigure(encoding='utf-8')
6 stdin = sys.stdin
7 stdout = sys.stdout
8
9 mailaddr = sys.argv[1]
10 inheader = {}
11
12 # Change to actual file for logging
13 logfile = open("/dev/null", "a")
14
15 def log(l, i):
16 logfile.write("{} {}\n".format(i, l))
17 logfile.flush()
18
19 def send(l):
20 log(l, ">")
21 stdout.write("{}\n".format(l))
22 stdout.flush()
23
24 def token_and_sid(version, sid, token):
25 if version < "0.5":
26 return "{}|{}".format(token, sid)
27 else:
28 return "{}|{}".format(sid, token)
29
30 log("started", "l")
31 while True:
32 line = stdin.readline().strip()
33 log(line, "<")
34 if not line:
35 log("finished", "l")
36 break
37 splitted = line.split("|")
38 if line == "config|ready":
39 log("in config ready", "l")
40 send("register|filter|smtp-in|mail-from")
41 send("register|filter|smtp-in|data-line")
42 send("register|ready")
43 if splitted[0] != "filter":
44 continue
45 if len(splitted) < 7:
46 send("invalid filter command: expected >6 fields!")
47 sys.exit(1)
48 version = splitted[1]
49 action = splitted[4]
50 sid = splitted[5]
51 token = splitted[6]
52 token_sid = token_and_sid(version, sid, token)
53 rest = "|".join(splitted[7:])
54 if action == "mail-from":
55 inheader[sid] = True
56 send("filter-result|{}|rewrite|<{}>".format(token_sid, mailaddr))
57 continue
58 if action == "data-line":
59 if rest == "" and inheader.get(sid, False):
60 inheader[sid] = False
61 if rest == "." and not inheader.get(sid):
62 del(inheader[sid])
63 if inheader.get(sid, False) and rest.upper().startswith("FROM:"):
64 send("filter-dataline|{}|From: {}".format(token_sid, mailaddr))
65 else:
66 send("filter-dataline|{}|{}".format(token_sid, rest))
67 continue
68 send("filter-result|{}|proceed".format(token_sid))