diff -r 000000000000 -r bb0aa2102206 VirtualMailManager/Alias.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/VirtualMailManager/Alias.py Sun Jan 06 18:22:10 2008 +0000 @@ -0,0 +1,105 @@ +#!/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 email aliases.""" + +__author__ = 'Pascal Volk ' +__version__ = 'rev '+'$Rev$'.split()[1] +__date__ = '$Date$'.split()[1] + +from Exceptions import VMMAliasException +from Domain import Domain +import constants.ERROR as ERR + +class Alias: + """Class to manage email accounts.""" + def __init__(self, dbh, address, basedir, destination=None): + if address == destination: + raise VMMAliasException(('Address and destination are identical.', + ERR.ALIAS_ADDR_DEST_IDENTICAL)) + self._dbh = dbh + self._addr = address + self._dest = destination + self._localpart = None + self._gid = 0 + self._aid = 0 + self._setAddr(basedir) + if not self._dest is None: + self._exists() + if self._isAccount(): + raise VMMAliasException( + ('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() + if aid is not None: + self._aid = aid[0] + return True + else: + return False + + def _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() + if uid is not None: + return True + else: + return False + + def _setAddr(self, basedir): + self._localpart, d = self._addr.split('@') + dom = Domain(self._dbh, d, basedir) + self._gid = dom.getID() + if self._gid == 0: + raise VMMAliasException(("Domain «%s» doesn't exist." % d, + ERR.NO_SUCH_DOMAIN)) + + def save(self): + if self._dest is None: + raise VMMAliasException(('No destination address for alias denoted.', + ERR.ALIAS_MISSING_DEST)) + if self._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: + raise VMMAliasException(("Alias already exists.", ERR.ALIAS_EXISTS)) + + def getInfo(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() + if len(destinations) > 0: + targets = [] + for destination in destinations: + targets.append(destination[0]) + return targets + else: + raise VMMAliasException(("Alias doesn't exists", ERR.NO_SUCH_ALIAS)) + + def delete(self): + dbc = self._dbh.cursor() + dbc.execute("DELETE FROM alias WHERE gid=%s AND address=%s", + self._gid, self._localpart) + rowcount = dbc.rowcount + dbc.close() + if rowcount > 0: + self._dbh.commit() + else: + raise VMMAliasException(("Alias doesn't exists", ERR.NO_SUCH_ALIAS)) +