mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Add optional error message to pattern validator
The pattern validator by default displays the pattern that is being matched against. This isn't helpful, particularly for very hairy patterns. This adds a new parameter, pattern_errmsg, that is displayed on errors if set. ticket #11
This commit is contained in:
@@ -1082,6 +1082,7 @@ class Data(Param):
|
||||
('maxlength', int, None),
|
||||
('length', int, None),
|
||||
('pattern', (basestring,), None),
|
||||
('pattern_errmsg', (basestring,), None),
|
||||
)
|
||||
|
||||
def __init__(self, name, *rules, **kw):
|
||||
@@ -1123,9 +1124,12 @@ class Data(Param):
|
||||
"""
|
||||
assert type(value) is self.type
|
||||
if self.re.match(value) is None:
|
||||
return _('must match pattern "%(pattern)s"') % dict(
|
||||
pattern=self.pattern,
|
||||
)
|
||||
if self.re_errmsg:
|
||||
return self.re_errmsg % dict(pattern=self.pattern,)
|
||||
else:
|
||||
return _('must match pattern "%(pattern)s"') % dict(
|
||||
pattern=self.pattern,
|
||||
)
|
||||
|
||||
|
||||
class Bytes(Data):
|
||||
@@ -1148,6 +1152,7 @@ class Bytes(Data):
|
||||
self.re = None
|
||||
else:
|
||||
self.re = re.compile(kw['pattern'])
|
||||
self.re_errmsg = kw.get('pattern_errmsg', None)
|
||||
super(Bytes, self).__init__(name, *rules, **kw)
|
||||
|
||||
def _rule_minlength(self, _, value):
|
||||
@@ -1201,6 +1206,7 @@ class Str(Data):
|
||||
self.re = None
|
||||
else:
|
||||
self.re = re.compile(kw['pattern'], re.UNICODE)
|
||||
self.re_errmsg = kw.get('pattern_errmsg', None)
|
||||
super(Str, self).__init__(name, *rules, **kw)
|
||||
|
||||
def _convert_scalar(self, value, index=None):
|
||||
|
||||
@@ -89,6 +89,9 @@ class group(LDAPObject):
|
||||
|
||||
takes_params = (
|
||||
Str('cn',
|
||||
pattern='^[a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?$',
|
||||
pattern_errmsg='may only include letters, numbers, _, -, . and $',
|
||||
maxlength=33,
|
||||
cli_name='name',
|
||||
label=_('Group name'),
|
||||
primary_key=True,
|
||||
|
||||
@@ -72,6 +72,9 @@ class user(LDAPObject):
|
||||
|
||||
takes_params = (
|
||||
Str('uid',
|
||||
pattern='^[a-zA-Z0-9_.][a-zA-Z0-9_.-]{0,30}[a-zA-Z0-9_.$-]?$',
|
||||
pattern_errmsg='may only include letters, numbers, _, -, . and $',
|
||||
maxlength=33,
|
||||
cli_name='login',
|
||||
label=_('User login'),
|
||||
primary_key=True,
|
||||
|
||||
@@ -28,6 +28,9 @@ from xmlrpc_test import Declarative, fuzzy_digits, fuzzy_uuid
|
||||
group1 = u'testgroup1'
|
||||
group2 = u'testgroup2'
|
||||
|
||||
invalidgroup1=u'+tgroup1'
|
||||
invalidgroup2=u'tgroup1234567890123456789012345678901234567890'
|
||||
|
||||
|
||||
class test_group(Declarative):
|
||||
cleanup_commands = [
|
||||
@@ -511,4 +514,18 @@ class test_group(Declarative):
|
||||
expected=errors.NotFound(reason='no such entry'),
|
||||
),
|
||||
|
||||
dict(
|
||||
desc='Test an invalid group name %r' % invalidgroup1,
|
||||
command=('group_add', [invalidgroup1], dict(description=u'Test')),
|
||||
expected=errors.ValidationError(name='cn', error='may only include letters, numbers, _, -, . and $'),
|
||||
),
|
||||
|
||||
|
||||
dict(
|
||||
desc='Test a group name that is too long %r' % invalidgroup2,
|
||||
command=('group_add', [invalidgroup2], dict(description=u'Test')),
|
||||
expected=errors.ValidationError(name='cn', error='can be at most 33 characters'),
|
||||
),
|
||||
|
||||
|
||||
]
|
||||
|
||||
@@ -31,6 +31,9 @@ from xmlrpc_test import Declarative, fuzzy_digits, fuzzy_uuid
|
||||
user_memberof = (u'cn=ipausers,cn=groups,cn=accounts,%s' % api.env.basedn,)
|
||||
user1=u'tuser1'
|
||||
|
||||
invaliduser1=u'+tuser1'
|
||||
invaliduser2=u'tuser1234567890123456789012345678901234567890'
|
||||
|
||||
|
||||
class test_user(Declarative):
|
||||
|
||||
@@ -78,6 +81,7 @@ class test_user(Declarative):
|
||||
objectclass=objectclasses.user,
|
||||
sn=[u'User1'],
|
||||
uid=[user1],
|
||||
uidnumber=[fuzzy_digits],
|
||||
ipauniqueid=[fuzzy_uuid],
|
||||
dn=u'uid=tuser1,cn=users,cn=accounts,' + api.env.basedn,
|
||||
),
|
||||
@@ -183,6 +187,8 @@ class test_user(Declarative):
|
||||
sn=[u'Administrator'],
|
||||
uid=[u'admin'],
|
||||
memberof_group=[u'admins'],
|
||||
memberof_rolegroup=[u'replicaadmin'],
|
||||
memberof_taskgroup=[u'managereplica', u'deletereplica'],
|
||||
),
|
||||
dict(
|
||||
dn=u'uid=tuser1,cn=users,cn=accounts,' + api.env.basedn,
|
||||
@@ -299,4 +305,17 @@ class test_user(Declarative):
|
||||
),
|
||||
|
||||
|
||||
dict(
|
||||
desc='Test an invalid login name %r' % invaliduser1,
|
||||
command=('user_add', [invaliduser1], dict(givenname=u'Test', sn=u'User1')),
|
||||
expected=errors.ValidationError(name='uid', error='may only include letters, numbers, _, -, . and $'),
|
||||
),
|
||||
|
||||
|
||||
dict(
|
||||
desc='Test a login name that is too long %r' % invaliduser2,
|
||||
command=('user_add', [invaliduser2], dict(givenname=u'Test', sn=u'User1')),
|
||||
expected=errors.ValidationError(name='uid', error='can be at most 33 characters'),
|
||||
),
|
||||
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user