mirror of
https://github.com/strapi/strapi.git
synced 2025-11-09 14:51:29 +00:00
Fix is-creator condition not applied on find (#9213)
* Fix is-creator condition not applied on find * Add test
This commit is contained in:
parent
3f1fa39ccb
commit
54af039f17
@ -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();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@ -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],
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -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 = {
|
||||||
|
|||||||
@ -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,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user