@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.
- package/admin/src/components/BoundRoute/getMethodColor.js +41 -0
- package/admin/src/components/BoundRoute/index.js +40 -24
- package/admin/src/components/FormModal/Input/index.js +121 -0
- package/admin/src/components/FormModal/index.js +123 -0
- package/admin/src/components/Permissions/PermissionRow/CheckboxWrapper.js +19 -26
- package/admin/src/components/Permissions/PermissionRow/SubCategory.js +118 -0
- package/admin/src/components/Permissions/PermissionRow/index.js +9 -48
- package/admin/src/components/Permissions/index.js +36 -24
- package/admin/src/components/Permissions/init.js +1 -6
- package/admin/src/components/Policies/index.js +46 -47
- package/admin/src/components/UsersPermissions/index.js +29 -26
- package/admin/src/components/UsersPermissions/init.js +1 -2
- package/admin/src/hooks/useFetchRole/index.js +17 -7
- package/admin/src/hooks/useForm/index.js +3 -29
- package/admin/src/hooks/useForm/reducer.js +2 -21
- package/admin/src/hooks/usePlugins/index.js +12 -21
- package/admin/src/hooks/usePlugins/reducer.js +0 -3
- package/admin/src/index.js +29 -34
- package/admin/src/pages/AdvancedSettings/index.js +210 -193
- package/admin/src/pages/AdvancedSettings/utils/api.js +13 -0
- package/admin/src/pages/AdvancedSettings/utils/layout.js +96 -0
- package/admin/src/pages/AdvancedSettings/utils/schema.js +21 -0
- package/admin/src/pages/EmailTemplates/components/EmailForm.js +173 -0
- package/admin/src/pages/EmailTemplates/components/EmailTable.js +116 -0
- package/admin/src/pages/EmailTemplates/index.js +125 -198
- package/admin/src/pages/EmailTemplates/utils/api.js +13 -0
- package/admin/src/pages/Providers/index.js +208 -216
- package/admin/src/pages/Providers/utils/api.js +21 -0
- package/admin/src/pages/Providers/utils/forms.js +168 -126
- package/admin/src/pages/Roles/CreatePage/index.js +155 -147
- package/admin/src/pages/Roles/EditPage/index.js +162 -134
- package/admin/src/pages/Roles/ListPage/components/TableBody.js +96 -0
- package/admin/src/pages/Roles/ListPage/index.js +176 -156
- package/admin/src/pages/Roles/ListPage/utils/api.js +28 -0
- package/admin/src/pages/Roles/index.js +14 -8
- package/admin/src/translations/ar.json +0 -8
- package/admin/src/translations/cs.json +0 -8
- package/admin/src/translations/de.json +0 -8
- package/admin/src/translations/dk.json +0 -8
- package/admin/src/translations/en.json +33 -12
- package/admin/src/translations/es.json +0 -8
- package/admin/src/translations/fr.json +0 -8
- package/admin/src/translations/id.json +0 -8
- package/admin/src/translations/it.json +0 -8
- package/admin/src/translations/ja.json +0 -8
- package/admin/src/translations/ko.json +93 -54
- package/admin/src/translations/ms.json +0 -8
- package/admin/src/translations/nl.json +0 -8
- package/admin/src/translations/pl.json +0 -8
- package/admin/src/translations/pt-BR.json +0 -8
- package/admin/src/translations/pt.json +0 -8
- package/admin/src/translations/ru.json +0 -8
- package/admin/src/translations/sk.json +0 -8
- package/admin/src/translations/sv.json +0 -8
- package/admin/src/translations/th.json +0 -8
- package/admin/src/translations/tr.json +0 -8
- package/admin/src/translations/uk.json +0 -8
- package/admin/src/translations/vi.json +0 -8
- package/admin/src/translations/zh-Hans.json +5 -14
- package/admin/src/translations/zh.json +0 -8
- package/admin/src/utils/axiosInstance.js +36 -0
- package/admin/src/utils/formatPluginName.js +26 -0
- package/admin/src/utils/index.js +1 -0
- package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
- package/documentation/1.0.0/overrides/users-permissions-User.json +7 -7
- package/jest.config.front.js +10 -0
- package/package.json +35 -32
- package/server/bootstrap/index.js +20 -25
- package/server/config.js +3 -3
- package/server/content-types/index.js +3 -3
- package/server/content-types/permission/index.js +30 -3
- package/server/content-types/role/index.js +47 -3
- package/server/content-types/user/index.js +65 -4
- package/server/controllers/auth.js +85 -237
- package/server/controllers/content-manager-user.js +183 -0
- package/server/controllers/index.js +12 -6
- package/server/controllers/permissions.js +26 -0
- package/server/controllers/role.js +77 -0
- package/server/controllers/settings.js +85 -0
- package/server/controllers/user.js +119 -45
- package/server/controllers/validation/auth.js +29 -0
- package/server/controllers/validation/user.js +38 -0
- package/server/graphql/index.js +44 -0
- package/server/graphql/mutations/auth/email-confirmation.js +39 -0
- package/server/graphql/mutations/auth/forgot-password.js +38 -0
- package/server/graphql/mutations/auth/login.js +38 -0
- package/server/graphql/mutations/auth/register.js +39 -0
- package/server/graphql/mutations/auth/reset-password.js +41 -0
- package/server/graphql/mutations/crud/role/create-role.js +37 -0
- package/server/graphql/mutations/crud/role/delete-role.js +28 -0
- package/server/graphql/mutations/crud/role/update-role.js +38 -0
- package/server/graphql/mutations/crud/user/create-user.js +48 -0
- package/server/graphql/mutations/crud/user/delete-user.js +42 -0
- package/server/graphql/mutations/crud/user/update-user.js +49 -0
- package/server/graphql/mutations/index.js +42 -0
- package/server/graphql/queries/index.js +13 -0
- package/server/graphql/queries/me.js +17 -0
- package/server/graphql/resolvers-configs.js +37 -0
- package/server/graphql/types/create-role-payload.js +11 -0
- package/server/graphql/types/delete-role-payload.js +11 -0
- package/server/graphql/types/index.js +21 -0
- package/server/graphql/types/login-input.js +13 -0
- package/server/graphql/types/login-payload.js +12 -0
- package/server/graphql/types/me-role.js +14 -0
- package/server/graphql/types/me.js +16 -0
- package/server/graphql/types/password-payload.js +11 -0
- package/server/graphql/types/register-input.js +13 -0
- package/server/graphql/types/update-role-payload.js +11 -0
- package/server/graphql/utils.js +27 -0
- package/server/index.js +21 -0
- package/server/middlewares/index.js +2 -2
- package/server/{policies → middlewares}/rateLimit.js +3 -7
- package/server/register.js +11 -0
- package/server/routes/admin/index.js +10 -0
- package/server/routes/admin/permissions.js +20 -0
- package/server/routes/admin/role.js +79 -0
- package/server/routes/admin/settings.js +95 -0
- package/server/routes/content-api/auth.js +73 -0
- package/server/routes/content-api/index.js +11 -0
- package/server/routes/content-api/permissions.js +9 -0
- package/server/routes/content-api/role.js +29 -0
- package/server/routes/content-api/user.js +61 -0
- package/server/routes/index.js +4 -3
- package/server/services/index.js +10 -8
- package/server/services/jwt.js +9 -17
- package/server/services/providers.js +32 -33
- package/server/services/role.js +177 -0
- package/server/services/user.js +9 -15
- package/server/services/users-permissions.js +140 -338
- package/server/strategies/users-permissions.js +123 -0
- package/server/utils/index.d.ts +2 -0
- package/strapi-admin.js +3 -0
- package/strapi-server.js +1 -19
- package/admin/src/assets/images/logo.svg +0 -1
- package/admin/src/components/BaselineAlignement/index.js +0 -33
- package/admin/src/components/Bloc/index.js +0 -10
- package/admin/src/components/BoundRoute/Components.js +0 -78
- package/admin/src/components/ContainerFluid/index.js +0 -13
- package/admin/src/components/FormBloc/index.js +0 -61
- package/admin/src/components/IntlInput/index.js +0 -38
- package/admin/src/components/ListBaselineAlignment/index.js +0 -8
- package/admin/src/components/ListRow/Components.js +0 -74
- package/admin/src/components/ListRow/index.js +0 -35
- package/admin/src/components/ModalForm/Wrapper.js +0 -12
- package/admin/src/components/ModalForm/index.js +0 -59
- package/admin/src/components/Permissions/ListWrapper.js +0 -9
- package/admin/src/components/Permissions/PermissionRow/BaselineAlignment.js +0 -7
- package/admin/src/components/Permissions/PermissionRow/RowStyle.js +0 -28
- package/admin/src/components/Permissions/PermissionRow/SubCategory/ConditionsButtonWrapper.js +0 -13
- package/admin/src/components/Permissions/PermissionRow/SubCategory/PolicyWrapper.js +0 -8
- package/admin/src/components/Permissions/PermissionRow/SubCategory/SubCategoryWrapper.js +0 -26
- package/admin/src/components/Permissions/PermissionRow/SubCategory/index.js +0 -116
- package/admin/src/components/Policies/Components.js +0 -26
- package/admin/src/components/PrefixedIcon/index.js +0 -27
- package/admin/src/components/Roles/EmptyRole/BaselineAlignment.js +0 -7
- package/admin/src/components/Roles/EmptyRole/index.js +0 -27
- package/admin/src/components/Roles/RoleListWrapper/index.js +0 -17
- package/admin/src/components/Roles/RoleRow/RoleDescription.js +0 -9
- package/admin/src/components/Roles/RoleRow/index.js +0 -45
- package/admin/src/components/Roles/index.js +0 -3
- package/admin/src/components/SizedInput/index.js +0 -24
- package/admin/src/pages/AdvancedSettings/reducer.js +0 -65
- package/admin/src/pages/AdvancedSettings/utils/form.js +0 -52
- package/admin/src/pages/EmailTemplates/CustomTextInput.js +0 -105
- package/admin/src/pages/EmailTemplates/Wrapper.js +0 -36
- package/admin/src/pages/EmailTemplates/reducer.js +0 -58
- package/admin/src/pages/EmailTemplates/utils/forms.js +0 -81
- package/admin/src/pages/Roles/ListPage/BaselineAlignment.js +0 -8
- package/server/content-types/permission/schema.json +0 -48
- package/server/content-types/role/schema.json +0 -46
- package/server/content-types/user/schema.json +0 -66
- package/server/controllers/user/admin.js +0 -230
- package/server/controllers/user/api.js +0 -174
- package/server/controllers/users-permissions.js +0 -271
- package/server/middlewares/users-permissions.js +0 -36
- package/server/policies/index.js +0 -11
- package/server/policies/isAuthenticated.js +0 -9
- package/server/policies/permissions.js +0 -94
- package/server/routes/routes.json +0 -381
- 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
|
|
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
|
|
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
|
|
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:
|
|
207
|
-
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:
|
|
231
|
-
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,
|
|
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://${
|
|
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(
|
|
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 (!
|
|
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
|
|
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 =
|
|
576
|
-
|
|
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
|
-
|
|
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
|
+
});
|
package/server/services/user.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
const crypto = require('crypto');
|
|
10
10
|
const bcrypt = require('bcryptjs');
|
|
11
11
|
|
|
12
|
-
const {
|
|
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
|
-
|
|
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
|
-
|
|
138
|
-
|
|
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:
|
|
139
|
+
USER: sanitizedUserInfo,
|
|
148
140
|
CODE: confirmationToken,
|
|
149
141
|
});
|
|
150
142
|
|
|
151
|
-
settings.object = await userPermissionService.template(settings.object, {
|
|
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
|