Skip to content

Commit

Permalink
Set reasonable defaults for username lengths
Browse files Browse the repository at this point in the history
Signed-off-by: Aurélien Bompard <aurelien@bompard.org>
  • Loading branch information
abompard committed Dec 10, 2021
1 parent 5d72ba6 commit f53e7a9
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 3 deletions.
5 changes: 3 additions & 2 deletions noggin/form/register_user.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from flask_babel import lazy_gettext as _
from wtforms import BooleanField, HiddenField, PasswordField, StringField
from wtforms.fields.html5 import EmailField
from wtforms.validators import DataRequired, EqualTo
from wtforms.validators import DataRequired, EqualTo, Length

from noggin.form.validators import Email, PasswordLength, username_format
from noggin.form.validators import Email, PasswordLength, StopOnError, username_format

from .base import BaseForm, ModestForm, strip, SubmitButtonField

Expand All @@ -25,6 +25,7 @@ class RegisterUserForm(ModestForm):
_('Username'),
validators=[
DataRequired(message=_('User name must not be empty')),
StopOnError(Length(min=3, max=32)),
username_format,
],
filters=[strip],
Expand Down
13 changes: 12 additions & 1 deletion noggin/form/validators.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from flask import current_app
from flask_babel import lazy_gettext as _
from wtforms.validators import Email as WTFormsEmailValidator
from wtforms.validators import Length, Regexp, ValidationError
from wtforms.validators import Length, Regexp, StopValidation, ValidationError


class Email(WTFormsEmailValidator):
Expand Down Expand Up @@ -41,3 +41,14 @@ def username_format(form, field):
chars="\", \"".join(current_app.config["ALLOWED_USERNAME_HUMAN"]),
),
)(form, field)


class StopOnError:
def __init__(self, validator):
self.validator = validator

def __call__(self, form, field):
try:
self.validator(form, field)
except ValidationError as e:
raise StopValidation(str(e))
21 changes: 21 additions & 0 deletions noggin/tests/unit/controller/test_registration.py
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,27 @@ def test_step_1_registration_closed(
assert len(outbox) == 0


@pytest.mark.parametrize(
"username", ["a", "ab", "a" * 33]
)
@pytest.mark.vcr()
def test_step_1_bad_length(client, post_data_step_1, mocker, username):
"""Try to register a user with a username that has a bad length"""
post_data_step_1["register-username"] = username
record_signal = mocker.Mock()
with mailer.record_messages() as outbox, stageuser_created.connected_to(
record_signal
):
result = client.post('/', data=post_data_step_1)
assert_form_field_error(
result,
"register-username",
"Field must be between 3 and 32 characters long.",
)
record_signal.assert_not_called()
assert len(outbox) == 0


@pytest.mark.parametrize(
"username", ["dummy_user", "dummy.user", "dummy user", "_dummy", ".dummy", "dummy-"]
)
Expand Down

0 comments on commit f53e7a9

Please sign in to comment.