tuxuuman d3a0b225a6
Update packages/plugins/users-permissions/server/strategies/users-permissions.js
Co-authored-by: Alexandre BODIN <alexandrebodin@users.noreply.github.com>
2022-02-11 15:32:14 +05:00

103 lines
2.4 KiB
JavaScript

'use strict';
const { castArray, map } = require('lodash/fp');
const { ForbiddenError, UnauthorizedError } = require('@strapi/utils').errors;
const { getService } = require('../utils');
const getAdvancedSettings = () => {
return strapi.store({ type: 'plugin', name: 'users-permissions' }).get({ key: 'advanced' });
};
const authenticate = async ctx => {
try {
const token = await getService('jwt').getToken(ctx);
if (token) {
const { id } = token;
if (id === undefined) {
return { authenticated: false };
}
// fetch authenticated user
const user = await getService('user').fetchAuthenticatedUser(id);
if (!user) {
return { error: 'Invalid credentials' };
}
const advancedSettings = await getAdvancedSettings();
if (advancedSettings.email_confirmation && !user.confirmed) {
return { error: 'Invalid credentials' };
}
if (user.blocked) {
return { error: 'Invalid credentials' };
}
ctx.state.user = user;
return {
authenticated: true,
credentials: user,
};
}
const publicPermissions = await strapi.query('plugin::users-permissions.permission').findMany({
where: {
role: { type: 'public' },
},
});
if (publicPermissions.length === 0) {
return { authenticated: false };
}
return {
authenticated: true,
credentials: null,
};
} catch (err) {
return { authenticated: false };
}
};
const verify = async (auth, config) => {
const { credentials: user } = auth;
if (!config.scope) {
if (!user) {
// A non authenticated user cannot access routes that do not have a scope
throw new UnauthorizedError();
} else {
// An authenticated user can access non scoped routes
return;
}
}
let allowedActions = auth.allowedActions;
if (!allowedActions) {
const permissions = await strapi.query('plugin::users-permissions.permission').findMany({
where: { role: user ? user.role.id : { type: 'public' } },
});
allowedActions = map('action', permissions);
auth.allowedActions = allowedActions;
}
const isAllowed = castArray(config.scope).every(scope => allowedActions.includes(scope));
if (!isAllowed) {
throw new ForbiddenError();
}
};
module.exports = {
name: 'users-permissions',
authenticate,
verify,
};