import string, re, sys, os, crypt class Acl: def __init__(self, root='.', file='etc/passwd'): self.acl_root = root self.acl_file = file self.acl_list = {} if not os.path.isfile('%s/%s' % (self.acl_root, self.acl_file)): file = open('%s/%s' % (self.acl_root, self.acl_file), 'w') file.close() return def acl_init(self): file = open('%s/%s' % (self.acl_root, self.acl_file), 'r') lines = file.readlines() file.close() self.acl_list = {} for line in lines: list = (line[:-1]).split('\t') self.acl_list[list[0]] = list return def acl_getuser(self, username): file = open('%s/%s' % (self.acl_root, self.acl_file), 'r') lines = file.readlines() file.close() username = '%s\t' % (username) for line in lines: if line.startswith(username): return (line[:-1]).split('\t') return None def acl_adduser(self, username, password='', attr=[]): if self.acl_getuser(username): return 0 if not username or username != re.sub('[\W_]', '_', username): return 0 file = open('%s/%s' % (self.acl_root, self.acl_file), 'a') file.write('%s\t%s\t%s\n' % (username, crypt.crypt(password, 'xx'), string.join(map(str, attr), '\t'))) file.close() return 1 def acl_deluser(self, username): if not self.acl_getuser(username): return 0 temp = open('%s/%s.%s' % (self.acl_root, self.acl_file, os.getpid()), 'w') file = open('%s/%s' % (self.acl_root, self.acl_file), 'r') lines = file.readlines() file.close() username = '%s\t' % (username) for line in lines: if not line.startswith(username): temp.write(line) temp.close() pid = os.getpid() os.rename('%s/%s.%s' % (self.acl_root, self.acl_file, pid), '%s/%s' % (self.acl_root, self.acl_file)) if os.path.isfile('%s/%s.%s' % (self.acl_root, self.acl_file, pid)): os.remove('%s/%s.%s' % (self.acl_root, self.acl_file, pid)) return 0 return 1 def acl_listuser(self, pattern='.*'): file = open('%s/%s' % (self.acl_root, self.acl_file), 'r') lines = file.readlines() file.close() list = [] pattern = '%s\t.*' % (pattern) for line in lines: if line: if re.match(pattern, line): list.append((line[:-1]).split('\t')) return list def acl_passwd(self, username, password): user = self.acl_getuser(username) if not user: return 0 if not self.acl_deluser(username): return 0 if not self.acl_adduser(username, password, user[2:]): return 0 return 1 def acl_auth(self, username, password): if self.acl_list: user = self.acl_list.get(username, None) if user: confirm = user[1] if confirm == crypt.crypt(password, 'xx'): return user[:1] + user[2:] return None user = self.acl_getuser(username) if user: confirm = user[1] if confirm == crypt.crypt(password, 'xx'): return user[:1] + user[2:] return None