mirror of
https://github.com/Mikaela/Limnoria.git
synced 2024-11-23 19:19:32 +01:00
Fix email regexp to be RFC-compliant
This commit is contained in:
parent
64b4a61d3a
commit
d6cd8a5427
@ -34,9 +34,50 @@ Simple utility modules.
|
|||||||
import re
|
import re
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
emailRe = re.compile(r"^(\w&.+-]+!)*[\w&.+-]+@"
|
class EmailRe:
|
||||||
r"(([0-9a-z]([0-9a-z-]*[0-9a-z])?\.)[a-z]{2,6}|"
|
"""Fake class used for backward compatibility."""
|
||||||
r"([0-9]{1,3}\.){3}[0-9]{1,3})$", re.I)
|
|
||||||
|
rfc822_specials = '()<>@,;:\\"[]'
|
||||||
|
def match(self, addr):
|
||||||
|
# From http://www.secureprogramming.com/?action=view&feature=recipes&recipeid=1
|
||||||
|
|
||||||
|
# First we validate the name portion (name@domain)
|
||||||
|
c = 0
|
||||||
|
while c < len(addr):
|
||||||
|
if addr[c] == '"' and (not c or addr[c - 1] == '.' or addr[c - 1] == '"'):
|
||||||
|
c = c + 1
|
||||||
|
while c < len(addr):
|
||||||
|
if addr[c] == '"': break
|
||||||
|
if addr[c] == '\\' and addr[c + 1] == ' ':
|
||||||
|
c = c + 2
|
||||||
|
continue
|
||||||
|
if ord(addr[c]) < 32 or ord(addr[c]) >= 127: return 0
|
||||||
|
c = c + 1
|
||||||
|
else: return 0
|
||||||
|
if addr[c] == '@': break
|
||||||
|
if addr[c] != '.': return 0
|
||||||
|
c = c + 1
|
||||||
|
continue
|
||||||
|
if addr[c] == '@': break
|
||||||
|
if ord(addr[c]) <= 32 or ord(addr[c]) >= 127: return 0
|
||||||
|
if addr[c] in self.rfc822_specials: return 0
|
||||||
|
c = c + 1
|
||||||
|
if not c or addr[c - 1] == '.': return 0
|
||||||
|
|
||||||
|
# Next we validate the domain portion (name@domain)
|
||||||
|
domain = c = c + 1
|
||||||
|
if domain >= len(addr): return 0
|
||||||
|
count = 0
|
||||||
|
while c < len(addr):
|
||||||
|
if addr[c] == '.':
|
||||||
|
if c == domain or addr[c - 1] == '.': return 0
|
||||||
|
count = count + 1
|
||||||
|
if ord(addr[c]) <= 32 or ord(addr[c]) >= 127: return 0
|
||||||
|
if addr[c] in self.rfc822_specials: return 0
|
||||||
|
c = c + 1
|
||||||
|
|
||||||
|
return count >= 1
|
||||||
|
emailRe = EmailRe()
|
||||||
|
|
||||||
def getSocket(host):
|
def getSocket(host):
|
||||||
"""Returns a socket of the correct AF_INET type (v4 or v6) in order to
|
"""Returns a socket of the correct AF_INET type (v4 or v6) in order to
|
||||||
|
Loading…
Reference in New Issue
Block a user