mirror of
https://github.com/strapi/strapi.git
synced 2025-11-14 01:02:04 +00:00
fix: sanitize relation read query
This commit is contained in:
parent
37dd1e3ff2
commit
e686e96112
@ -1,4 +1,4 @@
|
|||||||
import { prop, isEmpty, uniq, flow } from 'lodash/fp';
|
import { prop, isEmpty, uniq, flow, concat, uniqBy } from 'lodash/fp';
|
||||||
import { isOperatorOfType, contentTypes, relations } from '@strapi/utils';
|
import { isOperatorOfType, contentTypes, relations } from '@strapi/utils';
|
||||||
import { getService } from '../utils';
|
import { getService } from '../utils';
|
||||||
import { validateFindAvailable, validateFindExisting } from './validation/relations';
|
import { validateFindAvailable, validateFindExisting } from './validation/relations';
|
||||||
@ -133,14 +133,20 @@ export default {
|
|||||||
filters: {}, // cannot filter for RBAC reasons
|
filters: {}, // cannot filter for RBAC reasons
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const permissionChecker = getService('permission-checker').create({
|
||||||
|
userAbility,
|
||||||
|
model: targetedModel.uid,
|
||||||
|
});
|
||||||
|
const permissionQuery = await permissionChecker.sanitizedQuery.read(queryParams);
|
||||||
|
|
||||||
if (!isEmpty(idsToOmit)) {
|
if (!isEmpty(idsToOmit)) {
|
||||||
addFiltersClause(queryParams, { id: { $notIn: idsToOmit } });
|
addFiltersClause(permissionQuery, { id: { $notIn: idsToOmit } });
|
||||||
}
|
}
|
||||||
|
|
||||||
// searching should be allowed only on mainField for permission reasons
|
// searching should be allowed only on mainField for permission reasons
|
||||||
if (_q) {
|
if (_q) {
|
||||||
const _filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';
|
const _filter = isOperatorOfType('where', query._filter) ? query._filter : '$containsi';
|
||||||
addFiltersClause(queryParams, { [mainField]: { [_filter]: _q } });
|
addFiltersClause(permissionQuery, { [mainField]: { [_filter]: _q } });
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entityId) {
|
if (entityId) {
|
||||||
@ -163,10 +169,10 @@ export default {
|
|||||||
.select(`${alias}.id`)
|
.select(`${alias}.id`)
|
||||||
.getKnexQuery();
|
.getKnexQuery();
|
||||||
|
|
||||||
addFiltersClause(queryParams, { id: { $notIn: knexSubQuery } });
|
addFiltersClause(permissionQuery, { id: { $notIn: knexSubQuery } });
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.body = await strapi.entityService.findPage(targetedModel.uid, queryParams);
|
ctx.body = await strapi.entityService.findPage(targetedModel.uid, permissionQuery);
|
||||||
},
|
},
|
||||||
|
|
||||||
async findExisting(ctx: any) {
|
async findExisting(ctx: any) {
|
||||||
@ -242,13 +248,32 @@ export default {
|
|||||||
fields: fieldsToSelect,
|
fields: fieldsToSelect,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const permissionChecker = getService('permission-checker').create({
|
||||||
|
userAbility,
|
||||||
|
model: targetedModel.uid,
|
||||||
|
});
|
||||||
|
const permissionQuery = await permissionChecker.sanitizedQuery.read(queryParams);
|
||||||
|
|
||||||
if (isAnyToMany(attribute)) {
|
if (isAnyToMany(attribute)) {
|
||||||
|
const resWithIds = await strapi.entityService.loadPages(
|
||||||
|
model,
|
||||||
|
{ id },
|
||||||
|
targetField,
|
||||||
|
{
|
||||||
|
fields: ['id'],
|
||||||
|
} as any,
|
||||||
|
{
|
||||||
|
page: ctx.request.query.page,
|
||||||
|
pageSize: ctx.request.query.pageSize,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
const res = await strapi.entityService.loadPages(
|
const res = await strapi.entityService.loadPages(
|
||||||
model,
|
model,
|
||||||
{ id },
|
{ id },
|
||||||
targetField,
|
targetField,
|
||||||
{
|
{
|
||||||
...queryParams,
|
...permissionQuery,
|
||||||
ordering: 'desc',
|
ordering: 'desc',
|
||||||
} as any,
|
} as any,
|
||||||
{
|
{
|
||||||
@ -257,6 +282,7 @@ export default {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
res.results = uniqBy('id', concat(res.results, resWithIds.results));
|
||||||
ctx.body = res;
|
ctx.body = res;
|
||||||
} else {
|
} else {
|
||||||
const result = await strapi.entityService.load(model, { id }, targetField, queryParams);
|
const result = await strapi.entityService.load(model, { id }, targetField, queryParams);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user