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',
});
expect(pm.query).toStrictEqual({});
expect(pm.getQuery()).toStrictEqual({});
});
test('It should returns a valid query from the ability', () => {
@ -27,7 +27,17 @@ describe('Permissions Manager', () => {
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,
model,
get query() {
return buildStrapiQuery(buildCaslQuery(ability, action, model));
},
get isAllowed() {
return this.ability.can(action, model);
},
@ -30,10 +26,19 @@ module.exports = ({ ability, action, model }) => ({
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 {
...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 permissionQuery = permissionChecker.buildPermissionQuery(query);
const permissionQuery = permissionChecker.buildReadQuery(query);
const { results, pagination } = await entityManager[method](permissionQuery, model);
@ -214,7 +214,7 @@ module.exports = {
return ctx.forbidden();
}
const permissionQuery = permissionChecker.buildPermissionQuery(query);
const permissionQuery = permissionChecker.buildDeleteQuery(query);
const idsWhereClause = { [`id_in`]: ids };
const params = {

View File

@ -43,7 +43,10 @@ const createPermissionChecker = ({ userAbility, model }) => {
const sanitizeCreateInput = data => sanitizeInput(ACTIONS.create, data);
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 => {
can[action] = (...args) => can(ACTIONS[action], ...args);
@ -56,7 +59,8 @@ const createPermissionChecker = ({ userAbility, model }) => {
sanitizeOutput,
sanitizeCreateInput,
sanitizeUpdateInput,
buildPermissionQuery,
buildReadQuery,
buildDeleteQuery,
};
};