qmail-smtpd: Validation of recipient mailbox names.
[qmail] / qmail-valid-addresses
CommitLineData
ca51b51d
MW
1#! /usr/bin/python
2
3import os
4import cdb
5
6def sort(l):
7 l = [] + l
8 l.sort()
9 return l
10class struct (object):
11 def __init__(me, **kw):
12 me.__dict__.update(kw)
13 def __repr__(me):
14 return (type(me).__name__ +
15 '(' +
16 ', '.join(['%s = %r' % (k, me.__dict__[k])
17 for k in me.__dict__
18 if k[0] != '_']) +
19 ')')
20class userentry (struct):
21 pass
22
23os.chdir('/var/qmail')
24
25umap = {}
26udb = cdb.init('users/cdb')
27for k in udb.keys():
28 if len(k) == 0 or k[0] != '!':
29 continue
30 v = udb[k].split('\0')
31 u = userentry(user = v[0], uid = int(v[1]), gid = int(v[2]), home = v[3],
32 dash = v[4], pre = v[5])
33 if k[-1] == '\0':
34 u.name = k[1:-1]
35 u.wild = 0
36 else:
37 u.name = k[1:]
38 u.wild = 1
39 umap[u.name] = u
40del udb
41
42map = {}
43def addlocal(p, l, forcep = False):
44 l = 'L' + l
45 if not os.path.exists(p):
46 if forcep:
47 map[l] = '+'
48 return
49 f = open(p)
50 top = f.readline()
51 f.close()
52 if len(top) > 0 and top[0] == '!':
53 map[l] = '-'
54 else:
55 map[l] = '+'
56for k in sort(umap.keys()):
57 u = umap[k]
58 qm = '.qmail' + u.dash + u.pre
59 qmlen = len(qm)
60 if u.wild:
61 for p in os.listdir(u.home):
62 if not p.startswith(qm):
63 continue
64 ext = p[qmlen:]
65 addlocal(os.path.join(u.home, p), u.name + ext)
66 else:
67 addlocal(os.path.join(u.home, qm), u.name, u.dash == '')
68
69for dom in open('control/locals'):
70 if len(dom) and dom[-1] == '\n':
71 dom = dom[:-1]
72 map['@' + dom] = ''
73
74for v in open('control/virtualdomains'):
75 if len(v) and v[-1] == '\n':
76 v = v[:-1]
77 (addr, pre) = v.split(':', 2)
78 map['V' + addr] = pre
79
80for l in sort(map.keys()):
81 print '%s:%s' % (l, map[l])