qmail-smtpd: Validation of recipient mailbox names.
[qmail] / qmail-valid-addresses
diff --git a/qmail-valid-addresses b/qmail-valid-addresses
new file mode 100644 (file)
index 0000000..b77be52
--- /dev/null
@@ -0,0 +1,81 @@
+#! /usr/bin/python
+
+import os
+import cdb
+
+def sort(l):
+  l = [] + l
+  l.sort()
+  return l
+class struct (object):
+  def __init__(me, **kw):
+    me.__dict__.update(kw)
+  def __repr__(me):
+    return (type(me).__name__ +
+            '(' +
+            ', '.join(['%s = %r' % (k, me.__dict__[k])
+                       for k in me.__dict__
+                       if k[0] != '_']) +
+            ')')
+class userentry (struct):
+  pass
+
+os.chdir('/var/qmail')
+
+umap = {}
+udb = cdb.init('users/cdb')
+for k in udb.keys():
+  if len(k) == 0 or k[0] != '!':
+    continue
+  v = udb[k].split('\0')
+  u = userentry(user = v[0], uid = int(v[1]), gid = int(v[2]), home = v[3],
+                dash = v[4], pre = v[5])
+  if k[-1] == '\0':
+    u.name = k[1:-1]
+    u.wild = 0
+  else:
+    u.name = k[1:]
+    u.wild = 1
+  umap[u.name] = u
+del udb
+
+map = {}
+def addlocal(p, l, forcep = False):
+  l = 'L' + l
+  if not os.path.exists(p):
+    if forcep:
+      map[l] = '+'
+    return
+  f = open(p)
+  top = f.readline()
+  f.close()
+  if len(top) > 0 and top[0] == '!':
+    map[l] = '-'
+  else:
+    map[l] = '+'
+for k in sort(umap.keys()):
+  u = umap[k]
+  qm = '.qmail' + u.dash + u.pre
+  qmlen = len(qm)
+  if u.wild:
+    for p in os.listdir(u.home):
+      if not p.startswith(qm):
+        continue
+      ext = p[qmlen:]
+      addlocal(os.path.join(u.home, p), u.name + ext)
+  else:
+    addlocal(os.path.join(u.home, qm), u.name, u.dash == '')
+
+for dom in open('control/locals'):
+  if len(dom) and dom[-1] == '\n':
+    dom = dom[:-1]
+  map['@' + dom] = ''
+
+for v in open('control/virtualdomains'):
+  if len(v) and v[-1] == '\n':
+    v = v[:-1]
+  (addr, pre) = v.split(':', 2)
+  map['V' + addr] = pre
+
+for l in sort(map.keys()):
+  print '%s:%s' % (l, map[l])