@djangocfg/api 2.1.448 → 2.1.450

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.
Files changed (55) hide show
  1. package/dist/auth-server.cjs +1 -2272
  2. package/dist/auth-server.cjs.map +1 -1
  3. package/dist/auth-server.d.cts +1 -35
  4. package/dist/auth-server.d.ts +1 -35
  5. package/dist/auth-server.mjs +1 -2272
  6. package/dist/auth-server.mjs.map +1 -1
  7. package/dist/auth.cjs +285 -146
  8. package/dist/auth.cjs.map +1 -1
  9. package/dist/auth.d.cts +137 -2
  10. package/dist/auth.d.ts +137 -2
  11. package/dist/auth.mjs +294 -155
  12. package/dist/auth.mjs.map +1 -1
  13. package/dist/clients.cjs +35 -0
  14. package/dist/clients.cjs.map +1 -1
  15. package/dist/clients.d.cts +147 -2
  16. package/dist/clients.d.ts +147 -2
  17. package/dist/clients.mjs +35 -0
  18. package/dist/clients.mjs.map +1 -1
  19. package/dist/hooks.cjs +11 -0
  20. package/dist/hooks.cjs.map +1 -1
  21. package/dist/hooks.mjs +11 -0
  22. package/dist/hooks.mjs.map +1 -1
  23. package/dist/index.cjs +35 -0
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +169 -6
  26. package/dist/index.d.ts +169 -6
  27. package/dist/index.mjs +35 -0
  28. package/dist/index.mjs.map +1 -1
  29. package/package.json +7 -4
  30. package/src/_api/generated/_cfg_accounts/api.ts +8 -0
  31. package/src/_api/generated/_cfg_accounts/openapi.json +84 -5
  32. package/src/_api/generated/_cfg_accounts/schemas/OAuthTokenResponse.ts +2 -2
  33. package/src/_api/generated/_cfg_accounts/schemas/OTPRequestResponse.ts +2 -0
  34. package/src/_api/generated/_cfg_accounts/schemas/WebmailLink.ts +15 -0
  35. package/src/_api/generated/_cfg_accounts/schemas/WebmailLinkProviderEnum.ts +9 -0
  36. package/src/_api/generated/_cfg_accounts/schemas/index.ts +2 -0
  37. package/src/_api/generated/_cfg_centrifugo/api.ts +8 -0
  38. package/src/_api/generated/_cfg_totp/api.ts +8 -0
  39. package/src/_api/generated/helpers/auth.ts +12 -0
  40. package/src/_api/generated/openapi.json +84 -5
  41. package/src/_api/generated/types.gen.ts +131 -2
  42. package/src/auth/__tests__/jwt.test.ts +119 -0
  43. package/src/auth/__tests__/onUnauthorized.test.ts +206 -0
  44. package/src/auth/__tests__/refreshRotation.test.ts +119 -0
  45. package/src/auth/__tests__/sessionBootstrap.test.ts +76 -0
  46. package/src/auth/context/AuthContext.tsx +131 -14
  47. package/src/auth/hooks/useAuthForm.ts +5 -2
  48. package/src/auth/hooks/useAuthFormState.ts +4 -1
  49. package/src/auth/hooks/useTokenRefresh.ts +28 -62
  50. package/src/auth/middlewares/index.ts +7 -7
  51. package/src/auth/refreshHandler.ts +79 -0
  52. package/src/auth/types/form.ts +10 -0
  53. package/src/auth/types/index.ts +1 -0
  54. package/src/auth/utils/jwt.ts +66 -0
  55. package/src/auth/middlewares/tokenRefresh.ts +0 -161
package/dist/auth.d.cts CHANGED
@@ -73,6 +73,10 @@ type OtpRequestResponse = {
73
73
  * Success message
74
74
  */
75
75
  message: string;
76
+ /**
77
+ * Webmail deep-link for the recipient's provider, or null if the domain is unknown.
78
+ */
79
+ webmail?: WebmailLink | null;
76
80
  };
77
81
  /**
78
82
  * Serializer for OTP verification.
@@ -190,6 +194,129 @@ type User = {
190
194
  readonly centrifugo: CentrifugoToken | null;
191
195
  readonly api_key: string | null;
192
196
  };
197
+ /**
198
+ * Deep-link that opens the user's webmail on a search for our login email.
199
+ *
200
+ * Present only when the recipient's email domain maps to a known webmail
201
+ * provider (Gmail, Outlook, Mail.ru, Yandex, iCloud, …). For unknown/corporate
202
+ * domains this whole object is null and the frontend shows no button.
203
+ */
204
+ type WebmailLink = {
205
+ /**
206
+ * Provider slug (e.g. 'gmail', 'outlook', 'mail_ru'). Also selects the brand icon on the frontend.
207
+ *
208
+ * * `gmail` - gmail
209
+ * * `outlook` - outlook
210
+ * * `yahoo` - yahoo
211
+ * * `icloud` - icloud
212
+ * * `proton` - proton
213
+ * * `zoho` - zoho
214
+ * * `aol` - aol
215
+ * * `fastmail` - fastmail
216
+ * * `gmx` - gmx
217
+ * * `mailcom` - mailcom
218
+ * * `mail_ru` - mail_ru
219
+ * * `yandex` - yandex
220
+ * * `rambler` - rambler
221
+ * * `qq` - qq
222
+ * * `netease` - netease
223
+ * * `sina` - sina
224
+ * * `aliyun` - aliyun
225
+ * * `naver` - naver
226
+ * * `daum` - daum
227
+ * * `web_de` - web_de
228
+ * * `tonline` - tonline
229
+ * * `seznam` - seznam
230
+ * * `wp_pl` - wp_pl
231
+ * * `o2_pl` - o2_pl
232
+ * * `interia` - interia
233
+ * * `libero` - libero
234
+ * * `virgilio` - virgilio
235
+ * * `orange` - orange
236
+ * * `laposte` - laposte
237
+ * * `free_fr` - free_fr
238
+ * * `sfr` - sfr
239
+ */
240
+ provider: WebmailLinkProviderEnum;
241
+ /**
242
+ * Human-facing provider name, e.g. 'Gmail'.
243
+ */
244
+ provider_name: string;
245
+ /**
246
+ * Absolute URL to open in a new tab (a sender-filtered search, or the inbox as fallback).
247
+ */
248
+ url: string;
249
+ /**
250
+ * True if the URL opens a search filtered to our sender; False if it only opens the inbox.
251
+ */
252
+ is_search: boolean;
253
+ };
254
+ /**
255
+ * * `gmail` - gmail
256
+ * * `outlook` - outlook
257
+ * * `yahoo` - yahoo
258
+ * * `icloud` - icloud
259
+ * * `proton` - proton
260
+ * * `zoho` - zoho
261
+ * * `aol` - aol
262
+ * * `fastmail` - fastmail
263
+ * * `gmx` - gmx
264
+ * * `mailcom` - mailcom
265
+ * * `mail_ru` - mail_ru
266
+ * * `yandex` - yandex
267
+ * * `rambler` - rambler
268
+ * * `qq` - qq
269
+ * * `netease` - netease
270
+ * * `sina` - sina
271
+ * * `aliyun` - aliyun
272
+ * * `naver` - naver
273
+ * * `daum` - daum
274
+ * * `web_de` - web_de
275
+ * * `tonline` - tonline
276
+ * * `seznam` - seznam
277
+ * * `wp_pl` - wp_pl
278
+ * * `o2_pl` - o2_pl
279
+ * * `interia` - interia
280
+ * * `libero` - libero
281
+ * * `virgilio` - virgilio
282
+ * * `orange` - orange
283
+ * * `laposte` - laposte
284
+ * * `free_fr` - free_fr
285
+ * * `sfr` - sfr
286
+ */
287
+ declare enum WebmailLinkProviderEnum {
288
+ GMAIL = "gmail",
289
+ OUTLOOK = "outlook",
290
+ YAHOO = "yahoo",
291
+ ICLOUD = "icloud",
292
+ PROTON = "proton",
293
+ ZOHO = "zoho",
294
+ AOL = "aol",
295
+ FASTMAIL = "fastmail",
296
+ GMX = "gmx",
297
+ MAILCOM = "mailcom",
298
+ MAIL_RU = "mail_ru",
299
+ YANDEX = "yandex",
300
+ RAMBLER = "rambler",
301
+ QQ = "qq",
302
+ NETEASE = "netease",
303
+ SINA = "sina",
304
+ ALIYUN = "aliyun",
305
+ NAVER = "naver",
306
+ DAUM = "daum",
307
+ WEB_DE = "web_de",
308
+ TONLINE = "tonline",
309
+ SEZNAM = "seznam",
310
+ WP_PL = "wp_pl",
311
+ O2_PL = "o2_pl",
312
+ INTERIA = "interia",
313
+ LIBERO = "libero",
314
+ VIRGILIO = "virgilio",
315
+ ORANGE = "orange",
316
+ LAPOSTE = "laposte",
317
+ FREE_FR = "free_fr",
318
+ SFR = "sfr"
319
+ }
193
320
 
194
321
  /**
195
322
  * Auth Form Types
@@ -204,6 +331,8 @@ interface OTPRequestResult {
204
331
  message: string;
205
332
  statusCode?: number;
206
333
  retryAfter?: number;
334
+ /** Webmail deep-link for the recipient's provider, or null if unknown. */
335
+ webmail?: WebmailLink | null;
207
336
  }
208
337
  interface AuthFormState {
209
338
  /** Email address */
@@ -232,6 +361,8 @@ interface AuthFormState {
232
361
  isRateLimited: boolean;
233
362
  /** Formatted countdown label, e.g. "19:00" or "42s" */
234
363
  rateLimitLabel: string;
364
+ /** Webmail deep-link for the current identifier's provider (null = no button). */
365
+ webmail: WebmailLink | null;
235
366
  }
236
367
  interface AuthFormStateHandlers {
237
368
  setIdentifier: (identifier: string) => void;
@@ -247,6 +378,8 @@ interface AuthFormStateHandlers {
247
378
  setUseBackupCode: (useBackup: boolean) => void;
248
379
  /** Start a countdown timer that disables submit for `seconds` seconds */
249
380
  startRateLimitCountdown: (seconds: number) => void;
381
+ /** Set (or clear) the webmail deep-link for the current identifier */
382
+ setWebmail: (webmail: WebmailLink | null) => void;
250
383
  }
251
384
  interface AuthFormSubmitHandlers {
252
385
  handleIdentifierSubmit: (e: React.FormEvent) => Promise<void>;
@@ -817,7 +950,9 @@ interface UseTokenRefreshOptions {
817
950
  onRefreshError?: (error: Error) => void;
818
951
  }
819
952
  /**
820
- * Hook for automatic token refresh
953
+ * Hook for proactive automatic token refresh.
954
+ * (JWT expiry helpers live in ../utils/jwt so they can be unit-tested and
955
+ * reused by the auth-bootstrap validation path.)
821
956
  */
822
957
  declare function useTokenRefresh(options?: UseTokenRefreshOptions): {
823
958
  refreshToken: () => Promise<boolean>;
@@ -918,4 +1053,4 @@ declare const Analytics: {
918
1053
  setUser(userId: string): void;
919
1054
  };
920
1055
 
921
- export { AUTH_CONSTANTS, type AccountsContextValue, AccountsProvider, Analytics, AnalyticsCategory, type AnalyticsCategoryType, AnalyticsEvent, type AnalyticsEventType, type AuthConfig, AuthContext, type AuthContextType, type AuthFormAutoSubmit, type AuthFormReturn, type AuthFormState, type AuthFormStateHandlers, type AuthFormSubmitHandlers, type AuthFormValidation, AuthProvider, type AuthProviderProps, type AuthStep, type DeleteAccountResult, type OTPRequestResult, type PatchedCfgUserUpdateRequest, PatchedCfgUserUpdateRequestSchema, type ProfileCacheOptions, type TwoFactorDevice, type TwoFactorSetupData, type UseAuthFormOptions, type UseAuthFormStateReturn, type UseAutoAuthOptions, type UseDeleteAccountReturn, type UseGithubAuthOptions, type UseGithubAuthReturn, type UseTwoFactorOptions, type UseTwoFactorReturn, type UseTwoFactorSetupOptions, type UseTwoFactorSetupReturn, type UseTwoFactorStatusReturn, type UserProfile, authLogger, clearProfileCache, decodeBase64, encodeBase64, formatAuthError, getCacheMetadata, getCachedProfile, hasValidCache, logger, setCachedProfile, useAccountsContext, useAuth, useAuthForm, useAuthFormState, useAuthGuard, useAuthRedirectManager, useAuthValidation, useAutoAuth, useBase64, useCfgRouter, useDeleteAccount, useGithubAuth, useLocalStorage, useQueryParams, useSessionStorage, useTokenRefresh, useTwoFactor, useTwoFactorSetup, useTwoFactorStatus, validateEmail, validateIdentifier };
1056
+ export { AUTH_CONSTANTS, type AccountsContextValue, AccountsProvider, Analytics, AnalyticsCategory, type AnalyticsCategoryType, AnalyticsEvent, type AnalyticsEventType, type AuthConfig, AuthContext, type AuthContextType, type AuthFormAutoSubmit, type AuthFormReturn, type AuthFormState, type AuthFormStateHandlers, type AuthFormSubmitHandlers, type AuthFormValidation, AuthProvider, type AuthProviderProps, type AuthStep, type DeleteAccountResult, type OTPRequestResult, type PatchedCfgUserUpdateRequest, PatchedCfgUserUpdateRequestSchema, type ProfileCacheOptions, type TwoFactorDevice, type TwoFactorSetupData, type UseAuthFormOptions, type UseAuthFormStateReturn, type UseAutoAuthOptions, type UseDeleteAccountReturn, type UseGithubAuthOptions, type UseGithubAuthReturn, type UseTwoFactorOptions, type UseTwoFactorReturn, type UseTwoFactorSetupOptions, type UseTwoFactorSetupReturn, type UseTwoFactorStatusReturn, type UserProfile, type WebmailLink, authLogger, clearProfileCache, decodeBase64, encodeBase64, formatAuthError, getCacheMetadata, getCachedProfile, hasValidCache, logger, setCachedProfile, useAccountsContext, useAuth, useAuthForm, useAuthFormState, useAuthGuard, useAuthRedirectManager, useAuthValidation, useAutoAuth, useBase64, useCfgRouter, useDeleteAccount, useGithubAuth, useLocalStorage, useQueryParams, useSessionStorage, useTokenRefresh, useTwoFactor, useTwoFactorSetup, useTwoFactorStatus, validateEmail, validateIdentifier };
package/dist/auth.d.ts CHANGED
@@ -73,6 +73,10 @@ type OtpRequestResponse = {
73
73
  * Success message
74
74
  */
75
75
  message: string;
76
+ /**
77
+ * Webmail deep-link for the recipient's provider, or null if the domain is unknown.
78
+ */
79
+ webmail?: WebmailLink | null;
76
80
  };
77
81
  /**
78
82
  * Serializer for OTP verification.
@@ -190,6 +194,129 @@ type User = {
190
194
  readonly centrifugo: CentrifugoToken | null;
191
195
  readonly api_key: string | null;
192
196
  };
197
+ /**
198
+ * Deep-link that opens the user's webmail on a search for our login email.
199
+ *
200
+ * Present only when the recipient's email domain maps to a known webmail
201
+ * provider (Gmail, Outlook, Mail.ru, Yandex, iCloud, …). For unknown/corporate
202
+ * domains this whole object is null and the frontend shows no button.
203
+ */
204
+ type WebmailLink = {
205
+ /**
206
+ * Provider slug (e.g. 'gmail', 'outlook', 'mail_ru'). Also selects the brand icon on the frontend.
207
+ *
208
+ * * `gmail` - gmail
209
+ * * `outlook` - outlook
210
+ * * `yahoo` - yahoo
211
+ * * `icloud` - icloud
212
+ * * `proton` - proton
213
+ * * `zoho` - zoho
214
+ * * `aol` - aol
215
+ * * `fastmail` - fastmail
216
+ * * `gmx` - gmx
217
+ * * `mailcom` - mailcom
218
+ * * `mail_ru` - mail_ru
219
+ * * `yandex` - yandex
220
+ * * `rambler` - rambler
221
+ * * `qq` - qq
222
+ * * `netease` - netease
223
+ * * `sina` - sina
224
+ * * `aliyun` - aliyun
225
+ * * `naver` - naver
226
+ * * `daum` - daum
227
+ * * `web_de` - web_de
228
+ * * `tonline` - tonline
229
+ * * `seznam` - seznam
230
+ * * `wp_pl` - wp_pl
231
+ * * `o2_pl` - o2_pl
232
+ * * `interia` - interia
233
+ * * `libero` - libero
234
+ * * `virgilio` - virgilio
235
+ * * `orange` - orange
236
+ * * `laposte` - laposte
237
+ * * `free_fr` - free_fr
238
+ * * `sfr` - sfr
239
+ */
240
+ provider: WebmailLinkProviderEnum;
241
+ /**
242
+ * Human-facing provider name, e.g. 'Gmail'.
243
+ */
244
+ provider_name: string;
245
+ /**
246
+ * Absolute URL to open in a new tab (a sender-filtered search, or the inbox as fallback).
247
+ */
248
+ url: string;
249
+ /**
250
+ * True if the URL opens a search filtered to our sender; False if it only opens the inbox.
251
+ */
252
+ is_search: boolean;
253
+ };
254
+ /**
255
+ * * `gmail` - gmail
256
+ * * `outlook` - outlook
257
+ * * `yahoo` - yahoo
258
+ * * `icloud` - icloud
259
+ * * `proton` - proton
260
+ * * `zoho` - zoho
261
+ * * `aol` - aol
262
+ * * `fastmail` - fastmail
263
+ * * `gmx` - gmx
264
+ * * `mailcom` - mailcom
265
+ * * `mail_ru` - mail_ru
266
+ * * `yandex` - yandex
267
+ * * `rambler` - rambler
268
+ * * `qq` - qq
269
+ * * `netease` - netease
270
+ * * `sina` - sina
271
+ * * `aliyun` - aliyun
272
+ * * `naver` - naver
273
+ * * `daum` - daum
274
+ * * `web_de` - web_de
275
+ * * `tonline` - tonline
276
+ * * `seznam` - seznam
277
+ * * `wp_pl` - wp_pl
278
+ * * `o2_pl` - o2_pl
279
+ * * `interia` - interia
280
+ * * `libero` - libero
281
+ * * `virgilio` - virgilio
282
+ * * `orange` - orange
283
+ * * `laposte` - laposte
284
+ * * `free_fr` - free_fr
285
+ * * `sfr` - sfr
286
+ */
287
+ declare enum WebmailLinkProviderEnum {
288
+ GMAIL = "gmail",
289
+ OUTLOOK = "outlook",
290
+ YAHOO = "yahoo",
291
+ ICLOUD = "icloud",
292
+ PROTON = "proton",
293
+ ZOHO = "zoho",
294
+ AOL = "aol",
295
+ FASTMAIL = "fastmail",
296
+ GMX = "gmx",
297
+ MAILCOM = "mailcom",
298
+ MAIL_RU = "mail_ru",
299
+ YANDEX = "yandex",
300
+ RAMBLER = "rambler",
301
+ QQ = "qq",
302
+ NETEASE = "netease",
303
+ SINA = "sina",
304
+ ALIYUN = "aliyun",
305
+ NAVER = "naver",
306
+ DAUM = "daum",
307
+ WEB_DE = "web_de",
308
+ TONLINE = "tonline",
309
+ SEZNAM = "seznam",
310
+ WP_PL = "wp_pl",
311
+ O2_PL = "o2_pl",
312
+ INTERIA = "interia",
313
+ LIBERO = "libero",
314
+ VIRGILIO = "virgilio",
315
+ ORANGE = "orange",
316
+ LAPOSTE = "laposte",
317
+ FREE_FR = "free_fr",
318
+ SFR = "sfr"
319
+ }
193
320
 
194
321
  /**
195
322
  * Auth Form Types
@@ -204,6 +331,8 @@ interface OTPRequestResult {
204
331
  message: string;
205
332
  statusCode?: number;
206
333
  retryAfter?: number;
334
+ /** Webmail deep-link for the recipient's provider, or null if unknown. */
335
+ webmail?: WebmailLink | null;
207
336
  }
208
337
  interface AuthFormState {
209
338
  /** Email address */
@@ -232,6 +361,8 @@ interface AuthFormState {
232
361
  isRateLimited: boolean;
233
362
  /** Formatted countdown label, e.g. "19:00" or "42s" */
234
363
  rateLimitLabel: string;
364
+ /** Webmail deep-link for the current identifier's provider (null = no button). */
365
+ webmail: WebmailLink | null;
235
366
  }
236
367
  interface AuthFormStateHandlers {
237
368
  setIdentifier: (identifier: string) => void;
@@ -247,6 +378,8 @@ interface AuthFormStateHandlers {
247
378
  setUseBackupCode: (useBackup: boolean) => void;
248
379
  /** Start a countdown timer that disables submit for `seconds` seconds */
249
380
  startRateLimitCountdown: (seconds: number) => void;
381
+ /** Set (or clear) the webmail deep-link for the current identifier */
382
+ setWebmail: (webmail: WebmailLink | null) => void;
250
383
  }
251
384
  interface AuthFormSubmitHandlers {
252
385
  handleIdentifierSubmit: (e: React.FormEvent) => Promise<void>;
@@ -817,7 +950,9 @@ interface UseTokenRefreshOptions {
817
950
  onRefreshError?: (error: Error) => void;
818
951
  }
819
952
  /**
820
- * Hook for automatic token refresh
953
+ * Hook for proactive automatic token refresh.
954
+ * (JWT expiry helpers live in ../utils/jwt so they can be unit-tested and
955
+ * reused by the auth-bootstrap validation path.)
821
956
  */
822
957
  declare function useTokenRefresh(options?: UseTokenRefreshOptions): {
823
958
  refreshToken: () => Promise<boolean>;
@@ -918,4 +1053,4 @@ declare const Analytics: {
918
1053
  setUser(userId: string): void;
919
1054
  };
920
1055
 
921
- export { AUTH_CONSTANTS, type AccountsContextValue, AccountsProvider, Analytics, AnalyticsCategory, type AnalyticsCategoryType, AnalyticsEvent, type AnalyticsEventType, type AuthConfig, AuthContext, type AuthContextType, type AuthFormAutoSubmit, type AuthFormReturn, type AuthFormState, type AuthFormStateHandlers, type AuthFormSubmitHandlers, type AuthFormValidation, AuthProvider, type AuthProviderProps, type AuthStep, type DeleteAccountResult, type OTPRequestResult, type PatchedCfgUserUpdateRequest, PatchedCfgUserUpdateRequestSchema, type ProfileCacheOptions, type TwoFactorDevice, type TwoFactorSetupData, type UseAuthFormOptions, type UseAuthFormStateReturn, type UseAutoAuthOptions, type UseDeleteAccountReturn, type UseGithubAuthOptions, type UseGithubAuthReturn, type UseTwoFactorOptions, type UseTwoFactorReturn, type UseTwoFactorSetupOptions, type UseTwoFactorSetupReturn, type UseTwoFactorStatusReturn, type UserProfile, authLogger, clearProfileCache, decodeBase64, encodeBase64, formatAuthError, getCacheMetadata, getCachedProfile, hasValidCache, logger, setCachedProfile, useAccountsContext, useAuth, useAuthForm, useAuthFormState, useAuthGuard, useAuthRedirectManager, useAuthValidation, useAutoAuth, useBase64, useCfgRouter, useDeleteAccount, useGithubAuth, useLocalStorage, useQueryParams, useSessionStorage, useTokenRefresh, useTwoFactor, useTwoFactorSetup, useTwoFactorStatus, validateEmail, validateIdentifier };
1056
+ export { AUTH_CONSTANTS, type AccountsContextValue, AccountsProvider, Analytics, AnalyticsCategory, type AnalyticsCategoryType, AnalyticsEvent, type AnalyticsEventType, type AuthConfig, AuthContext, type AuthContextType, type AuthFormAutoSubmit, type AuthFormReturn, type AuthFormState, type AuthFormStateHandlers, type AuthFormSubmitHandlers, type AuthFormValidation, AuthProvider, type AuthProviderProps, type AuthStep, type DeleteAccountResult, type OTPRequestResult, type PatchedCfgUserUpdateRequest, PatchedCfgUserUpdateRequestSchema, type ProfileCacheOptions, type TwoFactorDevice, type TwoFactorSetupData, type UseAuthFormOptions, type UseAuthFormStateReturn, type UseAutoAuthOptions, type UseDeleteAccountReturn, type UseGithubAuthOptions, type UseGithubAuthReturn, type UseTwoFactorOptions, type UseTwoFactorReturn, type UseTwoFactorSetupOptions, type UseTwoFactorSetupReturn, type UseTwoFactorStatusReturn, type UserProfile, type WebmailLink, authLogger, clearProfileCache, decodeBase64, encodeBase64, formatAuthError, getCacheMetadata, getCachedProfile, hasValidCache, logger, setCachedProfile, useAccountsContext, useAuth, useAuthForm, useAuthFormState, useAuthGuard, useAuthRedirectManager, useAuthValidation, useAutoAuth, useBase64, useCfgRouter, useDeleteAccount, useGithubAuth, useLocalStorage, useQueryParams, useSessionStorage, useTokenRefresh, useTwoFactor, useTwoFactorSetup, useTwoFactorStatus, validateEmail, validateIdentifier };