"""Tool functions for GNUViech administration tool (c) 2004 Jan Dittberner """ import random, re from gnuviech import GNVPrefs try: from crypt import crypt except ImportError, ie: import sys sys.__stderr__.write("Unsupported platform without crypt: " + sys.platform) sys.exit() from time import time def generatePassword(): """Generates a password from the chars in GNVPrefs.PWDCHARS with a length between GNVPrefs.PWDMINLENGTH and GNVPrefs.PWDMAXLENGTH.""" return "".join([chr(char) for char in random.sample(GNVPrefs.PWDCHARS, random.randint(GNVPrefs.PWDMINLENGTH, GNVPrefs.PWDMAXLENGTH))]) def generateSalt(): saltchars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' salt = [] for i in range(8): salt.append(saltchars[random.randint(0, len(saltchars) - 1)]) return "".join(salt) def checkEmail(email): """Returns a match object if the given email address is syntactically correct otherwise it returns None""" # regex for email check p = re.compile(r'^([a-zA-Z0-9_\-.]+)@([a-zA-Z0-9\-]+(\.|[a-zA-Z0-9\-]+)*\.[a-z]{2,5})$') return p.search(email) def splitPasswdLine(line): loginname, password, uid, gid, fullname, directory, shell = line.split(":") return { "loginname" : loginname, "password" : password, "uid" : uid, "gid" : gid, "fullname" : fullname, "homedir" : directory, "shell" : shell } def splitShadowLine(line): (loginname, passwordhash, lastchange, maychange, mustchange, warnexpire, disabled, disabledsince, reserved) = line.split(":") return { "loginname" : loginname, "passwordhash" : passwordhash, "lastchange" : lastchange, "maychange" : maychange, "mustchange" : mustchange, "warnexpire" : warnexpire, "disabled" : disabled, "disabledsince" : disabledsince, "reserved" : reserved } def hashPassword(password, method="md5"): if (method == "md5"): return crypt(password, "$1$%s" % generateSalt()) return crypt(password, generateSalt()) def daysSince1970(): return int(time()/(3600*24))