@strapi/plugin-users-permissions 4.0.0-next.9 → 4.0.3

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 (178) 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 +0 -8
  19. package/admin/src/pages/AdvancedSettings/index.js +203 -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 +117 -197
  26. package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
  27. package/admin/src/pages/Providers/index.js +206 -221
  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/translations/ar.json +0 -8
  36. package/admin/src/translations/cs.json +0 -8
  37. package/admin/src/translations/de.json +0 -8
  38. package/admin/src/translations/dk.json +0 -8
  39. package/admin/src/translations/en.json +33 -12
  40. package/admin/src/translations/es.json +0 -8
  41. package/admin/src/translations/fr.json +0 -8
  42. package/admin/src/translations/id.json +0 -8
  43. package/admin/src/translations/it.json +0 -8
  44. package/admin/src/translations/ja.json +0 -8
  45. package/admin/src/translations/ko.json +93 -54
  46. package/admin/src/translations/ms.json +0 -8
  47. package/admin/src/translations/nl.json +0 -8
  48. package/admin/src/translations/pl.json +0 -8
  49. package/admin/src/translations/pt-BR.json +0 -8
  50. package/admin/src/translations/pt.json +0 -8
  51. package/admin/src/translations/ru.json +0 -8
  52. package/admin/src/translations/sk.json +0 -8
  53. package/admin/src/translations/sv.json +0 -8
  54. package/admin/src/translations/th.json +0 -8
  55. package/admin/src/translations/tr.json +0 -8
  56. package/admin/src/translations/uk.json +0 -8
  57. package/admin/src/translations/vi.json +0 -8
  58. package/admin/src/translations/zh-Hans.json +5 -14
  59. package/admin/src/translations/zh.json +0 -8
  60. package/admin/src/utils/axiosInstance.js +36 -0
  61. package/admin/src/utils/formatPluginName.js +26 -0
  62. package/admin/src/utils/index.js +1 -0
  63. package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
  64. package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
  65. package/jest.config.front.js +10 -0
  66. package/package.json +36 -33
  67. package/server/bootstrap/index.js +19 -21
  68. package/server/config.js +3 -3
  69. package/server/content-types/index.js +3 -3
  70. package/server/content-types/permission/index.js +30 -3
  71. package/server/content-types/role/index.js +47 -3
  72. package/server/content-types/user/index.js +65 -4
  73. package/server/controllers/auth.js +82 -245
  74. package/server/controllers/content-manager-user.js +183 -0
  75. package/server/controllers/index.js +12 -6
  76. package/server/controllers/permissions.js +26 -0
  77. package/server/controllers/role.js +77 -0
  78. package/server/controllers/settings.js +85 -0
  79. package/server/controllers/user.js +119 -45
  80. package/server/controllers/validation/auth.js +29 -0
  81. package/server/controllers/validation/user.js +38 -0
  82. package/server/graphql/index.js +44 -0
  83. package/server/graphql/mutations/auth/email-confirmation.js +39 -0
  84. package/server/graphql/mutations/auth/forgot-password.js +38 -0
  85. package/server/graphql/mutations/auth/login.js +38 -0
  86. package/server/graphql/mutations/auth/register.js +39 -0
  87. package/server/graphql/mutations/auth/reset-password.js +41 -0
  88. package/server/graphql/mutations/crud/role/create-role.js +37 -0
  89. package/server/graphql/mutations/crud/role/delete-role.js +28 -0
  90. package/server/graphql/mutations/crud/role/update-role.js +38 -0
  91. package/server/graphql/mutations/crud/user/create-user.js +48 -0
  92. package/server/graphql/mutations/crud/user/delete-user.js +42 -0
  93. package/server/graphql/mutations/crud/user/update-user.js +49 -0
  94. package/server/graphql/mutations/index.js +42 -0
  95. package/server/graphql/queries/index.js +13 -0
  96. package/server/graphql/queries/me.js +17 -0
  97. package/server/graphql/resolvers-configs.js +37 -0
  98. package/server/graphql/types/create-role-payload.js +11 -0
  99. package/server/graphql/types/delete-role-payload.js +11 -0
  100. package/server/graphql/types/index.js +21 -0
  101. package/server/graphql/types/login-input.js +13 -0
  102. package/server/graphql/types/login-payload.js +12 -0
  103. package/server/graphql/types/me-role.js +14 -0
  104. package/server/graphql/types/me.js +16 -0
  105. package/server/graphql/types/password-payload.js +11 -0
  106. package/server/graphql/types/register-input.js +13 -0
  107. package/server/graphql/types/update-role-payload.js +11 -0
  108. package/server/graphql/utils.js +27 -0
  109. package/server/index.js +21 -0
  110. package/server/middlewares/index.js +2 -2
  111. package/server/{policies → middlewares}/rateLimit.js +3 -7
  112. package/server/register.js +11 -0
  113. package/server/routes/admin/index.js +10 -0
  114. package/server/routes/admin/permissions.js +20 -0
  115. package/server/routes/admin/role.js +79 -0
  116. package/server/routes/admin/settings.js +95 -0
  117. package/server/routes/content-api/auth.js +73 -0
  118. package/server/routes/content-api/index.js +11 -0
  119. package/server/routes/content-api/permissions.js +9 -0
  120. package/server/routes/content-api/role.js +29 -0
  121. package/server/routes/content-api/user.js +61 -0
  122. package/server/routes/index.js +4 -428
  123. package/server/services/index.js +10 -8
  124. package/server/services/jwt.js +9 -17
  125. package/server/services/providers.js +32 -33
  126. package/server/services/role.js +177 -0
  127. package/server/services/user.js +23 -22
  128. package/server/services/users-permissions.js +140 -338
  129. package/server/strategies/users-permissions.js +123 -0
  130. package/server/utils/index.d.ts +2 -0
  131. package/strapi-admin.js +3 -0
  132. package/strapi-server.js +1 -19
  133. package/admin/src/assets/images/logo.svg +0 -1
  134. package/admin/src/components/BaselineAlignement/index.js +0 -33
  135. package/admin/src/components/Bloc/index.js +0 -10
  136. package/admin/src/components/BoundRoute/Components.js +0 -78
  137. package/admin/src/components/ContainerFluid/index.js +0 -13
  138. package/admin/src/components/FormBloc/index.js +0 -61
  139. package/admin/src/components/IntlInput/index.js +0 -38
  140. package/admin/src/components/ListBaselineAlignment/index.js +0 -8
  141. package/admin/src/components/ListRow/Components.js +0 -74
  142. package/admin/src/components/ListRow/index.js +0 -35
  143. package/admin/src/components/ModalForm/Wrapper.js +0 -12
  144. package/admin/src/components/ModalForm/index.js +0 -59
  145. package/admin/src/components/Permissions/ListWrapper.js +0 -9
  146. package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
  147. package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
  148. package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
  149. package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
  150. package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
  151. package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
  152. package/admin/src/components/Policies/Components.js +0 -26
  153. package/admin/src/components/PrefixedIcon/index.js +0 -27
  154. package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
  155. package/admin/src/components/Roles/EmptyRole/index.js +0 -27
  156. package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
  157. package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
  158. package/admin/src/components/Roles/RoleRow/index.js +0 -45
  159. package/admin/src/components/Roles/index.js +0 -3
  160. package/admin/src/components/SizedInput/index.js +0 -24
  161. package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
  162. package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
  163. package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
  164. package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
  165. package/admin/src/pages/EmailTemplates/reducer.js +0 -58
  166. package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
  167. package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
  168. package/server/content-types/permission/schema.json +0 -48
  169. package/server/content-types/role/schema.json +0 -46
  170. package/server/content-types/user/schema.json +0 -66
  171. package/server/controllers/user/admin.js +0 -230
  172. package/server/controllers/user/api.js +0 -174
  173. package/server/controllers/users-permissions.js +0 -271
  174. package/server/middlewares/users-permissions.js +0 -44
  175. package/server/policies/index.js +0 -11
  176. package/server/policies/isAuthenticated.js +0 -9
  177. package/server/policies/permissions.js +0 -94
  178. package/server/schema.graphql.js +0 -317
@@ -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 }) => ({
@@ -45,16 +45,23 @@ module.exports = ({ strapi }) => ({
45
45
 
46
46
  /**
47
47
  * Promise to edit a/an user.
48
+ * @param {string} userId
49
+ * @param {object} params
48
50
  * @return {Promise}
49
51
  */
50
- async edit(params, values) {
51
- if (values.password) {
52
- values.password = await getService('user').hashPassword(values);
52
+ async edit(userId, params = {}) {
53
+ if (params.password) {
54
+ params.password = await getService('user').hashPassword(params);
53
55
  }
54
56
 
55
- return strapi
56
- .query('plugin::users-permissions.user')
57
- .update({ where: params, data: values, populate: ['role'] });
57
+ return strapi.entityService.update(
58
+ 'plugin::users-permissions.user',
59
+ userId,
60
+ {
61
+ data: params,
62
+ populate: ['role']
63
+ }
64
+ );
58
65
  },
59
66
 
60
67
  /**
@@ -114,41 +121,35 @@ module.exports = ({ strapi }) => ({
114
121
  return strapi.query('plugin::users-permissions.user').delete({ where: params });
115
122
  },
116
123
 
117
- async removeAll(params) {
118
- return strapi.query('plugin::users-permissions.user').delete({ where: params });
119
- },
120
-
121
124
  validatePassword(password, hash) {
122
125
  return bcrypt.compare(password, hash);
123
126
  },
124
127
 
125
128
  async sendConfirmationEmail(user) {
126
129
  const userPermissionService = getService('users-permissions');
127
- const pluginStore = await strapi.store({
128
- environment: '',
129
- type: 'plugin',
130
- name: 'users-permissions',
131
- });
130
+ const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });
131
+ const userSchema = strapi.getModel('plugin::users-permissions.user');
132
132
 
133
133
  const settings = await pluginStore
134
134
  .get({ key: 'email' })
135
135
  .then(storeEmail => storeEmail['email_confirmation'].options);
136
136
 
137
- const userInfo = sanitizeEntity(user, {
138
- model: strapi.getModel('plugin::users-permissions.user'),
139
- });
137
+ // Sanitize the template's user information
138
+ const sanitizedUserInfo = await sanitize.sanitizers.defaultSanitizeOutput(userSchema, user);
140
139
 
141
140
  const confirmationToken = crypto.randomBytes(20).toString('hex');
142
141
 
143
- await this.edit({ id: user.id }, { confirmationToken });
142
+ await this.edit(user.id, { confirmationToken });
144
143
 
145
144
  settings.message = await userPermissionService.template(settings.message, {
146
145
  URL: `${getAbsoluteServerUrl(strapi.config)}/auth/email-confirmation`,
147
- USER: userInfo,
146
+ USER: sanitizedUserInfo,
148
147
  CODE: confirmationToken,
149
148
  });
150
149
 
151
- settings.object = await userPermissionService.template(settings.object, { USER: userInfo });
150
+ settings.object = await userPermissionService.template(settings.object, {
151
+ USER: sanitizedUserInfo,
152
+ });
152
153
 
153
154
  // Send an email to the user.
154
155
  await strapi