@strapi/plugin-users-permissions 4.0.0-next.6 → 4.0.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 (196) hide show
  1. package/admin/src/components/BoundRoute/getMethodColor.js +41 -0
  2. package/admin/src/components/BoundRoute/index.js +40 -24
  3. package/admin/src/components/FormModal/Input/index.js +121 -0
  4. package/admin/src/components/FormModal/index.js +123 -0
  5. package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +19 -26
  6. package/admin/src/components/Permissions/PermissionRow/SubCategory.js +118 -0
  7. package/admin/src/components/Permissions/PermissionRow/index.js +9 -48
  8. package/admin/src/components/Permissions/index.js +36 -24
  9. package/admin/src/components/Permissions/init.js +1 -6
  10. package/admin/src/components/Policies/index.js +46 -47
  11. package/admin/src/components/UsersPermissions/index.js +29 -26
  12. package/admin/src/components/UsersPermissions/init.js +1 -2
  13. package/admin/src/hooks/useFetchRole/index.js +17 -7
  14. package/admin/src/hooks/useForm/index.js +3 -29
  15. package/admin/src/hooks/useForm/reducer.js +2 -21
  16. package/admin/src/hooks/usePlugins/index.js +12 -21
  17. package/admin/src/hooks/usePlugins/reducer.js +0 -3
  18. package/admin/src/index.js +29 -34
  19. package/admin/src/pages/AdvancedSettings/index.js +210 -193
  20. package/admin/src/pages/AdvancedSettings/utils/api.js +13 -0
  21. package/admin/src/pages/AdvancedSettings/utils/layout.js +96 -0
  22. package/admin/src/pages/AdvancedSettings/utils/schema.js +22 -0
  23. package/admin/src/pages/EmailTemplates/components/EmailForm.js +173 -0
  24. package/admin/src/pages/EmailTemplates/components/EmailTable.js +116 -0
  25. package/admin/src/pages/EmailTemplates/index.js +125 -198
  26. package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
  27. package/admin/src/pages/Providers/index.js +208 -216
  28. package/admin/src/pages/Providers/utils/api.js +21 -0
  29. package/admin/src/pages/Providers/utils/forms.js +168 -126
  30. package/admin/src/pages/Roles/CreatePage/index.js +155 -147
  31. package/admin/src/pages/Roles/EditPage/index.js +162 -134
  32. package/admin/src/pages/Roles/ListPage/components/TableBody.js +96 -0
  33. package/admin/src/pages/Roles/ListPage/index.js +176 -156
  34. package/admin/src/pages/Roles/ListPage/utils/api.js +28 -0
  35. package/admin/src/pages/Roles/index.js +14 -8
  36. package/admin/src/permissions.js +12 -14
  37. package/admin/src/translations/ar.json +0 -8
  38. package/admin/src/translations/cs.json +0 -8
  39. package/admin/src/translations/de.json +0 -8
  40. package/admin/src/translations/dk.json +0 -8
  41. package/admin/src/translations/en.json +33 -12
  42. package/admin/src/translations/es.json +0 -8
  43. package/admin/src/translations/fr.json +0 -8
  44. package/admin/src/translations/id.json +0 -8
  45. package/admin/src/translations/it.json +0 -8
  46. package/admin/src/translations/ja.json +0 -8
  47. package/admin/src/translations/ko.json +0 -8
  48. package/admin/src/translations/ms.json +0 -8
  49. package/admin/src/translations/nl.json +0 -8
  50. package/admin/src/translations/pl.json +0 -8
  51. package/admin/src/translations/pt-BR.json +0 -8
  52. package/admin/src/translations/pt.json +0 -8
  53. package/admin/src/translations/ru.json +0 -8
  54. package/admin/src/translations/sk.json +0 -8
  55. package/admin/src/translations/sv.json +0 -8
  56. package/admin/src/translations/th.json +0 -8
  57. package/admin/src/translations/tr.json +0 -8
  58. package/admin/src/translations/uk.json +0 -8
  59. package/admin/src/translations/vi.json +0 -8
  60. package/admin/src/translations/zh-Hans.json +5 -14
  61. package/admin/src/translations/zh.json +0 -8
  62. package/admin/src/utils/axiosInstance.js +36 -0
  63. package/admin/src/utils/formatPluginName.js +26 -0
  64. package/admin/src/utils/index.js +1 -0
  65. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  66. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  67. package/package.json +30 -29
  68. package/{config/functions/bootstrap.js → server/bootstrap/index.js} +26 -33
  69. package/{config → server/bootstrap}/users-permissions-actions.js +0 -0
  70. package/server/config.js +23 -0
  71. package/server/content-types/index.js +11 -0
  72. package/server/content-types/permission/index.js +34 -0
  73. package/server/content-types/role/index.js +51 -0
  74. package/server/content-types/user/index.js +72 -0
  75. package/{models/User.config.js → server/content-types/user/schema-config.js} +0 -0
  76. package/server/controllers/auth.js +440 -0
  77. package/server/controllers/content-manager-user.js +183 -0
  78. package/server/controllers/index.js +17 -0
  79. package/server/controllers/permissions.js +26 -0
  80. package/server/controllers/role.js +77 -0
  81. package/server/controllers/settings.js +85 -0
  82. package/server/controllers/user.js +191 -0
  83. package/server/controllers/validation/auth.js +29 -0
  84. package/{controllers → server/controllers}/validation/email-template.js +0 -0
  85. package/server/controllers/validation/user.js +38 -0
  86. package/server/graphql/index.js +44 -0
  87. package/server/graphql/mutations/auth/email-confirmation.js +39 -0
  88. package/server/graphql/mutations/auth/forgot-password.js +38 -0
  89. package/server/graphql/mutations/auth/login.js +38 -0
  90. package/server/graphql/mutations/auth/register.js +39 -0
  91. package/server/graphql/mutations/auth/reset-password.js +41 -0
  92. package/server/graphql/mutations/crud/role/create-role.js +37 -0
  93. package/server/graphql/mutations/crud/role/delete-role.js +28 -0
  94. package/server/graphql/mutations/crud/role/update-role.js +38 -0
  95. package/server/graphql/mutations/crud/user/create-user.js +48 -0
  96. package/server/graphql/mutations/crud/user/delete-user.js +42 -0
  97. package/server/graphql/mutations/crud/user/update-user.js +49 -0
  98. package/server/graphql/mutations/index.js +42 -0
  99. package/server/graphql/queries/index.js +13 -0
  100. package/server/graphql/queries/me.js +17 -0
  101. package/server/graphql/resolvers-configs.js +37 -0
  102. package/server/graphql/types/create-role-payload.js +11 -0
  103. package/server/graphql/types/delete-role-payload.js +11 -0
  104. package/server/graphql/types/index.js +21 -0
  105. package/server/graphql/types/login-input.js +13 -0
  106. package/server/graphql/types/login-payload.js +12 -0
  107. package/server/graphql/types/me-role.js +14 -0
  108. package/server/graphql/types/me.js +16 -0
  109. package/server/graphql/types/password-payload.js +11 -0
  110. package/server/graphql/types/register-input.js +13 -0
  111. package/server/graphql/types/update-role-payload.js +11 -0
  112. package/server/graphql/utils.js +27 -0
  113. package/server/index.js +21 -0
  114. package/server/middlewares/index.js +7 -0
  115. package/{config/policies → server/middlewares}/rateLimit.js +4 -8
  116. package/server/register.js +11 -0
  117. package/server/routes/admin/index.js +10 -0
  118. package/server/routes/admin/permissions.js +20 -0
  119. package/server/routes/admin/role.js +79 -0
  120. package/server/routes/admin/settings.js +95 -0
  121. package/server/routes/content-api/auth.js +73 -0
  122. package/server/routes/content-api/index.js +11 -0
  123. package/server/routes/content-api/permissions.js +9 -0
  124. package/server/routes/content-api/role.js +29 -0
  125. package/server/routes/content-api/user.js +61 -0
  126. package/server/routes/index.js +6 -0
  127. package/server/services/index.js +15 -0
  128. package/server/services/jwt.js +55 -0
  129. package/server/services/providers.js +599 -0
  130. package/server/services/role.js +177 -0
  131. package/{services → server/services}/user.js +32 -35
  132. package/server/services/users-permissions.js +233 -0
  133. package/server/strategies/users-permissions.js +123 -0
  134. package/{utils → server/utils}/index.d.ts +6 -1
  135. package/server/utils/index.js +9 -0
  136. package/strapi-admin.js +3 -0
  137. package/strapi-server.js +3 -0
  138. package/admin/src/assets/images/logo.svg +0 -1
  139. package/admin/src/components/BaselineAlignement/index.js +0 -33
  140. package/admin/src/components/Bloc/index.js +0 -10
  141. package/admin/src/components/BoundRoute/Components.js +0 -78
  142. package/admin/src/components/ContainerFluid/index.js +0 -13
  143. package/admin/src/components/FormBloc/index.js +0 -61
  144. package/admin/src/components/IntlInput/index.js +0 -38
  145. package/admin/src/components/ListBaselineAlignment/index.js +0 -8
  146. package/admin/src/components/ListRow/Components.js +0 -74
  147. package/admin/src/components/ListRow/index.js +0 -35
  148. package/admin/src/components/ModalForm/Wrapper.js +0 -12
  149. package/admin/src/components/ModalForm/index.js +0 -59
  150. package/admin/src/components/Permissions/ListWrapper.js +0 -9
  151. package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
  152. package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
  153. package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
  154. package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
  155. package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
  156. package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
  157. package/admin/src/components/Policies/Components.js +0 -26
  158. package/admin/src/components/PrefixedIcon/index.js +0 -27
  159. package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
  160. package/admin/src/components/Roles/EmptyRole/index.js +0 -27
  161. package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
  162. package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
  163. package/admin/src/components/Roles/RoleRow/index.js +0 -45
  164. package/admin/src/components/Roles/index.js +0 -3
  165. package/admin/src/components/SizedInput/index.js +0 -24
  166. package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
  167. package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
  168. package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
  169. package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
  170. package/admin/src/pages/EmailTemplates/reducer.js +0 -58
  171. package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
  172. package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
  173. package/config/layout.js +0 -10
  174. package/config/policies/isAuthenticated.js +0 -9
  175. package/config/policies/permissions.js +0 -94
  176. package/config/request.json +0 -6
  177. package/config/routes.json +0 -381
  178. package/config/schema.graphql.js +0 -284
  179. package/config/security.json +0 -5
  180. package/controllers/auth.js +0 -596
  181. package/controllers/user/admin.js +0 -230
  182. package/controllers/user/api.js +0 -174
  183. package/controllers/user.js +0 -117
  184. package/controllers/users-permissions.js +0 -271
  185. package/middlewares/users-permissions/defaults.json +0 -5
  186. package/middlewares/users-permissions/index.js +0 -40
  187. package/models/Permission.js +0 -7
  188. package/models/Permission.settings.json +0 -45
  189. package/models/Role.js +0 -7
  190. package/models/Role.settings.json +0 -43
  191. package/models/User.js +0 -7
  192. package/models/User.settings.json +0 -63
  193. package/services/jwt.js +0 -65
  194. package/services/providers.js +0 -598
  195. package/services/users-permissions.js +0 -429
  196. package/utils/index.js +0 -11
@@ -1,596 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Auth.js controller
5
- *
6
- * @description: A set of functions called "actions" for managing `Auth`.
7
- */
8
-
9
- /* eslint-disable no-useless-escape */
10
- const crypto = require('crypto');
11
- const _ = require('lodash');
12
- const grant = require('grant-koa');
13
- const { sanitizeEntity } = require('@strapi/utils');
14
- const { getService } = require('../utils');
15
-
16
- const emailRegExp = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
17
- const formatError = error => [
18
- { messages: [{ id: error.id, message: error.message, field: error.field }] },
19
- ];
20
-
21
- module.exports = {
22
- async callback(ctx) {
23
- const provider = ctx.params.provider || 'local';
24
- const params = ctx.request.body;
25
-
26
- const store = await strapi.store({
27
- environment: '',
28
- type: 'plugin',
29
- name: 'users-permissions',
30
- });
31
-
32
- if (provider === 'local') {
33
- if (!_.get(await store.get({ key: 'grant' }), 'email.enabled')) {
34
- return ctx.badRequest(null, 'This provider is disabled.');
35
- }
36
-
37
- // The identifier is required.
38
- if (!params.identifier) {
39
- return ctx.badRequest(
40
- null,
41
- formatError({
42
- id: 'Auth.form.error.email.provide',
43
- message: 'Please provide your username or your e-mail.',
44
- })
45
- );
46
- }
47
-
48
- // The password is required.
49
- if (!params.password) {
50
- return ctx.badRequest(
51
- null,
52
- formatError({
53
- id: 'Auth.form.error.password.provide',
54
- message: 'Please provide your password.',
55
- })
56
- );
57
- }
58
-
59
- const query = { provider };
60
-
61
- // Check if the provided identifier is an email or not.
62
- const isEmail = emailRegExp.test(params.identifier);
63
-
64
- // Set the identifier to the appropriate query field.
65
- if (isEmail) {
66
- query.email = params.identifier.toLowerCase();
67
- } else {
68
- query.username = params.identifier;
69
- }
70
-
71
- // Check if the user exists.
72
- const user = await strapi.query('plugins::users-permissions.user').findOne({ where: query });
73
-
74
- if (!user) {
75
- return ctx.badRequest(
76
- null,
77
- formatError({
78
- id: 'Auth.form.error.invalid',
79
- message: 'Identifier or password invalid.',
80
- })
81
- );
82
- }
83
-
84
- if (
85
- _.get(await store.get({ key: 'advanced' }), 'email_confirmation') &&
86
- user.confirmed !== true
87
- ) {
88
- return ctx.badRequest(
89
- null,
90
- formatError({
91
- id: 'Auth.form.error.confirmed',
92
- message: 'Your account email is not confirmed',
93
- })
94
- );
95
- }
96
-
97
- if (user.blocked === true) {
98
- return ctx.badRequest(
99
- null,
100
- formatError({
101
- id: 'Auth.form.error.blocked',
102
- message: 'Your account has been blocked by an administrator',
103
- })
104
- );
105
- }
106
-
107
- // The user never authenticated with the `local` provider.
108
- if (!user.password) {
109
- return ctx.badRequest(
110
- null,
111
- formatError({
112
- id: 'Auth.form.error.password.local',
113
- message:
114
- 'This user never set a local password, please login with the provider used during account creation.',
115
- })
116
- );
117
- }
118
-
119
- const validPassword = await strapi.plugins[
120
- 'users-permissions'
121
- ].services.user.validatePassword(params.password, user.password);
122
-
123
- if (!validPassword) {
124
- return ctx.badRequest(
125
- null,
126
- formatError({
127
- id: 'Auth.form.error.invalid',
128
- message: 'Identifier or password invalid.',
129
- })
130
- );
131
- } else {
132
- ctx.send({
133
- jwt: strapi.plugins['users-permissions'].services.jwt.issue({
134
- id: user.id,
135
- }),
136
- user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
137
- model: strapi.getModel('plugins::users-permissions.user'),
138
- }),
139
- });
140
- }
141
- } else {
142
- if (!_.get(await store.get({ key: 'grant' }), [provider, 'enabled'])) {
143
- return ctx.badRequest(
144
- null,
145
- formatError({
146
- id: 'provider.disabled',
147
- message: 'This provider is disabled.',
148
- })
149
- );
150
- }
151
-
152
- // Connect the user with the third-party provider.
153
- let user;
154
- let error;
155
- try {
156
- [user, error] = await strapi.plugins['users-permissions'].services.providers.connect(
157
- provider,
158
- ctx.query
159
- );
160
- } catch ([user, error]) {
161
- return ctx.badRequest(null, error === 'array' ? error[0] : error);
162
- }
163
-
164
- if (!user) {
165
- return ctx.badRequest(null, error === 'array' ? error[0] : error);
166
- }
167
-
168
- ctx.send({
169
- jwt: strapi.plugins['users-permissions'].services.jwt.issue({
170
- id: user.id,
171
- }),
172
- user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
173
- model: strapi.getModel('plugins::users-permissions.user'),
174
- }),
175
- });
176
- }
177
- },
178
-
179
- async resetPassword(ctx) {
180
- const params = _.assign({}, ctx.request.body, ctx.params);
181
-
182
- if (
183
- params.password &&
184
- params.passwordConfirmation &&
185
- params.password === params.passwordConfirmation &&
186
- params.code
187
- ) {
188
- const user = await strapi
189
- .query('plugins::users-permissions.user')
190
- .findOne({ where: { resetPasswordToken: `${params.code}` } });
191
-
192
- if (!user) {
193
- return ctx.badRequest(
194
- null,
195
- formatError({
196
- id: 'Auth.form.error.code.provide',
197
- message: 'Incorrect code provided.',
198
- })
199
- );
200
- }
201
-
202
- const password = await getService('user').hashPassword({ password: params.password });
203
-
204
- // Update the user.
205
- await strapi
206
- .query('plugins::users-permissions.user')
207
- .update({ where: { id: user.id }, data: { resetPasswordToken: null, password } });
208
-
209
- ctx.send({
210
- jwt: strapi.plugins['users-permissions'].services.jwt.issue({
211
- id: user.id,
212
- }),
213
- user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
214
- model: strapi.getModel('plugins::users-permissions.user'),
215
- }),
216
- });
217
- } else if (
218
- params.password &&
219
- params.passwordConfirmation &&
220
- params.password !== params.passwordConfirmation
221
- ) {
222
- return ctx.badRequest(
223
- null,
224
- formatError({
225
- id: 'Auth.form.error.password.matching',
226
- message: 'Passwords do not match.',
227
- })
228
- );
229
- } else {
230
- return ctx.badRequest(
231
- null,
232
- formatError({
233
- id: 'Auth.form.error.params.provide',
234
- message: 'Incorrect params provided.',
235
- })
236
- );
237
- }
238
- },
239
-
240
- async connect(ctx, next) {
241
- const grantConfig = await strapi
242
- .store({
243
- environment: '',
244
- type: 'plugin',
245
- name: 'users-permissions',
246
- key: 'grant',
247
- })
248
- .get();
249
-
250
- const [requestPath] = ctx.request.url.split('?');
251
- const provider = requestPath.split('/')[2];
252
-
253
- if (!_.get(grantConfig[provider], 'enabled')) {
254
- return ctx.badRequest(null, 'This provider is disabled.');
255
- }
256
-
257
- if (!strapi.config.server.url.startsWith('http')) {
258
- strapi.log.warn(
259
- 'You are using a third party provider for login. Make sure to set an absolute url in config/server.js. More info here: https://strapi.io/documentation/developer-docs/latest/development/plugins/users-permissions.html#setting-up-the-server-url'
260
- );
261
- }
262
-
263
- // Ability to pass OAuth callback dynamically
264
- grantConfig[provider].callback = _.get(ctx, 'query.callback') || grantConfig[provider].callback;
265
- grantConfig[provider].redirect_uri = strapi.plugins[
266
- 'users-permissions'
267
- ].services.providers.buildRedirectUri(provider);
268
-
269
- return grant(grantConfig)(ctx, next);
270
- },
271
-
272
- async forgotPassword(ctx) {
273
- let { email } = ctx.request.body;
274
-
275
- // Check if the provided email is valid or not.
276
- const isEmail = emailRegExp.test(email);
277
-
278
- if (isEmail) {
279
- email = email.toLowerCase();
280
- } else {
281
- return ctx.badRequest(
282
- null,
283
- formatError({
284
- id: 'Auth.form.error.email.format',
285
- message: 'Please provide valid email address.',
286
- })
287
- );
288
- }
289
-
290
- const pluginStore = await strapi.store({
291
- environment: '',
292
- type: 'plugin',
293
- name: 'users-permissions',
294
- });
295
-
296
- // Find the user by email.
297
- const user = await strapi
298
- .query('plugins::users-permissions.user')
299
- .findOne({ where: { email: email.toLowerCase() } });
300
-
301
- // User not found.
302
- if (!user) {
303
- return ctx.badRequest(
304
- null,
305
- formatError({
306
- id: 'Auth.form.error.user.not-exist',
307
- message: 'This email does not exist.',
308
- })
309
- );
310
- }
311
-
312
- // Generate random token.
313
- const resetPasswordToken = crypto.randomBytes(64).toString('hex');
314
-
315
- const settings = await pluginStore.get({ key: 'email' }).then(storeEmail => {
316
- try {
317
- return storeEmail['reset_password'].options;
318
- } catch (error) {
319
- return {};
320
- }
321
- });
322
-
323
- const advanced = await pluginStore.get({
324
- key: 'advanced',
325
- });
326
-
327
- const userInfo = sanitizeEntity(user, {
328
- model: strapi.getModel('plugins::users-permissions.user'),
329
- });
330
-
331
- settings.message = await getService('users-permissions').template(settings.message, {
332
- URL: advanced.email_reset_password,
333
- USER: userInfo,
334
- TOKEN: resetPasswordToken,
335
- });
336
-
337
- settings.object = await getService('users-permissions').template(settings.object, {
338
- USER: userInfo,
339
- });
340
-
341
- try {
342
- // Send an email to the user.
343
- await strapi.plugins['email'].services.email.send({
344
- to: user.email,
345
- from:
346
- settings.from.email || settings.from.name
347
- ? `${settings.from.name} <${settings.from.email}>`
348
- : undefined,
349
- replyTo: settings.response_email,
350
- subject: settings.object,
351
- text: settings.message,
352
- html: settings.message,
353
- });
354
- } catch (err) {
355
- return ctx.badRequest(null, err);
356
- }
357
-
358
- // Update the user.
359
- await strapi
360
- .query('plugins::users-permissions.user')
361
- .update({ where: { id: user.id }, data: { resetPasswordToken } });
362
-
363
- ctx.send({ ok: true });
364
- },
365
-
366
- async register(ctx) {
367
- const pluginStore = await strapi.store({
368
- environment: '',
369
- type: 'plugin',
370
- name: 'users-permissions',
371
- });
372
-
373
- const settings = await pluginStore.get({
374
- key: 'advanced',
375
- });
376
-
377
- if (!settings.allow_register) {
378
- return ctx.badRequest(
379
- null,
380
- formatError({
381
- id: 'Auth.advanced.allow_register',
382
- message: 'Register action is currently disabled.',
383
- })
384
- );
385
- }
386
-
387
- const params = {
388
- ..._.omit(ctx.request.body, ['confirmed', 'confirmationToken', 'resetPasswordToken']),
389
- provider: 'local',
390
- };
391
-
392
- // Password is required.
393
- if (!params.password) {
394
- return ctx.badRequest(
395
- null,
396
- formatError({
397
- id: 'Auth.form.error.password.provide',
398
- message: 'Please provide your password.',
399
- })
400
- );
401
- }
402
-
403
- // Email is required.
404
- if (!params.email) {
405
- return ctx.badRequest(
406
- null,
407
- formatError({
408
- id: 'Auth.form.error.email.provide',
409
- message: 'Please provide your email.',
410
- })
411
- );
412
- }
413
-
414
- // Throw an error if the password selected by the user
415
- // contains more than three times the symbol '$'.
416
- if (getService('user').isHashed(params.password)) {
417
- return ctx.badRequest(
418
- null,
419
- formatError({
420
- id: 'Auth.form.error.password.format',
421
- message: 'Your password cannot contain more than three times the symbol `$`.',
422
- })
423
- );
424
- }
425
-
426
- const role = await strapi
427
- .query('plugins::users-permissions.role')
428
- .findOne({ where: { type: settings.default_role } });
429
-
430
- if (!role) {
431
- return ctx.badRequest(
432
- null,
433
- formatError({
434
- id: 'Auth.form.error.role.notFound',
435
- message: 'Impossible to find the default role.',
436
- })
437
- );
438
- }
439
-
440
- // Check if the provided email is valid or not.
441
- const isEmail = emailRegExp.test(params.email);
442
-
443
- if (isEmail) {
444
- params.email = params.email.toLowerCase();
445
- } else {
446
- return ctx.badRequest(
447
- null,
448
- formatError({
449
- id: 'Auth.form.error.email.format',
450
- message: 'Please provide valid email address.',
451
- })
452
- );
453
- }
454
-
455
- params.role = role.id;
456
- params.password = await getService('user').hashPassword(params);
457
-
458
- const user = await strapi.query('plugins::users-permissions.user').findOne({
459
- where: { email: params.email },
460
- });
461
-
462
- if (user && user.provider === params.provider) {
463
- return ctx.badRequest(
464
- null,
465
- formatError({
466
- id: 'Auth.form.error.email.taken',
467
- message: 'Email is already taken.',
468
- })
469
- );
470
- }
471
-
472
- if (user && user.provider !== params.provider && settings.unique_email) {
473
- return ctx.badRequest(
474
- null,
475
- formatError({
476
- id: 'Auth.form.error.email.taken',
477
- message: 'Email is already taken.',
478
- })
479
- );
480
- }
481
-
482
- try {
483
- if (!settings.email_confirmation) {
484
- params.confirmed = true;
485
- }
486
-
487
- const user = await strapi.query('plugins::users-permissions.user').create({ data: params });
488
-
489
- const sanitizedUser = sanitizeEntity(user, {
490
- model: strapi.getModel('plugins::users-permissions.user'),
491
- });
492
-
493
- if (settings.email_confirmation) {
494
- try {
495
- await getService('user').sendConfirmationEmail(user);
496
- } catch (err) {
497
- return ctx.badRequest(null, err);
498
- }
499
-
500
- return ctx.send({ user: sanitizedUser });
501
- }
502
-
503
- const jwt = strapi.plugins['users-permissions'].services.jwt.issue(_.pick(user, ['id']));
504
-
505
- return ctx.send({
506
- jwt,
507
- user: sanitizedUser,
508
- });
509
- } catch (err) {
510
- const adminError = _.includes(err.message, 'username')
511
- ? {
512
- id: 'Auth.form.error.username.taken',
513
- message: 'Username already taken',
514
- }
515
- : { id: 'Auth.form.error.email.taken', message: 'Email already taken' };
516
-
517
- ctx.badRequest(null, formatError(adminError));
518
- }
519
- },
520
-
521
- async emailConfirmation(ctx, next, returnUser) {
522
- const { confirmation: confirmationToken } = ctx.query;
523
-
524
- const { user: userService, jwt: jwtService } = strapi.plugins['users-permissions'].services;
525
-
526
- if (_.isEmpty(confirmationToken)) {
527
- return ctx.badRequest('token.invalid');
528
- }
529
-
530
- const user = await userService.fetch({ confirmationToken }, []);
531
-
532
- if (!user) {
533
- return ctx.badRequest('token.invalid');
534
- }
535
-
536
- await userService.edit({ id: user.id }, { confirmed: true, confirmationToken: null });
537
-
538
- if (returnUser) {
539
- ctx.send({
540
- jwt: jwtService.issue({ id: user.id }),
541
- user: sanitizeEntity(user, {
542
- model: strapi.getModel('plugins::users-permissions.user'),
543
- }),
544
- });
545
- } else {
546
- const settings = await strapi
547
- .store({
548
- environment: '',
549
- type: 'plugin',
550
- name: 'users-permissions',
551
- key: 'advanced',
552
- })
553
- .get();
554
-
555
- ctx.redirect(settings.email_confirmation_redirection || '/');
556
- }
557
- },
558
-
559
- async sendEmailConfirmation(ctx) {
560
- const params = _.assign(ctx.request.body);
561
-
562
- if (!params.email) {
563
- return ctx.badRequest('missing.email');
564
- }
565
-
566
- const isEmail = emailRegExp.test(params.email);
567
-
568
- if (isEmail) {
569
- params.email = params.email.toLowerCase();
570
- } else {
571
- return ctx.badRequest('wrong.email');
572
- }
573
-
574
- const user = await strapi.query('plugins::users-permissions.user').findOne({
575
- where: { email: params.email },
576
- });
577
-
578
- if (user.confirmed) {
579
- return ctx.badRequest('already.confirmed');
580
- }
581
-
582
- if (user.blocked) {
583
- return ctx.badRequest('blocked.user');
584
- }
585
-
586
- try {
587
- await getService('user').sendConfirmationEmail(user);
588
- ctx.send({
589
- email: user.email,
590
- sent: true,
591
- });
592
- } catch (err) {
593
- return ctx.badRequest(null, err);
594
- }
595
- },
596
- };