diff --git a/server/mergin/auth/forms.py b/server/mergin/auth/forms.py index b4c2a14d..b45638eb 100644 --- a/server/mergin/auth/forms.py +++ b/server/mergin/auth/forms.py @@ -15,7 +15,7 @@ EqualTo, ) -from .models import User +from .models import MAX_USERNAME_LENGTH, User from ..app import UpdateForm, CustomStringField @@ -87,7 +87,10 @@ class LoginForm(FlaskForm): class RegisterUserForm(FlaskForm): username = CustomStringField( "Username", - validators=[validators.Length(min=4, max=25), username_validation], + validators=[ + validators.Length(min=4, max=MAX_USERNAME_LENGTH), + username_validation, + ], ) email = CustomStringField( "Email Address", diff --git a/server/mergin/auth/models.py b/server/mergin/auth/models.py index e580e814..31499ad3 100644 --- a/server/mergin/auth/models.py +++ b/server/mergin/auth/models.py @@ -14,6 +14,8 @@ from ..sync.models import ProjectUser from ..sync.utils import get_user_agent, get_ip, get_device_id, is_reserved_word +MAX_USERNAME_LENGTH = 50 + class User(db.Model): id = db.Column(db.Integer, primary_key=True) @@ -203,8 +205,8 @@ def generate_username(cls, email: str) -> Optional[str]: ).ljust(4, "0") # additional check for reserved words username = f"{username}0" if is_reserved_word(username) else username - # some value until 25 + space for suffix - username = username[:22] + # keep some space for suffix + username = username[: MAX_USERNAME_LENGTH - 3] # check if we already do not have existing usernames query = db.session.execute( text( diff --git a/server/mergin/tests/test_auth.py b/server/mergin/tests/test_auth.py index c8b9a682..a5217f6a 100644 --- a/server/mergin/tests/test_auth.py +++ b/server/mergin/tests/test_auth.py @@ -851,10 +851,13 @@ def test_username_generation(client): user = add_user("support1", "user") assert User.generate_username("support@example.com") == "support0" - assert ( - User.generate_username("verylonglonglonglonglong@example.com") - == "verylonglonglonglonglo" - ) + + # test long emails + username = "a" * 25 + assert User.generate_username(f"{username}@example.com") == username + # shortened version + username = "a" * 50 + assert User.generate_username(f"{username}@example.com") == username[:47] # test username generation with existing user, case insensitive user = add_user("Testuser")