pooling EmailOption, UsernameOption and FilenameOption
This commit is contained in:
parent
4e8d780929
commit
a14e156a63
|
@ -143,10 +143,11 @@ def test_email():
|
||||||
od = OptionDescription('a', '', [e])
|
od = OptionDescription('a', '', [e])
|
||||||
c = Config(od)
|
c = Config(od)
|
||||||
c.read_write()
|
c.read_write()
|
||||||
c.e = 'root@foo.com'
|
c.e = u'foo-bar.baz@example.com'
|
||||||
raises(ValueError, "c.e = 'root'")
|
c.e = u'root@foo.com'
|
||||||
raises(ValueError, "c.e = 'root@domain'")
|
c.e = u'root@domain'
|
||||||
raises(ValueError, "c.e = 'root[]@domain'")
|
raises(ValueError, "c.e = u'root'")
|
||||||
|
raises(ValueError, "c.e = u'root[]@domain'")
|
||||||
|
|
||||||
|
|
||||||
def test_url():
|
def test_url():
|
||||||
|
|
|
@ -543,30 +543,6 @@ class DomainnameOption(Option):
|
||||||
return _valid_char(value)
|
return _valid_char(value)
|
||||||
|
|
||||||
|
|
||||||
class EmailOption(DomainnameOption):
|
|
||||||
__slots__ = tuple()
|
|
||||||
username_re = re.compile(r"^[\w!#$%&'*+\-/=?^`{|}~.]+$")
|
|
||||||
_display_name = _('email address')
|
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
|
||||||
err = self._impl_valid_unicode(value)
|
|
||||||
if err:
|
|
||||||
return err
|
|
||||||
splitted = value.split('@', 1)
|
|
||||||
if len(splitted) == 1:
|
|
||||||
return ValueError(_('must contains one @'))
|
|
||||||
username, domain = value.split('@', 1)
|
|
||||||
if not self.username_re.search(username):
|
|
||||||
return ValueError(_('invalid username in email address')) # pragma: optional cover
|
|
||||||
err = super(EmailOption, self)._validate(domain)
|
|
||||||
if err:
|
|
||||||
return err
|
|
||||||
return super(EmailOption, self)._second_level_validation(domain, False)
|
|
||||||
|
|
||||||
def _second_level_validation(self, value, warnings_only):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class URLOption(DomainnameOption):
|
class URLOption(DomainnameOption):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
proto_re = re.compile(r'(http|https)://')
|
proto_re = re.compile(r'(http|https)://')
|
||||||
|
@ -614,30 +590,32 @@ class URLOption(DomainnameOption):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class UsernameOption(Option):
|
class _RegexpOption(Option):
|
||||||
|
__slots__ = tuple()
|
||||||
|
def _validate(self, value, context=undefined, current_opt=undefined):
|
||||||
|
err = self._impl_valid_unicode(value)
|
||||||
|
if err:
|
||||||
|
return err
|
||||||
|
match = self._regexp.search(value)
|
||||||
|
if not match:
|
||||||
|
return ValueError()
|
||||||
|
|
||||||
|
|
||||||
|
class EmailOption(_RegexpOption):
|
||||||
|
__slots__ = tuple()
|
||||||
|
#https://www.w3.org/TR/html-markup/input.email.html#input.email.attrs.value.single.
|
||||||
|
_regexp = re.compile(r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$")
|
||||||
|
_display_name = _('email address')
|
||||||
|
|
||||||
|
|
||||||
|
class UsernameOption(_RegexpOption):
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
#regexp build with 'man 8 adduser' informations
|
#regexp build with 'man 8 adduser' informations
|
||||||
username_re = re.compile(r"^[a-z_][a-z0-9_-]{0,30}[$a-z0-9_-]{0,1}$")
|
_regexp = re.compile(r"^[a-z_][a-z0-9_-]{0,30}[$a-z0-9_-]{0,1}$")
|
||||||
_display_name = _('username')
|
_display_name = _('username')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
|
||||||
err = self._impl_valid_unicode(value)
|
|
||||||
if err:
|
|
||||||
return err
|
|
||||||
match = self.username_re.search(value)
|
|
||||||
if not match:
|
|
||||||
return ValueError() # pragma: optional cover
|
|
||||||
|
|
||||||
|
class FilenameOption(_RegexpOption):
|
||||||
class FilenameOption(Option):
|
|
||||||
__slots__ = tuple()
|
__slots__ = tuple()
|
||||||
path_re = re.compile(r"^[a-zA-Z0-9\-\._~/+]+$")
|
_regexp = re.compile(r"^[a-zA-Z0-9\-\._~/+]+$")
|
||||||
_display_name = _('file name')
|
_display_name = _('file name')
|
||||||
|
|
||||||
def _validate(self, value, context=undefined, current_opt=undefined):
|
|
||||||
err = self._impl_valid_unicode(value)
|
|
||||||
if err:
|
|
||||||
return err
|
|
||||||
match = self.path_re.search(value)
|
|
||||||
if not match:
|
|
||||||
return ValueError('some characters are not allowed') # pragma: optional cover
|
|
||||||
|
|
Loading…
Reference in New Issue