@strapi/plugin-users-permissions 4.0.0-next.1 → 4.0.0-next.13
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/index.js +31 -28
- package/admin/src/pages/AdvancedSettings/index.js +14 -2
- package/admin/src/pages/AdvancedSettings/utils/form.js +2 -2
- package/admin/src/pages/EmailTemplates/index.js +8 -1
- package/admin/src/pages/Providers/index.js +8 -1
- package/admin/src/pages/Roles/CreatePage/index.js +1 -1
- package/admin/src/pages/Roles/EditPage/index.js +2 -2
- package/admin/src/pages/Roles/ListPage/index.js +1 -1
- package/admin/src/pages/Roles/index.js +14 -8
- package/admin/src/permissions.js +12 -14
- package/admin/src/translations/en.json +4 -0
- package/admin/src/translations/zh-Hans.json +26 -7
- package/documentation/1.0.0/overrides/users-permissions-Role.json +6 -6
- package/package.json +8 -6
- package/{config/functions/bootstrap.js → server/bootstrap/index.js} +9 -18
- package/{config → server/bootstrap}/users-permissions-actions.js +0 -0
- package/server/config.js +23 -0
- package/server/content-types/index.js +11 -0
- package/server/content-types/permission/index.js +31 -0
- package/server/content-types/role/index.js +48 -0
- package/server/content-types/user/index.js +72 -0
- package/{models/User.config.js → server/content-types/user/schema-config.js} +0 -0
- package/{controllers → server/controllers}/auth.js +63 -77
- package/server/controllers/index.js +15 -0
- package/server/controllers/permissions.js +26 -0
- package/server/controllers/role.js +77 -0
- package/server/controllers/settings.js +84 -0
- package/{controllers → server/controllers}/user/admin.js +26 -42
- package/{controllers → server/controllers}/user/api.js +11 -27
- package/{controllers → server/controllers}/user.js +2 -18
- package/{controllers → server/controllers}/validation/email-template.js +0 -0
- package/server/index.js +21 -0
- package/server/policies/index.js +7 -0
- package/{config → server}/policies/rateLimit.js +4 -8
- package/server/register.js +7 -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 +6 -0
- package/{config → server}/schema.graphql.js +96 -63
- package/server/services/index.js +15 -0
- package/{services → server/services}/jwt.js +12 -14
- package/server/services/providers.js +592 -0
- package/server/services/role.js +182 -0
- package/{services → server/services}/user.js +31 -34
- package/server/services/users-permissions.js +222 -0
- package/server/strategies/users-permissions.js +122 -0
- package/{utils → server/utils}/index.d.ts +6 -1
- package/server/utils/index.js +9 -0
- package/strapi-server.js +3 -0
- package/config/layout.js +0 -10
- package/config/policies/isAuthenticated.js +0 -9
- package/config/policies/permissions.js +0 -94
- package/config/request.json +0 -6
- package/config/routes.json +0 -381
- package/config/security.json +0 -5
- package/controllers/users-permissions.js +0 -271
- package/middlewares/users-permissions/defaults.json +0 -5
- package/middlewares/users-permissions/index.js +0 -40
- package/models/Permission.js +0 -7
- package/models/Permission.settings.json +0 -45
- package/models/Role.js +0 -7
- package/models/Role.settings.json +0 -43
- package/models/User.js +0 -7
- package/models/User.settings.json +0 -63
- package/services/providers.js +0 -598
- package/services/users-permissions.js +0 -430
- package/utils/index.js +0 -11
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
module.exports = {
|
|
4
|
+
collectionName: 'up_roles',
|
|
5
|
+
info: {
|
|
6
|
+
name: 'role',
|
|
7
|
+
description: '',
|
|
8
|
+
singularName: 'role',
|
|
9
|
+
pluralName: 'roles',
|
|
10
|
+
displayName: 'Role',
|
|
11
|
+
},
|
|
12
|
+
pluginOptions: {
|
|
13
|
+
'content-manager': {
|
|
14
|
+
visible: false,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
attributes: {
|
|
18
|
+
name: {
|
|
19
|
+
type: 'string',
|
|
20
|
+
minLength: 3,
|
|
21
|
+
required: true,
|
|
22
|
+
configurable: false,
|
|
23
|
+
},
|
|
24
|
+
description: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
configurable: false,
|
|
27
|
+
},
|
|
28
|
+
type: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
unique: true,
|
|
31
|
+
configurable: false,
|
|
32
|
+
},
|
|
33
|
+
permissions: {
|
|
34
|
+
type: 'relation',
|
|
35
|
+
relation: 'oneToMany',
|
|
36
|
+
target: 'plugin::users-permissions.permission',
|
|
37
|
+
mappedBy: 'role',
|
|
38
|
+
configurable: false,
|
|
39
|
+
},
|
|
40
|
+
users: {
|
|
41
|
+
type: 'relation',
|
|
42
|
+
relation: 'oneToMany',
|
|
43
|
+
target: 'plugin::users-permissions.user',
|
|
44
|
+
mappedBy: 'role',
|
|
45
|
+
configurable: false,
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const schemaConfig = require('./schema-config');
|
|
4
|
+
|
|
5
|
+
module.exports = {
|
|
6
|
+
collectionName: 'up_users',
|
|
7
|
+
info: {
|
|
8
|
+
name: 'user',
|
|
9
|
+
description: '',
|
|
10
|
+
singularName: 'user',
|
|
11
|
+
pluralName: 'users',
|
|
12
|
+
displayName: 'User',
|
|
13
|
+
},
|
|
14
|
+
options: {
|
|
15
|
+
draftAndPublish: false,
|
|
16
|
+
timestamps: true,
|
|
17
|
+
},
|
|
18
|
+
attributes: {
|
|
19
|
+
username: {
|
|
20
|
+
type: 'string',
|
|
21
|
+
minLength: 3,
|
|
22
|
+
unique: true,
|
|
23
|
+
configurable: false,
|
|
24
|
+
required: true,
|
|
25
|
+
},
|
|
26
|
+
email: {
|
|
27
|
+
type: 'email',
|
|
28
|
+
minLength: 6,
|
|
29
|
+
configurable: false,
|
|
30
|
+
required: true,
|
|
31
|
+
},
|
|
32
|
+
provider: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
configurable: false,
|
|
35
|
+
},
|
|
36
|
+
password: {
|
|
37
|
+
type: 'password',
|
|
38
|
+
minLength: 6,
|
|
39
|
+
configurable: false,
|
|
40
|
+
private: true,
|
|
41
|
+
},
|
|
42
|
+
resetPasswordToken: {
|
|
43
|
+
type: 'string',
|
|
44
|
+
configurable: false,
|
|
45
|
+
private: true,
|
|
46
|
+
},
|
|
47
|
+
confirmationToken: {
|
|
48
|
+
type: 'string',
|
|
49
|
+
configurable: false,
|
|
50
|
+
private: true,
|
|
51
|
+
},
|
|
52
|
+
confirmed: {
|
|
53
|
+
type: 'boolean',
|
|
54
|
+
default: false,
|
|
55
|
+
configurable: false,
|
|
56
|
+
},
|
|
57
|
+
blocked: {
|
|
58
|
+
type: 'boolean',
|
|
59
|
+
default: false,
|
|
60
|
+
configurable: false,
|
|
61
|
+
},
|
|
62
|
+
role: {
|
|
63
|
+
type: 'relation',
|
|
64
|
+
relation: 'manyToOne',
|
|
65
|
+
target: 'plugin::users-permissions.role',
|
|
66
|
+
inversedBy: 'users',
|
|
67
|
+
configurable: false,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
|
|
71
|
+
config: schemaConfig, // TODO: to move to content-manager options
|
|
72
|
+
};
|
|
File without changes
|
|
@@ -9,7 +9,6 @@
|
|
|
9
9
|
/* eslint-disable no-useless-escape */
|
|
10
10
|
const crypto = require('crypto');
|
|
11
11
|
const _ = require('lodash');
|
|
12
|
-
const grant = require('grant-koa');
|
|
13
12
|
const { sanitizeEntity } = require('@strapi/utils');
|
|
14
13
|
const { getService } = require('../utils');
|
|
15
14
|
|
|
@@ -23,11 +22,7 @@ module.exports = {
|
|
|
23
22
|
const provider = ctx.params.provider || 'local';
|
|
24
23
|
const params = ctx.request.body;
|
|
25
24
|
|
|
26
|
-
const store = await strapi.store({
|
|
27
|
-
environment: '',
|
|
28
|
-
type: 'plugin',
|
|
29
|
-
name: 'users-permissions',
|
|
30
|
-
});
|
|
25
|
+
const store = await strapi.store({ type: 'plugin', name: 'users-permissions' });
|
|
31
26
|
|
|
32
27
|
if (provider === 'local') {
|
|
33
28
|
if (!_.get(await store.get({ key: 'grant' }), 'email.enabled')) {
|
|
@@ -69,7 +64,7 @@ module.exports = {
|
|
|
69
64
|
}
|
|
70
65
|
|
|
71
66
|
// Check if the user exists.
|
|
72
|
-
const user = await strapi.query('
|
|
67
|
+
const user = await strapi.query('plugin::users-permissions.user').findOne({ where: query });
|
|
73
68
|
|
|
74
69
|
if (!user) {
|
|
75
70
|
return ctx.badRequest(
|
|
@@ -116,9 +111,10 @@ module.exports = {
|
|
|
116
111
|
);
|
|
117
112
|
}
|
|
118
113
|
|
|
119
|
-
const validPassword = await
|
|
120
|
-
|
|
121
|
-
|
|
114
|
+
const validPassword = await getService('user').validatePassword(
|
|
115
|
+
params.password,
|
|
116
|
+
user.password
|
|
117
|
+
);
|
|
122
118
|
|
|
123
119
|
if (!validPassword) {
|
|
124
120
|
return ctx.badRequest(
|
|
@@ -130,11 +126,11 @@ module.exports = {
|
|
|
130
126
|
);
|
|
131
127
|
} else {
|
|
132
128
|
ctx.send({
|
|
133
|
-
jwt:
|
|
129
|
+
jwt: getService('jwt').issue({
|
|
134
130
|
id: user.id,
|
|
135
131
|
}),
|
|
136
|
-
user: sanitizeEntity(user
|
|
137
|
-
model: strapi.getModel('
|
|
132
|
+
user: sanitizeEntity(user, {
|
|
133
|
+
model: strapi.getModel('plugin::users-permissions.user'),
|
|
138
134
|
}),
|
|
139
135
|
});
|
|
140
136
|
}
|
|
@@ -153,10 +149,7 @@ module.exports = {
|
|
|
153
149
|
let user;
|
|
154
150
|
let error;
|
|
155
151
|
try {
|
|
156
|
-
[user, error] = await
|
|
157
|
-
provider,
|
|
158
|
-
ctx.query
|
|
159
|
-
);
|
|
152
|
+
[user, error] = await getService('providers').connect(provider, ctx.query);
|
|
160
153
|
} catch ([user, error]) {
|
|
161
154
|
return ctx.badRequest(null, error === 'array' ? error[0] : error);
|
|
162
155
|
}
|
|
@@ -166,11 +159,9 @@ module.exports = {
|
|
|
166
159
|
}
|
|
167
160
|
|
|
168
161
|
ctx.send({
|
|
169
|
-
jwt:
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
|
|
173
|
-
model: strapi.getModel('plugins::users-permissions.user'),
|
|
162
|
+
jwt: getService('jwt').issue({ id: user.id }),
|
|
163
|
+
user: sanitizeEntity(user, {
|
|
164
|
+
model: strapi.getModel('plugin::users-permissions.user'),
|
|
174
165
|
}),
|
|
175
166
|
});
|
|
176
167
|
}
|
|
@@ -186,7 +177,7 @@ module.exports = {
|
|
|
186
177
|
params.code
|
|
187
178
|
) {
|
|
188
179
|
const user = await strapi
|
|
189
|
-
.query('
|
|
180
|
+
.query('plugin::users-permissions.user')
|
|
190
181
|
.findOne({ where: { resetPasswordToken: `${params.code}` } });
|
|
191
182
|
|
|
192
183
|
if (!user) {
|
|
@@ -203,15 +194,13 @@ module.exports = {
|
|
|
203
194
|
|
|
204
195
|
// Update the user.
|
|
205
196
|
await strapi
|
|
206
|
-
.query('
|
|
197
|
+
.query('plugin::users-permissions.user')
|
|
207
198
|
.update({ where: { id: user.id }, data: { resetPasswordToken: null, password } });
|
|
208
199
|
|
|
209
200
|
ctx.send({
|
|
210
|
-
jwt:
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
user: sanitizeEntity(user.toJSON ? user.toJSON() : user, {
|
|
214
|
-
model: strapi.getModel('plugins::users-permissions.user'),
|
|
201
|
+
jwt: getService('jwt').issue({ id: user.id }),
|
|
202
|
+
user: sanitizeEntity(user, {
|
|
203
|
+
model: strapi.getModel('plugin::users-permissions.user'),
|
|
215
204
|
}),
|
|
216
205
|
});
|
|
217
206
|
} else if (
|
|
@@ -238,13 +227,10 @@ module.exports = {
|
|
|
238
227
|
},
|
|
239
228
|
|
|
240
229
|
async connect(ctx, next) {
|
|
230
|
+
const grant = require('grant-koa');
|
|
231
|
+
|
|
241
232
|
const grantConfig = await strapi
|
|
242
|
-
.store({
|
|
243
|
-
environment: '',
|
|
244
|
-
type: 'plugin',
|
|
245
|
-
name: 'users-permissions',
|
|
246
|
-
key: 'grant',
|
|
247
|
-
})
|
|
233
|
+
.store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
|
|
248
234
|
.get();
|
|
249
235
|
|
|
250
236
|
const [requestPath] = ctx.request.url.split('?');
|
|
@@ -262,9 +248,7 @@ module.exports = {
|
|
|
262
248
|
|
|
263
249
|
// Ability to pass OAuth callback dynamically
|
|
264
250
|
grantConfig[provider].callback = _.get(ctx, 'query.callback') || grantConfig[provider].callback;
|
|
265
|
-
grantConfig[provider].redirect_uri =
|
|
266
|
-
'users-permissions'
|
|
267
|
-
].services.providers.buildRedirectUri(provider);
|
|
251
|
+
grantConfig[provider].redirect_uri = getService('providers').buildRedirectUri(provider);
|
|
268
252
|
|
|
269
253
|
return grant(grantConfig)(ctx, next);
|
|
270
254
|
},
|
|
@@ -282,20 +266,16 @@ module.exports = {
|
|
|
282
266
|
null,
|
|
283
267
|
formatError({
|
|
284
268
|
id: 'Auth.form.error.email.format',
|
|
285
|
-
message: 'Please provide valid email address.',
|
|
269
|
+
message: 'Please provide a valid email address.',
|
|
286
270
|
})
|
|
287
271
|
);
|
|
288
272
|
}
|
|
289
273
|
|
|
290
|
-
const pluginStore = await strapi.store({
|
|
291
|
-
environment: '',
|
|
292
|
-
type: 'plugin',
|
|
293
|
-
name: 'users-permissions',
|
|
294
|
-
});
|
|
274
|
+
const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });
|
|
295
275
|
|
|
296
276
|
// Find the user by email.
|
|
297
277
|
const user = await strapi
|
|
298
|
-
.query('
|
|
278
|
+
.query('plugin::users-permissions.user')
|
|
299
279
|
.findOne({ where: { email: email.toLowerCase() } });
|
|
300
280
|
|
|
301
281
|
// User not found.
|
|
@@ -309,6 +289,17 @@ module.exports = {
|
|
|
309
289
|
);
|
|
310
290
|
}
|
|
311
291
|
|
|
292
|
+
// User blocked
|
|
293
|
+
if (user.blocked) {
|
|
294
|
+
return ctx.badRequest(
|
|
295
|
+
null,
|
|
296
|
+
formatError({
|
|
297
|
+
id: 'Auth.form.error.user.blocked',
|
|
298
|
+
message: 'This user is disabled.',
|
|
299
|
+
})
|
|
300
|
+
);
|
|
301
|
+
}
|
|
302
|
+
|
|
312
303
|
// Generate random token.
|
|
313
304
|
const resetPasswordToken = crypto.randomBytes(64).toString('hex');
|
|
314
305
|
|
|
@@ -325,7 +316,7 @@ module.exports = {
|
|
|
325
316
|
});
|
|
326
317
|
|
|
327
318
|
const userInfo = sanitizeEntity(user, {
|
|
328
|
-
model: strapi.getModel('
|
|
319
|
+
model: strapi.getModel('plugin::users-permissions.user'),
|
|
329
320
|
});
|
|
330
321
|
|
|
331
322
|
settings.message = await getService('users-permissions').template(settings.message, {
|
|
@@ -340,35 +331,34 @@ module.exports = {
|
|
|
340
331
|
|
|
341
332
|
try {
|
|
342
333
|
// Send an email to the user.
|
|
343
|
-
await strapi
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
334
|
+
await strapi
|
|
335
|
+
.plugin('email')
|
|
336
|
+
.service('email')
|
|
337
|
+
.send({
|
|
338
|
+
to: user.email,
|
|
339
|
+
from:
|
|
340
|
+
settings.from.email || settings.from.name
|
|
341
|
+
? `${settings.from.name} <${settings.from.email}>`
|
|
342
|
+
: undefined,
|
|
343
|
+
replyTo: settings.response_email,
|
|
344
|
+
subject: settings.object,
|
|
345
|
+
text: settings.message,
|
|
346
|
+
html: settings.message,
|
|
347
|
+
});
|
|
354
348
|
} catch (err) {
|
|
355
349
|
return ctx.badRequest(null, err);
|
|
356
350
|
}
|
|
357
351
|
|
|
358
352
|
// Update the user.
|
|
359
353
|
await strapi
|
|
360
|
-
.query('
|
|
354
|
+
.query('plugin::users-permissions.user')
|
|
361
355
|
.update({ where: { id: user.id }, data: { resetPasswordToken } });
|
|
362
356
|
|
|
363
357
|
ctx.send({ ok: true });
|
|
364
358
|
},
|
|
365
359
|
|
|
366
360
|
async register(ctx) {
|
|
367
|
-
const pluginStore = await strapi.store({
|
|
368
|
-
environment: '',
|
|
369
|
-
type: 'plugin',
|
|
370
|
-
name: 'users-permissions',
|
|
371
|
-
});
|
|
361
|
+
const pluginStore = await strapi.store({ type: 'plugin', name: 'users-permissions' });
|
|
372
362
|
|
|
373
363
|
const settings = await pluginStore.get({
|
|
374
364
|
key: 'advanced',
|
|
@@ -424,7 +414,7 @@ module.exports = {
|
|
|
424
414
|
}
|
|
425
415
|
|
|
426
416
|
const role = await strapi
|
|
427
|
-
.query('
|
|
417
|
+
.query('plugin::users-permissions.role')
|
|
428
418
|
.findOne({ where: { type: settings.default_role } });
|
|
429
419
|
|
|
430
420
|
if (!role) {
|
|
@@ -455,7 +445,7 @@ module.exports = {
|
|
|
455
445
|
params.role = role.id;
|
|
456
446
|
params.password = await getService('user').hashPassword(params);
|
|
457
447
|
|
|
458
|
-
const user = await strapi.query('
|
|
448
|
+
const user = await strapi.query('plugin::users-permissions.user').findOne({
|
|
459
449
|
where: { email: params.email },
|
|
460
450
|
});
|
|
461
451
|
|
|
@@ -484,10 +474,10 @@ module.exports = {
|
|
|
484
474
|
params.confirmed = true;
|
|
485
475
|
}
|
|
486
476
|
|
|
487
|
-
const user = await strapi.query('
|
|
477
|
+
const user = await strapi.query('plugin::users-permissions.user').create({ data: params });
|
|
488
478
|
|
|
489
479
|
const sanitizedUser = sanitizeEntity(user, {
|
|
490
|
-
model: strapi.getModel('
|
|
480
|
+
model: strapi.getModel('plugin::users-permissions.user'),
|
|
491
481
|
});
|
|
492
482
|
|
|
493
483
|
if (settings.email_confirmation) {
|
|
@@ -500,7 +490,7 @@ module.exports = {
|
|
|
500
490
|
return ctx.send({ user: sanitizedUser });
|
|
501
491
|
}
|
|
502
492
|
|
|
503
|
-
const jwt =
|
|
493
|
+
const jwt = getService('jwt').issue(_.pick(user, ['id']));
|
|
504
494
|
|
|
505
495
|
return ctx.send({
|
|
506
496
|
jwt,
|
|
@@ -521,7 +511,8 @@ module.exports = {
|
|
|
521
511
|
async emailConfirmation(ctx, next, returnUser) {
|
|
522
512
|
const { confirmation: confirmationToken } = ctx.query;
|
|
523
513
|
|
|
524
|
-
const
|
|
514
|
+
const userService = getService('user');
|
|
515
|
+
const jwtService = getService('jwt');
|
|
525
516
|
|
|
526
517
|
if (_.isEmpty(confirmationToken)) {
|
|
527
518
|
return ctx.badRequest('token.invalid');
|
|
@@ -539,17 +530,12 @@ module.exports = {
|
|
|
539
530
|
ctx.send({
|
|
540
531
|
jwt: jwtService.issue({ id: user.id }),
|
|
541
532
|
user: sanitizeEntity(user, {
|
|
542
|
-
model: strapi.getModel('
|
|
533
|
+
model: strapi.getModel('plugin::users-permissions.user'),
|
|
543
534
|
}),
|
|
544
535
|
});
|
|
545
536
|
} else {
|
|
546
537
|
const settings = await strapi
|
|
547
|
-
.store({
|
|
548
|
-
environment: '',
|
|
549
|
-
type: 'plugin',
|
|
550
|
-
name: 'users-permissions',
|
|
551
|
-
key: 'advanced',
|
|
552
|
-
})
|
|
538
|
+
.store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
|
|
553
539
|
.get();
|
|
554
540
|
|
|
555
541
|
ctx.redirect(settings.email_confirmation_redirection || '/');
|
|
@@ -571,7 +557,7 @@ module.exports = {
|
|
|
571
557
|
return ctx.badRequest('wrong.email');
|
|
572
558
|
}
|
|
573
559
|
|
|
574
|
-
const user = await strapi.query('
|
|
560
|
+
const user = await strapi.query('plugin::users-permissions.user').findOne({
|
|
575
561
|
where: { email: params.email },
|
|
576
562
|
});
|
|
577
563
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const auth = require('./auth');
|
|
4
|
+
const user = require('./user');
|
|
5
|
+
const role = require('./role');
|
|
6
|
+
const permissions = require('./permissions');
|
|
7
|
+
const settings = require('./settings');
|
|
8
|
+
|
|
9
|
+
module.exports = {
|
|
10
|
+
auth,
|
|
11
|
+
user,
|
|
12
|
+
role,
|
|
13
|
+
permissions,
|
|
14
|
+
settings,
|
|
15
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const _ = require('lodash');
|
|
4
|
+
const { getService } = require('../utils');
|
|
5
|
+
|
|
6
|
+
module.exports = {
|
|
7
|
+
async getPermissions(ctx) {
|
|
8
|
+
const permissions = await getService('users-permissions').getActions();
|
|
9
|
+
|
|
10
|
+
ctx.send({ permissions });
|
|
11
|
+
},
|
|
12
|
+
|
|
13
|
+
async getPolicies(ctx) {
|
|
14
|
+
const policies = _.keys(strapi.plugin('users-permissions').policies);
|
|
15
|
+
|
|
16
|
+
ctx.send({
|
|
17
|
+
policies: _.without(policies, 'permissions'),
|
|
18
|
+
});
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
async getRoutes(ctx) {
|
|
22
|
+
const routes = await getService('users-permissions').getRoutes();
|
|
23
|
+
|
|
24
|
+
ctx.send({ routes });
|
|
25
|
+
},
|
|
26
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const _ = require('lodash');
|
|
4
|
+
const { getService } = require('../utils');
|
|
5
|
+
|
|
6
|
+
module.exports = {
|
|
7
|
+
/**
|
|
8
|
+
* Default action.
|
|
9
|
+
*
|
|
10
|
+
* @return {Object}
|
|
11
|
+
*/
|
|
12
|
+
async createRole(ctx) {
|
|
13
|
+
if (_.isEmpty(ctx.request.body)) {
|
|
14
|
+
return ctx.badRequest('Request body cannot be empty');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
await getService('role').createRole(ctx.request.body);
|
|
18
|
+
|
|
19
|
+
ctx.send({ ok: true });
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
async getRole(ctx) {
|
|
23
|
+
const { id } = ctx.params;
|
|
24
|
+
const { lang } = ctx.query;
|
|
25
|
+
|
|
26
|
+
const plugins = await getService('users-permissions').getPlugins(lang);
|
|
27
|
+
const role = await getService('role').getRole(id, plugins);
|
|
28
|
+
|
|
29
|
+
if (!role) {
|
|
30
|
+
return ctx.notFound();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
ctx.send({ role });
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
async getRoles(ctx) {
|
|
37
|
+
const roles = await getService('role').getRoles();
|
|
38
|
+
|
|
39
|
+
ctx.send({ roles });
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
async updateRole(ctx) {
|
|
43
|
+
const roleID = ctx.params.role;
|
|
44
|
+
|
|
45
|
+
if (_.isEmpty(ctx.request.body)) {
|
|
46
|
+
return ctx.badRequest('Request body cannot be empty');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
await getService('role').updateRole(roleID, ctx.request.body);
|
|
50
|
+
|
|
51
|
+
ctx.send({ ok: true });
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
async deleteRole(ctx) {
|
|
55
|
+
const roleID = ctx.params.role;
|
|
56
|
+
|
|
57
|
+
if (!roleID) {
|
|
58
|
+
return ctx.badRequest();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Fetch public role.
|
|
62
|
+
const publicRole = await strapi
|
|
63
|
+
.query('plugin::users-permissions.role')
|
|
64
|
+
.findOne({ where: { type: 'public' } });
|
|
65
|
+
|
|
66
|
+
const publicRoleID = publicRole.id;
|
|
67
|
+
|
|
68
|
+
// Prevent from removing the public role.
|
|
69
|
+
if (roleID.toString() === publicRoleID.toString()) {
|
|
70
|
+
return ctx.badRequest('Cannot delete public role');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
await getService('role').deleteRole(roleID, publicRoleID);
|
|
74
|
+
|
|
75
|
+
ctx.send({ ok: true });
|
|
76
|
+
},
|
|
77
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const _ = require('lodash');
|
|
4
|
+
const { getService } = require('../utils');
|
|
5
|
+
const { isValidEmailTemplate } = require('./validation/email-template');
|
|
6
|
+
|
|
7
|
+
module.exports = {
|
|
8
|
+
async getEmailTemplate(ctx) {
|
|
9
|
+
ctx.send(await strapi.store({ type: 'plugin', name: 'users-permissions', key: 'email' }).get());
|
|
10
|
+
},
|
|
11
|
+
|
|
12
|
+
async updateEmailTemplate(ctx) {
|
|
13
|
+
if (_.isEmpty(ctx.request.body)) {
|
|
14
|
+
return ctx.badRequest('Request body cannot be empty');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const emailTemplates = ctx.request.body['email-templates'];
|
|
18
|
+
|
|
19
|
+
for (let key in emailTemplates) {
|
|
20
|
+
const template = emailTemplates[key].options.message;
|
|
21
|
+
|
|
22
|
+
if (!isValidEmailTemplate(template)) {
|
|
23
|
+
return ctx.badRequest('Invalid template');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
await strapi
|
|
28
|
+
.store({ type: 'plugin', name: 'users-permissions', key: 'email' })
|
|
29
|
+
.set({ value: emailTemplates });
|
|
30
|
+
|
|
31
|
+
ctx.send({ ok: true });
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
async getAdvancedSettings(ctx) {
|
|
35
|
+
const settings = await strapi
|
|
36
|
+
.store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
|
|
37
|
+
.get();
|
|
38
|
+
|
|
39
|
+
const roles = await getService('role').getRoles();
|
|
40
|
+
|
|
41
|
+
ctx.send({ settings, roles });
|
|
42
|
+
},
|
|
43
|
+
|
|
44
|
+
async updateAdvancedSettings(ctx) {
|
|
45
|
+
if (_.isEmpty(ctx.request.body)) {
|
|
46
|
+
return ctx.badRequest('Request body cannot be empty');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
await strapi
|
|
50
|
+
.store({ type: 'plugin', name: 'users-permissions', key: 'advanced' })
|
|
51
|
+
.set({ value: ctx.request.body });
|
|
52
|
+
|
|
53
|
+
ctx.send({ ok: true });
|
|
54
|
+
},
|
|
55
|
+
|
|
56
|
+
async getProviders(ctx) {
|
|
57
|
+
const providers = await strapi
|
|
58
|
+
.store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
|
|
59
|
+
.get();
|
|
60
|
+
|
|
61
|
+
for (const provider in providers) {
|
|
62
|
+
if (provider !== 'email') {
|
|
63
|
+
providers[provider].redirectUri = strapi
|
|
64
|
+
.plugin('users-permissions')
|
|
65
|
+
.service('providers')
|
|
66
|
+
.buildRedirectUri(provider);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
ctx.send(providers);
|
|
71
|
+
},
|
|
72
|
+
|
|
73
|
+
async updateProviders(ctx) {
|
|
74
|
+
if (_.isEmpty(ctx.request.body)) {
|
|
75
|
+
return ctx.badRequest('Request body cannot be empty');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
await strapi
|
|
79
|
+
.store({ type: 'plugin', name: 'users-permissions', key: 'grant' })
|
|
80
|
+
.set({ value: ctx.request.body.providers });
|
|
81
|
+
|
|
82
|
+
ctx.send({ ok: true });
|
|
83
|
+
},
|
|
84
|
+
};
|