Fix is-creator condition not applied on find (#9213)

* Fix is-creator condition not applied on find

* Add test
This commit is contained in:
Alexandre BODIN 2021-01-26 10:18:43 +01:00 committed by GitHub
parent 3f1fa39ccb
commit 54af039f17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 12 deletions

View File

@ -14,7 +14,7 @@ describe('Permissions Manager', () => {
model: 'foo', model: 'foo',
}); });
expect(pm.query).toStrictEqual({}); expect(pm.getQuery()).toStrictEqual({});
}); });
test('It should returns a valid query from the ability', () => { test('It should returns a valid query from the ability', () => {
@ -27,7 +27,17 @@ describe('Permissions Manager', () => {
const expected = { _or: [{ kai: 'doe' }] }; const expected = { _or: [{ kai: 'doe' }] };
expect(pm.query).toStrictEqual(expected); expect(pm.getQuery()).toStrictEqual(expected);
});
test('It should throw if no action is defined', () => {
const ability = defineAbility(can => can('read', 'foo', ['bar'], { kai: 'doe' }));
const pm = createPermissionsManager({
ability,
model: 'foo',
});
expect(() => pm.getQuery()).toThrowError();
}); });
}); });

View File

@ -14,10 +14,6 @@ module.exports = ({ ability, action, model }) => ({
action, action,
model, model,
get query() {
return buildStrapiQuery(buildCaslQuery(ability, action, model));
},
get isAllowed() { get isAllowed() {
return this.ability.can(action, model); return this.ability.can(action, model);
}, },
@ -30,10 +26,19 @@ module.exports = ({ ability, action, model }) => ({
return this.sanitize(data, { ...options, isOutput: false }); return this.sanitize(data, { ...options, isOutput: false });
}, },
queryFrom(query) { getQuery(queryAction = action) {
if (_.isUndefined(queryAction)) {
throw new Error('Action must be defined to build a permission query');
}
return buildStrapiQuery(buildCaslQuery(ability, queryAction, model));
},
queryFrom(query = {}, action) {
const permissionQuery = this.getQuery(action);
return { return {
...query, ...query,
_where: query._where ? _.concat(this.query, query._where) : [this.query], _where: query._where ? _.concat(permissionQuery, query._where) : [permissionQuery],
}; };
}, },

View File

@ -26,7 +26,7 @@ module.exports = {
const method = has('_q', query) ? 'searchWithRelationCounts' : 'findWithRelationCounts'; const method = has('_q', query) ? 'searchWithRelationCounts' : 'findWithRelationCounts';
const permissionQuery = permissionChecker.buildPermissionQuery(query); const permissionQuery = permissionChecker.buildReadQuery(query);
const { results, pagination } = await entityManager[method](permissionQuery, model); const { results, pagination } = await entityManager[method](permissionQuery, model);
@ -214,7 +214,7 @@ module.exports = {
return ctx.forbidden(); return ctx.forbidden();
} }
const permissionQuery = permissionChecker.buildPermissionQuery(query); const permissionQuery = permissionChecker.buildDeleteQuery(query);
const idsWhereClause = { [`id_in`]: ids }; const idsWhereClause = { [`id_in`]: ids };
const params = { const params = {

View File

@ -43,7 +43,10 @@ const createPermissionChecker = ({ userAbility, model }) => {
const sanitizeCreateInput = data => sanitizeInput(ACTIONS.create, data); const sanitizeCreateInput = data => sanitizeInput(ACTIONS.create, data);
const sanitizeUpdateInput = entity => data => sanitizeInput(ACTIONS.update, data, entity); const sanitizeUpdateInput = entity => data => sanitizeInput(ACTIONS.update, data, entity);
const buildPermissionQuery = query => permissionsManager.queryFrom(query); const buildPermissionQuery = (query, action) => permissionsManager.queryFrom(query, action);
const buildReadQuery = query => buildPermissionQuery(query, ACTIONS.read);
const buildDeleteQuery = query => buildPermissionQuery(query, ACTIONS.delete);
Object.keys(ACTIONS).forEach(action => { Object.keys(ACTIONS).forEach(action => {
can[action] = (...args) => can(ACTIONS[action], ...args); can[action] = (...args) => can(ACTIONS[action], ...args);
@ -56,7 +59,8 @@ const createPermissionChecker = ({ userAbility, model }) => {
sanitizeOutput, sanitizeOutput,
sanitizeCreateInput, sanitizeCreateInput,
sanitizeUpdateInput, sanitizeUpdateInput,
buildPermissionQuery, buildReadQuery,
buildDeleteQuery,
}; };
}; };