@atproto/oauth-provider 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/dist/account/account-store.d.ts +6 -5
- package/dist/account/account-store.d.ts.map +1 -1
- package/dist/account/account-store.js +24 -8
- package/dist/account/account-store.js.map +1 -1
- package/dist/account/sign-up-data.d.ts +2 -2
- package/dist/assets/app/bundle-manifest.json +185 -185
- package/dist/assets/app/{index-ItwwtJ8r.js → index-DZHZ9kCP.js} +2 -2
- package/dist/assets/app/{index-ItwwtJ8r.js.map → index-DZHZ9kCP.js.map} +1 -1
- package/dist/assets/app/{main-CSatvmRR.js → main-Dr6y26KY.js} +48 -48
- package/dist/assets/app/{main-CSatvmRR.js.map → main-Dr6y26KY.js.map} +1 -1
- package/dist/assets/app/messages-6_mYuGzB.js +4 -0
- package/dist/assets/app/messages-6_mYuGzB.js.map +1 -0
- package/dist/assets/app/messages-7wdeBTpD.js +4 -0
- package/dist/assets/app/messages-7wdeBTpD.js.map +1 -0
- package/dist/assets/app/messages-B-YFoWKc.js +4 -0
- package/dist/assets/app/messages-B-YFoWKc.js.map +1 -0
- package/dist/assets/app/messages-B10DUOE-.js +4 -0
- package/dist/assets/app/messages-B10DUOE-.js.map +1 -0
- package/dist/assets/app/messages-B4AwFEeZ.js +4 -0
- package/dist/assets/app/messages-B4AwFEeZ.js.map +1 -0
- package/dist/assets/app/messages-BDP8MyEC.js +4 -0
- package/dist/assets/app/messages-BDP8MyEC.js.map +1 -0
- package/dist/assets/app/messages-BIS87lxQ.js +4 -0
- package/dist/assets/app/messages-BIS87lxQ.js.map +1 -0
- package/dist/assets/app/messages-BI_Wbjdt.js +4 -0
- package/dist/assets/app/messages-BI_Wbjdt.js.map +1 -0
- package/dist/assets/app/messages-BMAouhRx.js +4 -0
- package/dist/assets/app/messages-BMAouhRx.js.map +1 -0
- package/dist/assets/app/messages-BdckMnJj.js +4 -0
- package/dist/assets/app/messages-BdckMnJj.js.map +1 -0
- package/dist/assets/app/messages-BgBLzc46.js +4 -0
- package/dist/assets/app/messages-BgBLzc46.js.map +1 -0
- package/dist/assets/app/messages-BobD78yK.js +4 -0
- package/dist/assets/app/messages-BobD78yK.js.map +1 -0
- package/dist/assets/app/messages-BtThT9UZ.js +4 -0
- package/dist/assets/app/messages-BtThT9UZ.js.map +1 -0
- package/dist/assets/app/messages-BwKHkbeh.js +4 -0
- package/dist/assets/app/messages-BwKHkbeh.js.map +1 -0
- package/dist/assets/app/messages-C417YUvA.js +4 -0
- package/dist/assets/app/messages-C417YUvA.js.map +1 -0
- package/dist/assets/app/messages-C4CxO4bO.js +4 -0
- package/dist/assets/app/messages-C4CxO4bO.js.map +1 -0
- package/dist/assets/app/messages-C5vd04e6.js +4 -0
- package/dist/assets/app/messages-C5vd04e6.js.map +1 -0
- package/dist/assets/app/messages-CAri2Wnz.js +4 -0
- package/dist/assets/app/messages-CAri2Wnz.js.map +1 -0
- package/dist/assets/app/messages-CPtWTZeG.js +4 -0
- package/dist/assets/app/messages-CPtWTZeG.js.map +1 -0
- package/dist/assets/app/messages-CiaM5zm8.js +4 -0
- package/dist/assets/app/messages-CiaM5zm8.js.map +1 -0
- package/dist/assets/app/messages-CkL-L2R6.js +4 -0
- package/dist/assets/app/messages-CkL-L2R6.js.map +1 -0
- package/dist/assets/app/messages-Cy_4XLNe.js +4 -0
- package/dist/assets/app/messages-Cy_4XLNe.js.map +1 -0
- package/dist/assets/app/messages-D5_ad-Eo.js +4 -0
- package/dist/assets/app/messages-D5_ad-Eo.js.map +1 -0
- package/dist/assets/app/messages-DChMl9mT.js +4 -0
- package/dist/assets/app/messages-DChMl9mT.js.map +1 -0
- package/dist/assets/app/messages-DWX-DIfv.js +4 -0
- package/dist/assets/app/messages-DWX-DIfv.js.map +1 -0
- package/dist/assets/app/messages-DgfsOphe.js +4 -0
- package/dist/assets/app/messages-DgfsOphe.js.map +1 -0
- package/dist/assets/app/messages-Dj5B_DR6.js +4 -0
- package/dist/assets/app/messages-Dj5B_DR6.js.map +1 -0
- package/dist/assets/app/messages-Dwzqo4eA.js +4 -0
- package/dist/assets/app/messages-Dwzqo4eA.js.map +1 -0
- package/dist/assets/app/messages-ESCIXJR7.js +4 -0
- package/dist/assets/app/messages-ESCIXJR7.js.map +1 -0
- package/dist/assets/app/messages-dglB2edb.js +4 -0
- package/dist/assets/app/messages-dglB2edb.js.map +1 -0
- package/dist/assets/app/messages-e_ClRrWc.js +4 -0
- package/dist/assets/app/messages-e_ClRrWc.js.map +1 -0
- package/dist/assets/app/messages-evvDxmrP.js +4 -0
- package/dist/assets/app/messages-evvDxmrP.js.map +1 -0
- package/dist/assets/app/messages-pPbdLb5B.js +4 -0
- package/dist/assets/app/messages-pPbdLb5B.js.map +1 -0
- package/dist/assets/app/messages-tJv8gHL2.js +4 -0
- package/dist/assets/app/messages-tJv8gHL2.js.map +1 -0
- package/dist/assets/app/messages-vLRVEw96.js +4 -0
- package/dist/assets/app/messages-vLRVEw96.js.map +1 -0
- package/dist/errors/invalid-invite-code-error.d.ts +5 -0
- package/dist/errors/invalid-invite-code-error.d.ts.map +1 -0
- package/dist/errors/invalid-invite-code-error.js +11 -0
- package/dist/errors/invalid-invite-code-error.js.map +1 -0
- package/dist/errors/oauth-error.d.ts +2 -2
- package/dist/errors/oauth-error.js.map +1 -1
- package/dist/oauth-errors.d.ts +1 -0
- package/dist/oauth-errors.d.ts.map +1 -1
- package/dist/oauth-errors.js +3 -1
- package/dist/oauth-errors.js.map +1 -1
- package/dist/oauth-provider.d.ts +3 -3
- package/dist/oauth-provider.d.ts.map +1 -1
- package/dist/oauth-provider.js +24 -23
- package/dist/oauth-provider.js.map +1 -1
- package/dist/output/build-customization-data.d.ts +20 -11
- package/dist/output/build-customization-data.d.ts.map +1 -1
- package/dist/output/build-customization-data.js +72 -43
- package/dist/output/build-customization-data.js.map +1 -1
- package/package.json +4 -3
- package/src/account/account-store.ts +21 -6
- package/src/assets/app/components/forms/input-checkbox.tsx +12 -7
- package/src/assets/app/components/forms/input-email-address.tsx +2 -3
- package/src/assets/app/components/forms/input-password.tsx +2 -3
- package/src/assets/app/components/forms/input-text.tsx +6 -0
- package/src/assets/app/components/utils/error-message.tsx +30 -4
- package/src/assets/app/lib/api.ts +25 -3
- package/src/assets/app/locales/an/messages.po +51 -53
- package/src/assets/app/locales/ast/messages.po +51 -53
- package/src/assets/app/locales/ca/messages.po +51 -53
- package/src/assets/app/locales/da/messages.po +51 -53
- package/src/assets/app/locales/de/messages.po +51 -53
- package/src/assets/app/locales/el/messages.po +51 -53
- package/src/assets/app/locales/en/messages.po +51 -53
- package/src/assets/app/locales/en-GB/messages.po +51 -53
- package/src/assets/app/locales/es/messages.po +51 -53
- package/src/assets/app/locales/eu/messages.po +51 -53
- package/src/assets/app/locales/fi/messages.po +51 -53
- package/src/assets/app/locales/fr/messages.po +52 -54
- package/src/assets/app/locales/ga/messages.po +51 -53
- package/src/assets/app/locales/gl/messages.po +51 -53
- package/src/assets/app/locales/hi/messages.po +51 -53
- package/src/assets/app/locales/hu/messages.po +51 -53
- package/src/assets/app/locales/ia/messages.po +51 -53
- package/src/assets/app/locales/id/messages.po +51 -53
- package/src/assets/app/locales/it/messages.po +51 -53
- package/src/assets/app/locales/ja/messages.po +51 -53
- package/src/assets/app/locales/km/messages.po +51 -53
- package/src/assets/app/locales/ko/messages.po +51 -53
- package/src/assets/app/locales/ne/messages.po +51 -53
- package/src/assets/app/locales/nl/messages.po +51 -53
- package/src/assets/app/locales/pl/messages.po +51 -53
- package/src/assets/app/locales/pt-BR/messages.po +51 -53
- package/src/assets/app/locales/ro/messages.po +51 -53
- package/src/assets/app/locales/ru/messages.po +51 -53
- package/src/assets/app/locales/sv/messages.po +51 -53
- package/src/assets/app/locales/th/messages.po +51 -53
- package/src/assets/app/locales/tr/messages.po +51 -53
- package/src/assets/app/locales/uk/messages.po +51 -53
- package/src/assets/app/locales/vi/messages.po +51 -53
- package/src/assets/app/locales/zh-CN/messages.po +51 -53
- package/src/assets/app/locales/zh-HK/messages.po +51 -53
- package/src/assets/app/locales/zh-TW/messages.po +51 -53
- package/src/assets/app/views/authorize/reset-password/reset-password-confirm-form.tsx +1 -1
- package/src/assets/app/views/authorize/sign-in/sign-in-form.tsx +3 -5
- package/src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx +7 -5
- package/src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx +0 -2
- package/src/errors/invalid-invite-code-error.ts +10 -0
- package/src/errors/oauth-error.ts +1 -1
- package/src/oauth-errors.ts +1 -0
- package/src/oauth-provider.ts +45 -35
- package/src/output/build-customization-data.ts +89 -50
- package/tsconfig.backend.tsbuildinfo +1 -1
- package/dist/assets/app/messages-BQeltXSF.js +0 -4
- package/dist/assets/app/messages-BQeltXSF.js.map +0 -1
- package/dist/assets/app/messages-BQkEhfjg.js +0 -4
- package/dist/assets/app/messages-BQkEhfjg.js.map +0 -1
- package/dist/assets/app/messages-BUjKj_UJ.js +0 -4
- package/dist/assets/app/messages-BUjKj_UJ.js.map +0 -1
- package/dist/assets/app/messages-BWIQa8fO.js +0 -4
- package/dist/assets/app/messages-BWIQa8fO.js.map +0 -1
- package/dist/assets/app/messages-BaNVb0bp.js +0 -4
- package/dist/assets/app/messages-BaNVb0bp.js.map +0 -1
- package/dist/assets/app/messages-BaizVXcF.js +0 -4
- package/dist/assets/app/messages-BaizVXcF.js.map +0 -1
- package/dist/assets/app/messages-BfoClA1Y.js +0 -4
- package/dist/assets/app/messages-BfoClA1Y.js.map +0 -1
- package/dist/assets/app/messages-BsKGDZnC.js +0 -4
- package/dist/assets/app/messages-BsKGDZnC.js.map +0 -1
- package/dist/assets/app/messages-Bu-TJhml.js +0 -4
- package/dist/assets/app/messages-Bu-TJhml.js.map +0 -1
- package/dist/assets/app/messages-BvOKnBQk.js +0 -4
- package/dist/assets/app/messages-BvOKnBQk.js.map +0 -1
- package/dist/assets/app/messages-BxDzCiWz.js +0 -4
- package/dist/assets/app/messages-BxDzCiWz.js.map +0 -1
- package/dist/assets/app/messages-CDgFOy4S.js +0 -4
- package/dist/assets/app/messages-CDgFOy4S.js.map +0 -1
- package/dist/assets/app/messages-CLbTz0o9.js +0 -4
- package/dist/assets/app/messages-CLbTz0o9.js.map +0 -1
- package/dist/assets/app/messages-CNwSh0t7.js +0 -4
- package/dist/assets/app/messages-CNwSh0t7.js.map +0 -1
- package/dist/assets/app/messages-CSMNJ6P8.js +0 -4
- package/dist/assets/app/messages-CSMNJ6P8.js.map +0 -1
- package/dist/assets/app/messages-CZQUw3mp.js +0 -4
- package/dist/assets/app/messages-CZQUw3mp.js.map +0 -1
- package/dist/assets/app/messages-CZT41oVp.js +0 -4
- package/dist/assets/app/messages-CZT41oVp.js.map +0 -1
- package/dist/assets/app/messages-C_b-d3t8.js +0 -4
- package/dist/assets/app/messages-C_b-d3t8.js.map +0 -1
- package/dist/assets/app/messages-C_u3MTc2.js +0 -4
- package/dist/assets/app/messages-C_u3MTc2.js.map +0 -1
- package/dist/assets/app/messages-Cn8nHZic.js +0 -4
- package/dist/assets/app/messages-Cn8nHZic.js.map +0 -1
- package/dist/assets/app/messages-CtDywJUm.js +0 -4
- package/dist/assets/app/messages-CtDywJUm.js.map +0 -1
- package/dist/assets/app/messages-CurtIjBF.js +0 -4
- package/dist/assets/app/messages-CurtIjBF.js.map +0 -1
- package/dist/assets/app/messages-Cv6zIbaP.js +0 -4
- package/dist/assets/app/messages-Cv6zIbaP.js.map +0 -1
- package/dist/assets/app/messages-D1eLQuPE.js +0 -4
- package/dist/assets/app/messages-D1eLQuPE.js.map +0 -1
- package/dist/assets/app/messages-D8vHEaYW.js +0 -4
- package/dist/assets/app/messages-D8vHEaYW.js.map +0 -1
- package/dist/assets/app/messages-DJ1Q4GeC.js +0 -4
- package/dist/assets/app/messages-DJ1Q4GeC.js.map +0 -1
- package/dist/assets/app/messages-DRL3exqd.js +0 -4
- package/dist/assets/app/messages-DRL3exqd.js.map +0 -1
- package/dist/assets/app/messages-DWLPQRTp.js +0 -4
- package/dist/assets/app/messages-DWLPQRTp.js.map +0 -1
- package/dist/assets/app/messages-DjVaE9YE.js +0 -4
- package/dist/assets/app/messages-DjVaE9YE.js.map +0 -1
- package/dist/assets/app/messages-DqpMfFJR.js +0 -4
- package/dist/assets/app/messages-DqpMfFJR.js.map +0 -1
- package/dist/assets/app/messages-ETjhJBEN.js +0 -4
- package/dist/assets/app/messages-ETjhJBEN.js.map +0 -1
- package/dist/assets/app/messages-EUKrgrGn.js +0 -4
- package/dist/assets/app/messages-EUKrgrGn.js.map +0 -1
- package/dist/assets/app/messages-QQrOUcPW.js +0 -4
- package/dist/assets/app/messages-QQrOUcPW.js.map +0 -1
- package/dist/assets/app/messages-e2QGqFL6.js +0 -4
- package/dist/assets/app/messages-e2QGqFL6.js.map +0 -1
- package/dist/assets/app/messages-p61py7gD.js +0 -4
- package/dist/assets/app/messages-p61py7gD.js.map +0 -1
- /package/dist/assets/app/{main-CSatvmRR.css → main-Dr6y26KY.css} +0 -0
@@ -1,6 +1,7 @@
|
|
1
1
|
import { isEmailValid } from '@hapi/address'
|
2
2
|
import { isDisposableEmail } from 'disposable-email-domains-js'
|
3
3
|
import { z } from 'zod'
|
4
|
+
import { ensureValidHandle, normalizeHandle } from '@atproto/syntax'
|
4
5
|
import { ClientId } from '../client/client-id.js'
|
5
6
|
import { DeviceId } from '../device/device-id.js'
|
6
7
|
import { localeSchema } from '../lib/locale.js'
|
@@ -16,12 +17,24 @@ import { Account } from './account.js'
|
|
16
17
|
// @NOTE Change the length here to force stronger passwords (through a reset)
|
17
18
|
export const oldPasswordSchema = z.string().min(1)
|
18
19
|
export const newPasswordSchema = z.string().min(8)
|
19
|
-
export const tokenSchema = z
|
20
|
+
export const tokenSchema = z
|
21
|
+
.string()
|
22
|
+
.regex(/^[A-Z2-7]{5}-[A-Z2-7]{5}$/, 'Invalid token format')
|
20
23
|
export const handleSchema = z
|
21
24
|
.string()
|
22
|
-
.
|
23
|
-
.
|
24
|
-
.
|
25
|
+
// @NOTE: We only check against validity towards ATProto's syntax. Additional
|
26
|
+
// rules may be imposed by the store implementation.
|
27
|
+
.superRefine((value, ctx) => {
|
28
|
+
try {
|
29
|
+
ensureValidHandle(value)
|
30
|
+
} catch (err) {
|
31
|
+
ctx.addIssue({
|
32
|
+
code: z.ZodIssueCode.custom,
|
33
|
+
message: err instanceof Error ? err.message : 'Invalid handle',
|
34
|
+
})
|
35
|
+
}
|
36
|
+
})
|
37
|
+
.transform(normalizeHandle)
|
25
38
|
export const emailSchema = z
|
26
39
|
.string()
|
27
40
|
.email()
|
@@ -34,13 +47,15 @@ export const emailSchema = z
|
|
34
47
|
.refine((email) => !isDisposableEmail(email), {
|
35
48
|
message: 'Disposable email addresses are not allowed',
|
36
49
|
})
|
50
|
+
.transform((value) => value.toLowerCase())
|
51
|
+
export const inviteCodeSchema = z.string().min(1)
|
37
52
|
|
38
53
|
export const authenticateAccountDataSchema = z
|
39
54
|
.object({
|
40
55
|
locale: localeSchema,
|
41
56
|
username: z.string(),
|
42
57
|
password: oldPasswordSchema,
|
43
|
-
emailOtp:
|
58
|
+
emailOtp: tokenSchema.optional(),
|
44
59
|
})
|
45
60
|
.strict()
|
46
61
|
|
@@ -54,7 +69,7 @@ export const createAccountDataSchema = z
|
|
54
69
|
handle: handleSchema,
|
55
70
|
email: emailSchema,
|
56
71
|
password: z.intersection(oldPasswordSchema, newPasswordSchema),
|
57
|
-
inviteCode:
|
72
|
+
inviteCode: inviteCodeSchema.optional(),
|
58
73
|
})
|
59
74
|
.strict()
|
60
75
|
|
@@ -22,11 +22,13 @@ export function InputCheckbox({
|
|
22
22
|
id,
|
23
23
|
ref,
|
24
24
|
disabled,
|
25
|
+
title,
|
26
|
+
'aria-label': ariaLabel = title,
|
25
27
|
'aria-labelledby': ariaLabelledBy,
|
26
28
|
...props
|
27
29
|
}: InputCheckboxProps) {
|
28
30
|
const htmlFor = useRandomString('input-checkbox-')
|
29
|
-
const
|
31
|
+
const labelRef = useRef<HTMLLabelElement>(null)
|
30
32
|
const inputRef = useRef<HTMLInputElement>(null)
|
31
33
|
const ctx = useContext(FieldsetContext)
|
32
34
|
|
@@ -34,12 +36,13 @@ export function InputCheckbox({
|
|
34
36
|
|
35
37
|
return (
|
36
38
|
<InputContainer
|
37
|
-
ref={containerRef}
|
38
39
|
className={clsx('cursor-pointer', className)}
|
39
40
|
icon={
|
40
41
|
<input
|
41
42
|
{...props}
|
42
43
|
disabled={disabled ?? ctx.disabled}
|
44
|
+
title={title}
|
45
|
+
aria-label={ariaLabel}
|
43
46
|
aria-labelledby={
|
44
47
|
children
|
45
48
|
? // Prefer the local "<label>" element (through "htmlFor") over the wrapping "<fieldset>" to describe the checkbox.
|
@@ -53,15 +56,17 @@ export function InputCheckbox({
|
|
53
56
|
/>
|
54
57
|
}
|
55
58
|
tabIndex={-1}
|
56
|
-
onClick={(
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
59
|
+
onClick={({ target }) => {
|
60
|
+
// Native behavior of clicking the label should toggle the checkbox.
|
61
|
+
if (target === labelRef.current) return
|
62
|
+
if (target === inputRef.current) return
|
63
|
+
|
64
|
+
inputRef.current?.click()
|
61
65
|
}}
|
62
66
|
>
|
63
67
|
{children && (
|
64
68
|
<label
|
69
|
+
ref={labelRef}
|
65
70
|
htmlFor={inputId}
|
66
71
|
className="block w-full leading-[1.6] select-none cursor-pointer"
|
67
72
|
>
|
@@ -26,6 +26,7 @@ export function InputEmailAddress({
|
|
26
26
|
spellCheck = 'false',
|
27
27
|
value,
|
28
28
|
defaultValue = value,
|
29
|
+
title,
|
29
30
|
...props
|
30
31
|
}: InputEmailAddressProps) {
|
31
32
|
const { t } = useLingui()
|
@@ -46,10 +47,8 @@ export function InputEmailAddress({
|
|
46
47
|
|
47
48
|
return (
|
48
49
|
<InputText
|
49
|
-
aria-label={t`Email`}
|
50
|
-
placeholder={t`Email`}
|
51
|
-
title={t`Email`}
|
52
50
|
{...props}
|
51
|
+
title={title ?? t`Email address`}
|
53
52
|
type="email"
|
54
53
|
autoCapitalize={autoCapitalize}
|
55
54
|
autoCorrect={autoCorrect}
|
@@ -25,6 +25,7 @@ export function InputPassword({
|
|
25
25
|
value,
|
26
26
|
defaultValue = value,
|
27
27
|
ref,
|
28
|
+
title,
|
28
29
|
dir = 'auto',
|
29
30
|
autoCapitalize = 'none',
|
30
31
|
autoCorrect = 'off',
|
@@ -48,10 +49,8 @@ export function InputPassword({
|
|
48
49
|
|
49
50
|
return (
|
50
51
|
<InputText
|
51
|
-
placeholder={t`Password`}
|
52
|
-
aria-label={t`Password`}
|
53
|
-
title={t`Password`}
|
54
52
|
{...props}
|
53
|
+
title={title ?? t`Password`}
|
55
54
|
ref={mergeRefs([ref, inputRef])}
|
56
55
|
dir={dir}
|
57
56
|
autoCapitalize={autoCapitalize}
|
@@ -26,7 +26,10 @@ export function InputText({
|
|
26
26
|
onBlur,
|
27
27
|
ref,
|
28
28
|
disabled,
|
29
|
+
title,
|
30
|
+
'aria-label': ariaLabel = title,
|
29
31
|
'aria-labelledby': ariaLabelledBy,
|
32
|
+
placeholder = ariaLabel,
|
30
33
|
...props
|
31
34
|
}: InputTextProps) {
|
32
35
|
const ctx = useContext(FieldsetContext)
|
@@ -59,6 +62,9 @@ export function InputText({
|
|
59
62
|
<input
|
60
63
|
{...props}
|
61
64
|
disabled={disabled ?? ctx.disabled}
|
65
|
+
title={title}
|
66
|
+
placeholder={placeholder}
|
67
|
+
aria-label={ariaLabel}
|
62
68
|
aria-labelledby={ariaLabelledBy ?? ctx.labelId}
|
63
69
|
ref={mergeRefs([ref, inputRef])}
|
64
70
|
className="w-full bg-transparent bg-clip-padding text-base text-inherit outline-none dark:placeholder-gray-500 text-ellipsis"
|
@@ -1,9 +1,12 @@
|
|
1
1
|
import { Trans } from '@lingui/react/macro'
|
2
2
|
import { ReactNode, memo } from 'react'
|
3
3
|
import {
|
4
|
+
AccessDeniedError,
|
4
5
|
EmailTakenError,
|
5
6
|
HandleUnavailableError,
|
6
7
|
InvalidCredentialsError,
|
8
|
+
InvalidInviteCodeError,
|
9
|
+
InvalidRequestError,
|
7
10
|
RequestExpiredError,
|
8
11
|
SecondAuthenticationFactorRequiredError,
|
9
12
|
UnknownRequestUriError,
|
@@ -17,12 +20,19 @@ export type ApiErrorMessageProps = {
|
|
17
20
|
export const ErrorMessage = memo(function ErrorMessage({
|
18
21
|
error,
|
19
22
|
}: ApiErrorMessageProps): ReactNode {
|
23
|
+
// Matches the order of the error checks in the API's parseError method (must
|
24
|
+
// be from most specific to least specific to avoid unreachable code paths).
|
25
|
+
|
26
|
+
if (error instanceof SecondAuthenticationFactorRequiredError) {
|
27
|
+
return <Trans>A second authentication factor is required</Trans>
|
28
|
+
}
|
29
|
+
|
20
30
|
if (error instanceof InvalidCredentialsError) {
|
21
31
|
return <Trans>Wrong identifier or password</Trans>
|
22
32
|
}
|
23
33
|
|
24
|
-
if (error instanceof
|
25
|
-
return <Trans>
|
34
|
+
if (error instanceof InvalidInviteCodeError) {
|
35
|
+
return <Trans>The invite code is not valid</Trans>
|
26
36
|
}
|
27
37
|
|
28
38
|
if (error instanceof HandleUnavailableError) {
|
@@ -43,8 +53,8 @@ export const ErrorMessage = memo(function ErrorMessage({
|
|
43
53
|
}
|
44
54
|
}
|
45
55
|
|
46
|
-
if (error instanceof
|
47
|
-
return <Trans>
|
56
|
+
if (error instanceof EmailTakenError) {
|
57
|
+
return <Trans>This email is already used</Trans>
|
48
58
|
}
|
49
59
|
|
50
60
|
if (
|
@@ -54,6 +64,22 @@ export const ErrorMessage = memo(function ErrorMessage({
|
|
54
64
|
return <Trans>This sign-in session has expired</Trans>
|
55
65
|
}
|
56
66
|
|
67
|
+
if (error instanceof InvalidRequestError) {
|
68
|
+
return (
|
69
|
+
<Trans>
|
70
|
+
The data you submitted is invalid. Please check the form and try again.
|
71
|
+
</Trans>
|
72
|
+
)
|
73
|
+
}
|
74
|
+
|
75
|
+
if (error instanceof AccessDeniedError) {
|
76
|
+
return (
|
77
|
+
<Trans>
|
78
|
+
This authorization request has been denied. Please try again.
|
79
|
+
</Trans>
|
80
|
+
)
|
81
|
+
}
|
82
|
+
|
57
83
|
if (error instanceof JsonErrorResponse) {
|
58
84
|
return <Trans>Unexpected server response</Trans>
|
59
85
|
}
|
@@ -50,7 +50,7 @@ export type SessionResponse = {
|
|
50
50
|
export class Api extends JsonClient<{
|
51
51
|
'/verify-handle-availability': {
|
52
52
|
input: VerifyHandleAvailabilityData
|
53
|
-
output:
|
53
|
+
output: { available: true }
|
54
54
|
}
|
55
55
|
'/sign-up': {
|
56
56
|
input: SignUpData
|
@@ -62,11 +62,11 @@ export class Api extends JsonClient<{
|
|
62
62
|
}
|
63
63
|
'/reset-password-request': {
|
64
64
|
input: InitiatePasswordResetData
|
65
|
-
output:
|
65
|
+
output: { success: true }
|
66
66
|
}
|
67
67
|
'/reset-password-confirm': {
|
68
68
|
input: ConfirmResetPasswordData
|
69
|
-
output:
|
69
|
+
output: { success: true }
|
70
70
|
}
|
71
71
|
}> {
|
72
72
|
constructor(csrfToken: string) {
|
@@ -97,6 +97,9 @@ export class Api extends JsonClient<{
|
|
97
97
|
if (InvalidCredentialsError.is(json)) {
|
98
98
|
return new InvalidCredentialsError(json)
|
99
99
|
}
|
100
|
+
if (InvalidInviteCodeError.is(json)) {
|
101
|
+
return new InvalidInviteCodeError(json)
|
102
|
+
}
|
100
103
|
if (HandleUnavailableError.is(json)) {
|
101
104
|
return new HandleUnavailableError(json)
|
102
105
|
}
|
@@ -151,6 +154,25 @@ export class InvalidRequestError<
|
|
151
154
|
}
|
152
155
|
}
|
153
156
|
|
157
|
+
export type InvalidInviteCodePayload = InvalidRequestPayload & {
|
158
|
+
error_description: `This invite code is invalid.${string}`
|
159
|
+
}
|
160
|
+
export class InvalidInviteCodeError<
|
161
|
+
P extends InvalidInviteCodePayload = InvalidInviteCodePayload,
|
162
|
+
> extends InvalidRequestError<P> {
|
163
|
+
constructor(payload: P) {
|
164
|
+
super(payload)
|
165
|
+
}
|
166
|
+
|
167
|
+
static is(json: unknown): json is InvalidInviteCodePayload {
|
168
|
+
return (
|
169
|
+
super.is(json) &&
|
170
|
+
json.error_description != null &&
|
171
|
+
json.error_description.startsWith('This invite code is invalid.')
|
172
|
+
)
|
173
|
+
}
|
174
|
+
}
|
175
|
+
|
154
176
|
export type RequestExpiredPayload = AccessDeniedPayload & {
|
155
177
|
error_description: 'This request has expired'
|
156
178
|
}
|
@@ -17,11 +17,11 @@ msgstr ""
|
|
17
17
|
msgid "<0/> is asking for permission to access your account (<1/>)."
|
18
18
|
msgstr ""
|
19
19
|
|
20
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
20
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:219
|
21
21
|
msgid "2FA Confirmation"
|
22
22
|
msgstr ""
|
23
23
|
|
24
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
24
|
+
#: src/assets/app/components/utils/error-message.tsx:27
|
25
25
|
msgid "A second authentication factor is required"
|
26
26
|
msgstr ""
|
27
27
|
|
@@ -45,7 +45,7 @@ msgstr ""
|
|
45
45
|
msgid "An application on your device"
|
46
46
|
msgstr ""
|
47
47
|
|
48
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
48
|
+
#: src/assets/app/components/utils/error-message.tsx:87
|
49
49
|
msgid "An unknown error occurred"
|
50
50
|
msgstr ""
|
51
51
|
|
@@ -78,8 +78,6 @@ msgstr ""
|
|
78
78
|
msgid "By clicking <0>Authorize</0>, you allow this application to perform the following actions in accordance with their <1>terms of service</1> and <2>privacy policy</2>:"
|
79
79
|
msgstr ""
|
80
80
|
|
81
|
-
#. placeholder {0}: tosLink ? ( <LinkAnchor className="text-brand underline" link={tosLink}> <Trans>Terms of Service</Trans> </LinkAnchor> ) : ( <Trans>Terms of Service</Trans> )
|
82
|
-
#. placeholder {1}: ppLink ? ( <LinkAnchor className="text-brand underline" link={ppLink}> <Trans>Privacy Policy</Trans> </LinkAnchor> ) : ( <Trans>Privacy Policy</Trans> )
|
83
81
|
#: src/assets/app/views/authorize/sign-up/sign-up-disclaimer.tsx:30
|
84
82
|
msgid "By creating an account you agree to the {0} and the {1} of this service."
|
85
83
|
msgstr ""
|
@@ -89,8 +87,7 @@ msgstr ""
|
|
89
87
|
msgid "Cancel"
|
90
88
|
msgstr ""
|
91
89
|
|
92
|
-
|
93
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:234
|
90
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:232
|
94
91
|
msgid "Check your {0} email for a login code and enter it here."
|
95
92
|
msgstr ""
|
96
93
|
|
@@ -110,7 +107,7 @@ msgstr ""
|
|
110
107
|
msgid "Confirm your password to continue"
|
111
108
|
msgstr ""
|
112
109
|
|
113
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
110
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:223
|
114
111
|
msgid "Confirmation code"
|
115
112
|
msgstr ""
|
116
113
|
|
@@ -130,19 +127,17 @@ msgstr ""
|
|
130
127
|
msgid "Description"
|
131
128
|
msgstr ""
|
132
129
|
|
133
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:
|
134
|
-
#: src/assets/app/components/forms/input-email-address.tsx:49
|
135
|
-
#: src/assets/app/components/forms/input-email-address.tsx:50
|
136
|
-
#: src/assets/app/components/forms/input-email-address.tsx:51
|
130
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:114
|
137
131
|
msgid "Email"
|
138
132
|
msgstr ""
|
139
133
|
|
140
134
|
#: src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx:55
|
141
135
|
#: src/assets/app/views/authorize/reset-password/reset-password-request-form.tsx:60
|
136
|
+
#: src/assets/app/components/forms/input-email-address.tsx:51
|
142
137
|
msgid "Email address"
|
143
138
|
msgstr ""
|
144
139
|
|
145
|
-
#: src/assets/app/components/forms/input-new-password.tsx:
|
140
|
+
#: src/assets/app/components/forms/input-new-password.tsx:44
|
146
141
|
msgid "Enter a password"
|
147
142
|
msgstr ""
|
148
143
|
|
@@ -158,7 +153,7 @@ msgstr ""
|
|
158
153
|
msgid "Enter your email address"
|
159
154
|
msgstr ""
|
160
155
|
|
161
|
-
#: src/assets/app/components/forms/input-new-password.tsx:
|
156
|
+
#: src/assets/app/components/forms/input-new-password.tsx:45
|
162
157
|
msgid "Enter your new password"
|
163
158
|
msgstr ""
|
164
159
|
|
@@ -175,6 +170,10 @@ msgstr ""
|
|
175
170
|
msgid "Error"
|
176
171
|
msgstr ""
|
177
172
|
|
173
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:102
|
174
|
+
msgid "example-com-xxxxx-xxxxx"
|
175
|
+
msgstr ""
|
176
|
+
|
178
177
|
#: src/assets/app/components/utils/password-strength-label.tsx:25
|
179
178
|
msgid "Extra"
|
180
179
|
msgstr ""
|
@@ -183,11 +182,10 @@ msgstr ""
|
|
183
182
|
msgid "Forgot Password"
|
184
183
|
msgstr ""
|
185
184
|
|
186
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
185
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:178
|
187
186
|
msgid "Forgot?"
|
188
187
|
msgstr ""
|
189
188
|
|
190
|
-
#. placeholder {0}: account.preferred_username || account.email || account.sub
|
191
189
|
#: src/assets/app/views/authorize/accept/accept-view.tsx:40
|
192
190
|
msgid "Grant access to your <0>{0}</0> account"
|
193
191
|
msgstr ""
|
@@ -212,13 +210,12 @@ msgstr ""
|
|
212
210
|
msgid "Interface language selector"
|
213
211
|
msgstr ""
|
214
212
|
|
215
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:
|
213
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:275
|
216
214
|
msgid "Invalid"
|
217
215
|
msgstr ""
|
218
216
|
|
219
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:
|
220
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:
|
221
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:100
|
217
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:96
|
218
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:101
|
222
219
|
msgid "Invite code"
|
223
220
|
msgstr ""
|
224
221
|
|
@@ -272,9 +269,7 @@ msgstr ""
|
|
272
269
|
msgid "Only letters, numbers, and hyphens"
|
273
270
|
msgstr ""
|
274
271
|
|
275
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:
|
276
|
-
#: src/assets/app/components/forms/input-password.tsx:51
|
277
|
-
#: src/assets/app/components/forms/input-password.tsx:52
|
272
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-account-form.tsx:128
|
278
273
|
#: src/assets/app/components/forms/input-password.tsx:53
|
279
274
|
msgid "Password"
|
280
275
|
msgstr ""
|
@@ -295,11 +290,11 @@ msgstr ""
|
|
295
290
|
msgid "Password updated!"
|
296
291
|
msgstr ""
|
297
292
|
|
298
|
-
#: src/assets/app/components/forms/input-new-password.tsx:
|
293
|
+
#: src/assets/app/components/forms/input-new-password.tsx:46
|
299
294
|
msgid "Password with at least {MIN_PASSWORD_LENGTH} characters"
|
300
295
|
msgstr ""
|
301
296
|
|
302
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
297
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:192
|
303
298
|
msgid "Please verify the domain name of the website before entering your password. Never enter your password on a domain you do not trust."
|
304
299
|
msgstr ""
|
305
300
|
|
@@ -309,8 +304,8 @@ msgstr ""
|
|
309
304
|
msgid "Privacy Policy"
|
310
305
|
msgstr ""
|
311
306
|
|
312
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
313
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
307
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:206
|
308
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:211
|
314
309
|
msgid "Remember this account on this device"
|
315
310
|
msgstr ""
|
316
311
|
|
@@ -326,11 +321,11 @@ msgstr ""
|
|
326
321
|
msgid "Reset Password"
|
327
322
|
msgstr ""
|
328
323
|
|
329
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
324
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:176
|
330
325
|
msgid "Reset your password"
|
331
326
|
msgstr ""
|
332
327
|
|
333
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:
|
328
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:196
|
334
329
|
msgid "Select domain"
|
335
330
|
msgstr ""
|
336
331
|
|
@@ -338,7 +333,7 @@ msgstr ""
|
|
338
333
|
msgid "Select from an existing account"
|
339
334
|
msgstr ""
|
340
335
|
|
341
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
336
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:202
|
342
337
|
msgid "Session"
|
343
338
|
msgstr ""
|
344
339
|
|
@@ -348,7 +343,6 @@ msgstr ""
|
|
348
343
|
msgid "Sign in"
|
349
344
|
msgstr ""
|
350
345
|
|
351
|
-
#. placeholder {0}: account.name
|
352
346
|
#: src/assets/app/views/authorize/sign-in/sign-in-picker.tsx:75
|
353
347
|
msgid "Sign in as {0}"
|
354
348
|
msgstr ""
|
@@ -383,45 +377,55 @@ msgstr ""
|
|
383
377
|
msgid "Terms of Service"
|
384
378
|
msgstr ""
|
385
379
|
|
386
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
380
|
+
#: src/assets/app/components/utils/error-message.tsx:52
|
387
381
|
msgid "That handle cannot be used"
|
388
382
|
msgstr ""
|
389
383
|
|
390
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
384
|
+
#: src/assets/app/components/utils/error-message.tsx:69
|
385
|
+
msgid "The data you submitted is invalid. Please check the form and try again."
|
386
|
+
msgstr ""
|
387
|
+
|
388
|
+
#: src/assets/app/components/utils/error-message.tsx:43
|
391
389
|
msgid "The domain name is not allowed"
|
392
390
|
msgstr ""
|
393
391
|
|
394
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
392
|
+
#: src/assets/app/components/utils/error-message.tsx:45
|
395
393
|
msgid "The handle contains inappropriate language"
|
396
394
|
msgstr ""
|
397
395
|
|
398
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
396
|
+
#: src/assets/app/components/utils/error-message.tsx:50
|
399
397
|
msgid "The handle is already in use"
|
400
398
|
msgstr ""
|
401
399
|
|
402
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
400
|
+
#: src/assets/app/components/utils/error-message.tsx:41
|
403
401
|
msgid "The handle is invalid"
|
404
402
|
msgstr ""
|
405
403
|
|
406
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
404
|
+
#: src/assets/app/components/utils/error-message.tsx:35
|
405
|
+
msgid "The invite code is not valid"
|
406
|
+
msgstr ""
|
407
|
+
|
408
|
+
#: src/assets/app/components/utils/error-message.tsx:77
|
409
|
+
msgid "This authorization request has been denied. Please try again."
|
410
|
+
msgstr ""
|
411
|
+
|
412
|
+
#: src/assets/app/components/utils/error-message.tsx:57
|
407
413
|
msgid "This email is already used"
|
408
414
|
msgstr ""
|
409
415
|
|
410
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
416
|
+
#: src/assets/app/components/utils/error-message.tsx:48
|
411
417
|
msgid "This handle is reserved"
|
412
418
|
msgstr ""
|
413
419
|
|
414
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
420
|
+
#: src/assets/app/components/utils/error-message.tsx:64
|
415
421
|
msgid "This sign-in session has expired"
|
416
422
|
msgstr ""
|
417
423
|
|
418
424
|
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:166
|
419
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:167
|
420
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:168
|
421
425
|
msgid "Type your desired username"
|
422
426
|
msgstr ""
|
423
427
|
|
424
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
428
|
+
#: src/assets/app/components/utils/error-message.tsx:84
|
425
429
|
msgid "Unexpected server response"
|
426
430
|
msgstr ""
|
427
431
|
|
@@ -430,23 +434,18 @@ msgid "Uniquely identify you"
|
|
430
434
|
msgstr ""
|
431
435
|
|
432
436
|
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:143
|
433
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:144
|
434
437
|
msgid "Username or email address"
|
435
438
|
msgstr ""
|
436
439
|
|
437
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:
|
440
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:270
|
438
441
|
msgid "Valid"
|
439
442
|
msgstr ""
|
440
443
|
|
441
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:154
|
442
|
-
msgid "Valid email address or username"
|
443
|
-
msgstr ""
|
444
|
-
|
445
444
|
#: src/assets/app/views/authorize/sign-up/sign-up-view.tsx:135
|
446
445
|
msgid "Verify you are human"
|
447
446
|
msgstr ""
|
448
447
|
|
449
|
-
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:
|
448
|
+
#: src/assets/app/views/authorize/sign-in/sign-in-form.tsx:189
|
450
449
|
msgid "Warning"
|
451
450
|
msgstr ""
|
452
451
|
|
@@ -458,7 +457,7 @@ msgstr ""
|
|
458
457
|
msgid "Weak"
|
459
458
|
msgstr ""
|
460
459
|
|
461
|
-
#: src/assets/app/components/utils/error-message.tsx:
|
460
|
+
#: src/assets/app/components/utils/error-message.tsx:31
|
462
461
|
msgid "Wrong identifier or password"
|
463
462
|
msgstr ""
|
464
463
|
|
@@ -466,7 +465,7 @@ msgstr ""
|
|
466
465
|
msgid "You are being redirected..."
|
467
466
|
msgstr ""
|
468
467
|
|
469
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:
|
468
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:235
|
470
469
|
msgid "You can change this username to any domain name you control after your account is set up."
|
471
470
|
msgstr ""
|
472
471
|
|
@@ -482,8 +481,7 @@ msgstr ""
|
|
482
481
|
msgid "Your account"
|
483
482
|
msgstr ""
|
484
483
|
|
485
|
-
|
486
|
-
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:219
|
484
|
+
#: src/assets/app/views/authorize/sign-up/sign-up-handle-form.tsx:217
|
487
485
|
msgid "Your full username will be: {0}"
|
488
486
|
msgstr ""
|
489
487
|
|