2020-01-23 16:59:50 +01:00
|
|
|
/**
|
|
|
|
* Policies util
|
|
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
|
2018-03-30 17:05:24 +02:00
|
|
|
const _ = require('lodash');
|
2020-01-23 16:59:50 +01:00
|
|
|
|
|
|
|
const get = (policy, plugin, apiName) => {
|
|
|
|
if (globalPolicyExists(policy)) {
|
|
|
|
return parsePolicy(getGlobalPolicy(policy));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pluginPolicyExists(policy)) {
|
|
|
|
return parsePolicy(getPluginPolicy(policy));
|
|
|
|
}
|
|
|
|
|
|
|
|
const pluginPolicy = `${PLUGIN_PREFIX}${plugin}.${policy}`;
|
|
|
|
|
|
|
|
if (!isGlobal(policy) && plugin && pluginPolicyExists(pluginPolicy)) {
|
|
|
|
return parsePolicy(getPluginPolicy(pluginPolicy));
|
|
|
|
}
|
|
|
|
|
|
|
|
const api = _.get(strapi.api, apiName);
|
|
|
|
if (!isGlobal(policy) && api && policyExistsIn(api, policy)) {
|
|
|
|
return parsePolicy(getPolicyIn(api, policy));
|
|
|
|
}
|
|
|
|
|
|
|
|
throw new Error(`Could not find policy "${policy}"`);
|
|
|
|
};
|
|
|
|
|
|
|
|
const globalPolicy = ({ method, endpoint, controller, action, plugin }) => {
|
|
|
|
return async (ctx, next) => {
|
|
|
|
ctx.request.route = {
|
|
|
|
endpoint: `${method} ${endpoint}`,
|
|
|
|
controller: _.toLower(controller),
|
|
|
|
action: _.toLower(action),
|
|
|
|
splittedEndpoint: endpoint,
|
|
|
|
verb: _.toLower(method),
|
|
|
|
plugin,
|
2018-04-10 11:47:01 +02:00
|
|
|
};
|
2020-01-23 16:59:50 +01:00
|
|
|
|
|
|
|
await next();
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
const parsePolicy = policy => {
|
|
|
|
if (_.isFunction(policy)) {
|
|
|
|
return policy;
|
|
|
|
}
|
|
|
|
|
|
|
|
return policy.handler;
|
|
|
|
};
|
|
|
|
|
|
|
|
const GLOBAL_PREFIX = 'global.';
|
|
|
|
const PLUGIN_PREFIX = 'plugins.';
|
|
|
|
|
|
|
|
const getPolicyIn = (container, policy) => {
|
|
|
|
return _.get(container, ['config', 'policies', policy.toLowerCase()]);
|
|
|
|
};
|
|
|
|
|
|
|
|
const policyExistsIn = (container, policy) => {
|
|
|
|
return !_.isUndefined(getPolicyIn(container, policy));
|
|
|
|
};
|
|
|
|
|
|
|
|
const isGlobal = policy => _.startsWith(policy, GLOBAL_PREFIX);
|
|
|
|
|
|
|
|
const getGlobalPolicy = policy => {
|
|
|
|
const strippedPolicy = policy.replace(GLOBAL_PREFIX, '');
|
|
|
|
return getPolicyIn(strapi, strippedPolicy);
|
|
|
|
};
|
|
|
|
|
|
|
|
const globalPolicyExists = policy => {
|
|
|
|
return isGlobal(policy) && !_.isUndefined(getGlobalPolicy(policy));
|
|
|
|
};
|
|
|
|
|
|
|
|
const getPluginPolicy = policy => {
|
|
|
|
const [, plugin = '', policyName = ''] = policy.split('.');
|
|
|
|
return getPolicyIn(_.get(strapi, ['plugins', plugin]), policyName);
|
|
|
|
};
|
|
|
|
|
|
|
|
const pluginPolicyExists = policy => {
|
|
|
|
return isPluginPolicy(policy) && !_.isUndefined(getPluginPolicy(policy));
|
|
|
|
};
|
|
|
|
|
|
|
|
const isPluginPolicy = policy => _.startsWith(policy, PLUGIN_PREFIX);
|
|
|
|
|
|
|
|
module.exports = {
|
|
|
|
get,
|
|
|
|
globalPolicy,
|
2018-03-30 17:05:24 +02:00
|
|
|
};
|