diff -r 89f952b0f366 -r c44ea4526546 VirtualMailManager/VirtualMailManager.py --- a/VirtualMailManager/VirtualMailManager.py Wed Jun 11 00:05:22 2008 +0000 +++ b/VirtualMailManager/VirtualMailManager.py Wed Jun 11 05:07:07 2008 +0000 @@ -18,6 +18,7 @@ import sys import gettext from encodings.idna import ToASCII, ToUnicode +from getpass import getpass from shutil import rmtree from subprocess import Popen, PIPE @@ -72,7 +73,7 @@ def __chkCfgFile(self): """Checks the configuration file, returns bool""" if not os.path.isfile(self.__cfgFileName): - raise VMMException((_(u"The file »%s« does not exists.") % + raise VMMException((_(u"The file '%s' does not exists.") % self.__cfgFileName, ERR.CONF_NOFILE)) fstat = os.stat(self.__cfgFileName) try: @@ -139,7 +140,7 @@ ERR.LOCALPART_TOO_LONG)) if re.compile(RE_LOCALPART).search(localpart): raise VMMException(( - _(u'The local part »%s« contains invalid characters.') % + _(u"The local part '%s' contains invalid characters.") % localpart, ERR.LOCALPART_INVALID)) return localpart @@ -191,10 +192,10 @@ try: localpart, domain = address.split('@') except ValueError: - raise VMMException((_(u"Missing '@' sign in e-mail address »%s«.") % + raise VMMException((_(u"Missing '@' sign in e-mail address '%s'.") % address, ERR.INVALID_ADDRESS)) except AttributeError: - raise VMMException((_(u"»%s« looks not like an e-mail address.") % + raise VMMException((_(u"'%s' looks not like an e-mail address.") % address, ERR.INVALID_ADDRESS)) domain = self.__chkDomainname(domain) localpart = self.__chkLocalpart(localpart) @@ -207,6 +208,21 @@ password = self.__pwhash(password) return Account(self.__dbh, address, password) + def _readpass(self): + clear0 = '' + clear1 = '1' + while clear0 != clear1: + while len(clear0) < 1: + clear0 = getpass(prompt=_('Enter new password: ')) + if len(clear0) < 1: + sys.stderr.write('%s\n' + % _('Sorry, empty passwords are not permitted')) + clear1 = getpass(prompt=_('Retype new password: ')) + if clear0 != clear1: + clear0 = '' + sys.stderr.write('%s\n' % _('Sorry, passwords do not match')) + return clear0 + def __getAlias(self, address, destination=None): address = self.__chkEmailAddress(address) if not destination is None: @@ -410,7 +426,7 @@ if not section: self.__Cfg.configure(self.__cfgSections) elif section not in self.__cfgSections: - raise VMMException((_(u"Invalid section: »%s«") % section, + raise VMMException((_(u"Invalid section: '%s'") % section, ERR.INVALID_SECTION)) else: self.__Cfg.configure([section]) @@ -424,7 +440,7 @@ def domain_transport(self, domainname, transport, force=None): if force is not None and force != 'force': - raise VMMDomainException((_(u'Invalid argument: »%s«') % force, + raise VMMDomainException((_(u"Invalid argument: '%s'") % force, ERR.INVALID_OPTION)) dom = self.__getDomain(domainname, None) if force is None: @@ -434,7 +450,7 @@ def domain_delete(self, domainname, force=None): if not force is None and force not in ['deluser','delalias','delall']: - raise VMMDomainException((_(u'Invalid argument: »%s«') % force, + raise VMMDomainException((_(u"Invalid argument: '%s'") % force, ERR.INVALID_OPTION)) dom = self.__getDomain(domainname) gid = dom.getID() @@ -463,7 +479,7 @@ elif detailed == 'detailed': return dominfo, dom.getAccounts(), dom.getAliases() else: - raise VMMDomainException(('%s: »%s«' % (_('Invalid argument'), + raise VMMDomainException(("%s: '%s'" % (_('Invalid argument'), detailed), ERR.INVALID_OPTION)) def domain_list(self, pattern=None): @@ -481,7 +497,7 @@ re.compile(RE_DOMAIN_SRCH) if not re.match(RE_DOMAIN_SRCH, domain): raise VMMException(( - _(u'The pattern »%s« contains invalid characters.') % + _(u"The pattern '%s' contains invalid characters.") % pattern, ERR.DOMAIN_INVALID)) else: pattern = self.__chkDomainname(pattern) @@ -490,6 +506,9 @@ def user_add(self, emailaddress, password): acc = self.__getAccount(emailaddress, password) + if password is None: + password = self._readpass() + acc.setPassword(self.__pwhash(password)) acc.save(self.__Cfg.get('maildir', 'folder'), self.__Cfg.getboolean('services', 'smtp'), self.__Cfg.getboolean('services', 'pop3'), @@ -531,6 +550,10 @@ def user_password(self, emailaddress, password): acc = self.__getAccount(emailaddress) + if acc.getUID() == 0: + raise VMMException((_("Account doesn't exists"),ERR.NO_SUCH_ACCOUNT)) + if password is None: + password = self._readpass() acc.modify('password', self.__pwhash(password)) def user_name(self, emailaddress, name):