@webiny/cognito 6.6.0-alpha.0 → 6.6.0-alpha.1

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 (78) hide show
  1. package/Cognito.d.ts +51 -0
  2. package/Cognito.js +78 -4
  3. package/Cognito.js.map +1 -1
  4. package/admin/Cognito.js +8 -2
  5. package/admin/Cognito.js.map +1 -1
  6. package/admin/DefaultCognitoSignInConfig.d.ts +23 -0
  7. package/admin/DefaultCognitoSignInConfig.js +51 -0
  8. package/admin/DefaultCognitoSignInConfig.js.map +1 -0
  9. package/admin/SignInExtension.d.ts +2 -0
  10. package/admin/SignInExtension.js +9 -0
  11. package/admin/SignInExtension.js.map +1 -0
  12. package/admin/index.d.ts +2 -0
  13. package/admin/index.js +2 -0
  14. package/admin/presentation/Cognito/CognitoLoginScreen.d.ts +2 -2
  15. package/admin/presentation/Cognito/CognitoLoginScreen.js +9 -0
  16. package/admin/presentation/Cognito/CognitoLoginScreen.js.map +1 -1
  17. package/admin/presentation/Cognito/CognitoPresenter.d.ts +25 -1
  18. package/admin/presentation/Cognito/CognitoPresenter.js +122 -10
  19. package/admin/presentation/Cognito/CognitoPresenter.js.map +1 -1
  20. package/admin/presentation/Cognito/CognitoSignInConfig.d.ts +31 -0
  21. package/admin/presentation/Cognito/CognitoSignInConfig.js +5 -0
  22. package/admin/presentation/Cognito/CognitoSignInConfig.js.map +1 -0
  23. package/admin/presentation/Cognito/abstractions.d.ts +20 -1
  24. package/admin/presentation/Cognito/abstractions.js.map +1 -1
  25. package/admin/presentation/Cognito/components/ConfirmTotpCode.d.ts +26 -0
  26. package/admin/presentation/Cognito/components/ConfirmTotpCode.js +45 -0
  27. package/admin/presentation/Cognito/components/ConfirmTotpCode.js.map +1 -0
  28. package/admin/presentation/Cognito/components/Divider.d.ts +19 -1
  29. package/admin/presentation/Cognito/components/Divider.js +3 -2
  30. package/admin/presentation/Cognito/components/Divider.js.map +1 -1
  31. package/admin/presentation/Cognito/components/FederatedLogin.d.ts +22 -5
  32. package/admin/presentation/Cognito/components/FederatedLogin.js +19 -6
  33. package/admin/presentation/Cognito/components/FederatedLogin.js.map +1 -1
  34. package/admin/presentation/Cognito/components/FooterSignIn.d.ts +20 -3
  35. package/admin/presentation/Cognito/components/FooterSignIn.js +3 -2
  36. package/admin/presentation/Cognito/components/FooterSignIn.js.map +1 -1
  37. package/admin/presentation/Cognito/components/PasswordResetCodeSent.d.ts +19 -1
  38. package/admin/presentation/Cognito/components/PasswordResetCodeSent.js +3 -2
  39. package/admin/presentation/Cognito/components/PasswordResetCodeSent.js.map +1 -1
  40. package/admin/presentation/Cognito/components/RequestPasswordResetCode.d.ts +19 -1
  41. package/admin/presentation/Cognito/components/RequestPasswordResetCode.js +3 -2
  42. package/admin/presentation/Cognito/components/RequestPasswordResetCode.js.map +1 -1
  43. package/admin/presentation/Cognito/components/RequireNewPassword.d.ts +19 -1
  44. package/admin/presentation/Cognito/components/RequireNewPassword.js +3 -2
  45. package/admin/presentation/Cognito/components/RequireNewPassword.js.map +1 -1
  46. package/admin/presentation/Cognito/components/SetNewPassword.d.ts +19 -1
  47. package/admin/presentation/Cognito/components/SetNewPassword.js +3 -2
  48. package/admin/presentation/Cognito/components/SetNewPassword.js.map +1 -1
  49. package/admin/presentation/Cognito/components/SetupTotp.d.ts +25 -0
  50. package/admin/presentation/Cognito/components/SetupTotp.js +60 -0
  51. package/admin/presentation/Cognito/components/SetupTotp.js.map +1 -0
  52. package/admin/presentation/Cognito/components/SignIn.d.ts +19 -3
  53. package/admin/presentation/Cognito/components/SignIn.js +14 -7
  54. package/admin/presentation/Cognito/components/SignIn.js.map +1 -1
  55. package/admin/presentation/Cognito/components/index.d.ts +292 -0
  56. package/admin/presentation/Cognito/components/index.js +29 -0
  57. package/admin/presentation/Cognito/components/index.js.map +1 -0
  58. package/admin/presentation/Cognito/signInFeature.d.ts +1 -0
  59. package/admin/presentation/Cognito/signInFeature.js +11 -0
  60. package/admin/presentation/Cognito/signInFeature.js.map +1 -0
  61. package/admin/ui/views/Account/Account.js.map +1 -1
  62. package/admin/ui/views/Users/UsersForm.js +21 -15
  63. package/admin/ui/views/Users/UsersForm.js.map +1 -1
  64. package/admin/ui/views/Users/UsersView.js +3 -3
  65. package/admin/ui/views/Users/UsersView.js.map +1 -1
  66. package/admin/ui/views/Users/hooks/useUserForm.js.map +1 -1
  67. package/api/features/CognitoIdp/CognitoIdentityProvider.js +15 -11
  68. package/api/features/CognitoIdp/CognitoIdentityProvider.js.map +1 -1
  69. package/api/features/CognitoIdp/abstractions.d.ts +1 -1
  70. package/api/features/CognitoIdp/abstractions.js.map +1 -1
  71. package/api/index.d.ts +1 -0
  72. package/api/index.js +1 -0
  73. package/index.d.ts +0 -1
  74. package/index.js +0 -1
  75. package/infra/CognitoFederationPulumi.d.ts +8 -0
  76. package/infra/CognitoFederationPulumi.js +17 -0
  77. package/infra/CognitoFederationPulumi.js.map +1 -0
  78. package/package.json +23 -21
@@ -4,10 +4,13 @@ import { confirmResetPassword, confirmSignIn, fetchAuthSession, resetPassword, s
4
4
  import { CognitoPresenter } from "./abstractions.js";
5
5
  import { LogInUseCase } from "@webiny/app-admin/features/security/LogIn/index.js";
6
6
  import { IdentityContext } from "@webiny/app-admin/features/security/IdentityContext/index.js";
7
+ import { CognitoSignInConfig } from "./CognitoSignInConfig.js";
8
+ const federatedDescription = "You will be taken to an external service to complete the sign-in process.";
7
9
  class CognitoPresenterImpl {
8
- constructor(identity, logInUseCase){
10
+ constructor(identity, logInUseCase, signInConfig){
9
11
  this.identity = identity;
10
12
  this.logInUseCase = logInUseCase;
13
+ this.signInConfig = signInConfig;
11
14
  this.authState = "signIn";
12
15
  this.authData = null;
13
16
  this.message = null;
@@ -15,6 +18,12 @@ class CognitoPresenterImpl {
15
18
  this.isLoggingIn = false;
16
19
  this.formLoading = false;
17
20
  this.initialized = false;
21
+ this.signInTitle = "Sign in";
22
+ this.signInDescription = void 0;
23
+ this.allowCredentialsLogin = true;
24
+ this.federatedProviders = [];
25
+ this.totpSharedSecret = "";
26
+ this.totpQrCodeUri = "";
18
27
  makeAutoObservable(this);
19
28
  }
20
29
  get vm() {
@@ -26,7 +35,11 @@ class CognitoPresenterImpl {
26
35
  isAuthenticated: identity.isAuthenticated,
27
36
  signIn: {
28
37
  isLoading: this.formLoading,
29
- message: this.message
38
+ message: this.message,
39
+ title: this.signInTitle,
40
+ description: this.signInDescription,
41
+ allowCredentialsLogin: this.allowCredentialsLogin,
42
+ federatedProviders: this.federatedProviders
30
43
  },
31
44
  requestPasswordResetCode: {
32
45
  isLoading: this.formLoading,
@@ -43,13 +56,50 @@ class CognitoPresenterImpl {
43
56
  requireNewPassword: {
44
57
  isLoading: this.formLoading,
45
58
  requiredAttributes: this.authData && this.authData.requiredAttributes || []
59
+ },
60
+ confirmTotpCode: {
61
+ isLoading: this.formLoading,
62
+ message: this.message
63
+ },
64
+ setupTotp: {
65
+ isLoading: this.formLoading,
66
+ sharedSecret: this.totpSharedSecret,
67
+ qrCodeUri: this.totpQrCodeUri,
68
+ message: this.message
46
69
  }
47
70
  };
48
71
  }
49
72
  async init(params) {
50
73
  if (this.initialized) return;
74
+ let oauthConfig;
75
+ if (this.signInConfig) {
76
+ const config = await this.signInConfig.getConfig();
77
+ runInAction(()=>{
78
+ this.signInTitle = config.title ?? "Sign in";
79
+ this.signInDescription = config.description;
80
+ if (!config.description && !config.allowCredentialsLogin) this.signInDescription = federatedDescription;
81
+ this.allowCredentialsLogin = config.allowCredentialsLogin;
82
+ this.federatedProviders = config.providers;
83
+ });
84
+ const domain = process.env.REACT_APP_USER_POOL_DOMAIN;
85
+ if (domain) oauthConfig = {
86
+ Cognito: {
87
+ userPoolId: params.userPoolId,
88
+ userPoolClientId: params.clientId,
89
+ loginWith: {
90
+ oauth: {
91
+ domain,
92
+ redirectSignIn: config.oauth.redirectSignIn,
93
+ redirectSignOut: config.oauth.redirectSignOut,
94
+ scopes: config.oauth.scopes,
95
+ responseType: config.oauth.responseType
96
+ }
97
+ }
98
+ }
99
+ };
100
+ }
51
101
  Amplify.configure({
52
- Auth: {
102
+ Auth: oauthConfig ?? {
53
103
  Cognito: {
54
104
  userPoolId: params.userPoolId,
55
105
  userPoolClientId: params.clientId
@@ -81,7 +131,20 @@ class CognitoPresenterImpl {
81
131
  };
82
132
  this.formLoading = false;
83
133
  });
84
- else {
134
+ else if ("CONFIRM_SIGN_IN_WITH_TOTP_CODE" === nextStep.signInStep) runInAction(()=>{
135
+ this.authState = "confirmTotpCode";
136
+ this.formLoading = false;
137
+ });
138
+ else if ("CONTINUE_SIGN_IN_WITH_TOTP_SETUP" === nextStep.signInStep) {
139
+ const totpSetup = nextStep.totpSetupDetails;
140
+ const uri = totpSetup.getSetupUri("Webiny").toString();
141
+ runInAction(()=>{
142
+ this.totpSharedSecret = totpSetup.sharedSecret;
143
+ this.totpQrCodeUri = uri;
144
+ this.authState = "setupTotp";
145
+ this.formLoading = false;
146
+ });
147
+ } else {
85
148
  await this.handleSignedIn();
86
149
  runInAction(()=>{
87
150
  this.formLoading = false;
@@ -193,6 +256,54 @@ class CognitoPresenterImpl {
193
256
  });
194
257
  }
195
258
  }
259
+ async confirmTotpCode(code) {
260
+ runInAction(()=>{
261
+ this.formLoading = true;
262
+ this.message = null;
263
+ });
264
+ try {
265
+ await confirmSignIn({
266
+ challengeResponse: code
267
+ });
268
+ await this.handleSignedIn();
269
+ } catch (error) {
270
+ runInAction(()=>{
271
+ this.message = {
272
+ title: "Verification Failed",
273
+ text: error.message,
274
+ type: "danger"
275
+ };
276
+ });
277
+ } finally{
278
+ runInAction(()=>{
279
+ this.formLoading = false;
280
+ });
281
+ }
282
+ }
283
+ async verifyTotpSetup(code) {
284
+ runInAction(()=>{
285
+ this.formLoading = true;
286
+ this.message = null;
287
+ });
288
+ try {
289
+ await confirmSignIn({
290
+ challengeResponse: code
291
+ });
292
+ await this.handleSignedIn();
293
+ } catch (error) {
294
+ runInAction(()=>{
295
+ this.message = {
296
+ title: "Setup Failed",
297
+ text: error.message,
298
+ type: "danger"
299
+ };
300
+ });
301
+ } finally{
302
+ runInAction(()=>{
303
+ this.formLoading = false;
304
+ });
305
+ }
306
+ }
196
307
  showSignIn() {
197
308
  this.authState = "signIn";
198
309
  this.authData = null;
@@ -241,11 +352,6 @@ class CognitoPresenterImpl {
241
352
  }
242
353
  }
243
354
  async checkUrl() {
244
- const query = new URLSearchParams(window.location.search);
245
- const queryData = {};
246
- query.forEach((value, key)=>queryData[key] = value);
247
- const { state } = queryData;
248
- if (state) return;
249
355
  return this.checkSession();
250
356
  }
251
357
  async checkSession() {
@@ -266,7 +372,13 @@ const CognitoPresenter_CognitoPresenter = CognitoPresenter.createImplementation(
266
372
  implementation: CognitoPresenterImpl,
267
373
  dependencies: [
268
374
  IdentityContext,
269
- LogInUseCase
375
+ LogInUseCase,
376
+ [
377
+ CognitoSignInConfig,
378
+ {
379
+ optional: true
380
+ }
381
+ ]
270
382
  ]
271
383
  });
272
384
  export { CognitoPresenter_CognitoPresenter as CognitoPresenter };
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/Cognito/CognitoPresenter.js","sources":["../../../../src/admin/presentation/Cognito/CognitoPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport { Amplify } from \"aws-amplify\";\nimport {\n signIn,\n signOut,\n confirmSignIn,\n resetPassword,\n confirmResetPassword,\n fetchAuthSession\n} from \"aws-amplify/auth\";\nimport {\n CognitoPresenter as CognitoPresenterAbstraction,\n AuthState,\n AuthData,\n AuthMessage,\n ICognitoInitParams\n} from \"./abstractions.js\";\nimport { LogInUseCase } from \"@webiny/app-admin/features/security/LogIn/index.js\";\nimport { IdentityContext } from \"@webiny/app-admin/features/security/IdentityContext/index.js\";\n\nclass CognitoPresenterImpl implements CognitoPresenterAbstraction.Interface {\n private authState: AuthState = \"signIn\";\n private authData: AuthData | null = null;\n private message: AuthMessage | null = null;\n private checkingSession = false;\n private isLoggingIn = false;\n private formLoading = false;\n private initialized = false;\n\n constructor(\n private identity: IdentityContext.Interface,\n private logInUseCase: LogInUseCase.Interface\n ) {\n makeAutoObservable(this);\n }\n\n get vm() {\n const identity = this.identity.getIdentity();\n\n return {\n authState: this.authState,\n checkingSession: this.checkingSession,\n isLoggingIn: this.isLoggingIn,\n isAuthenticated: identity.isAuthenticated,\n\n // View-specific VMs\n signIn: {\n isLoading: this.formLoading,\n message: this.message\n },\n requestPasswordResetCode: {\n isLoading: this.formLoading,\n message: this.message\n },\n passwordResetCodeSent: {\n isLoading: this.formLoading,\n message: this.message\n },\n setNewPassword: {\n isLoading: this.formLoading,\n message: this.message\n },\n requireNewPassword: {\n isLoading: this.formLoading,\n requiredAttributes: (this.authData && this.authData.requiredAttributes) || []\n }\n };\n }\n\n async init(params: ICognitoInitParams): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n Amplify.configure({\n Auth: {\n Cognito: {\n userPoolId: params.userPoolId,\n userPoolClientId: params.clientId\n }\n }\n });\n this.initialized = true;\n\n await this.checkUrl();\n }\n\n // Public API\n async signIn(username: string, password: string): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n const usernameOrPassword = [\"UserNotFoundException\", \"NotAuthorizedException\"];\n\n try {\n const result = await signIn({ username, password });\n const { nextStep } = result;\n\n if (nextStep.signInStep === \"CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED\") {\n runInAction(() => {\n this.authState = \"requireNewPassword\";\n this.authData = {\n requiredAttributes: nextStep.missingAttributes || []\n };\n this.formLoading = false;\n });\n } else {\n await this.handleSignedIn();\n runInAction(() => {\n this.formLoading = false;\n });\n }\n } catch (error) {\n let message = error.message;\n\n if (usernameOrPassword.includes(error.name)) {\n message = \"Incorrect username or password.\";\n }\n runInAction(() => {\n this.message = {\n title: \"Login Failed\",\n text: message,\n type: \"danger\"\n };\n this.formLoading = false;\n });\n }\n }\n\n async confirmNewPassword(password: string, requiredAttributes: any): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await confirmSignIn({\n challengeResponse: password,\n options: { userAttributes: requiredAttributes }\n });\n await this.handleSignedIn();\n } catch (error) {\n runInAction(() => {\n this.message = {\n title: \"Error\",\n text: error.message,\n type: \"danger\"\n };\n });\n } finally {\n runInAction(() => {\n this.formLoading = false;\n });\n }\n }\n\n async requestPasswordReset(username: string): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await resetPassword({ username });\n } catch {\n // We ignore errors and pretend that everything went fine.\n // Showing an error would give a potential attacker information about which usernames exist (or not).\n // This way it's more difficult to exploit the process.\n } finally {\n runInAction(() => {\n this.authState = \"passwordResetCodeSent\";\n this.authData = { username };\n this.formLoading = false;\n });\n }\n }\n\n async resendPasswordResetCode(): Promise<void> {\n const username = this.authData?.username;\n if (this.authState !== \"passwordResetCodeSent\" || !username) {\n return;\n }\n\n await this.requestPasswordReset(username!);\n runInAction(() => {\n this.message = {\n title: \"Code Resent\",\n text: \"Password reset code has been resent to your email address. Please check your inbox!\",\n type: \"success\"\n };\n });\n }\n\n async confirmPasswordReset(code: string, password: string): Promise<void> {\n const username = this.authData?.username;\n if (!username) {\n return;\n }\n\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await confirmResetPassword({\n username,\n confirmationCode: code,\n newPassword: password\n });\n runInAction(() => {\n this.authState = \"signIn\";\n this.message = {\n title: \"Password Reset\",\n text: \"You can now sign in with your new password\",\n type: \"success\"\n };\n });\n } catch (error) {\n runInAction(() => {\n this.message = {\n title: \"Error\",\n text: error.message,\n type: \"danger\"\n };\n });\n } finally {\n runInAction(() => {\n this.formLoading = false;\n });\n }\n }\n\n showSignIn(): void {\n this.authState = \"signIn\";\n this.authData = null;\n this.message = null;\n }\n\n showRequestPasswordResetCode(): void {\n this.authState = \"requestPasswordResetCode\";\n this.message = null;\n }\n\n showSetNewPassword(): void {\n this.authState = \"setNewPassword\";\n this.message = null;\n }\n\n // Private/internal methods\n private async handleSignedIn(): Promise<void> {\n runInAction(() => {\n this.isLoggingIn = true;\n });\n\n try {\n await this.logInUseCase.execute({\n idTokenProvider: async () => {\n const session = await fetchAuthSession();\n const idToken = session.tokens?.idToken;\n if (!idToken) {\n throw new Error(\"No ID token available.\");\n }\n return idToken.toString();\n },\n logoutCallback: () => {\n signOut();\n runInAction(() => {\n this.authState = \"signIn\";\n this.authData = null;\n });\n }\n });\n\n runInAction(() => {\n this.authState = \"signedIn\";\n });\n } catch (error) {\n console.error(\"Error during sign in:\", error);\n runInAction(() => {\n this.authState = \"signIn\";\n });\n } finally {\n runInAction(() => {\n this.isLoggingIn = false;\n });\n }\n }\n\n private async checkUrl(): Promise<void> {\n const query = new URLSearchParams(window.location.search);\n const queryData: Record<string, string> = {};\n query.forEach((value, key) => (queryData[key] = value));\n const { state } = queryData;\n\n if (state) {\n // Handle state from URL if needed\n return;\n }\n\n return this.checkSession();\n }\n\n private async checkSession(): Promise<void> {\n runInAction(() => {\n this.checkingSession = true;\n });\n\n try {\n const session = await fetchAuthSession();\n if (session.tokens) {\n // We don't need to `await`, we simply start a separate \"branch\" of execution.\n this.handleSignedIn();\n }\n } catch {\n // Not authenticated, stay on signIn\n } finally {\n runInAction(() => {\n this.checkingSession = false;\n });\n }\n }\n}\n\nexport const CognitoPresenter = CognitoPresenterAbstraction.createImplementation({\n implementation: CognitoPresenterImpl,\n dependencies: [IdentityContext, LogInUseCase]\n});\n"],"names":["CognitoPresenterImpl","identity","logInUseCase","makeAutoObservable","params","Amplify","username","password","runInAction","usernameOrPassword","result","signIn","nextStep","error","message","requiredAttributes","confirmSignIn","resetPassword","code","confirmResetPassword","session","fetchAuthSession","idToken","Error","signOut","console","query","URLSearchParams","window","queryData","value","key","state","CognitoPresenter","CognitoPresenterAbstraction","IdentityContext","LogInUseCase"],"mappings":"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"}
1
+ {"version":3,"file":"admin/presentation/Cognito/CognitoPresenter.js","sources":["../../../../src/admin/presentation/Cognito/CognitoPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction } from \"mobx\";\nimport { Amplify } from \"aws-amplify\";\nimport {\n signIn,\n signOut,\n confirmSignIn,\n resetPassword,\n confirmResetPassword,\n fetchAuthSession\n} from \"aws-amplify/auth\";\nimport {\n CognitoPresenter as CognitoPresenterAbstraction,\n AuthState,\n AuthData,\n AuthMessage,\n ICognitoInitParams\n} from \"./abstractions.js\";\nimport { LogInUseCase } from \"@webiny/app-admin/features/security/LogIn/index.js\";\nimport { IdentityContext } from \"@webiny/app-admin/features/security/IdentityContext/index.js\";\nimport { CognitoSignInConfig } from \"./CognitoSignInConfig.js\";\n\nconst federatedDescription =\n \"You will be taken to an external service to complete the sign-in process.\";\n\nclass CognitoPresenterImpl implements CognitoPresenterAbstraction.Interface {\n private authState: AuthState = \"signIn\";\n private authData: AuthData | null = null;\n private message: AuthMessage | null = null;\n private checkingSession = false;\n private isLoggingIn = false;\n private formLoading = false;\n private initialized = false;\n\n private signInTitle = \"Sign in\";\n private signInDescription: string | undefined = undefined;\n private allowCredentialsLogin = true;\n private federatedProviders: CognitoSignInConfig.FederatedProvider[] = [];\n\n private totpSharedSecret = \"\";\n private totpQrCodeUri = \"\";\n\n constructor(\n private identity: IdentityContext.Interface,\n private logInUseCase: LogInUseCase.Interface,\n private signInConfig: CognitoSignInConfig.Interface | undefined\n ) {\n makeAutoObservable(this);\n }\n\n get vm() {\n const identity = this.identity.getIdentity();\n\n return {\n authState: this.authState,\n checkingSession: this.checkingSession,\n isLoggingIn: this.isLoggingIn,\n isAuthenticated: identity.isAuthenticated,\n\n // View-specific VMs\n signIn: {\n isLoading: this.formLoading,\n message: this.message,\n title: this.signInTitle,\n description: this.signInDescription,\n allowCredentialsLogin: this.allowCredentialsLogin,\n federatedProviders: this.federatedProviders\n },\n requestPasswordResetCode: {\n isLoading: this.formLoading,\n message: this.message\n },\n passwordResetCodeSent: {\n isLoading: this.formLoading,\n message: this.message\n },\n setNewPassword: {\n isLoading: this.formLoading,\n message: this.message\n },\n requireNewPassword: {\n isLoading: this.formLoading,\n requiredAttributes: (this.authData && this.authData.requiredAttributes) || []\n },\n confirmTotpCode: {\n isLoading: this.formLoading,\n message: this.message\n },\n setupTotp: {\n isLoading: this.formLoading,\n sharedSecret: this.totpSharedSecret,\n qrCodeUri: this.totpQrCodeUri,\n message: this.message\n }\n };\n }\n\n async init(params: ICognitoInitParams): Promise<void> {\n if (this.initialized) {\n return;\n }\n\n let oauthConfig:\n | { Cognito: { userPoolId: string; userPoolClientId: string; loginWith: any } }\n | undefined;\n\n if (this.signInConfig) {\n const config = await this.signInConfig.getConfig();\n\n runInAction(() => {\n this.signInTitle = config.title ?? \"Sign in\";\n this.signInDescription = config.description;\n\n if (!config.description && !config.allowCredentialsLogin) {\n this.signInDescription = federatedDescription;\n }\n\n this.allowCredentialsLogin = config.allowCredentialsLogin;\n this.federatedProviders = config.providers;\n });\n\n const domain = process.env.REACT_APP_USER_POOL_DOMAIN;\n if (domain) {\n oauthConfig = {\n Cognito: {\n userPoolId: params.userPoolId,\n userPoolClientId: params.clientId,\n loginWith: {\n oauth: {\n domain,\n redirectSignIn: config.oauth.redirectSignIn,\n redirectSignOut: config.oauth.redirectSignOut,\n scopes: config.oauth.scopes,\n responseType: config.oauth.responseType\n }\n }\n }\n };\n }\n }\n\n Amplify.configure({\n Auth: oauthConfig ?? {\n Cognito: {\n userPoolId: params.userPoolId,\n userPoolClientId: params.clientId\n }\n }\n });\n this.initialized = true;\n\n await this.checkUrl();\n }\n\n // Public API\n async signIn(username: string, password: string): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n const usernameOrPassword = [\"UserNotFoundException\", \"NotAuthorizedException\"];\n\n try {\n const result = await signIn({ username, password });\n const { nextStep } = result;\n\n if (nextStep.signInStep === \"CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED\") {\n runInAction(() => {\n this.authState = \"requireNewPassword\";\n this.authData = {\n requiredAttributes: nextStep.missingAttributes || []\n };\n this.formLoading = false;\n });\n } else if (nextStep.signInStep === \"CONFIRM_SIGN_IN_WITH_TOTP_CODE\") {\n runInAction(() => {\n this.authState = \"confirmTotpCode\";\n this.formLoading = false;\n });\n } else if (nextStep.signInStep === \"CONTINUE_SIGN_IN_WITH_TOTP_SETUP\") {\n const totpSetup = nextStep.totpSetupDetails;\n const uri = totpSetup.getSetupUri(\"Webiny\").toString();\n runInAction(() => {\n this.totpSharedSecret = totpSetup.sharedSecret;\n this.totpQrCodeUri = uri;\n this.authState = \"setupTotp\";\n this.formLoading = false;\n });\n } else {\n await this.handleSignedIn();\n runInAction(() => {\n this.formLoading = false;\n });\n }\n } catch (error) {\n let message = error.message;\n\n if (usernameOrPassword.includes(error.name)) {\n message = \"Incorrect username or password.\";\n }\n runInAction(() => {\n this.message = {\n title: \"Login Failed\",\n text: message,\n type: \"danger\"\n };\n this.formLoading = false;\n });\n }\n }\n\n async confirmNewPassword(password: string, requiredAttributes: any): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await confirmSignIn({\n challengeResponse: password,\n options: { userAttributes: requiredAttributes }\n });\n await this.handleSignedIn();\n } catch (error) {\n runInAction(() => {\n this.message = {\n title: \"Error\",\n text: error.message,\n type: \"danger\"\n };\n });\n } finally {\n runInAction(() => {\n this.formLoading = false;\n });\n }\n }\n\n async requestPasswordReset(username: string): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await resetPassword({ username });\n } catch {\n // We ignore errors and pretend that everything went fine.\n // Showing an error would give a potential attacker information about which usernames exist (or not).\n // This way it's more difficult to exploit the process.\n } finally {\n runInAction(() => {\n this.authState = \"passwordResetCodeSent\";\n this.authData = { username };\n this.formLoading = false;\n });\n }\n }\n\n async resendPasswordResetCode(): Promise<void> {\n const username = this.authData?.username;\n if (this.authState !== \"passwordResetCodeSent\" || !username) {\n return;\n }\n\n await this.requestPasswordReset(username!);\n runInAction(() => {\n this.message = {\n title: \"Code Resent\",\n text: \"Password reset code has been resent to your email address. Please check your inbox!\",\n type: \"success\"\n };\n });\n }\n\n async confirmPasswordReset(code: string, password: string): Promise<void> {\n const username = this.authData?.username;\n if (!username) {\n return;\n }\n\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await confirmResetPassword({\n username,\n confirmationCode: code,\n newPassword: password\n });\n runInAction(() => {\n this.authState = \"signIn\";\n this.message = {\n title: \"Password Reset\",\n text: \"You can now sign in with your new password\",\n type: \"success\"\n };\n });\n } catch (error) {\n runInAction(() => {\n this.message = {\n title: \"Error\",\n text: error.message,\n type: \"danger\"\n };\n });\n } finally {\n runInAction(() => {\n this.formLoading = false;\n });\n }\n }\n\n async confirmTotpCode(code: string): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await confirmSignIn({ challengeResponse: code });\n await this.handleSignedIn();\n } catch (error) {\n runInAction(() => {\n this.message = {\n title: \"Verification Failed\",\n text: error.message,\n type: \"danger\"\n };\n });\n } finally {\n runInAction(() => {\n this.formLoading = false;\n });\n }\n }\n\n async verifyTotpSetup(code: string): Promise<void> {\n runInAction(() => {\n this.formLoading = true;\n this.message = null;\n });\n\n try {\n await confirmSignIn({ challengeResponse: code });\n await this.handleSignedIn();\n } catch (error) {\n runInAction(() => {\n this.message = {\n title: \"Setup Failed\",\n text: error.message,\n type: \"danger\"\n };\n });\n } finally {\n runInAction(() => {\n this.formLoading = false;\n });\n }\n }\n\n showSignIn(): void {\n this.authState = \"signIn\";\n this.authData = null;\n this.message = null;\n }\n\n showRequestPasswordResetCode(): void {\n this.authState = \"requestPasswordResetCode\";\n this.message = null;\n }\n\n showSetNewPassword(): void {\n this.authState = \"setNewPassword\";\n this.message = null;\n }\n\n // Private/internal methods\n private async handleSignedIn(): Promise<void> {\n runInAction(() => {\n this.isLoggingIn = true;\n });\n\n try {\n await this.logInUseCase.execute({\n idTokenProvider: async () => {\n const session = await fetchAuthSession();\n const idToken = session.tokens?.idToken;\n if (!idToken) {\n throw new Error(\"No ID token available.\");\n }\n return idToken.toString();\n },\n logoutCallback: () => {\n signOut();\n runInAction(() => {\n this.authState = \"signIn\";\n this.authData = null;\n });\n }\n });\n\n runInAction(() => {\n this.authState = \"signedIn\";\n });\n } catch (error) {\n console.error(\"Error during sign in:\", error);\n runInAction(() => {\n this.authState = \"signIn\";\n });\n } finally {\n runInAction(() => {\n this.isLoggingIn = false;\n });\n }\n }\n\n private async checkUrl(): Promise<void> {\n return this.checkSession();\n }\n\n private async checkSession(): Promise<void> {\n runInAction(() => {\n this.checkingSession = true;\n });\n\n try {\n const session = await fetchAuthSession();\n if (session.tokens) {\n // We don't need to `await`, we simply start a separate \"branch\" of execution.\n this.handleSignedIn();\n }\n } catch {\n // Not authenticated, stay on signIn\n } finally {\n runInAction(() => {\n this.checkingSession = false;\n });\n }\n }\n}\n\nexport const CognitoPresenter = CognitoPresenterAbstraction.createImplementation({\n implementation: CognitoPresenterImpl,\n dependencies: [IdentityContext, LogInUseCase, [CognitoSignInConfig, { optional: true }]]\n});\n"],"names":["federatedDescription","CognitoPresenterImpl","identity","logInUseCase","signInConfig","undefined","makeAutoObservable","params","oauthConfig","config","runInAction","domain","process","Amplify","username","password","usernameOrPassword","result","signIn","nextStep","totpSetup","uri","error","message","requiredAttributes","confirmSignIn","resetPassword","code","confirmResetPassword","session","fetchAuthSession","idToken","Error","signOut","console","CognitoPresenter","CognitoPresenterAbstraction","IdentityContext","LogInUseCase","CognitoSignInConfig"],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type React from "react";
2
+ export interface SignInProps {
3
+ signIn: () => void;
4
+ }
5
+ export type IFederatedProvider = {
6
+ name: string;
7
+ label: string;
8
+ } | {
9
+ name: string;
10
+ component: React.FC<SignInProps>;
11
+ };
12
+ export interface ICognitoSignInConfig {
13
+ getConfig(): Promise<{
14
+ oauth: {
15
+ scopes: string[];
16
+ redirectSignIn: string[];
17
+ redirectSignOut: string[];
18
+ responseType: "code" | "token";
19
+ };
20
+ allowCredentialsLogin: boolean;
21
+ providers: IFederatedProvider[];
22
+ title?: string;
23
+ description?: string;
24
+ }>;
25
+ }
26
+ export declare const CognitoSignInConfig: import("@webiny/di").Abstraction<ICognitoSignInConfig>;
27
+ export declare namespace CognitoSignInConfig {
28
+ type Interface = ICognitoSignInConfig;
29
+ type Config = Awaited<ReturnType<ICognitoSignInConfig["getConfig"]>>;
30
+ type FederatedProvider = IFederatedProvider;
31
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const CognitoSignInConfig = createAbstraction("CognitoSignInConfig");
3
+ export { CognitoSignInConfig };
4
+
5
+ //# sourceMappingURL=CognitoSignInConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/Cognito/CognitoSignInConfig.js","sources":["../../../../src/admin/presentation/Cognito/CognitoSignInConfig.ts"],"sourcesContent":["import type React from \"react\";\nimport { createAbstraction } from \"@webiny/feature/admin\";\n\nexport interface SignInProps {\n signIn: () => void;\n}\n\nexport type IFederatedProvider =\n | { name: string; label: string }\n | { name: string; component: React.FC<SignInProps> };\n\nexport interface ICognitoSignInConfig {\n getConfig(): Promise<{\n oauth: {\n scopes: string[];\n redirectSignIn: string[];\n redirectSignOut: string[];\n responseType: \"code\" | \"token\";\n };\n allowCredentialsLogin: boolean;\n providers: IFederatedProvider[];\n title?: string;\n description?: string;\n }>;\n}\n\nexport const CognitoSignInConfig = createAbstraction<ICognitoSignInConfig>(\"CognitoSignInConfig\");\n\nexport namespace CognitoSignInConfig {\n export type Interface = ICognitoSignInConfig;\n export type Config = Awaited<ReturnType<ICognitoSignInConfig[\"getConfig\"]>>;\n export type FederatedProvider = IFederatedProvider;\n}\n"],"names":["CognitoSignInConfig","createAbstraction"],"mappings":";AA0BO,MAAMA,sBAAsBC,kBAAwC"}
@@ -1,4 +1,5 @@
1
- export type AuthState = "signIn" | "signedIn" | "signedOut" | "requestPasswordResetCode" | "passwordResetCodeSent" | "setNewPassword" | "requireNewPassword";
1
+ import type { IFederatedProvider } from "./CognitoSignInConfig.js";
2
+ export type AuthState = "signIn" | "signedIn" | "signedOut" | "requestPasswordResetCode" | "passwordResetCodeSent" | "setNewPassword" | "requireNewPassword" | "confirmTotpCode" | "setupTotp";
2
3
  export interface AuthDataVerified {
3
4
  email?: string;
4
5
  phone_number?: string;
@@ -27,6 +28,10 @@ export interface ICognitoInitParams {
27
28
  export interface SignInVM {
28
29
  isLoading: boolean;
29
30
  message: AuthMessage | null;
31
+ title: string;
32
+ description: string | undefined;
33
+ allowCredentialsLogin: boolean;
34
+ federatedProviders: IFederatedProvider[];
30
35
  }
31
36
  export interface RequireNewPasswordVM {
32
37
  isLoading: boolean;
@@ -44,6 +49,16 @@ export interface SetNewPasswordVM {
44
49
  isLoading: boolean;
45
50
  message: AuthMessage | null;
46
51
  }
52
+ export interface ConfirmTotpCodeVM {
53
+ isLoading: boolean;
54
+ message: AuthMessage | null;
55
+ }
56
+ export interface SetupTotpVM {
57
+ isLoading: boolean;
58
+ sharedSecret: string;
59
+ qrCodeUri: string;
60
+ message: AuthMessage | null;
61
+ }
47
62
  export interface ICognitoPresenter {
48
63
  vm: {
49
64
  authState: AuthState;
@@ -55,6 +70,8 @@ export interface ICognitoPresenter {
55
70
  requestPasswordResetCode: RequestPasswordResetCodeVM;
56
71
  passwordResetCodeSent: PasswordResetCodeSentVM;
57
72
  setNewPassword: SetNewPasswordVM;
73
+ confirmTotpCode: ConfirmTotpCodeVM;
74
+ setupTotp: SetupTotpVM;
58
75
  };
59
76
  init(params: ICognitoInitParams): Promise<void>;
60
77
  signIn(username: string, password: string): Promise<void>;
@@ -62,6 +79,8 @@ export interface ICognitoPresenter {
62
79
  requestPasswordReset(username: string): Promise<void>;
63
80
  resendPasswordResetCode(): Promise<void>;
64
81
  confirmPasswordReset(code: string, password: string): Promise<void>;
82
+ confirmTotpCode(code: string): Promise<void>;
83
+ verifyTotpSetup(code: string): Promise<void>;
65
84
  showSignIn(): void;
66
85
  showRequestPasswordResetCode(): void;
67
86
  showSetNewPassword(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/Cognito/abstractions.js","sources":["../../../../src/admin/presentation/Cognito/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\n\nexport type AuthState =\n | \"signIn\"\n | \"signedIn\"\n | \"signedOut\"\n | \"requestPasswordResetCode\"\n | \"passwordResetCodeSent\"\n | \"setNewPassword\"\n | \"requireNewPassword\";\n\nexport interface AuthDataVerified {\n email?: string;\n phone_number?: string;\n}\n\nexport interface AuthDataUnverified {\n email?: string;\n phone_number?: string;\n}\n\nexport interface AuthData {\n username?: string;\n verified?: AuthDataVerified;\n unverified?: AuthDataUnverified;\n requiredAttributes?: string[];\n [key: string]:\n | string\n | null\n | boolean\n | undefined\n | string[]\n | AuthDataVerified\n | AuthDataUnverified;\n}\n\nexport interface AuthMessage {\n title: string;\n text: string;\n type: \"success\" | \"info\" | \"warning\" | \"danger\";\n}\n\nexport interface ICognitoInitParams {\n region: string;\n userPoolId: string;\n clientId: string;\n}\n\nexport interface SignInVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface RequireNewPasswordVM {\n isLoading: boolean;\n requiredAttributes: string[];\n}\n\nexport interface RequestPasswordResetCodeVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface PasswordResetCodeSentVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface SetNewPasswordVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface ICognitoPresenter {\n vm: {\n authState: AuthState;\n checkingSession: boolean;\n isLoggingIn: boolean;\n isAuthenticated: boolean;\n signIn: SignInVM;\n requireNewPassword: RequireNewPasswordVM;\n requestPasswordResetCode: RequestPasswordResetCodeVM;\n passwordResetCodeSent: PasswordResetCodeSentVM;\n setNewPassword: SetNewPasswordVM;\n };\n\n // Lifecycle\n init(params: ICognitoInitParams): Promise<void>;\n\n // Authentication actions\n signIn(username: string, password: string): Promise<void>;\n confirmNewPassword(password: string, requiredAttributes: any): Promise<void>;\n requestPasswordReset(username: string): Promise<void>;\n resendPasswordResetCode(): Promise<void>;\n confirmPasswordReset(code: string, password: string): Promise<void>;\n\n // Navigation actions\n showSignIn(): void;\n showRequestPasswordResetCode(): void;\n showSetNewPassword(): void;\n}\n\nexport const CognitoPresenter = createAbstraction<ICognitoPresenter>(\"CognitoPresenter\");\n\nexport namespace CognitoPresenter {\n export type Interface = ICognitoPresenter;\n}\n"],"names":["CognitoPresenter","createAbstraction"],"mappings":";AAsGO,MAAMA,mBAAmBC,kBAAqC"}
1
+ {"version":3,"file":"admin/presentation/Cognito/abstractions.js","sources":["../../../../src/admin/presentation/Cognito/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { IFederatedProvider } from \"./CognitoSignInConfig.js\";\n\nexport type AuthState =\n | \"signIn\"\n | \"signedIn\"\n | \"signedOut\"\n | \"requestPasswordResetCode\"\n | \"passwordResetCodeSent\"\n | \"setNewPassword\"\n | \"requireNewPassword\"\n | \"confirmTotpCode\"\n | \"setupTotp\";\n\nexport interface AuthDataVerified {\n email?: string;\n phone_number?: string;\n}\n\nexport interface AuthDataUnverified {\n email?: string;\n phone_number?: string;\n}\n\nexport interface AuthData {\n username?: string;\n verified?: AuthDataVerified;\n unverified?: AuthDataUnverified;\n requiredAttributes?: string[];\n [key: string]:\n | string\n | null\n | boolean\n | undefined\n | string[]\n | AuthDataVerified\n | AuthDataUnverified;\n}\n\nexport interface AuthMessage {\n title: string;\n text: string;\n type: \"success\" | \"info\" | \"warning\" | \"danger\";\n}\n\nexport interface ICognitoInitParams {\n region: string;\n userPoolId: string;\n clientId: string;\n}\n\nexport interface SignInVM {\n isLoading: boolean;\n message: AuthMessage | null;\n title: string;\n description: string | undefined;\n allowCredentialsLogin: boolean;\n federatedProviders: IFederatedProvider[];\n}\n\nexport interface RequireNewPasswordVM {\n isLoading: boolean;\n requiredAttributes: string[];\n}\n\nexport interface RequestPasswordResetCodeVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface PasswordResetCodeSentVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface SetNewPasswordVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface ConfirmTotpCodeVM {\n isLoading: boolean;\n message: AuthMessage | null;\n}\n\nexport interface SetupTotpVM {\n isLoading: boolean;\n sharedSecret: string;\n qrCodeUri: string;\n message: AuthMessage | null;\n}\n\nexport interface ICognitoPresenter {\n vm: {\n authState: AuthState;\n checkingSession: boolean;\n isLoggingIn: boolean;\n isAuthenticated: boolean;\n signIn: SignInVM;\n requireNewPassword: RequireNewPasswordVM;\n requestPasswordResetCode: RequestPasswordResetCodeVM;\n passwordResetCodeSent: PasswordResetCodeSentVM;\n setNewPassword: SetNewPasswordVM;\n confirmTotpCode: ConfirmTotpCodeVM;\n setupTotp: SetupTotpVM;\n };\n\n // Lifecycle\n init(params: ICognitoInitParams): Promise<void>;\n\n // Authentication actions\n signIn(username: string, password: string): Promise<void>;\n confirmNewPassword(password: string, requiredAttributes: any): Promise<void>;\n requestPasswordReset(username: string): Promise<void>;\n resendPasswordResetCode(): Promise<void>;\n confirmPasswordReset(code: string, password: string): Promise<void>;\n confirmTotpCode(code: string): Promise<void>;\n verifyTotpSetup(code: string): Promise<void>;\n\n // Navigation actions\n showSignIn(): void;\n showRequestPasswordResetCode(): void;\n showSetNewPassword(): void;\n}\n\nexport const CognitoPresenter = createAbstraction<ICognitoPresenter>(\"CognitoPresenter\");\n\nexport namespace CognitoPresenter {\n export type Interface = ICognitoPresenter;\n}\n"],"names":["CognitoPresenter","createAbstraction"],"mappings":";AA6HO,MAAMA,mBAAmBC,kBAAqC"}
@@ -0,0 +1,26 @@
1
+ import React from "react";
2
+ import type { ConfirmTotpCodeVM } from "../../../../admin/presentation/Cognito/abstractions.js";
3
+ export interface ConfirmTotpCodeProps {
4
+ vm: ConfirmTotpCodeVM;
5
+ onSubmit: (code: string) => void;
6
+ onCancel: () => void;
7
+ }
8
+ export declare const ConfirmTotpCode: ((props: ConfirmTotpCodeProps) => React.JSX.Element) & {
9
+ original: (props: ConfirmTotpCodeProps) => React.JSX.Element;
10
+ originalName: string;
11
+ displayName: string;
12
+ } & {
13
+ original: ((props: ConfirmTotpCodeProps) => React.JSX.Element) & {
14
+ original: (props: ConfirmTotpCodeProps) => React.JSX.Element;
15
+ originalName: string;
16
+ displayName: string;
17
+ };
18
+ originalName: string;
19
+ displayName: string;
20
+ } & {
21
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<((props: ConfirmTotpCodeProps) => React.JSX.Element) & {
22
+ original: (props: ConfirmTotpCodeProps) => React.JSX.Element;
23
+ originalName: string;
24
+ displayName: string;
25
+ }>) => (props: unknown) => React.JSX.Element;
26
+ };
@@ -0,0 +1,45 @@
1
+ import react from "react";
2
+ import { Alert, Button, Grid, Input } from "@webiny/admin-ui";
3
+ import { makeDecoratable } from "@webiny/app-admin";
4
+ import { Bind, Form } from "@webiny/form";
5
+ import { validation } from "@webiny/validation";
6
+ import { View } from "./View.js";
7
+ import { FooterSignIn } from "./FooterSignIn.js";
8
+ const ConfirmTotpCode = makeDecoratable("CognitoConfirmTotpCode", (props)=>{
9
+ const { vm, onSubmit, onCancel } = props;
10
+ return /*#__PURE__*/ react.createElement(View.Container, null, /*#__PURE__*/ react.createElement(Form, {
11
+ onSubmit: (data)=>onSubmit(data.code),
12
+ submitOnEnter: true
13
+ }, ({ submit })=>/*#__PURE__*/ react.createElement(View.Content, null, /*#__PURE__*/ react.createElement(View.Title, {
14
+ title: "Two-factor authentication",
15
+ description: "Enter the 6-digit code from your authenticator app."
16
+ }), vm.message && /*#__PURE__*/ react.createElement("div", {
17
+ className: "mb-lg"
18
+ }, /*#__PURE__*/ react.createElement(Alert, {
19
+ title: vm.message.title,
20
+ type: vm.message.type
21
+ }, vm.message.text)), /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
22
+ span: 12
23
+ }, /*#__PURE__*/ react.createElement(Bind, {
24
+ name: "code",
25
+ validators: validation.create("required")
26
+ }, /*#__PURE__*/ react.createElement(Input, {
27
+ label: "Verification Code",
28
+ autoComplete: "one-time-code",
29
+ inputMode: "numeric"
30
+ }))), /*#__PURE__*/ react.createElement(Grid.Column, {
31
+ span: 12
32
+ }, /*#__PURE__*/ react.createElement("div", {
33
+ className: "flex items-center justify-between"
34
+ }, /*#__PURE__*/ react.createElement(FooterSignIn, {
35
+ onSignIn: onCancel
36
+ }), /*#__PURE__*/ react.createElement(Button, {
37
+ text: "Verify",
38
+ onClick: submit,
39
+ containerClassName: "ml-auto",
40
+ disabled: vm.isLoading
41
+ })))))));
42
+ });
43
+ export { ConfirmTotpCode };
44
+
45
+ //# sourceMappingURL=ConfirmTotpCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/Cognito/components/ConfirmTotpCode.js","sources":["../../../../../src/admin/presentation/Cognito/components/ConfirmTotpCode.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button, Grid, Input, Alert } from \"@webiny/admin-ui\";\nimport { makeDecoratable } from \"@webiny/app-admin\";\nimport { Form, Bind } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport { View } from \"./View.js\";\nimport type { ConfirmTotpCodeVM } from \"~/admin/presentation/Cognito/abstractions.js\";\nimport { FooterSignIn } from \"~/admin/presentation/Cognito/components/FooterSignIn.js\";\n\nexport interface ConfirmTotpCodeProps {\n vm: ConfirmTotpCodeVM;\n onSubmit: (code: string) => void;\n onCancel: () => void;\n}\n\nexport const ConfirmTotpCode = makeDecoratable(\n \"CognitoConfirmTotpCode\",\n (props: ConfirmTotpCodeProps) => {\n const { vm, onSubmit, onCancel } = props;\n\n return (\n <View.Container>\n <Form<{ code: string }> onSubmit={data => onSubmit(data.code)} submitOnEnter>\n {({ submit }) => (\n <View.Content>\n <View.Title\n title={\"Two-factor authentication\"}\n description={\"Enter the 6-digit code from your authenticator app.\"}\n />\n\n {vm.message && (\n <div className={\"mb-lg\"}>\n <Alert title={vm.message.title} type={vm.message.type}>\n {vm.message.text}\n </Alert>\n </div>\n )}\n\n <Grid>\n <Grid.Column span={12}>\n <Bind name=\"code\" validators={validation.create(\"required\")}>\n <Input\n label={\"Verification Code\"}\n autoComplete={\"one-time-code\"}\n inputMode={\"numeric\"}\n />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <div className={\"flex items-center justify-between\"}>\n <FooterSignIn onSignIn={onCancel} />\n <Button\n text={\"Verify\"}\n onClick={submit}\n containerClassName={\"ml-auto\"}\n disabled={vm.isLoading}\n />\n </div>\n </Grid.Column>\n </Grid>\n </View.Content>\n )}\n </Form>\n </View.Container>\n );\n }\n);\n"],"names":["ConfirmTotpCode","makeDecoratable","props","vm","onSubmit","onCancel","View","Form","data","submit","Alert","Grid","Bind","validation","Input","FooterSignIn","Button"],"mappings":";;;;;;;AAeO,MAAMA,kBAAkBC,gBAC3B,0BACA,CAACC;IACG,MAAM,EAAEC,EAAE,EAAEC,QAAQ,EAAEC,QAAQ,EAAE,GAAGH;IAEnC,OAAO,WAAP,GACI,oBAACI,KAAK,SAAS,sBACX,oBAACC,MAAIA;QAAmB,UAAUC,CAAAA,OAAQJ,SAASI,KAAK,IAAI;QAAG;OAC1D,CAAC,EAAEC,MAAM,EAAE,iBACR,oBAACH,KAAK,OAAO,sBACT,oBAACA,KAAK,KAAK;YACP,OAAO;YACP,aAAa;YAGhBH,GAAG,OAAO,IAAI,WAAJ,GACP,oBAAC;YAAI,WAAW;yBACZ,oBAACO,OAAKA;YAAC,OAAOP,GAAG,OAAO,CAAC,KAAK;YAAE,MAAMA,GAAG,OAAO,CAAC,IAAI;WAChDA,GAAG,OAAO,CAAC,IAAI,kBAK5B,oBAACQ,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;YAAC,MAAM;yBACf,oBAACC,MAAIA;YAAC,MAAK;YAAO,YAAYC,WAAW,MAAM,CAAC;yBAC5C,oBAACC,OAAKA;YACF,OAAO;YACP,cAAc;YACd,WAAW;4BAIvB,oBAACH,KAAK,MAAM;YAAC,MAAM;yBACf,oBAAC;YAAI,WAAW;yBACZ,oBAACI,cAAYA;YAAC,UAAUV;0BACxB,oBAACW,QAAMA;YACH,MAAM;YACN,SAASP;YACT,oBAAoB;YACpB,UAAUN,GAAG,SAAS;;AAU9D"}
@@ -1,2 +1,20 @@
1
1
  import React from "react";
2
- export declare const Divider: () => React.JSX.Element;
2
+ export declare const Divider: (() => React.JSX.Element) & {
3
+ original: () => React.JSX.Element;
4
+ originalName: string;
5
+ displayName: string;
6
+ } & {
7
+ original: (() => React.JSX.Element) & {
8
+ original: () => React.JSX.Element;
9
+ originalName: string;
10
+ displayName: string;
11
+ };
12
+ originalName: string;
13
+ displayName: string;
14
+ } & {
15
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<(() => React.JSX.Element) & {
16
+ original: () => React.JSX.Element;
17
+ originalName: string;
18
+ displayName: string;
19
+ }>) => (props: unknown) => React.JSX.Element;
20
+ };
@@ -1,6 +1,7 @@
1
1
  import react from "react";
2
2
  import { Separator, Text } from "@webiny/admin-ui";
3
- const Divider = ()=>/*#__PURE__*/ react.createElement("div", {
3
+ import { makeDecoratable } from "@webiny/app-admin";
4
+ const Divider = makeDecoratable("CognitoDivider", ()=>/*#__PURE__*/ react.createElement("div", {
4
5
  className: "relative my-lg"
5
6
  }, /*#__PURE__*/ react.createElement("div", {
6
7
  className: "absolute inset-0 flex items-center"
@@ -9,7 +10,7 @@ const Divider = ()=>/*#__PURE__*/ react.createElement("div", {
9
10
  }, /*#__PURE__*/ react.createElement(Text, {
10
11
  size: "sm",
11
12
  className: "text-neutral-strong px-sm bg-neutral-base uppercase"
12
- }, "Or continue with")));
13
+ }, "Or continue with"))));
13
14
  export { Divider };
14
15
 
15
16
  //# sourceMappingURL=Divider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/Cognito/components/Divider.js","sources":["../../../../../src/admin/presentation/Cognito/components/Divider.tsx"],"sourcesContent":["import React from \"react\";\nimport { Separator, Text } from \"@webiny/admin-ui\";\n\nexport const Divider = () => {\n return (\n <div className={\"relative my-lg\"}>\n <div className={\"absolute inset-0 flex items-center\"}>\n <Separator />\n </div>\n <div className={\"relative flex justify-center\"}>\n <Text size={\"sm\"} className={\"text-neutral-strong px-sm bg-neutral-base uppercase\"}>\n {\"Or continue with\"}\n </Text>\n </div>\n </div>\n );\n};\n"],"names":["Divider","Separator","Text"],"mappings":";;AAGO,MAAMA,UAAU,IACZ,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QAAI,WAAW;qBACZ,oBAACC,WAASA,QAAAA,WAAAA,GAEd,oBAAC;QAAI,WAAW;qBACZ,oBAACC,MAAIA;QAAC,MAAM;QAAM,WAAW;OACxB"}
1
+ {"version":3,"file":"admin/presentation/Cognito/components/Divider.js","sources":["../../../../../src/admin/presentation/Cognito/components/Divider.tsx"],"sourcesContent":["import React from \"react\";\nimport { Separator, Text } from \"@webiny/admin-ui\";\nimport { makeDecoratable } from \"@webiny/app-admin\";\n\nexport const Divider = makeDecoratable(\"CognitoDivider\", () => {\n return (\n <div className={\"relative my-lg\"}>\n <div className={\"absolute inset-0 flex items-center\"}>\n <Separator />\n </div>\n <div className={\"relative flex justify-center\"}>\n <Text size={\"sm\"} className={\"text-neutral-strong px-sm bg-neutral-base uppercase\"}>\n {\"Or continue with\"}\n </Text>\n </div>\n </div>\n );\n});\n"],"names":["Divider","makeDecoratable","Separator","Text"],"mappings":";;;AAIO,MAAMA,UAAUC,gBAAgB,kBAAkB,IAC9C,WAAP,GACI,oBAAC;QAAI,WAAW;qBACZ,oBAAC;QAAI,WAAW;qBACZ,oBAACC,WAASA,QAAAA,WAAAA,GAEd,oBAAC;QAAI,WAAW;qBACZ,oBAACC,MAAIA;QAAC,MAAM;QAAM,WAAW;OACxB"}
@@ -1,7 +1,24 @@
1
1
  import React from "react";
2
- import type { FederatedIdentityProvider } from "../../../../admin/federatedIdentityProviders.js";
3
- interface FederatedLoginProps {
4
- providers: FederatedIdentityProvider[];
2
+ import { CognitoSignInConfig } from "../../../../admin/index.js";
3
+ export interface FederatedLoginProps {
4
+ providers: CognitoSignInConfig.FederatedProvider[];
5
5
  }
6
- export declare const FederatedLogin: ({ providers }: FederatedLoginProps) => React.JSX.Element;
7
- export {};
6
+ export declare const FederatedLogin: (({ providers }: FederatedLoginProps) => React.JSX.Element) & {
7
+ original: ({ providers }: FederatedLoginProps) => React.JSX.Element;
8
+ originalName: string;
9
+ displayName: string;
10
+ } & {
11
+ original: (({ providers }: FederatedLoginProps) => React.JSX.Element) & {
12
+ original: ({ providers }: FederatedLoginProps) => React.JSX.Element;
13
+ originalName: string;
14
+ displayName: string;
15
+ };
16
+ originalName: string;
17
+ displayName: string;
18
+ } & {
19
+ createDecorator: (decorator: import("@webiny/app-admin").ComponentDecorator<(({ providers }: FederatedLoginProps) => React.JSX.Element) & {
20
+ original: ({ providers }: FederatedLoginProps) => React.JSX.Element;
21
+ originalName: string;
22
+ displayName: string;
23
+ }>) => (props: unknown) => React.JSX.Element;
24
+ };
@@ -1,5 +1,7 @@
1
1
  import react from "react";
2
2
  import { signInWithRedirect } from "aws-amplify/auth";
3
+ import { Button } from "@webiny/admin-ui";
4
+ import { makeDecoratable } from "@webiny/app-admin";
3
5
  import { federatedIdentityProviders } from "../../../federatedIdentityProviders.js";
4
6
  import { FederatedProviders } from "./FederatedProviders.js";
5
7
  const builtInProviders = new Set([
@@ -8,8 +10,8 @@ const builtInProviders = new Set([
8
10
  "Facebook",
9
11
  "Google"
10
12
  ]);
11
- const FederatedLogin = ({ providers })=>/*#__PURE__*/ react.createElement(FederatedProviders.Container, null, providers.map(({ name, component: Component })=>{
12
- const cognitoProviderName = federatedIdentityProviders[name] ?? name;
13
+ const FederatedLogin = makeDecoratable("CognitoFederatedLogin", ({ providers })=>/*#__PURE__*/ react.createElement(FederatedProviders.Container, null, providers.map((provider)=>{
14
+ const cognitoProviderName = federatedIdentityProviders[provider.name] ?? provider.name;
13
15
  const isBuiltIn = builtInProviders.has(cognitoProviderName);
14
16
  const signIn = ()=>{
15
17
  isBuiltIn ? signInWithRedirect({
@@ -20,11 +22,22 @@ const FederatedLogin = ({ providers })=>/*#__PURE__*/ react.createElement(Federa
20
22
  }
21
23
  });
22
24
  };
23
- return /*#__PURE__*/ react.createElement(Component, {
24
- key: name,
25
- signIn: signIn
25
+ if ("component" in provider) {
26
+ const Component = provider.component;
27
+ return /*#__PURE__*/ react.createElement(Component, {
28
+ key: provider.name,
29
+ signIn: signIn
30
+ });
31
+ }
32
+ return /*#__PURE__*/ react.createElement(Button, {
33
+ key: provider.name,
34
+ text: provider.label,
35
+ onClick: signIn,
36
+ style: {
37
+ width: "100%"
38
+ }
26
39
  });
27
- }));
40
+ })));
28
41
  export { FederatedLogin };
29
42
 
30
43
  //# sourceMappingURL=FederatedLogin.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/Cognito/components/FederatedLogin.js","sources":["../../../../../src/admin/presentation/Cognito/components/FederatedLogin.tsx"],"sourcesContent":["import React from \"react\";\nimport { signInWithRedirect } from \"aws-amplify/auth\";\nimport type { FederatedIdentityProvider } from \"~/admin/federatedIdentityProviders.js\";\nimport { federatedIdentityProviders } from \"~/admin/federatedIdentityProviders.js\";\nimport { FederatedProviders } from \"./FederatedProviders.js\";\n\ntype AuthProvider = \"Amazon\" | \"Apple\" | \"Facebook\" | \"Google\";\n\nconst builtInProviders = new Set<string>([\"Amazon\", \"Apple\", \"Facebook\", \"Google\"]);\n\ninterface FederatedLoginProps {\n providers: FederatedIdentityProvider[];\n}\n\nexport const FederatedLogin = ({ providers }: FederatedLoginProps) => {\n return (\n <FederatedProviders.Container>\n {providers.map(({ name, component: Component }) => {\n const cognitoProviderName = federatedIdentityProviders[name] ?? name;\n const isBuiltIn = builtInProviders.has(cognitoProviderName);\n\n const signIn = () => {\n if (isBuiltIn) {\n signInWithRedirect({\n provider: cognitoProviderName as AuthProvider\n });\n } else {\n signInWithRedirect({\n provider: { custom: cognitoProviderName }\n });\n }\n };\n\n return <Component key={name} signIn={signIn} />;\n })}\n </FederatedProviders.Container>\n );\n};\n"],"names":["builtInProviders","Set","FederatedLogin","providers","FederatedProviders","name","Component","cognitoProviderName","federatedIdentityProviders","isBuiltIn","signIn","signInWithRedirect"],"mappings":";;;;AAQA,MAAMA,mBAAmB,IAAIC,IAAY;IAAC;IAAU;IAAS;IAAY;CAAS;AAM3E,MAAMC,iBAAiB,CAAC,EAAEC,SAAS,EAAuB,GACtD,WAAP,GACI,oBAACC,mBAAmB,SAAS,QACxBD,UAAU,GAAG,CAAC,CAAC,EAAEE,IAAI,EAAE,WAAWC,SAAS,EAAE;QAC1C,MAAMC,sBAAsBC,0BAA0B,CAACH,KAAK,IAAIA;QAChE,MAAMI,YAAYT,iBAAiB,GAAG,CAACO;QAEvC,MAAMG,SAAS;YACPD,YACAE,mBAAmB;gBACf,UAAUJ;YACd,KAEAI,mBAAmB;gBACf,UAAU;oBAAE,QAAQJ;gBAAoB;YAC5C;QAER;QAEA,OAAO,WAAP,GAAO,oBAACD,WAAAA;YAAU,KAAKD;YAAM,QAAQK;;IACzC"}
1
+ {"version":3,"file":"admin/presentation/Cognito/components/FederatedLogin.js","sources":["../../../../../src/admin/presentation/Cognito/components/FederatedLogin.tsx"],"sourcesContent":["import React from \"react\";\nimport { signInWithRedirect } from \"aws-amplify/auth\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { makeDecoratable } from \"@webiny/app-admin\";\nimport { federatedIdentityProviders } from \"~/admin/federatedIdentityProviders.js\";\nimport { FederatedProviders } from \"./FederatedProviders.js\";\nimport { CognitoSignInConfig } from \"~/admin/index.js\";\n\ntype AuthProvider = \"Amazon\" | \"Apple\" | \"Facebook\" | \"Google\";\n\nconst builtInProviders = new Set<string>([\"Amazon\", \"Apple\", \"Facebook\", \"Google\"]);\n\nexport interface FederatedLoginProps {\n providers: CognitoSignInConfig.FederatedProvider[];\n}\n\nexport const FederatedLogin = makeDecoratable(\n \"CognitoFederatedLogin\",\n ({ providers }: FederatedLoginProps) => {\n return (\n <FederatedProviders.Container>\n {providers.map(provider => {\n const cognitoProviderName =\n federatedIdentityProviders[provider.name] ?? provider.name;\n const isBuiltIn = builtInProviders.has(cognitoProviderName);\n\n const signIn = () => {\n if (isBuiltIn) {\n signInWithRedirect({\n provider: cognitoProviderName as AuthProvider\n });\n } else {\n signInWithRedirect({\n provider: { custom: cognitoProviderName }\n });\n }\n };\n\n if (\"component\" in provider) {\n const Component = provider.component;\n return <Component key={provider.name} signIn={signIn} />;\n }\n\n return (\n <Button\n key={provider.name}\n text={provider.label}\n onClick={signIn}\n style={{ width: \"100%\" }}\n />\n );\n })}\n </FederatedProviders.Container>\n );\n }\n);\n"],"names":["builtInProviders","Set","FederatedLogin","makeDecoratable","providers","FederatedProviders","provider","cognitoProviderName","federatedIdentityProviders","isBuiltIn","signIn","signInWithRedirect","Component","Button"],"mappings":";;;;;;AAUA,MAAMA,mBAAmB,IAAIC,IAAY;IAAC;IAAU;IAAS;IAAY;CAAS;AAM3E,MAAMC,iBAAiBC,gBAC1B,yBACA,CAAC,EAAEC,SAAS,EAAuB,GACxB,WAAP,GACI,oBAACC,mBAAmB,SAAS,QACxBD,UAAU,GAAG,CAACE,CAAAA;QACX,MAAMC,sBACFC,0BAA0B,CAACF,SAAS,IAAI,CAAC,IAAIA,SAAS,IAAI;QAC9D,MAAMG,YAAYT,iBAAiB,GAAG,CAACO;QAEvC,MAAMG,SAAS;YACPD,YACAE,mBAAmB;gBACf,UAAUJ;YACd,KAEAI,mBAAmB;gBACf,UAAU;oBAAE,QAAQJ;gBAAoB;YAC5C;QAER;QAEA,IAAI,eAAeD,UAAU;YACzB,MAAMM,YAAYN,SAAS,SAAS;YACpC,OAAO,WAAP,GAAO,oBAACM,WAAAA;gBAAU,KAAKN,SAAS,IAAI;gBAAE,QAAQI;;QAClD;QAEA,OAAO,WAAP,GACI,oBAACG,QAAMA;YACH,KAAKP,SAAS,IAAI;YAClB,MAAMA,SAAS,KAAK;YACpB,SAASI;YACT,OAAO;gBAAE,OAAO;YAAO;;IAGnC"}