@webiny/cognito 6.3.0-beta.4 → 6.4.0-beta.0

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 (148) hide show
  1. package/Cognito.js +23 -24
  2. package/Cognito.js.map +1 -1
  3. package/admin/Cognito.js +35 -41
  4. package/admin/Cognito.js.map +1 -1
  5. package/admin/CognitoLogin.js +8 -13
  6. package/admin/CognitoLogin.js.map +1 -1
  7. package/admin/Extension.js +17 -16
  8. package/admin/Extension.js.map +1 -1
  9. package/admin/SecurityPermission.js +11 -14
  10. package/admin/SecurityPermission.js.map +1 -1
  11. package/admin/domain/permissionsSchema.js +14 -9
  12. package/admin/domain/permissionsSchema.js.map +1 -1
  13. package/admin/features/permissions/abstractions.js +2 -1
  14. package/admin/features/permissions/abstractions.js.map +1 -1
  15. package/admin/features/permissions/feature.js +2 -1
  16. package/admin/features/permissions/feature.js.map +1 -1
  17. package/admin/federatedIdentityProviders.js +7 -6
  18. package/admin/federatedIdentityProviders.js.map +1 -1
  19. package/admin/presentation/Cognito/CognitoLoginScreen.js +39 -42
  20. package/admin/presentation/Cognito/CognitoLoginScreen.js.map +1 -1
  21. package/admin/presentation/Cognito/CognitoPresenter.js +250 -275
  22. package/admin/presentation/Cognito/CognitoPresenter.js.map +1 -1
  23. package/admin/presentation/Cognito/abstractions.js +2 -1
  24. package/admin/presentation/Cognito/abstractions.js.map +1 -1
  25. package/admin/presentation/Cognito/components/Divider.js +12 -13
  26. package/admin/presentation/Cognito/components/Divider.js.map +1 -1
  27. package/admin/presentation/Cognito/components/FederatedLogin.js +24 -29
  28. package/admin/presentation/Cognito/components/FederatedLogin.js.map +1 -1
  29. package/admin/presentation/Cognito/components/FederatedProviders.js +7 -10
  30. package/admin/presentation/Cognito/components/FederatedProviders.js.map +1 -1
  31. package/admin/presentation/Cognito/components/FooterSignIn.js +9 -12
  32. package/admin/presentation/Cognito/components/FooterSignIn.js.map +1 -1
  33. package/admin/presentation/Cognito/components/PasswordResetCodeSent.js +33 -37
  34. package/admin/presentation/Cognito/components/PasswordResetCodeSent.js.map +1 -1
  35. package/admin/presentation/Cognito/components/RequestPasswordResetCode.js +35 -39
  36. package/admin/presentation/Cognito/components/RequestPasswordResetCode.js.map +1 -1
  37. package/admin/presentation/Cognito/components/RequireNewPassword.js +44 -48
  38. package/admin/presentation/Cognito/components/RequireNewPassword.js.map +1 -1
  39. package/admin/presentation/Cognito/components/SetNewPassword.js +70 -71
  40. package/admin/presentation/Cognito/components/SetNewPassword.js.map +1 -1
  41. package/admin/presentation/Cognito/components/SignIn.js +52 -59
  42. package/admin/presentation/Cognito/components/SignIn.js.map +1 -1
  43. package/admin/presentation/Cognito/components/View.js +41 -60
  44. package/admin/presentation/Cognito/components/View.js.map +1 -1
  45. package/admin/presentation/Cognito/feature.js +12 -11
  46. package/admin/presentation/Cognito/feature.js.map +1 -1
  47. package/admin/presentation/shared/createPasswordValidator.js +13 -24
  48. package/admin/presentation/shared/createPasswordValidator.js.map +1 -1
  49. package/admin/presentation/shared/usePasswordValidator.js +11 -10
  50. package/admin/presentation/shared/usePasswordValidator.js.map +1 -1
  51. package/admin/presentation/userMenu/AccountDetails.js +15 -18
  52. package/admin/presentation/userMenu/AccountDetails.js.map +1 -1
  53. package/admin/presentation/userMenu/useIsDefaultTenant.js +5 -11
  54. package/admin/presentation/userMenu/useIsDefaultTenant.js.map +1 -1
  55. package/admin/routes.js +16 -17
  56. package/admin/routes.js.map +1 -1
  57. package/admin/ui/UserItem.js +0 -3
  58. package/admin/ui/components/AvatarImage/AvatarImage.js +25 -37
  59. package/admin/ui/components/AvatarImage/AvatarImage.js.map +1 -1
  60. package/admin/ui/components/AvatarImage/AvatarImagePreview.js +49 -51
  61. package/admin/ui/components/AvatarImage/AvatarImagePreview.js.map +1 -1
  62. package/admin/ui/components/AvatarImage/AvatarImageTrigger.js +25 -26
  63. package/admin/ui/components/AvatarImage/AvatarImageTrigger.js.map +1 -1
  64. package/admin/ui/components/AvatarImage/index.js +0 -2
  65. package/admin/ui/views/Account/Account.js +117 -130
  66. package/admin/ui/views/Account/Account.js.map +1 -1
  67. package/admin/ui/views/Account/graphql.js +5 -4
  68. package/admin/ui/views/Account/graphql.js.map +1 -1
  69. package/admin/ui/views/Account/index.js +0 -2
  70. package/admin/ui/views/Users/UsersDataList.js +146 -159
  71. package/admin/ui/views/Users/UsersDataList.js.map +1 -1
  72. package/admin/ui/views/Users/UsersForm.js +151 -162
  73. package/admin/ui/views/Users/UsersForm.js.map +1 -1
  74. package/admin/ui/views/Users/UsersView.js +9 -9
  75. package/admin/ui/views/Users/UsersView.js.map +1 -1
  76. package/admin/ui/views/Users/components/DeleteAction.js +23 -30
  77. package/admin/ui/views/Users/components/DeleteAction.js.map +1 -1
  78. package/admin/ui/views/Users/graphql.js +9 -10
  79. package/admin/ui/views/Users/graphql.js.map +1 -1
  80. package/admin/ui/views/Users/hooks/useUserForm.js +104 -114
  81. package/admin/ui/views/Users/hooks/useUserForm.js.map +1 -1
  82. package/admin/ui/views/Users/search.js +21 -0
  83. package/admin/ui/views/Users/search.js.map +1 -0
  84. package/admin/ui/views/utils.js +9 -7
  85. package/admin/ui/views/utils.js.map +1 -1
  86. package/api/CognitoApiFeature.js +15 -17
  87. package/api/CognitoApiFeature.js.map +1 -1
  88. package/api/domain/Username.js +5 -4
  89. package/api/domain/Username.js.map +1 -1
  90. package/api/domain/errors.js +37 -56
  91. package/api/domain/errors.js.map +1 -1
  92. package/api/features/CognitoIdp/CognitoIdentityProvider.js +49 -51
  93. package/api/features/CognitoIdp/CognitoIdentityProvider.js.map +1 -1
  94. package/api/features/CognitoIdp/abstractions.js +2 -1
  95. package/api/features/CognitoIdp/abstractions.js.map +1 -1
  96. package/api/features/CognitoIdp/feature.js +6 -5
  97. package/api/features/CognitoIdp/feature.js.map +1 -1
  98. package/api/features/CognitoIdp/index.js +0 -2
  99. package/api/features/CognitoService/CognitoService.js +93 -83
  100. package/api/features/CognitoService/CognitoService.js.map +1 -1
  101. package/api/features/CognitoService/abstractions.js +3 -5
  102. package/api/features/CognitoService/abstractions.js.map +1 -1
  103. package/api/features/CognitoService/feature.js +7 -6
  104. package/api/features/CognitoService/feature.js.map +1 -1
  105. package/api/features/CognitoService/index.js +0 -2
  106. package/api/features/CreateUser/CreateUserUseCase.js +62 -88
  107. package/api/features/CreateUser/CreateUserUseCase.js.map +1 -1
  108. package/api/features/CreateUser/abstractions.js +2 -1
  109. package/api/features/CreateUser/abstractions.js.map +1 -1
  110. package/api/features/CreateUser/feature.js +6 -5
  111. package/api/features/CreateUser/feature.js.map +1 -1
  112. package/api/features/CreateUser/index.js +0 -2
  113. package/api/features/CreateUser/schema.js +14 -13
  114. package/api/features/CreateUser/schema.js.map +1 -1
  115. package/api/features/DeleteUser/DeleteUserUseCase.js +34 -41
  116. package/api/features/DeleteUser/DeleteUserUseCase.js.map +1 -1
  117. package/api/features/DeleteUser/abstractions.js +2 -1
  118. package/api/features/DeleteUser/abstractions.js.map +1 -1
  119. package/api/features/DeleteUser/feature.js +6 -5
  120. package/api/features/DeleteUser/feature.js.map +1 -1
  121. package/api/features/DeleteUser/index.js +0 -2
  122. package/api/features/UpdateUser/UpdateUserUseCase.js +49 -71
  123. package/api/features/UpdateUser/UpdateUserUseCase.js.map +1 -1
  124. package/api/features/UpdateUser/abstractions.js +2 -1
  125. package/api/features/UpdateUser/abstractions.js.map +1 -1
  126. package/api/features/UpdateUser/feature.js +6 -5
  127. package/api/features/UpdateUser/feature.js.map +1 -1
  128. package/api/features/UpdateUser/index.js +0 -2
  129. package/api/features/UpdateUser/schema.js +13 -12
  130. package/api/features/UpdateUser/schema.js.map +1 -1
  131. package/api/features/UserInstaller/UserInstaller.js +36 -36
  132. package/api/features/UserInstaller/UserInstaller.js.map +1 -1
  133. package/api/features/UserInstaller/feature.js +6 -5
  134. package/api/features/UserInstaller/feature.js.map +1 -1
  135. package/api/graphql/user.gql.js +83 -107
  136. package/api/graphql/user.gql.js.map +1 -1
  137. package/index.js +0 -2
  138. package/package.json +22 -23
  139. package/static/svg/search.43fa797c.svg +20 -0
  140. package/admin/ui/UserItem.js.map +0 -1
  141. package/admin/ui/components/AvatarImage/index.js.map +0 -1
  142. package/admin/ui/views/Account/index.js.map +0 -1
  143. package/api/features/CognitoIdp/index.js.map +0 -1
  144. package/api/features/CognitoService/index.js.map +0 -1
  145. package/api/features/CreateUser/index.js.map +0 -1
  146. package/api/features/DeleteUser/index.js.map +0 -1
  147. package/api/features/UpdateUser/index.js.map +0 -1
  148. package/index.js.map +0 -1
@@ -1,299 +1,274 @@
1
1
  import { makeAutoObservable, runInAction } from "mobx";
2
2
  import { Amplify } from "aws-amplify";
3
- import { signIn, signOut, confirmSignIn, resetPassword, confirmResetPassword, fetchAuthSession } from "aws-amplify/auth";
4
- import { CognitoPresenter as CognitoPresenterAbstraction } from "./abstractions.js";
3
+ import { confirmResetPassword, confirmSignIn, fetchAuthSession, resetPassword, signIn, signOut } from "aws-amplify/auth";
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
7
  class CognitoPresenterImpl {
8
- authState = "signIn";
9
- authData = null;
10
- message = null;
11
- checkingSession = false;
12
- isLoggingIn = false;
13
- formLoading = false;
14
- initialized = false;
15
- constructor(identity, logInUseCase) {
16
- this.identity = identity;
17
- this.logInUseCase = logInUseCase;
18
- makeAutoObservable(this);
19
- }
20
- get vm() {
21
- const identity = this.identity.getIdentity();
22
- return {
23
- authState: this.authState,
24
- checkingSession: this.checkingSession,
25
- isLoggingIn: this.isLoggingIn,
26
- isAuthenticated: identity.isAuthenticated,
27
- // View-specific VMs
28
- signIn: {
29
- isLoading: this.formLoading,
30
- message: this.message
31
- },
32
- requestPasswordResetCode: {
33
- isLoading: this.formLoading,
34
- message: this.message
35
- },
36
- passwordResetCodeSent: {
37
- isLoading: this.formLoading,
38
- message: this.message
39
- },
40
- setNewPassword: {
41
- isLoading: this.formLoading,
42
- message: this.message
43
- },
44
- requireNewPassword: {
45
- isLoading: this.formLoading,
46
- requiredAttributes: this.authData && this.authData.requiredAttributes || []
47
- }
48
- };
49
- }
50
- async init(params) {
51
- if (this.initialized) {
52
- return;
8
+ constructor(identity, logInUseCase){
9
+ this.identity = identity;
10
+ this.logInUseCase = logInUseCase;
11
+ this.authState = "signIn";
12
+ this.authData = null;
13
+ this.message = null;
14
+ this.checkingSession = false;
15
+ this.isLoggingIn = false;
16
+ this.formLoading = false;
17
+ this.initialized = false;
18
+ makeAutoObservable(this);
53
19
  }
54
- Amplify.configure({
55
- Auth: {
56
- Cognito: {
57
- userPoolId: params.userPoolId,
58
- userPoolClientId: params.clientId
59
- }
60
- }
61
- });
62
- this.initialized = true;
63
- await this.checkUrl();
64
- }
65
-
66
- // Public API
67
- async signIn(username, password) {
68
- runInAction(() => {
69
- this.formLoading = true;
70
- this.message = null;
71
- });
72
- const usernameOrPassword = ["UserNotFoundException", "NotAuthorizedException"];
73
- try {
74
- const result = await signIn({
75
- username,
76
- password
77
- });
78
- const {
79
- nextStep
80
- } = result;
81
- if (nextStep.signInStep === "CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED") {
82
- runInAction(() => {
83
- this.authState = "requireNewPassword";
84
- this.authData = {
85
- requiredAttributes: nextStep.missingAttributes || []
86
- };
87
- this.formLoading = false;
20
+ get vm() {
21
+ const identity = this.identity.getIdentity();
22
+ return {
23
+ authState: this.authState,
24
+ checkingSession: this.checkingSession,
25
+ isLoggingIn: this.isLoggingIn,
26
+ isAuthenticated: identity.isAuthenticated,
27
+ signIn: {
28
+ isLoading: this.formLoading,
29
+ message: this.message
30
+ },
31
+ requestPasswordResetCode: {
32
+ isLoading: this.formLoading,
33
+ message: this.message
34
+ },
35
+ passwordResetCodeSent: {
36
+ isLoading: this.formLoading,
37
+ message: this.message
38
+ },
39
+ setNewPassword: {
40
+ isLoading: this.formLoading,
41
+ message: this.message
42
+ },
43
+ requireNewPassword: {
44
+ isLoading: this.formLoading,
45
+ requiredAttributes: this.authData && this.authData.requiredAttributes || []
46
+ }
47
+ };
48
+ }
49
+ async init(params) {
50
+ if (this.initialized) return;
51
+ Amplify.configure({
52
+ Auth: {
53
+ Cognito: {
54
+ userPoolId: params.userPoolId,
55
+ userPoolClientId: params.clientId
56
+ }
57
+ }
88
58
  });
89
- } else {
90
- await this.handleSignedIn();
91
- runInAction(() => {
92
- this.formLoading = false;
59
+ this.initialized = true;
60
+ await this.checkUrl();
61
+ }
62
+ async signIn(username, password) {
63
+ runInAction(()=>{
64
+ this.formLoading = true;
65
+ this.message = null;
93
66
  });
94
- }
95
- } catch (error) {
96
- let message = error.message;
97
- if (usernameOrPassword.includes(error.name)) {
98
- message = "Incorrect username or password.";
99
- }
100
- runInAction(() => {
101
- this.message = {
102
- title: "Login Failed",
103
- text: message,
104
- type: "danger"
105
- };
106
- this.formLoading = false;
107
- });
67
+ const usernameOrPassword = [
68
+ "UserNotFoundException",
69
+ "NotAuthorizedException"
70
+ ];
71
+ try {
72
+ const result = await signIn({
73
+ username,
74
+ password
75
+ });
76
+ const { nextStep } = result;
77
+ if ("CONFIRM_SIGN_IN_WITH_NEW_PASSWORD_REQUIRED" === nextStep.signInStep) runInAction(()=>{
78
+ this.authState = "requireNewPassword";
79
+ this.authData = {
80
+ requiredAttributes: nextStep.missingAttributes || []
81
+ };
82
+ this.formLoading = false;
83
+ });
84
+ else {
85
+ await this.handleSignedIn();
86
+ runInAction(()=>{
87
+ this.formLoading = false;
88
+ });
89
+ }
90
+ } catch (error) {
91
+ let message = error.message;
92
+ if (usernameOrPassword.includes(error.name)) message = "Incorrect username or password.";
93
+ runInAction(()=>{
94
+ this.message = {
95
+ title: "Login Failed",
96
+ text: message,
97
+ type: "danger"
98
+ };
99
+ this.formLoading = false;
100
+ });
101
+ }
108
102
  }
109
- }
110
- async confirmNewPassword(password, requiredAttributes) {
111
- runInAction(() => {
112
- this.formLoading = true;
113
- this.message = null;
114
- });
115
- try {
116
- await confirmSignIn({
117
- challengeResponse: password,
118
- options: {
119
- userAttributes: requiredAttributes
103
+ async confirmNewPassword(password, requiredAttributes) {
104
+ runInAction(()=>{
105
+ this.formLoading = true;
106
+ this.message = null;
107
+ });
108
+ try {
109
+ await confirmSignIn({
110
+ challengeResponse: password,
111
+ options: {
112
+ userAttributes: requiredAttributes
113
+ }
114
+ });
115
+ await this.handleSignedIn();
116
+ } catch (error) {
117
+ runInAction(()=>{
118
+ this.message = {
119
+ title: "Error",
120
+ text: error.message,
121
+ type: "danger"
122
+ };
123
+ });
124
+ } finally{
125
+ runInAction(()=>{
126
+ this.formLoading = false;
127
+ });
120
128
  }
121
- });
122
- await this.handleSignedIn();
123
- } catch (error) {
124
- runInAction(() => {
125
- this.message = {
126
- title: "Error",
127
- text: error.message,
128
- type: "danger"
129
- };
130
- });
131
- } finally {
132
- runInAction(() => {
133
- this.formLoading = false;
134
- });
135
129
  }
136
- }
137
- async requestPasswordReset(username) {
138
- runInAction(() => {
139
- this.formLoading = true;
140
- this.message = null;
141
- });
142
- try {
143
- await resetPassword({
144
- username
145
- });
146
- } catch {
147
- // We ignore errors and pretend that everything went fine.
148
- // Showing an error would give a potential attacker information about which usernames exist (or not).
149
- // This way it's more difficult to exploit the process.
150
- } finally {
151
- runInAction(() => {
152
- this.authState = "passwordResetCodeSent";
153
- this.authData = {
154
- username
155
- };
156
- this.formLoading = false;
157
- });
130
+ async requestPasswordReset(username) {
131
+ runInAction(()=>{
132
+ this.formLoading = true;
133
+ this.message = null;
134
+ });
135
+ try {
136
+ await resetPassword({
137
+ username
138
+ });
139
+ } catch {} finally{
140
+ runInAction(()=>{
141
+ this.authState = "passwordResetCodeSent";
142
+ this.authData = {
143
+ username
144
+ };
145
+ this.formLoading = false;
146
+ });
147
+ }
158
148
  }
159
- }
160
- async resendPasswordResetCode() {
161
- const username = this.authData?.username;
162
- if (this.authState !== "passwordResetCodeSent" || !username) {
163
- return;
149
+ async resendPasswordResetCode() {
150
+ const username = this.authData?.username;
151
+ if ("passwordResetCodeSent" !== this.authState || !username) return;
152
+ await this.requestPasswordReset(username);
153
+ runInAction(()=>{
154
+ this.message = {
155
+ title: "Code Resent",
156
+ text: "Password reset code has been resent to your email address. Please check your inbox!",
157
+ type: "success"
158
+ };
159
+ });
164
160
  }
165
- await this.requestPasswordReset(username);
166
- runInAction(() => {
167
- this.message = {
168
- title: "Code Resent",
169
- text: "Password reset code has been resent to your email address. Please check your inbox!",
170
- type: "success"
171
- };
172
- });
173
- }
174
- async confirmPasswordReset(code, password) {
175
- const username = this.authData?.username;
176
- if (!username) {
177
- return;
161
+ async confirmPasswordReset(code, password) {
162
+ const username = this.authData?.username;
163
+ if (!username) return;
164
+ runInAction(()=>{
165
+ this.formLoading = true;
166
+ this.message = null;
167
+ });
168
+ try {
169
+ await confirmResetPassword({
170
+ username,
171
+ confirmationCode: code,
172
+ newPassword: password
173
+ });
174
+ runInAction(()=>{
175
+ this.authState = "signIn";
176
+ this.message = {
177
+ title: "Password Reset",
178
+ text: "You can now sign in with your new password",
179
+ type: "success"
180
+ };
181
+ });
182
+ } catch (error) {
183
+ runInAction(()=>{
184
+ this.message = {
185
+ title: "Error",
186
+ text: error.message,
187
+ type: "danger"
188
+ };
189
+ });
190
+ } finally{
191
+ runInAction(()=>{
192
+ this.formLoading = false;
193
+ });
194
+ }
178
195
  }
179
- runInAction(() => {
180
- this.formLoading = true;
181
- this.message = null;
182
- });
183
- try {
184
- await confirmResetPassword({
185
- username,
186
- confirmationCode: code,
187
- newPassword: password
188
- });
189
- runInAction(() => {
196
+ showSignIn() {
190
197
  this.authState = "signIn";
191
- this.message = {
192
- title: "Password Reset",
193
- text: "You can now sign in with your new password",
194
- type: "success"
195
- };
196
- });
197
- } catch (error) {
198
- runInAction(() => {
199
- this.message = {
200
- title: "Error",
201
- text: error.message,
202
- type: "danger"
203
- };
204
- });
205
- } finally {
206
- runInAction(() => {
207
- this.formLoading = false;
208
- });
198
+ this.authData = null;
199
+ this.message = null;
209
200
  }
210
- }
211
- showSignIn() {
212
- this.authState = "signIn";
213
- this.authData = null;
214
- this.message = null;
215
- }
216
- showRequestPasswordResetCode() {
217
- this.authState = "requestPasswordResetCode";
218
- this.message = null;
219
- }
220
- showSetNewPassword() {
221
- this.authState = "setNewPassword";
222
- this.message = null;
223
- }
224
-
225
- // Private/internal methods
226
- async handleSignedIn() {
227
- runInAction(() => {
228
- this.isLoggingIn = true;
229
- });
230
- try {
231
- await this.logInUseCase.execute({
232
- idTokenProvider: async () => {
233
- const session = await fetchAuthSession();
234
- const idToken = session.tokens?.idToken;
235
- if (!idToken) {
236
- throw new Error("No ID token available.");
237
- }
238
- return idToken.toString();
239
- },
240
- logoutCallback: () => {
241
- signOut();
242
- runInAction(() => {
243
- this.authState = "signIn";
244
- this.authData = null;
245
- });
201
+ showRequestPasswordResetCode() {
202
+ this.authState = "requestPasswordResetCode";
203
+ this.message = null;
204
+ }
205
+ showSetNewPassword() {
206
+ this.authState = "setNewPassword";
207
+ this.message = null;
208
+ }
209
+ async handleSignedIn() {
210
+ runInAction(()=>{
211
+ this.isLoggingIn = true;
212
+ });
213
+ try {
214
+ await this.logInUseCase.execute({
215
+ idTokenProvider: async ()=>{
216
+ const session = await fetchAuthSession();
217
+ const idToken = session.tokens?.idToken;
218
+ if (!idToken) throw new Error("No ID token available.");
219
+ return idToken.toString();
220
+ },
221
+ logoutCallback: ()=>{
222
+ signOut();
223
+ runInAction(()=>{
224
+ this.authState = "signIn";
225
+ this.authData = null;
226
+ });
227
+ }
228
+ });
229
+ runInAction(()=>{
230
+ this.authState = "signedIn";
231
+ });
232
+ } catch (error) {
233
+ console.error("Error during sign in:", error);
234
+ runInAction(()=>{
235
+ this.authState = "signIn";
236
+ });
237
+ } finally{
238
+ runInAction(()=>{
239
+ this.isLoggingIn = false;
240
+ });
246
241
  }
247
- });
248
- runInAction(() => {
249
- this.authState = "signedIn";
250
- });
251
- } catch (error) {
252
- console.error("Error during sign in:", error);
253
- runInAction(() => {
254
- this.authState = "signIn";
255
- });
256
- } finally {
257
- runInAction(() => {
258
- this.isLoggingIn = false;
259
- });
260
242
  }
261
- }
262
- async checkUrl() {
263
- const query = new URLSearchParams(window.location.search);
264
- const queryData = {};
265
- query.forEach((value, key) => queryData[key] = value);
266
- const {
267
- state
268
- } = queryData;
269
- if (state) {
270
- // Handle state from URL if needed
271
- return;
243
+ 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
+ return this.checkSession();
272
250
  }
273
- return this.checkSession();
274
- }
275
- async checkSession() {
276
- runInAction(() => {
277
- this.checkingSession = true;
278
- });
279
- try {
280
- const session = await fetchAuthSession();
281
- if (session.tokens) {
282
- // We don't need to `await`, we simply start a separate "branch" of execution.
283
- this.handleSignedIn();
284
- }
285
- } catch {
286
- // Not authenticated, stay on signIn
287
- } finally {
288
- runInAction(() => {
289
- this.checkingSession = false;
290
- });
251
+ async checkSession() {
252
+ runInAction(()=>{
253
+ this.checkingSession = true;
254
+ });
255
+ try {
256
+ const session = await fetchAuthSession();
257
+ if (session.tokens) this.handleSignedIn();
258
+ } catch {} finally{
259
+ runInAction(()=>{
260
+ this.checkingSession = false;
261
+ });
262
+ }
291
263
  }
292
- }
293
264
  }
294
- export const CognitoPresenter = CognitoPresenterAbstraction.createImplementation({
295
- implementation: CognitoPresenterImpl,
296
- dependencies: [IdentityContext, LogInUseCase]
265
+ const CognitoPresenter_CognitoPresenter = CognitoPresenter.createImplementation({
266
+ implementation: CognitoPresenterImpl,
267
+ dependencies: [
268
+ IdentityContext,
269
+ LogInUseCase
270
+ ]
297
271
  });
272
+ export { CognitoPresenter_CognitoPresenter as CognitoPresenter };
298
273
 
299
274
  //# sourceMappingURL=CognitoPresenter.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["makeAutoObservable","runInAction","Amplify","signIn","signOut","confirmSignIn","resetPassword","confirmResetPassword","fetchAuthSession","CognitoPresenter","CognitoPresenterAbstraction","LogInUseCase","IdentityContext","CognitoPresenterImpl","authState","authData","message","checkingSession","isLoggingIn","formLoading","initialized","constructor","identity","logInUseCase","vm","getIdentity","isAuthenticated","isLoading","requestPasswordResetCode","passwordResetCodeSent","setNewPassword","requireNewPassword","requiredAttributes","init","params","configure","Auth","Cognito","userPoolId","userPoolClientId","clientId","checkUrl","username","password","usernameOrPassword","result","nextStep","signInStep","missingAttributes","handleSignedIn","error","includes","name","title","text","type","confirmNewPassword","challengeResponse","options","userAttributes","requestPasswordReset","resendPasswordResetCode","confirmPasswordReset","code","confirmationCode","newPassword","showSignIn","showRequestPasswordResetCode","showSetNewPassword","execute","idTokenProvider","session","idToken","tokens","Error","toString","logoutCallback","console","query","URLSearchParams","window","location","search","queryData","forEach","value","key","state","checkSession","createImplementation","implementation","dependencies"],"sources":["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"],"mappings":"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","ignoreList":[]}
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,4 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/admin";
2
- export const CognitoPresenter = createAbstraction("CognitoPresenter");
2
+ const CognitoPresenter = createAbstraction("CognitoPresenter");
3
+ export { CognitoPresenter };
3
4
 
4
5
  //# sourceMappingURL=abstractions.js.map