From 1b4fb7e4efaeb756b88dddfd6771771827c9f84a Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Wed, 28 Sep 2005 16:13:38 +0000 Subject: [PATCH] - started python implementation of addpopuser git-svn-id: file:///home/www/usr01/svn/gnuviechadmin/gnuviech.info/gnuviechadmin/trunk@120 a67ec6bc-e5d5-0310-a910-815c51eb3124 --- backend/addpopuser.py | 112 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100755 backend/addpopuser.py diff --git a/backend/addpopuser.py b/backend/addpopuser.py new file mode 100755 index 0000000..e0d3c11 --- /dev/null +++ b/backend/addpopuser.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python + +import psycopg, crypt, crack, popen2, getopt, random, sys + +def generate_password(): + (o, i, e) = popen2.popen3("apg -n 1 -m 8 -x 12 -a 0") + + return "".join(o.readlines()).strip() + +def check_password(password): + try: + return crack.VeryFascistCheck(password) + except ValueError, ve: + print "Weak password:", ve + return None + +def md5_crypt_password(password): + salt = "".join([chr(letter) for letter in random.sample(range(ord('a'), ord('z')), 8)]) + + return crypt.crypt(password, '$1$' + salt) + +class InvalidDomain(Exception): + def __init__(self, domain): + self.domain = domain + + def __str__(self): + return repr("Invalid domain %s" % (domain)) + +def validate_domain(domain): + cnx = psycopg.connect("user=exim4 password=CotOgigmeIk5 dbname=gnuviechadmin") + cr = cnx.cursor() + + cr.execute("SELECT * FROM domain WHERE domainname=%(name)s" % + {'name': psycopg.QuotedString(domain)}) + cnx.commit() + + result = cr.fetchall() + if (not result): + raise InvalidDomain(domain) +# +#print "-- Information from mailalias --" +#cr.execute('SELECT * FROM mailalias') +#cnx.commit() +# +#print cr.description +# +#result = cr.fetchall() +#for line in result: +# print line +# +#print "-- Information from mailpasswd --" +#cr.execute('SELECT * FROM mailpasswd') +#cnx.commit() +#result = cr.fetchall() +#for line in result: +# print line +# +#print "-- Domains --" +#cr.execute('SELECT DISTINCT domain FROM mailalias') +#cnx.commit() +#result = cr.fetchall() +#for line in result: +# print line + +def usage(): + print """Usage information: + ===================== + %(process)s -h|--help + - prints this help text + + %(process)s --domain= [--password=] + - adds a new pop user for the given domain + - if the optional password is ommitted a generated one is used + - the password is checked using cracklib + - if the password is too weak a generated one is used + """ % {'process': sys.argv[0]} + +if __name__ == "__main__": + try: + options = getopt.getopt(sys.argv[1:], "h", ['help', 'password=', 'domain=']) + except getopt.GetoptError: + usage() + sys.exit(1) + + if (not options[0] or + dict(options[0]).has_key('-h') or + dict(options[0]).has_key('--help') or + not dict(options[0]).has_key('--domain') or + not dict(options[0])['--domain'].strip()): + usage() + sys.exit(1) + + # specify the domain + domain = dict(options[0])['--domain'] + try: + validate_domain(domain) + except InvalidDomain, iv: + print iv + sys.exit(1) + + # specify the password + password = None + + if dict(options[0]).has_key('--password'): + password = check_password(dict(options[0])['--password']) + if (password == None): + password = generate_password() + + print domain + print password + + print md5_crypt_password(password)