iro/validate.py
branchdevel
changeset 126 1ac2439a68b5
parent 125 19b3f383c9ce
child 129 d6704178a18f
--- a/iro/validate.py	Mon Jan 30 06:51:28 2012 +0100
+++ b/iro/validate.py	Mon Jan 30 06:52:46 2012 +0100
@@ -1,10 +1,11 @@
+from twisted.internet import defer
+
 import re
 from decorator import decorator
-
-from twisted.internet import defer
+from inspect import getcallargs
 
-from inspect import getcallargs
-from .error import ValidateException
+from .error import ValidateException, NotATelNumber, InvalidMail
+from .telnumber import Telnumber
 
 def vBool(value, field):
     '''Validator for boolean values'''
@@ -29,10 +30,70 @@
     return value
 
 def vTel(value,field):
-    return value
+    '''Validator for Telefonnumbers'''
+    ret = []
+    for v in value:
+        try:
+            ret.append(Telnumber(v))
+        except NotATelNumber, e:
+            e.field=field
+            raise e
+    return ret
 
 def vEmail(value, field):
-    return value
+    '''validator for emailadresses (see wikipeda for strange mailadresses and RFC3696)
+    valid:
+    "very.(),:;<>[]\\".VERY.\\"very@\\\ \\"very\\".unusual"@strange.example.com
+    ""@example.org
+    "very.unusual.@.unusual.com"@example.com'
+
+    not valid:
+    Abc.@example.com
+    Abc..123@example.com
+    thisis."notallowed@example.com
+    this\\ still\\"not\\allowed@example.com
+    '''
+    ret = []
+    for v in value:
+        parts= re.match(r'^(.*)@(.+?)$',v)
+        if not parts:
+            raise InvalidMail(v,field)
+        local=parts.group(1)
+        domain=parts.group(2)
+        
+        if not re.match(r'^(\[[0-9\.]{7,16}\]|\[[0-9a-f:]{3,}\]|([a-z0-9+\-%_]+\.)+[a-z]{2,6})$',domain.lower()):
+            raise InvalidMail(v,field)
+       
+        if local == "":
+            continue
+        if local.startswith(".") or local.endswith("."):
+            raise InvalidMail(v,field)
+        unquote = True
+        parts = local.split('"')
+        c=0
+        i=0
+        for part in parts:
+            if unquote and part != "":                     #unquoted is not allowd so much
+                if not re.match(r'^[^\\,\[\];\(\)@<>: ]+$',part) or ".." in part:
+                    raise InvalidMail(v,field)
+            if i == 0:
+                if unquote and part != "" and len(parts) > 1 and part[-1] != '.': #quoted parts must be seperated by a dot
+                    raise InvalidMail(v,field)
+                unquote = not unquote
+                c+=1
+            elif part == ''  or part[-1] != "\\":
+                if unquote  and part != "":         #quoted parts must be seperated by a dot
+                    if part[0] != ".":
+                        raise InvalidMail(v,field)
+                    if i < len(parts)-1 and part[-1] != '.':
+                        raise InvalidMail(v,field)
+                unquote = not unquote
+                c += 1
+            i += 1
+        if c%2 == 0 and c > 1:                        #no single quote allowed
+            raise InvalidMail(v,field)
+        ret.append(v)
+    return ret
 
 def validate(kwd,func, need=True,*args,**kargs):
     '''validate decorator