73 lines
1.9 KiB
JavaScript
Raw Normal View History

2018-08-08 17:57:02 +02:00
const _ = require('lodash');
module.exports = async (ctx, next) => {
let role;
if (ctx.request && ctx.request.header && ctx.request.header.authorization) {
try {
2018-01-18 11:13:44 +01:00
const { _id, id } = await strapi.plugins['users-permissions'].services.jwt.getToken(ctx);
if ((id || _id) === undefined) {
throw new Error('Invalid token: Token did not contain required fields');
}
2017-12-14 16:12:39 +01:00
ctx.state.user = await strapi.query('user', 'users-permissions').findOne({ _id, id });
} catch (err) {
2017-11-27 16:59:53 +01:00
return ctx.unauthorized(err);
}
if (!ctx.state.user) {
return ctx.unauthorized(`User Not Found.`);
}
role = ctx.state.user.role;
if (role.type === 'root') {
return await next();
}
2018-08-08 17:57:02 +02:00
const store = await strapi.store({
environment: '',
type: 'plugin',
name: 'users-permissions'
});
if (_.get(await store.get({key: 'advanced'}), 'email_confirmation') && ctx.state.user.confirmed !== true) {
return ctx.unauthorized('Your account email is not confirmed.');
}
2018-08-06 17:46:58 +02:00
if (ctx.state.user.blocked === true) {
return ctx.unauthorized(`Your account has been blocked by the administrator.`);
}
}
2018-03-12 16:37:20 +01:00
// Retrieve `public` role.
if (!role) {
2018-03-12 16:37:20 +01:00
role = await strapi.query('role', 'users-permissions').findOne({ type: 'public' }, []);
}
const route = ctx.request.route;
const permission = await strapi.query('permission', 'users-permissions').findOne({
role: role._id || role.id,
type: route.plugin || 'application',
controller: route.controller,
action: route.action,
enabled: true
}, []);
if (!permission) {
2018-05-24 17:20:32 +02:00
if (ctx.request.graphql === null) {
return ctx.request.graphql = strapi.errors.forbidden();
}
2018-08-06 16:59:14 +02:00
return ctx.forbidden();
}
// Execute the policies.
if (permission.policy) {
return await strapi.plugins['users-permissions'].config.policies[permission.policy](ctx, next);
}
// Execute the action.
await next();
};