Merge pull request from GHSA-xqp8-w826-hh6x
* Added a test case that triggers the query parameter crash * rest.js: validate the explain parameter to keep the nodejs driver from throwing an uncatchable exception and crashing the server (see https://jira.mongodb.org/browse/NODE-3463) RestQuery.js: Check whether explain mode is enabled not by "!== true", but by the "!" operator. explain can have string values. Added tests that validate correct behaviour on different explain values * Refactor the new tests * Simplify the new tests Also do a sanity check on the explain results * Test refactor * Exclude queryPlannerExtended as it is not supported by the testing environment Simplifies the tests * Restrict the changes to mongodb Moved the verification of the explain value from rest.js to MongoStorageAdapter.js Also restricted the relevant unit tests to mongodb * Added changelog entry * reformat changelog entry * Update CHANGELOG.md Co-authored-by: Kartal Kaan Bozdoğan <kartalkaanbozdogan@gmail.com> Co-authored-by: Manuel <5673677+mtrezza@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
1e0d408ca3
commit
308668c894
@@ -108,6 +108,23 @@ const mongoSchemaFromFieldsAndClassNameAndCLP = (
|
||||
return mongoObject;
|
||||
};
|
||||
|
||||
function validateExplainValue(explain) {
|
||||
if (explain) {
|
||||
// The list of allowed explain values is from node-mongodb-native/lib/explain.js
|
||||
const explainAllowedValues = [
|
||||
'queryPlanner',
|
||||
'queryPlannerExtended',
|
||||
'executionStats',
|
||||
'allPlansExecution',
|
||||
false,
|
||||
true,
|
||||
];
|
||||
if (!explainAllowedValues.includes(explain)) {
|
||||
throw new Parse.Error(Parse.Error.INVALID_QUERY, 'Invalid value for explain');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class MongoStorageAdapter implements StorageAdapter {
|
||||
// Private
|
||||
_uri: string;
|
||||
@@ -578,6 +595,7 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
query: QueryType,
|
||||
{ skip, limit, sort, keys, readPreference, hint, caseInsensitive, explain }: QueryOptions
|
||||
): Promise<any> {
|
||||
validateExplainValue(explain);
|
||||
schema = convertParseSchemaToMongoSchema(schema);
|
||||
const mongoWhere = transformWhere(className, query, schema);
|
||||
const mongoSort = _.mapKeys(sort, (value, fieldName) =>
|
||||
@@ -756,6 +774,7 @@ export class MongoStorageAdapter implements StorageAdapter {
|
||||
hint: ?mixed,
|
||||
explain?: boolean
|
||||
) {
|
||||
validateExplainValue(explain);
|
||||
let isPointerField = false;
|
||||
pipeline = pipeline.map(stage => {
|
||||
if (stage.$group) {
|
||||
|
||||
Reference in New Issue
Block a user