mirror of
https://github.com/pocket-id/pocket-id.git
synced 2026-03-27 09:46:36 +00:00
fix: allow one-char username on signup (#1378)
This commit is contained in:
@@ -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"`
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|||||||
@@ -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._-]+$")
|
||||||
|
|
||||||
|
|||||||
@@ -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},
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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 }) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user