#!/usr/bin/env python# -*- coding: UTF-8 -*-# opyright 2007-2008 VEB IT# See COPYING for distribution information.# $Id$"""Virtual Mail Manager's Alias class to manage e-mail aliases."""fromconstants.VERSIONimportVERSION__author__='Pascal Volk <p.volk@veb-it.de>'__version__=VERSION__revision__='rev '+'$Rev$'.split()[1]__date__='$Date$'.split()[1]fromExceptionsimportVMMAliasExceptionfromDomainimportDomainimportconstants.ERRORasERRclassAlias:"""Class to manage e-mail accounts."""def__init__(self,dbh,address,basedir,destination=None):ifaddress==destination:raiseVMMAliasException(('Address and destination are identical.',ERR.ALIAS_ADDR_DEST_IDENTICAL))self._dbh=dbhself._addr=addressself._dest=destinationself._localpart=Noneself._gid=0self._aid=0self._setAddr(basedir)ifnotself._destisNone:self._exists()ifself._isAccount():raiseVMMAliasException(('There is already an account with address »%s«'%self._addr,ERR.ACCOUNT_EXISTS))def_exists(self):dbc=self._dbh.cursor()dbc.execute("SELECT id FROM alias WHERE gid=%s AND address=%s\ AND destination=%s",self._gid,self._localpart,self._dest)aid=dbc.fetchone()dbc.close()ifaidisnotNone:self._aid=aid[0]returnTrueelse:returnFalsedef_isAccount(self):dbc=self._dbh.cursor()dbc.execute("SELECT uid FROM users WHERE gid=%s AND local_part=%s",self._gid,self._localpart)uid=dbc.fetchone()dbc.close()ifuidisnotNone:returnTrueelse:returnFalsedef_setAddr(self,basedir):self._localpart,d=self._addr.split('@')dom=Domain(self._dbh,d,basedir)self._gid=dom.getID()ifself._gid==0:raiseVMMAliasException(("Domain »%s« doesn't exist."%d,ERR.NO_SUCH_DOMAIN))defsave(self):ifself._destisNone:raiseVMMAliasException(('No destination address for alias denoted.',ERR.ALIAS_MISSING_DEST))ifself._aid<1:dbc=self._dbh.cursor()dbc.execute("INSERT INTO alias (gid, address, destination) VALUES\ (%s, %s, %s)",self._gid,self._localpart,self._dest)self._dbh.commit()dbc.close()else:raiseVMMAliasException(("Alias already exists.",ERR.ALIAS_EXISTS))defgetInfo(self):dbc=self._dbh.cursor()dbc.execute('SELECT destination FROM alias WHERE gid=%s AND address=%s',self._gid,self._localpart)destinations=dbc.fetchall()dbc.close()iflen(destinations)>0:targets=[]fordestinationindestinations:targets.append(destination[0])returntargetselse:raiseVMMAliasException(("Alias doesn't exists",ERR.NO_SUCH_ALIAS))defdelete(self):dbc=self._dbh.cursor()dbc.execute("DELETE FROM alias WHERE gid=%s AND address=%s",self._gid,self._localpart)rowcount=dbc.rowcountdbc.close()ifrowcount>0:self._dbh.commit()else:raiseVMMAliasException(("Alias doesn't exists",ERR.NO_SUCH_ALIAS))