X-Git-Url: https://git.distorted.org.uk/~mdw/qmail/blobdiff_plain/ca51b51d75ecbf78f6c5786b6d3379d296e89d85..19de3a724957f431fcee39ab79d158e5d279e188:/qmail-valid-addresses diff --git a/qmail-valid-addresses b/qmail-valid-addresses index b77be52..8a36f58 100644 --- a/qmail-valid-addresses +++ b/qmail-valid-addresses @@ -2,6 +2,7 @@ import os import cdb +from errno import * def sort(l): l = [] + l @@ -40,42 +41,85 @@ for k in udb.keys(): del udb map = {} -def addlocal(p, l, forcep = False): +def addlocal(u, p, l, forcep = False): l = 'L' + l + p = os.path.join(u.home, p) 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] == '!': + qm = file(os.path.join(u.home, p)).readline() + if len(qm) > 1 and qm[0:2] == '#!': map[l] = '-' + elif len(qm) > 1 and qm[0:2] == '#?': + name = u.user + map[l] = '?' + name else: map[l] = '+' + +def allfiles(pre, dir): + for f in os.listdir(dir): + ff = os.path.join(dir, f) + if os.path.isdir(ff): + for sub in allfiles(f, ff): + yield sub + elif os.path.isfile(ff): + yield f + +def qmfiles(pre, dir): + for f in os.listdir(dir): + if not f.startswith(pre): + continue + ff = os.path.join(dir, f) + if os.path.isdir(ff): + for sub in allfiles(f, ff): + yield sub + elif os.path.isfile(ff): + yield f + for k in sort(umap.keys()): + ouid = os.geteuid() 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 == '') + try: + try: + os.seteuid(u.uid) + except OSError: + pass + qm = '.qmail' + u.dash + u.pre + qmlen = len(qm) + if u.wild: + try: + for p in qmfiles(qm, u.home): + ext = p[qmlen:] + addlocal(u, p, u.name + ext) + except IOError: + pass + else: + addlocal(u, qm, u.name, u.dash == '') + finally: + os.seteuid(ouid) + +me = open('control/me').readline() -for dom in open('control/locals'): - if len(dom) and dom[-1] == '\n': - dom = dom[:-1] - map['@' + dom] = '' +try: + for dom in open('control/locals'): + if len(dom) and dom[-1] == '\n': + dom = dom[:-1] + map['@' + dom] = '' +except IOError, exc: + if exc.errno != ENOENT: + raise + map['@' + me] = '' -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 +try: + 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 +except IOError, exc: + if exc.errno != ENOENT: + raise for l in sort(map.keys()): print '%s:%s' % (l, map[l])