From 1ff58dbe2d2803194db1ef2a6997765b115ce588 Mon Sep 17 00:00:00 2001 From: Herman Snevajs Date: Tue, 23 May 2023 22:43:44 +0200 Subject: [PATCH 1/2] custom field class that filters whitespaces --- server/mergin/app.py | 12 ++++++++++++ server/mergin/auth/forms.py | 22 ++++++++-------------- server/mergin/tests/test_auth.py | 3 ++- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/server/mergin/app.py b/server/mergin/app.py index cb5edad0..463bf2d3 100644 --- a/server/mergin/app.py +++ b/server/mergin/app.py @@ -18,6 +18,7 @@ from flask_mail import Mail from connexion.apps.flask_app import FlaskJSONEncoder from flask_wtf import FlaskForm +from wtforms import StringField from pathlib import Path import sys import time @@ -433,3 +434,14 @@ class ResponseError: def to_dict(self) -> Dict: return dict(code=self.code, detail=self.detail + f" ({self.code})") + +def whitespace_filter(obj): + return obj.strip() if isinstance(obj, str) else obj + +class CustomStringField(StringField): + """ Custom class for string form fields """ + def __init__(self, *args, **kwargs): + filters = kwargs.get("filters") + # add whitespace filter + kwargs["filters"] = (*filters, whitespace_filter) if filters else (whitespace_filter, ) + super().__init__(*args, **kwargs) \ No newline at end of file diff --git a/server/mergin/auth/forms.py b/server/mergin/auth/forms.py index 17937b2e..fbe027af 100644 --- a/server/mergin/auth/forms.py +++ b/server/mergin/auth/forms.py @@ -16,11 +16,7 @@ ) from .models import User -from ..app import UpdateForm - - -def whitespace_filter(obj): - return obj.strip() if isinstance(obj, str) else obj +from ..app import UpdateForm, CustomStringField def username_validation(form, field): @@ -51,20 +47,18 @@ def __call__(self, form, field): class LoginForm(FlaskForm): """Form with username and password fields for user to sign in.""" - login = StringField(validators=[DataRequired(), Length(max=80)]) + login = CustomStringField(validators=[DataRequired(), Length(max=80)]) password = PasswordField(validators=[DataRequired()]) class RegisterUserForm(FlaskForm): - username = StringField( + username = CustomStringField( "Username", validators=[validators.Length(min=4, max=25), username_validation], - filters=(whitespace_filter,), ) email = StringField( "Email Address", validators=[DataRequired(), Email()], - filters=(whitespace_filter,), ) def validate(self): @@ -85,8 +79,8 @@ def validate(self): class ResetPasswordForm(FlaskForm): - email = StringField( - "Email Address", [DataRequired(), Email()], filters=(whitespace_filter,) + email = CustomStringField( + "Email Address", [DataRequired(), Email()], ) @@ -119,9 +113,9 @@ class UserProfileDataForm(UpdateForm): """This form is for user profile update""" receive_notifications = BooleanField("Receive notifications", [Optional()]) - first_name = StringField("First Name", [Optional()], filters=(whitespace_filter,)) - last_name = StringField("Last Name", [Optional()], filters=(whitespace_filter,)) - email = StringField("Email", [Optional(), Email()], filters=(whitespace_filter,)) + first_name = CustomStringField("First Name", [Optional()]) + last_name = CustomStringField("Last Name", [Optional()]) + email = CustomStringField("Email", [Optional(), Email()]) class ApiLoginForm(LoginForm): diff --git a/server/mergin/tests/test_auth.py b/server/mergin/tests/test_auth.py index 2455efae..4eb0466c 100644 --- a/server/mergin/tests/test_auth.py +++ b/server/mergin/tests/test_auth.py @@ -24,9 +24,10 @@ def client(app): return client -# login tests: success, success with email login, invalid password, missing password, wrong headers +# login tests: success, success with trailing space, success with email login, invalid password, missing password, wrong headers test_login_data = [ ({"login": "mergin", "password": "ilovemergin"}, json_headers, 200), + ({"login": "mergin ", "password": "ilovemergin"}, json_headers, 200), ({"login": "mergin@mergin.com", "password": "ilovemergin"}, json_headers, 200), ({"login": "mergin", "password": "ilovemergi"}, json_headers, 401), ({"login": "mergin"}, json_headers, 401), From 3a234db40a6476efc501f901282ba89fec602000 Mon Sep 17 00:00:00 2001 From: Herman Snevajs Date: Wed, 24 May 2023 10:55:23 +0200 Subject: [PATCH 2/2] custom field in user registration email --- server/mergin/auth/forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/mergin/auth/forms.py b/server/mergin/auth/forms.py index fbe027af..9bfe28c0 100644 --- a/server/mergin/auth/forms.py +++ b/server/mergin/auth/forms.py @@ -56,7 +56,7 @@ class RegisterUserForm(FlaskForm): "Username", validators=[validators.Length(min=4, max=25), username_validation], ) - email = StringField( + email = CustomStringField( "Email Address", validators=[DataRequired(), Email()], )