- implemented change pop/imap password
git-svn-id: file:///home/www/usr01/svn/gnuviechadmin/gnuviech.info/gnuviechadmin/trunk@136 a67ec6bc-e5d5-0310-a910-815c51eb3124
This commit is contained in:
parent
cab6f70ec8
commit
da5aa67ac9
2 changed files with 69 additions and 2 deletions
59
backend/changepoppassword.py
Executable file
59
backend/changepoppassword.py
Executable file
|
@ -0,0 +1,59 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import psycopg, getopt, sys
|
||||||
|
|
||||||
|
from gvadm import PasswordTools, DomainTools
|
||||||
|
|
||||||
|
def usage():
|
||||||
|
print """Usage information:
|
||||||
|
=====================
|
||||||
|
%(process)s -h|--help
|
||||||
|
- prints this help text
|
||||||
|
|
||||||
|
%(process)s --domain=<domain> --user=<user> [--password=<password>]
|
||||||
|
- updates the password of a 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=', 'user='])
|
||||||
|
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() or
|
||||||
|
not dict(options[0]).has_key('--user') or
|
||||||
|
not dict(options[0])['--user'].strip()):
|
||||||
|
usage()
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# specify the domain
|
||||||
|
domain = None
|
||||||
|
try:
|
||||||
|
domain = DomainTools.Domain(dict(options[0])['--domain'])
|
||||||
|
except DomainTools.InvalidDomain, iv:
|
||||||
|
print iv
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
username = dict(options[0])['--user']
|
||||||
|
if not domain.hasPopUser(username):
|
||||||
|
print "Domain doesn't have pop user", username
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# specify the password
|
||||||
|
password = None
|
||||||
|
|
||||||
|
if dict(options[0]).has_key('--password'):
|
||||||
|
password = PasswordTools.check_password(dict(options[0])['--password'])
|
||||||
|
if (password == None):
|
||||||
|
password = PasswordTools.generate_password()
|
||||||
|
|
||||||
|
domain.updatePopPassword(username, password)
|
|
@ -143,12 +143,20 @@ Password: %(password)s""" % {'domain': self.domain,
|
||||||
|
|
||||||
def hasPopUser(self, username):
|
def hasPopUser(self, username):
|
||||||
"""Checks whether the specified POP3/IMAP user exists in the domain."""
|
"""Checks whether the specified POP3/IMAP user exists in the domain."""
|
||||||
return ([user for user in domain.listPopUsers() if (user == username)])
|
return ([user for user in self.listPopUsers() if (user == username)])
|
||||||
|
|
||||||
def updatePopPassword(self, username, password=PasswordTools.generate_password()):
|
def updatePopPassword(self, username, password=PasswordTools.generate_password()):
|
||||||
"""Updates the password of the given POP3/IMAP user."""
|
"""Updates the password of the given POP3/IMAP user."""
|
||||||
if self.hasPopUser(username):
|
if self.hasPopUser(username):
|
||||||
print("will update password of user %s to %s" % (username, password))
|
crypted = PasswordTools.md5_crypt_password(password)
|
||||||
|
|
||||||
|
cr = self.cnx.cursor()
|
||||||
|
cr.execute("UPDATE mailpasswd SET clear=%(clear)s, crypt=%(crypt)s WHERE id=%(user)s" % {
|
||||||
|
'clear': psycopg.QuotedString(password),
|
||||||
|
'crypt': psycopg.QuotedString(crypted),
|
||||||
|
'user': psycopg.QuotedString(username)})
|
||||||
|
self.cnx.commit()
|
||||||
|
print("updated password of user %s to %s" % (username, password))
|
||||||
else:
|
else:
|
||||||
raise InvalidPopUser(self, username)
|
raise InvalidPopUser(self, username)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue