* 'vmm.cfg.5'
- Added sections FILES, SEE ALSO and AUTHOR
* 'vmm.1'
- Fixed SEE ALSO
#!/usr/bin/env python# -*- coding: UTF-8 -*-# Copyright 2007-2008 VEB IT# See COPYING for distribution information.# $Id$"""Virtual Mail Manager's Account class to manage e-mail accounts."""fromconstants.VERSIONimportVERSION__author__='Pascal Volk <p.volk@veb-it.de>'__version__=VERSION__revision__='rev '+'$Rev$'.split()[1]__date__='$Date$'.split()[1]fromExceptionsimportVMMAccountExceptionfromDomainimportDomainfromTransportimportTransportfromMailLocationimportMailLocationimportconstants.ERRORasERRclassAccount:"""Class to manage e-mail accounts."""def__init__(self,dbh,address,password=None):self._dbh=dbhself._base=Noneself._addr=addressself._localpart=Noneself._name=Noneself._uid=0self._gid=0self._mid=0self._tid=0self._passwd=passwordself._setAddr()self._exists()ifself._isAlias():raiseVMMAccountException(('There is already an alias with address »%s«'%address,ERR.ALIAS_EXISTS))def_exists(self):dbc=self._dbh.cursor()dbc.execute("SELECT uid, mid, tid FROM users \WHERE gid=%s AND local_part=%s",self._gid,self._localpart)result=dbc.fetchone()dbc.close()ifresultisnotNone:self._uid,self._mid,self._tid=resultreturnTrueelse:returnFalsedef_isAlias(self):dbc=self._dbh.cursor()dbc.execute("SELECT gid FROM alias WHERE gid=%s AND address=%s",self._gid,self._localpart)gid=dbc.fetchone()dbc.close()ifgidisnotNone:returnTrueelse:returnFalsedef_setAddr(self):self._localpart,d=self._addr.split('@')dom=Domain(self._dbh,d)self._gid=dom.getID()ifself._gid==0:raiseVMMAccountException(("Domain »%s« doesn't exist."%d,ERR.NO_SUCH_DOMAIN))self._base=dom.getDir()self._tid=dom.getTransportID()def_setID(self):dbc=self._dbh.cursor()dbc.execute("SELECT nextval('users_uid')")self._uid=dbc.fetchone()[0]dbc.close()def_prepare(self,maillocation):self._setID()self._mid=MailLocation(self._dbh,maillocation=maillocation).getID()def_switchState(self,state,service):ifnotisinstance(state,bool):returnFalseifnotservicein['smtp','pop3','imap','managesieve','all',None]:raiseVMMAccountException(("Unknown service »%s«"%service,ERR.UNKNOWN_SERVICE))ifself._uid<1:raiseVMMAccountException(("Account doesn't exists",ERR.NO_SUCH_ACCOUNT))dbc=self._dbh.cursor()ifservicein['smtp','pop3','imap','managesieve']:dbc.execute("UPDATE users SET %s=%s WHERE local_part='%s' AND gid=%s"%(service,state,self._localpart,self._gid))elifstate:dbc.execute("UPDATE users SET smtp = TRUE, pop3 = TRUE,\ imap = TRUE, managesieve = TRUE WHERE local_part = %s AND gid = %s",self._localpart,self._gid)else:dbc.execute("UPDATE users SET smtp = FALSE, pop3 = FALSE,\ imap = FALSE, managesieve = FALSE WHERE local_part = %s AND gid = %s",self._localpart,self._gid)ifdbc.rowcount>0:self._dbh.commit()dbc.close()defgetUID(self):returnself._uiddefgetGID(self):returnself._giddefgetDir(self,directory):ifdirectory=='domain':return'%s'%self._baseelifdirectory=='home':return'%s/%i'%(self._base,self._uid)defenable(self,service=None):self._switchState(True,service)defdisable(self,service=None):self._switchState(False,service)defsave(self,maillocation,smtp,pop3,imap,managesieve):ifself._uid<1:self._prepare(maillocation)dbc=self._dbh.cursor()dbc.execute("""INSERT INTO users (local_part, passwd, uid, gid,\ mid, tid, smtp, pop3, imap, managesieve)\ VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",self._localpart,self._passwd,self._uid,self._gid,self._mid,self._tid,smtp,pop3,imap,managesieve)self._dbh.commit()dbc.close()else:raiseVMMAccountException(('Account already exists.',ERR.ACCOUNT_EXISTS))defmodify(self,what,value):ifself._uid==0:raiseVMMAccountException(("Account doesn't exists",ERR.NO_SUCH_ACCOUNT))ifwhatnotin['name','password','transport']:returnFalsedbc=self._dbh.cursor()ifwhat=='password':dbc.execute("UPDATE users SET passwd=%s WHERE local_part=%s AND\ gid=%s",value,self._localpart,self._gid)elifwhat=='transport':self._tid=Transport(self._dbh,transport=value).getID()dbc.execute("UPDATE users SET tid=%s WHERE local_part=%s AND\ gid=%s",self._tid,self._localpart,self._gid)else:dbc.execute("UPDATE users SET name=%s WHERE local_part=%s AND\ gid=%s",value,self._localpart,self._gid)ifdbc.rowcount>0:self._dbh.commit()dbc.close()defgetInfo(self):dbc=self._dbh.cursor()dbc.execute("SELECT name, uid, gid, mid, tid, smtp, pop3, imap, \ managesieve FROM users WHERE local_part=%s AND gid=%s",self._localpart,self._gid)info=dbc.fetchone()dbc.close()ifinfoisNone:raiseVMMAccountException(("Account doesn't exists",ERR.NO_SUCH_ACCOUNT))else:keys=['name','uid','gid','maildir','transport','smtp','pop3','imap','managesieve']info=dict(zip(keys,info))forservicein['smtp','pop3','imap','managesieve']:ifbool(info[service]):info[service]='enabled'else:info[service]='disabled'info['address']=self._addrinfo['maildir']='%s/%s/%s'%(self._base,info['uid'],MailLocation(self._dbh,mid=info['maildir']).getMailLocation())info['transport']=Transport(self._dbh,tid=info['transport']).getTransport()returninfodefdelete(self):ifself._uid>0:dbc=self._dbh.cursor()dbc.execute("DELETE FROM users WHERE gid=%s AND local_part=%s",self._gid,self._localpart)ifdbc.rowcount>0:self._dbh.commit()dbc.close()else:raiseVMMAccountException(("Account doesn't exists",ERR.NO_SUCH_ACCOUNT))defgetAccountByID(uid,dbh):try:uid=long(uid)exceptValueError:raiseVMMAccountException(('uid must be an int/long.',ERR.INVALID_AGUMENT))ifuid<1:raiseVMMAccountException(('uid must be greater than 0.',ERR.INVALID_AGUMENT))dbc=dbh.cursor()dbc.execute("SELECT local_part||'@'||domains.domainname AS address, uid,\ gid FROM users LEFT JOIN domains USING(gid) WHERE uid=%s",uid)info=dbc.fetchone()dbc.close()ifinfoisNone:raiseVMMAccountException(("Account doesn't exists",ERR.NO_SUCH_ACCOUNT))keys=['address','uid','gid']info=dict(zip(keys,info))returninfo