Adjust minimum username length to 2 characters (#2746)
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 4 Dec 2025 09:44:07 +0000 (10:44 +0100)
committerGitHub <noreply@github.com>
Thu, 4 Dec 2025 09:44:07 +0000 (10:44 +0100)
music_assistant/controllers/webserver/auth.py
music_assistant/controllers/webserver/controller.py
tests/test_webserver_auth.py

index 9eda61c950f435dcd7a527be8c81412bcb7e1e89..4a5fa73835c268f71975d0a8f54f209c90df2cdd 100644 (file)
@@ -1165,7 +1165,7 @@ class AuthenticationManager:
         """
         Create a new user with built-in authentication (admin only).
 
-        :param username: The username (minimum 3 characters).
+        :param username: The username (minimum 2 characters).
         :param password: The password (minimum 8 characters).
         :param role: User role - "admin" or "user" (default: "user").
         :param display_name: Optional display name.
@@ -1175,8 +1175,8 @@ class AuthenticationManager:
         :return: Created user object.
         """
         # Validation
-        if not username or len(username) < 3:
-            raise InvalidDataError("Username must be at least 3 characters")
+        if not username or len(username) < 2:
+            raise InvalidDataError("Username must be at least 2 characters")
 
         if not password or len(password) < 8:
             raise InvalidDataError("Password must be at least 8 characters")
index 6a6ea1f44f9e937f5d53387fab37d2bfd4c4e6e7..fb87b48325c42ab358ce2bbb786fdee8dc8ef33f 100644 (file)
@@ -1011,9 +1011,9 @@ class WebserverController(CoreController):
         display_name = body.get("display_name")
 
         # Validation
-        if not username or len(username) < 3:
+        if not username or len(username) < 2:
             return web.json_response(
-                {"success": False, "error": "Username must be at least 3 characters"}, status=400
+                {"success": False, "error": "Username must be at least 2 characters"}, status=400
             )
 
         if not password or len(password) < 8:
index ae579e8ac3a14f10277fd07e7680a2e12a928870..fe22434e9bedaff4a944329da04a2f66165c115a 100644 (file)
@@ -617,12 +617,19 @@ async def test_create_user_api_validation(auth_manager: AuthenticationManager) -
     set_current_user(admin)
 
     # Test username too short
-    with pytest.raises(InvalidDataError, match="Username must be at least 3 characters"):
+    with pytest.raises(InvalidDataError, match="Username must be at least 2 characters"):
         await auth_manager.create_user_with_api(
-            username="ab",
+            username="a",
             password="password123",
         )
 
+    # Test 2-character username is accepted (minimum allowed)
+    user_2char = await auth_manager.create_user_with_api(
+        username="ab",
+        password="password123",
+    )
+    assert user_2char.username == "ab"
+
     # Test password too short
     with pytest.raises(InvalidDataError, match="Password must be at least 8 characters"):
         await auth_manager.create_user_with_api(