- normalize username and email fields to lowercase, resolves #1740

- add autoComplete attributes to auth flow for easier sign in/sign up
This commit is contained in:
Amruth Pillai
2025-01-12 15:13:11 +01:00
parent 92856b6f06
commit 89a44cc33a
12 changed files with 36 additions and 19 deletions

View File

@ -77,6 +77,7 @@ export const BackupOtpPage = () => {
<Input
pattern="[a-z0-9]{10}"
placeholder="a1b2c3d4e5"
autoComplete="one-time-code"
title={t`Backup Codes may contain only lowercase letters or numbers, and must be exactly 10 characters.`}
{...field}
/>

View File

@ -81,7 +81,7 @@ export const ForgotPasswordPage = () => {
<FormItem>
<FormLabel>{t`Email`}</FormLabel>
<FormControl>
<Input placeholder="john.doe@example.com" {...field} />
<Input placeholder="john.doe@example.com" autoComplete="email" {...field} />
</FormControl>
<FormMessage />
</FormItem>

View File

@ -89,7 +89,12 @@ export const LoginPage = () => {
<FormItem>
<FormLabel>{t`Email`}</FormLabel>
<FormControl>
<Input placeholder="john.doe@example.com" {...field} />
<Input
autoComplete="email"
className="lowercase"
placeholder="john.doe@example.com"
{...field}
/>
</FormControl>
<FormDescription>{t`You can also enter your username.`}</FormDescription>
<FormMessage />
@ -104,7 +109,7 @@ export const LoginPage = () => {
<FormItem>
<FormLabel>{t`Password`}</FormLabel>
<FormControl>
<Input type="password" {...field} />
<Input type="password" autoComplete="password" {...field} />
</FormControl>
<FormDescription>
<Trans>

View File

@ -119,6 +119,7 @@ export const RegisterPage = () => {
<FormLabel>{t`Username`}</FormLabel>
<FormControl>
<Input
className="lowercase"
placeholder={t({
message: "john.doe",
context:
@ -140,6 +141,7 @@ export const RegisterPage = () => {
<FormLabel>{t`Email`}</FormLabel>
<FormControl>
<Input
className="lowercase"
placeholder={t({
message: "john.doe@example.com",
context:

View File

@ -82,7 +82,7 @@ export const ResetPasswordPage = () => {
<FormItem>
<FormLabel>{t`Password`}</FormLabel>
<FormControl>
<Input type="password" {...field} />
<Input type="password" autoComplete="new-password" {...field} />
</FormControl>
<FormDescription>
<Trans>

View File

@ -81,7 +81,7 @@ export const VerifyOtpPage = () => {
<FormItem>
<FormLabel>{t`One-Time Password`}</FormLabel>
<FormControl>
<Input placeholder="123456" {...field} />
<Input placeholder="123456" autoComplete="one-time-code" {...field} />
</FormControl>
<FormMessage />
</FormItem>

View File

@ -151,7 +151,7 @@ export const AccountSettings = () => {
<FormItem>
<FormLabel>{t`Name`}</FormLabel>
<FormControl>
<Input {...field} />
<Input autoComplete="name" {...field} />
</FormControl>
<FormMessage />
</FormItem>
@ -165,7 +165,7 @@ export const AccountSettings = () => {
<FormItem>
<FormLabel>{t`Username`}</FormLabel>
<FormControl>
<Input {...field} />
<Input autoComplete="username" className="lowercase" {...field} />
</FormControl>
<FormMessage />
</FormItem>
@ -179,7 +179,7 @@ export const AccountSettings = () => {
<FormItem>
<FormLabel>{t`Email`}</FormLabel>
<FormControl>
<Input type="email" {...field} />
<Input type="email" autoComplete="email" className="lowercase" {...field} />
</FormControl>
<FormDescription
className={cn(

View File

@ -84,7 +84,7 @@ export const SecuritySettings = () => {
<FormItem>
<FormLabel>{t`New Password`}</FormLabel>
<FormControl>
<Input type="password" {...field} />
<Input type="password" autoComplete="new-password" {...field} />
</FormControl>
</FormItem>
)}
@ -97,7 +97,7 @@ export const SecuritySettings = () => {
<FormItem>
<FormLabel>{t`Confirm New Password`}</FormLabel>
<FormControl>
<Input type="password" {...field} />
<Input type="password" autoComplete="new-password" {...field} />
</FormControl>
{fieldState.error && (
<FormDescription className="text-error-foreground">

View File

@ -9,9 +9,9 @@ type Statistic = {
export const StatisticsSection = () => {
const stats: Statistic[] = [
{ name: t`GitHub Stars`, value: 19_500 },
{ name: t`Users Signed Up`, value: 500_000 },
{ name: t`Resumes Generated`, value: 700_000 },
{ name: t`GitHub Stars`, value: 27_000 },
{ name: t`Users Signed Up`, value: 650_000 },
{ name: t`Resumes Generated`, value: 840_000 },
];
return (

View File

@ -5,7 +5,7 @@ import { usernameSchema } from "../user";
export const loginSchema = z
.object({
identifier: z.string(),
identifier: z.string().transform((value) => value.toLowerCase()),
password: z.password().min(6),
})
.refine(

View File

@ -8,17 +8,20 @@ export const usernameSchema = z
.string()
.min(3)
.max(255)
.regex(/^[\d._a-z-]+$/, {
message:
"Usernames can only contain lowercase letters, numbers, periods, hyphens, and underscores.",
});
.regex(/^[\w.-]+$/, {
message: "Usernames can only contain letters, numbers, periods, hyphens, and underscores.",
})
.transform((value) => value.toLowerCase());
export const userSchema = z.object({
id: idSchema,
name: z.string().min(1).max(255),
picture: z.literal("").or(z.null()).or(z.string().url()),
username: usernameSchema,
email: z.string().email(),
email: z
.string()
.email()
.transform((value) => value.toLowerCase()),
locale: z.string().default("en-US"),
emailVerified: z.boolean().default(false),
twoFactorEnabled: z.boolean().default(false),

View File

@ -0,0 +1,6 @@
-- This migration normalizes the username and email fields for all users,
-- ensuring that they are stored in lowercase.
UPDATE "User"
SET username = LOWER(username),
email = LOWER(email);