VirtualMailManager/Alias.py
changeset 0 bb0aa2102206
child 3 a9b44e04bf01
--- /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 <p.volk@veb-it.de>'
+__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))
+