@strapi/plugin-users-permissions 4.0.0-next.7 → 4.0.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 (180) 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 +21 -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/translations/ar.json +0 -8
  37. package/admin/src/translations/cs.json +0 -8
  38. package/admin/src/translations/de.json +0 -8
  39. package/admin/src/translations/dk.json +0 -8
  40. package/admin/src/translations/en.json +33 -12
  41. package/admin/src/translations/es.json +0 -8
  42. package/admin/src/translations/fr.json +0 -8
  43. package/admin/src/translations/id.json +0 -8
  44. package/admin/src/translations/it.json +0 -8
  45. package/admin/src/translations/ja.json +0 -8
  46. package/admin/src/translations/ko.json +93 -54
  47. package/admin/src/translations/ms.json +0 -8
  48. package/admin/src/translations/nl.json +0 -8
  49. package/admin/src/translations/pl.json +0 -8
  50. package/admin/src/translations/pt-BR.json +0 -8
  51. package/admin/src/translations/pt.json +0 -8
  52. package/admin/src/translations/ru.json +0 -8
  53. package/admin/src/translations/sk.json +0 -8
  54. package/admin/src/translations/sv.json +0 -8
  55. package/admin/src/translations/th.json +0 -8
  56. package/admin/src/translations/tr.json +0 -8
  57. package/admin/src/translations/uk.json +0 -8
  58. package/admin/src/translations/vi.json +0 -8
  59. package/admin/src/translations/zh-Hans.json +5 -14
  60. package/admin/src/translations/zh.json +0 -8
  61. package/admin/src/utils/axiosInstance.js +36 -0
  62. package/admin/src/utils/formatPluginName.js +26 -0
  63. package/admin/src/utils/index.js +1 -0
  64. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  65. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  66. package/jest.config.front.js +10 -0
  67. package/package.json +35 -32
  68. package/server/bootstrap/index.js +20 -25
  69. package/server/config.js +3 -3
  70. package/server/content-types/index.js +3 -3
  71. package/server/content-types/permission/index.js +30 -3
  72. package/server/content-types/role/index.js +47 -3
  73. package/server/content-types/user/index.js +65 -4
  74. package/server/controllers/auth.js +85 -237
  75. package/server/controllers/content-manager-user.js +183 -0
  76. package/server/controllers/index.js +12 -6
  77. package/server/controllers/permissions.js +26 -0
  78. package/server/controllers/role.js +77 -0
  79. package/server/controllers/settings.js +85 -0
  80. package/server/controllers/user.js +119 -45
  81. package/server/controllers/validation/auth.js +29 -0
  82. package/server/controllers/validation/user.js +38 -0
  83. package/server/graphql/index.js +44 -0
  84. package/server/graphql/mutations/auth/email-confirmation.js +39 -0
  85. package/server/graphql/mutations/auth/forgot-password.js +38 -0
  86. package/server/graphql/mutations/auth/login.js +38 -0
  87. package/server/graphql/mutations/auth/register.js +39 -0
  88. package/server/graphql/mutations/auth/reset-password.js +41 -0
  89. package/server/graphql/mutations/crud/role/create-role.js +37 -0
  90. package/server/graphql/mutations/crud/role/delete-role.js +28 -0
  91. package/server/graphql/mutations/crud/role/update-role.js +38 -0
  92. package/server/graphql/mutations/crud/user/create-user.js +48 -0
  93. package/server/graphql/mutations/crud/user/delete-user.js +42 -0
  94. package/server/graphql/mutations/crud/user/update-user.js +49 -0
  95. package/server/graphql/mutations/index.js +42 -0
  96. package/server/graphql/queries/index.js +13 -0
  97. package/server/graphql/queries/me.js +17 -0
  98. package/server/graphql/resolvers-configs.js +37 -0
  99. package/server/graphql/types/create-role-payload.js +11 -0
  100. package/server/graphql/types/delete-role-payload.js +11 -0
  101. package/server/graphql/types/index.js +21 -0
  102. package/server/graphql/types/login-input.js +13 -0
  103. package/server/graphql/types/login-payload.js +12 -0
  104. package/server/graphql/types/me-role.js +14 -0
  105. package/server/graphql/types/me.js +16 -0
  106. package/server/graphql/types/password-payload.js +11 -0
  107. package/server/graphql/types/register-input.js +13 -0
  108. package/server/graphql/types/update-role-payload.js +11 -0
  109. package/server/graphql/utils.js +27 -0
  110. package/server/index.js +21 -0
  111. package/server/middlewares/index.js +2 -2
  112. package/server/{policies → middlewares}/rateLimit.js +3 -7
  113. package/server/register.js +11 -0
  114. package/server/routes/admin/index.js +10 -0
  115. package/server/routes/admin/permissions.js +20 -0
  116. package/server/routes/admin/role.js +79 -0
  117. package/server/routes/admin/settings.js +95 -0
  118. package/server/routes/content-api/auth.js +73 -0
  119. package/server/routes/content-api/index.js +11 -0
  120. package/server/routes/content-api/permissions.js +9 -0
  121. package/server/routes/content-api/role.js +29 -0
  122. package/server/routes/content-api/user.js +61 -0
  123. package/server/routes/index.js +4 -3
  124. package/server/services/index.js +10 -8
  125. package/server/services/jwt.js +9 -17
  126. package/server/services/providers.js +32 -33
  127. package/server/services/role.js +177 -0
  128. package/server/services/user.js +9 -15
  129. package/server/services/users-permissions.js +140 -338
  130. package/server/strategies/users-permissions.js +123 -0
  131. package/server/utils/index.d.ts +2 -0
  132. package/strapi-admin.js +3 -0
  133. package/strapi-server.js +1 -19
  134. package/admin/src/assets/images/logo.svg +0 -1
  135. package/admin/src/components/BaselineAlignement/index.js +0 -33
  136. package/admin/src/components/Bloc/index.js +0 -10
  137. package/admin/src/components/BoundRoute/Components.js +0 -78
  138. package/admin/src/components/ContainerFluid/index.js +0 -13
  139. package/admin/src/components/FormBloc/index.js +0 -61
  140. package/admin/src/components/IntlInput/index.js +0 -38
  141. package/admin/src/components/ListBaselineAlignment/index.js +0 -8
  142. package/admin/src/components/ListRow/Components.js +0 -74
  143. package/admin/src/components/ListRow/index.js +0 -35
  144. package/admin/src/components/ModalForm/Wrapper.js +0 -12
  145. package/admin/src/components/ModalForm/index.js +0 -59
  146. package/admin/src/components/Permissions/ListWrapper.js +0 -9
  147. package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
  148. package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
  149. package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
  150. package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
  151. package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
  152. package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
  153. package/admin/src/components/Policies/Components.js +0 -26
  154. package/admin/src/components/PrefixedIcon/index.js +0 -27
  155. package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
  156. package/admin/src/components/Roles/EmptyRole/index.js +0 -27
  157. package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
  158. package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
  159. package/admin/src/components/Roles/RoleRow/index.js +0 -45
  160. package/admin/src/components/Roles/index.js +0 -3
  161. package/admin/src/components/SizedInput/index.js +0 -24
  162. package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
  163. package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
  164. package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
  165. package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
  166. package/admin/src/pages/EmailTemplates/reducer.js +0 -58
  167. package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
  168. package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
  169. package/server/content-types/permission/schema.json +0 -48
  170. package/server/content-types/role/schema.json +0 -46
  171. package/server/content-types/user/schema.json +0 -66
  172. package/server/controllers/user/admin.js +0 -230
  173. package/server/controllers/user/api.js +0 -174
  174. package/server/controllers/users-permissions.js +0 -271
  175. package/server/middlewares/users-permissions.js +0 -36
  176. package/server/policies/index.js +0 -11
  177. package/server/policies/isAuthenticated.js +0 -9
  178. package/server/policies/permissions.js +0 -94
  179. package/server/routes/routes.json +0 -381
  180. package/server/schema.graphql.js +0 -317
@@ -6,15 +6,18 @@
6
6
 
7
7
  // Public node modules.
8
8
  const _ = require('lodash');
9
- const request = require('request');
9
+ const jwt = require('jsonwebtoken');
10
+ const urlJoin = require('url-join');
10
11
 
11
- // Purest strategies.
12
- const purest = require('purest')({ request });
13
- const purestConfig = require('@purest/providers');
14
12
  const { getAbsoluteServerUrl } = require('@strapi/utils');
15
- const jwt = require('jsonwebtoken');
16
13
 
17
14
  module.exports = ({ strapi }) => {
15
+ // lazy load heavy dependencies
16
+ const request = require('request');
17
+ // Purest strategies.
18
+ const purest = require('purest')({ request });
19
+ const purestConfig = require('@purest/providers');
20
+
18
21
  /**
19
22
  * Helper to get profiles
20
23
  *
@@ -25,13 +28,8 @@ module.exports = ({ strapi }) => {
25
28
  const getProfile = async (provider, query, callback) => {
26
29
  const access_token = query.access_token || query.code || query.oauth_token;
27
30
 
28
- const grant = await strapi
29
- .store({
30
- environment: '',
31
- type: 'plugin',
32
- name: 'users-permissions',
33
- key: 'grant',
34
- })
31
+ const providers = await strapi
32
+ .store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
35
33
  .get();
36
34
 
37
35
  switch (provider) {
@@ -66,7 +64,7 @@ module.exports = ({ strapi }) => {
66
64
  // Combine username and discriminator because discord username is not unique
67
65
  var username = `${body.username}#${body.discriminator}`;
68
66
  callback(null, {
69
- username: username,
67
+ username,
70
68
  email: body.email,
71
69
  });
72
70
  }
@@ -203,8 +201,8 @@ module.exports = ({ strapi }) => {
203
201
  const twitter = purest({
204
202
  provider: 'twitter',
205
203
  config: purestConfig,
206
- key: grant.twitter.key,
207
- secret: grant.twitter.secret,
204
+ key: providers.twitter.key,
205
+ secret: providers.twitter.secret,
208
206
  });
209
207
 
210
208
  twitter
@@ -227,8 +225,8 @@ module.exports = ({ strapi }) => {
227
225
  case 'instagram': {
228
226
  const instagram = purest({
229
227
  provider: 'instagram',
230
- key: grant.instagram.key,
231
- secret: grant.instagram.secret,
228
+ key: providers.instagram.key,
229
+ secret: providers.instagram.secret,
232
230
  config: purestConfig,
233
231
  });
234
232
 
@@ -300,7 +298,7 @@ module.exports = ({ strapi }) => {
300
298
 
301
299
  twitch
302
300
  .get('users')
303
- .auth(access_token, grant.twitch.key)
301
+ .auth(access_token, providers.twitch.key)
304
302
  .request((err, res, body) => {
305
303
  if (err) {
306
304
  callback(err);
@@ -405,7 +403,7 @@ module.exports = ({ strapi }) => {
405
403
  }
406
404
  case 'auth0': {
407
405
  const purestAuth0Conf = {};
408
- purestAuth0Conf[`https://${grant.auth0.subdomain}.auth0.com`] = {
406
+ purestAuth0Conf[`https://${providers.auth0.subdomain}.auth0.com`] = {
409
407
  __domain: {
410
408
  auth: {
411
409
  auth: { bearer: '[0]' },
@@ -444,7 +442,7 @@ module.exports = ({ strapi }) => {
444
442
  break;
445
443
  }
446
444
  case 'cas': {
447
- const provider_url = 'https://' + _.get(grant['cas'], 'subdomain');
445
+ const provider_url = 'https://' + _.get(providers.cas, 'subdomain');
448
446
  const cas = purest({
449
447
  provider: 'cas',
450
448
  config: {
@@ -522,23 +520,20 @@ module.exports = ({ strapi }) => {
522
520
  return reject([null, err]);
523
521
  }
524
522
 
523
+ const email = _.toLower(profile.email);
524
+
525
525
  // We need at least the mail.
526
- if (!profile.email) {
526
+ if (!email) {
527
527
  return reject([null, { message: 'Email was not available.' }]);
528
528
  }
529
529
 
530
530
  try {
531
531
  const users = await strapi.query('plugin::users-permissions.user').findMany({
532
- where: { email: profile.email },
532
+ where: { email },
533
533
  });
534
534
 
535
535
  const advanced = await strapi
536
- .store({
537
- environment: '',
538
- type: 'plugin',
539
- name: 'users-permissions',
540
- key: 'advanced',
541
- })
536
+ .store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
542
537
  .get();
543
538
 
544
539
  const user = _.find(users, { provider });
@@ -572,11 +567,13 @@ module.exports = ({ strapi }) => {
572
567
  .findOne({ where: { type: advanced.default_role } });
573
568
 
574
569
  // Create the new user.
575
- const params = _.assign(profile, {
576
- provider: provider,
570
+ const params = {
571
+ ...profile,
572
+ email, // overwrite with lowercased email
573
+ provider,
577
574
  role: defaultRole.id,
578
575
  confirmed: true,
579
- });
576
+ };
580
577
 
581
578
  const createdUser = await strapi
582
579
  .query('plugin::users-permissions.user')
@@ -590,8 +587,10 @@ module.exports = ({ strapi }) => {
590
587
  });
591
588
  };
592
589
 
593
- const buildRedirectUri = (provider = '') =>
594
- `${getAbsoluteServerUrl(strapi.config)}/connect/${provider}/callback`;
590
+ const buildRedirectUri = (provider = '') => {
591
+ const apiPrefix = strapi.config.get('api.rest.prefix');
592
+ return urlJoin(getAbsoluteServerUrl(strapi.config), apiPrefix, 'connect', provider, 'callback');
593
+ };
595
594
 
596
595
  return {
597
596
  connect,
@@ -0,0 +1,177 @@
1
+ 'use strict';
2
+
3
+ const _ = require('lodash');
4
+ const { NotFoundError } = require('@strapi/utils').errors;
5
+ const { getService } = require('../utils');
6
+
7
+ module.exports = ({ strapi }) => ({
8
+ async createRole(params) {
9
+ if (!params.type) {
10
+ params.type = _.snakeCase(_.deburr(_.toLower(params.name)));
11
+ }
12
+
13
+ const role = await strapi
14
+ .query('plugin::users-permissions.role')
15
+ .create({ data: _.omit(params, ['users', 'permissions']) });
16
+
17
+ const createPromises = _.flatMap(params.permissions, (type, typeName) => {
18
+ return _.flatMap(type.controllers, (controller, controllerName) => {
19
+ return _.reduce(
20
+ controller,
21
+ (acc, action, actionName) => {
22
+ const { enabled /* policy */ } = action;
23
+
24
+ if (enabled) {
25
+ const actionID = `${typeName}.${controllerName}.${actionName}`;
26
+
27
+ acc.push(
28
+ strapi
29
+ .query('plugin::users-permissions.permission')
30
+ .create({ data: { action: actionID, role: role.id } })
31
+ );
32
+ }
33
+
34
+ return acc;
35
+ },
36
+ []
37
+ );
38
+ });
39
+ });
40
+
41
+ await Promise.all(createPromises);
42
+ },
43
+
44
+ async getRole(roleID) {
45
+ const role = await strapi
46
+ .query('plugin::users-permissions.role')
47
+ .findOne({ where: { id: roleID }, populate: ['permissions'] });
48
+
49
+ if (!role) {
50
+ throw new NotFoundError('Role not found');
51
+ }
52
+
53
+ const allActions = getService('users-permissions').getActions();
54
+
55
+ // Group by `type`.
56
+ role.permissions.forEach(permission => {
57
+ const [type, controller, action] = permission.action.split('.');
58
+
59
+ _.set(allActions, `${type}.controllers.${controller}.${action}`, {
60
+ enabled: true,
61
+ policy: '',
62
+ });
63
+ });
64
+
65
+ return {
66
+ ...role,
67
+ permissions: allActions,
68
+ };
69
+ },
70
+
71
+ async getRoles() {
72
+ const roles = await strapi.query('plugin::users-permissions.role').findMany({ sort: ['name'] });
73
+
74
+ for (const role of roles) {
75
+ role.nb_users = await strapi
76
+ .query('plugin::users-permissions.user')
77
+ .count({ where: { role: { id: role.id } } });
78
+ }
79
+
80
+ return roles;
81
+ },
82
+
83
+ async updateRole(roleID, data) {
84
+ const role = await strapi
85
+ .query('plugin::users-permissions.role')
86
+ .findOne({ where: { id: roleID }, populate: ['permissions'] });
87
+
88
+ if (!role) {
89
+ throw new NotFoundError('Role not found');
90
+ }
91
+
92
+ await strapi.query('plugin::users-permissions.role').update({
93
+ where: { id: roleID },
94
+ data: _.pick(data, ['name', 'description']),
95
+ });
96
+
97
+ const { permissions } = data;
98
+
99
+ const newActions = _.flatMap(permissions, (type, typeName) => {
100
+ return _.flatMap(type.controllers, (controller, controllerName) => {
101
+ return _.reduce(
102
+ controller,
103
+ (acc, action, actionName) => {
104
+ const { enabled /* policy */ } = action;
105
+
106
+ if (enabled) {
107
+ acc.push(`${typeName}.${controllerName}.${actionName}`);
108
+ }
109
+
110
+ return acc;
111
+ },
112
+ []
113
+ );
114
+ });
115
+ });
116
+
117
+ const oldActions = role.permissions.map(({ action }) => action);
118
+
119
+ const toDelete = role.permissions.reduce((acc, permission) => {
120
+ if (!newActions.includes(permission.action)) {
121
+ acc.push(permission);
122
+ }
123
+ return acc;
124
+ }, []);
125
+
126
+ const toCreate = newActions
127
+ .filter(action => !oldActions.includes(action))
128
+ .map(action => ({ action, role: role.id }));
129
+
130
+ await Promise.all(
131
+ toDelete.map(permission =>
132
+ strapi
133
+ .query('plugin::users-permissions.permission')
134
+ .delete({ where: { id: permission.id } })
135
+ )
136
+ );
137
+
138
+ await Promise.all(
139
+ toCreate.map(permissionInfo =>
140
+ strapi.query('plugin::users-permissions.permission').create({ data: permissionInfo })
141
+ )
142
+ );
143
+ },
144
+
145
+ async deleteRole(roleID, publicRoleID) {
146
+ const role = await strapi
147
+ .query('plugin::users-permissions.role')
148
+ .findOne({ where: { id: roleID }, populate: ['users', 'permissions'] });
149
+
150
+ if (!role) {
151
+ throw new NotFoundError('Role not found');
152
+ }
153
+
154
+ // Move users to guest role.
155
+ await Promise.all(
156
+ role.users.map(user => {
157
+ return strapi.query('plugin::users-permissions.user').update({
158
+ where: { id: user.id },
159
+ data: { role: publicRoleID },
160
+ });
161
+ })
162
+ );
163
+
164
+ // Remove permissions related to this role.
165
+ // TODO: use delete many
166
+ await Promise.all(
167
+ role.permissions.map(permission => {
168
+ return strapi.query('plugin::users-permissions.permission').delete({
169
+ where: { id: permission.id },
170
+ });
171
+ })
172
+ );
173
+
174
+ // Delete the role.
175
+ await strapi.query('plugin::users-permissions.role').delete({ where: { id: roleID } });
176
+ },
177
+ });
@@ -9,7 +9,7 @@
9
9
  const crypto = require('crypto');
10
10
  const bcrypt = require('bcryptjs');
11
11
 
12
- const { sanitizeEntity, getAbsoluteServerUrl } = require('@strapi/utils');
12
+ const { getAbsoluteServerUrl, sanitize } = require('@strapi/utils');
13
13
  const { getService } = require('../utils');
14
14
 
15
15
  module.exports = ({ strapi }) => ({
@@ -114,29 +114,21 @@ module.exports = ({ strapi }) => ({
114
114
  return strapi.query('plugin::users-permissions.user').delete({ where: params });
115
115
  },
116
116
 
117
- async removeAll(params) {
118
- return strapi.query('plugin::users-permissions.user').delete({ where: params });
119
- },
120
-
121
117
  validatePassword(password, hash) {
122
118
  return bcrypt.compare(password, hash);
123
119
  },
124
120
 
125
121
  async sendConfirmationEmail(user) {
126
122
  const userPermissionService = getService('users-permissions');
127
- const pluginStore = await strapi.store({
128
- environment: '',
129
- type: 'plugin',
130
- name: 'users-permissions',
131
- });
123
+ const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });
124
+ const userSchema = strapi.getModel('plugin::users-permissions.user');
132
125
 
133
126
  const settings = await pluginStore
134
127
  .get({ key: 'email' })
135
128
  .then(storeEmail => storeEmail['email_confirmation'].options);
136
129
 
137
- const userInfo = sanitizeEntity(user, {
138
- model: strapi.getModel('plugin::users-permissions.user'),
139
- });
130
+ // Sanitize the template's user information
131
+ const sanitizedUserInfo = await sanitize.sanitizers.defaultSanitizeOutput(userSchema, user);
140
132
 
141
133
  const confirmationToken = crypto.randomBytes(20).toString('hex');
142
134
 
@@ -144,11 +136,13 @@ module.exports = ({ strapi }) => ({
144
136
 
145
137
  settings.message = await userPermissionService.template(settings.message, {
146
138
  URL: `${getAbsoluteServerUrl(strapi.config)}/auth/email-confirmation`,
147
- USER: userInfo,
139
+ USER: sanitizedUserInfo,
148
140
  CODE: confirmationToken,
149
141
  });
150
142
 
151
- settings.object = await userPermissionService.template(settings.object, { USER: userInfo });
143
+ settings.object = await userPermissionService.template(settings.object, {
144
+ USER: sanitizedUserInfo,
145
+ });
152
146
 
153
147
  // Send an email to the user.
154
148
  await strapi