VMM: moved functions ace2idna(), check_domainname(), idn2ascii() v0.6.x
authorPascal Volk <neverseen@users.sourceforge.net>
Fri, 16 Apr 2010 03:58:07 +0000
branchv0.6.x
changeset 254 8aecc83a0d32
parent 253 58d1b6f41664
child 255 d2ddd4a6528d
VMM: moved functions ace2idna(), check_domainname(), idn2ascii() and relevant parts to the Domain module. Adjusted imports in modules AliasDomain, EmailAddress and Handler.
VirtualMailManager/AliasDomain.py
VirtualMailManager/Domain.py
VirtualMailManager/EmailAddress.py
VirtualMailManager/Handler.py
VirtualMailManager/__init__.py
--- a/VirtualMailManager/AliasDomain.py	Fri Apr 16 03:02:34 2010 +0000
+++ b/VirtualMailManager/AliasDomain.py	Fri Apr 16 03:58:07 2010 +0000
@@ -8,8 +8,7 @@
     Virtual Mail Manager's AliasDomain class to manage alias domains.
 """
 
-from VirtualMailManager import check_domainname
-from VirtualMailManager.Domain import Domain
+from VirtualMailManager.Domain import Domain, check_domainname
 from VirtualMailManager.constants.ERROR import \
      ALIASDOMAIN_EXISTS, ALIASDOMAIN_ISDOMAIN, ALIASDOMAIN_NO_DOMDEST, \
      NO_SUCH_ALIASDOMAIN, NO_SUCH_DOMAIN
--- a/VirtualMailManager/Domain.py	Fri Apr 16 03:02:34 2010 +0000
+++ b/VirtualMailManager/Domain.py	Fri Apr 16 03:58:07 2010 +0000
@@ -9,18 +9,21 @@
 """
 
 import os
+import re
+from encodings.idna import ToASCII, ToUnicode
 from random import choice
 
-from VirtualMailManager import check_domainname
 from VirtualMailManager.constants.ERROR import \
      ACCOUNT_AND_ALIAS_PRESENT, ACCOUNT_PRESENT, ALIAS_PRESENT, \
-     DOMAIN_ALIAS_EXISTS, DOMAIN_EXISTS, NO_SUCH_DOMAIN
+     DOMAIN_ALIAS_EXISTS, DOMAIN_EXISTS, DOMAIN_INVALID, DOMAIN_TOO_LONG, \
+     NO_SUCH_DOMAIN
 from VirtualMailManager.errors import DomainError as DomErr
 from VirtualMailManager.Transport import Transport
 
 
 MAILDIR_CHARS = '0123456789abcdefghijklmnopqrstuvwxyz'
-_ = lambda x: x
+RE_DOMAIN = re.compile(r"^(?:[a-z0-9-]{1,63}\.){1,}[a-z]{2,6}$")
+_ = lambda msg: msg
 
 
 class Domain(object):
@@ -318,6 +321,51 @@
         return aliasdomains
 
 
+def ace2idna(domainname):
+    """Converts the domain name `domainname` from ACE according to IDNA."""
+    return u'.'.join([ToUnicode(lbl) for lbl in domainname.split('.') if lbl])
+
+
+def check_domainname(domainname):
+    """Returns the validated domain name `domainname`.
+
+    It also converts the name of the domain from IDN to ASCII, if
+    necessary.
+
+    Throws an `DomainError`, if the domain name is too long or doesn't
+    look like a valid domain name (label.label.label).
+
+    """
+    if not RE_DOMAIN.match(domainname):
+        domainname = idn2ascii(domainname)
+    if len(domainname) > 255:
+        raise DomErr(_(u'The domain name is too long'), DOMAIN_TOO_LONG)
+    if not RE_DOMAIN.match(domainname):
+        raise DomErr(_(u"The domain name '%s' is invalid") % domainname,
+                     DOMAIN_INVALID)
+    return domainname
+
+
+def get_gid(dbh, domainname):
+    """Returns the group id of the domain *domainname*.
+
+    If the domain couldn't be found in the database 0 will be returned.
+    """
+    domainname = check_domainname(domainname)
+    dbc = dbh.cursor()
+    dbc.execute('SELECT gid FROM domain_name WHERE domainname=%s', domainname)
+    gid = dbc.fetchone()
+    dbc.close()
+    if gid:
+        return gid[0]
+    return 0
+
+
+def idn2ascii(domainname):
+    """Converts the idn domain name `domainname` into punycode."""
+    return '.'.join([ToASCII(lbl) for lbl in domainname.split('.') if lbl])
+
+
 def search(dbh, pattern=None, like=False):
     """'Search' for domains by *pattern* in the database.
 
@@ -374,19 +422,4 @@
     return gids, domains
 
 
-def get_gid(dbh, domainname):
-    """Returns the group id of the domain *domainname*.
-
-    If the domain couldn't be found in the database 0 will be returned.
-    """
-    domainname = check_domainname(domainname)
-    dbc = dbh.cursor()
-    dbc.execute('SELECT gid FROM domain_name WHERE domainname=%s', domainname)
-    gid = dbc.fetchone()
-    dbc.close()
-    if gid:
-        return gid[0]
-    return 0
-
-
 del _
--- a/VirtualMailManager/EmailAddress.py	Fri Apr 16 03:02:34 2010 +0000
+++ b/VirtualMailManager/EmailAddress.py	Fri Apr 16 03:58:07 2010 +0000
@@ -9,7 +9,7 @@
 """
 import re
 
-from VirtualMailManager import check_domainname
+from VirtualMailManager.Domain import check_domainname
 from VirtualMailManager.constants.ERROR import \
      DOMAIN_NO_NAME, INVALID_ADDRESS, LOCALPART_INVALID, LOCALPART_TOO_LONG
 from VirtualMailManager.errors import EmailAddressError as EAErr
--- a/VirtualMailManager/Handler.py	Fri Apr 16 03:02:34 2010 +0000
+++ b/VirtualMailManager/Handler.py	Fri Apr 16 03:58:07 2010 +0000
@@ -21,12 +21,12 @@
 from pyPgSQL import PgSQL  # python-pgsql - http://pypgsql.sourceforge.net
 
 import VirtualMailManager.constants.ERROR as ERR
-from VirtualMailManager import ENCODING, ace2idna, exec_ok
+from VirtualMailManager import ENCODING, exec_ok
 from VirtualMailManager.Account import Account
 from VirtualMailManager.Alias import Alias
 from VirtualMailManager.AliasDomain import AliasDomain
 from VirtualMailManager.Config import Config as Cfg
-from VirtualMailManager.Domain import Domain, get_gid
+from VirtualMailManager.Domain import Domain, ace2idna, get_gid
 from VirtualMailManager.EmailAddress import EmailAddress
 from VirtualMailManager.errors import VMMError, AliasError, DomainError, \
      RelocatedError
--- a/VirtualMailManager/__init__.py	Fri Apr 16 03:02:34 2010 +0000
+++ b/VirtualMailManager/__init__.py	Fri Apr 16 03:58:07 2010 +0000
@@ -10,14 +10,11 @@
 
 import gettext
 import os
-import re
 import locale
 
-from encodings.idna import ToASCII, ToUnicode
 
 from VirtualMailManager.constants.ERROR import \
-     DOMAIN_INVALID, DOMAIN_TOO_LONG, NOT_EXECUTABLE, NO_SUCH_BINARY, \
-     NO_SUCH_DIRECTORY
+     NOT_EXECUTABLE, NO_SUCH_BINARY, NO_SUCH_DIRECTORY
 from VirtualMailManager.constants.version import __author__, __date__, \
      __version__
 from VirtualMailManager.errors import VMMError
@@ -27,8 +24,7 @@
     # version information from VERSION
     '__author__', '__date__', '__version__',
     # defined stuff
-    'ENCODING', 'ace2idna', 'check_domainname', 'exec_ok', 'expand_path',
-    'get_unicode', 'idn2ascii', 'is_dir',
+    'ENCODING', 'exec_ok', 'expand_path', 'get_unicode', 'is_dir',
 ]
 
 
@@ -40,9 +36,6 @@
     locale.setlocale(locale.LC_ALL, 'C')
 ENCODING = locale.nl_langinfo(locale.CODESET)
 
-# there may be many domain and e-mail address checks
-RE_DOMAIN = re.compile(r"^(?:[a-z0-9-]{1,63}\.){1,}[a-z]{2,6}$")
-
 gettext.install('vmm', '/usr/local/share/locale', unicode=1)
 
 
@@ -90,39 +83,9 @@
         raise VMMError(_(u"'%s' is not a file") % get_unicode(binary),
                        NO_SUCH_BINARY)
     if not os.access(binary, os.X_OK):
-        raise VMMError(_(u"File is not executable: '%s'") % 
+        raise VMMError(_(u"File is not executable: '%s'") %
                        get_unicode(binary), NOT_EXECUTABLE)
     return binary
 
 
-def idn2ascii(domainname):
-    """Converts the idn domain name `domainname` into punycode."""
-    return '.'.join([ToASCII(lbl) for lbl in domainname.split('.') if lbl])
-
-
-def ace2idna(domainname):
-    """Converts the domain name `domainname` from ACE according to IDNA."""
-    return u'.'.join([ToUnicode(lbl) for lbl in domainname.split('.') if lbl])
-
-
-def check_domainname(domainname):
-    """Returns the validated domain name `domainname`.
-
-    It also converts the name of the domain from IDN to ASCII, if
-    necessary.
-
-    Throws an `VMMError`, if the domain name is too long or doesn't
-    look like a valid domain name (label.label.label).
-
-    """
-    if not RE_DOMAIN.match(domainname):
-        domainname = idn2ascii(domainname)
-    if len(domainname) > 255:
-        raise VMMError(_(u'The domain name is too long'), DOMAIN_TOO_LONG)
-    if not RE_DOMAIN.match(domainname):
-        raise VMMError(_(u'The domain name %r is invalid') % domainname,
-                       DOMAIN_INVALID)
-    return domainname
-
-
 del _