fix: allow one-char username on signup (#1378)

This commit is contained in:
taoso
2026-03-27 01:36:54 +08:00
committed by GitHub
parent 724c41cb7a
commit dc6558522e
6 changed files with 8 additions and 6 deletions

View File

@@ -1,7 +1,7 @@
package dto package dto
type SignUpDto struct { type SignUpDto struct {
Username string `json:"username" binding:"required,username,min=2,max=50" unorm:"nfc"` Username string `json:"username" binding:"required,username,min=1,max=50" unorm:"nfc"`
Email *string `json:"email" binding:"omitempty,email" unorm:"nfc"` Email *string `json:"email" binding:"omitempty,email" unorm:"nfc"`
FirstName string `json:"firstName" binding:"max=50" unorm:"nfc"` FirstName string `json:"firstName" binding:"max=50" unorm:"nfc"`
LastName string `json:"lastName" binding:"max=50" unorm:"nfc"` LastName string `json:"lastName" binding:"max=50" unorm:"nfc"`

View File

@@ -23,7 +23,7 @@ type UserDto struct {
} }
type UserCreateDto struct { type UserCreateDto struct {
Username string `json:"username" binding:"required,username,min=2,max=50" unorm:"nfc"` Username string `json:"username" binding:"required,username,min=1,max=50" unorm:"nfc"`
Email *string `json:"email" binding:"omitempty,email" unorm:"nfc"` Email *string `json:"email" binding:"omitempty,email" unorm:"nfc"`
EmailVerified bool `json:"emailVerified"` EmailVerified bool `json:"emailVerified"`
FirstName string `json:"firstName" binding:"max=50" unorm:"nfc"` FirstName string `json:"firstName" binding:"max=50" unorm:"nfc"`

View File

@@ -13,7 +13,8 @@ import (
// [a-zA-Z0-9] : The username must start with an alphanumeric character // [a-zA-Z0-9] : The username must start with an alphanumeric character
// [a-zA-Z0-9_.@-]* : The rest of the username can contain alphanumeric characters, dots, underscores, hyphens, and "@" symbols // [a-zA-Z0-9_.@-]* : The rest of the username can contain alphanumeric characters, dots, underscores, hyphens, and "@" symbols
// [a-zA-Z0-9]$ : The username must end with an alphanumeric character // [a-zA-Z0-9]$ : The username must end with an alphanumeric character
var validateUsernameRegex = regexp.MustCompile("^[a-zA-Z0-9][a-zA-Z0-9_.@-]*[a-zA-Z0-9]$") // (...)? : This allows single-character usernames (just one alphanumeric character)
var validateUsernameRegex = regexp.MustCompile("^[a-zA-Z0-9]([a-zA-Z0-9_.@-]*[a-zA-Z0-9])?$")
var validateClientIDRegex = regexp.MustCompile("^[a-zA-Z0-9._-]+$") var validateClientIDRegex = regexp.MustCompile("^[a-zA-Z0-9._-]+$")

View File

@@ -20,6 +20,7 @@ func TestValidateUsername(t *testing.T) {
{"starts with symbol", ".username", false}, {"starts with symbol", ".username", false},
{"ends with non-alphanumeric", "username-", false}, {"ends with non-alphanumeric", "username-", false},
{"contains space", "user name", false}, {"contains space", "user name", false},
{"valid single char", "a", true},
{"empty", "", false}, {"empty", "", false},
{"only special chars", "-._@", false}, {"only special chars", "-._@", false},
{"valid long", "a1234567890_b.c-d@e", true}, {"valid long", "a1234567890_b.c-d@e", true},

View File

@@ -31,7 +31,7 @@ export const callbackUrlSchema = z
export const usernameSchema = z export const usernameSchema = z
.string() .string()
.min(2) .min(1)
.max(30) .max(30)
.regex(/^[a-zA-Z0-9]/, m.username_must_start_with()) .regex(/^[a-zA-Z0-9]/, m.username_must_start_with())
.regex(/[a-zA-Z0-9]$/, m.username_must_end_with()) .regex(/[a-zA-Z0-9]$/, m.username_must_end_with())

View File

@@ -66,7 +66,7 @@ test('Change Locale', async ({ page }) => {
// Check if the validation messages are translated because they are provided by Zod // Check if the validation messages are translated because they are provided by Zod
await page.getByRole('textbox', { name: 'Gebruikersnaam' }).fill(''); await page.getByRole('textbox', { name: 'Gebruikersnaam' }).fill('');
await page.getByRole('button', { name: 'Opslaan' }).click(); await page.getByRole('button', { name: 'Opslaan' }).click();
await expect(page.getByText('Te kort: verwacht dat string >=2 tekens heeft')).toBeVisible(); await expect(page.getByText('Te kort: verwacht dat string >=1 tekens heeft')).toBeVisible();
// Clear all cookies and sign in again to check if the language is still set to Dutch // Clear all cookies and sign in again to check if the language is still set to Dutch
await page.context().clearCookies(); await page.context().clearCookies();
@@ -76,7 +76,7 @@ test('Change Locale', async ({ page }) => {
await page.getByRole('textbox', { name: 'Gebruikersnaam' }).fill(''); await page.getByRole('textbox', { name: 'Gebruikersnaam' }).fill('');
await page.getByRole('button', { name: 'Opslaan' }).click(); await page.getByRole('button', { name: 'Opslaan' }).click();
await expect(page.getByText('Te kort: verwacht dat string >=2 tekens heeft')).toBeVisible(); await expect(page.getByText('Te kort: verwacht dat string >=1 tekens heeft')).toBeVisible();
}); });
test('Add passkey to an account', async ({ page }) => { test('Add passkey to an account', async ({ page }) => {