Skip to content

Commit

Permalink
- normalize username and email fields to lowercase, resolves #1740
Browse files Browse the repository at this point in the history
- add autoComplete attributes to auth flow for easier sign in/sign up
  • Loading branch information
AmruthPillai committed Jan 12, 2025
1 parent 92856b6 commit 89a44cc
Show file tree
Hide file tree
Showing 12 changed files with 36 additions and 19 deletions.
1 change: 1 addition & 0 deletions apps/client/src/pages/auth/backup-otp/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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}
/>
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/pages/auth/forgot-password/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ export const ForgotPasswordPage = () => {
<FormItem>
<FormLabel>{t`Email`}</FormLabel>
<FormControl>
<Input placeholder="[email protected]" {...field} />
<Input placeholder="[email protected]" autoComplete="email" {...field} />
</FormControl>
<FormMessage />
</FormItem>
Expand Down
9 changes: 7 additions & 2 deletions apps/client/src/pages/auth/login/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,12 @@ export const LoginPage = () => {
<FormItem>
<FormLabel>{t`Email`}</FormLabel>
<FormControl>
<Input placeholder="[email protected]" {...field} />
<Input
autoComplete="email"
className="lowercase"
placeholder="[email protected]"
{...field}
/>
</FormControl>
<FormDescription>{t`You can also enter your username.`}</FormDescription>
<FormMessage />
Expand All @@ -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>
Expand Down
2 changes: 2 additions & 0 deletions apps/client/src/pages/auth/register/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ export const RegisterPage = () => {
<FormLabel>{t`Username`}</FormLabel>
<FormControl>
<Input
className="lowercase"
placeholder={t({
message: "john.doe",
context:
Expand All @@ -140,6 +141,7 @@ export const RegisterPage = () => {
<FormLabel>{t`Email`}</FormLabel>
<FormControl>
<Input
className="lowercase"
placeholder={t({
message: "[email protected]",
context:
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/pages/auth/reset-password/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/pages/auth/verify-otp/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ export const AccountSettings = () => {
<FormItem>
<FormLabel>{t`Name`}</FormLabel>
<FormControl>
<Input {...field} />
<Input autoComplete="name" {...field} />
</FormControl>
<FormMessage />
</FormItem>
Expand All @@ -165,7 +165,7 @@ export const AccountSettings = () => {
<FormItem>
<FormLabel>{t`Username`}</FormLabel>
<FormControl>
<Input {...field} />
<Input autoComplete="username" className="lowercase" {...field} />
</FormControl>
<FormMessage />
</FormItem>
Expand All @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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>
)}
Expand All @@ -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">
Expand Down
6 changes: 3 additions & 3 deletions apps/client/src/pages/home/sections/statistics/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand Down
2 changes: 1 addition & 1 deletion libs/dto/src/auth/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
13 changes: 8 additions & 5 deletions libs/dto/src/user/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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),
Expand Down
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit 89a44cc

Please sign in to comment.