chiark / gitweb /
qmail-smtpd: Validation of recipient mailbox names.
[qmail] / qmail-valid-addresses
1 #! /usr/bin/python
2
3 import os
4 import cdb
5
6 def sort(l):
7   l = [] + l
8   l.sort()
9   return l
10 class 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             ')')
20 class userentry (struct):
21   pass
22
23 os.chdir('/var/qmail')
24
25 umap = {}
26 udb = cdb.init('users/cdb')
27 for 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
40 del udb
41
42 map = {}
43 def 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] = '+'
56 for 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
69 for dom in open('control/locals'):
70   if len(dom) and dom[-1] == '\n':
71     dom = dom[:-1]
72   map['@' + dom] = ''
73
74 for 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
80 for l in sort(map.keys()):
81   print '%s:%s' % (l, map[l])