#!/usr/bin/env python# -*- coding: UTF-8 -*-# Copyright 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,destination=None):ifaddress==destination:raiseVMMAliasException(_(u'Address and destination are identical.'),ERR.ALIAS_ADDR_DEST_IDENTICAL)self._dbh=dbhself._addr=addressself._dest=destinationself._localpart=Noneself._gid=0self._isNew=Falseself._setAddr()ifnotself._destisNone:self._exists()ifself._isAccount():raiseVMMAliasException(_(u"There is already an account with address '%s'")%self._addr,ERR.ACCOUNT_EXISTS)def_exists(self):dbc=self._dbh.cursor()dbc.execute("SELECT gid FROM alias WHERE gid=%s AND address=%s\ AND destination=%s",self._gid,self._localpart,self._dest)gid=dbc.fetchone()dbc.close()ifgidisNone:self._isNew=Trueelse:self._isNew=Falsedef_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):self._localpart,d=self._addr.split('@')dom=Domain(self._dbh,d)self._gid=dom.getID()ifself._gid==0:raiseVMMAliasException(_(u"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._isNew: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()ifself._destisNone:dbc.execute("DELETE FROM alias WHERE gid=%s AND address=%s",self._gid,self._localpart)else:dbc.execute("DELETE FROM alias WHERE gid=%s AND address=%s AND \ destination=%s",self._gid,self._localpart,self._dest)rowcount=dbc.rowcountdbc.close()ifrowcount>0:self._dbh.commit()else:raiseVMMAliasException(_("Alias doesn't exists"),ERR.NO_SUCH_ALIAS)