console: handle nested fragments in allowed queries (close #5137) (#5252)

This commit is contained in:
Anuj Shah 2020-07-31 15:47:52 +05:30 committed by GitHub
parent 116d04f7fe
commit 65e568e6dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 8 deletions

View File

@ -10,6 +10,7 @@
- server: support only a bounded plan cache, with a default size of 4000 (closes #5363)
- server: add logs for action handlers
- server: add request/response sizes in event triggers (and scheduled trigger) logs
- console: handle nested fragments in allowed queries (close #5137) (#5252)
- console: update sidebar icons for different action and trigger types (#5445)
- console: make add column UX consistent with others (#5486)

View File

@ -14,22 +14,25 @@ export const readFile = (file, callback) => {
reader.readAsText(file);
};
const getQueryFragments = queryDef => {
const fragments = [];
function recurQueryDef(queryDef, fragments, definitionHash) {
visit(queryDef, {
FragmentSpread(node) {
fragments.push(node.name.value);
fragments.add(node.name.value);
recurQueryDef(definitionHash[node.name.value], fragments, definitionHash);
},
});
}
return fragments;
const getQueryFragments = (queryDef, definitionHash = {}) => {
const fragments = new Set();
recurQueryDef(queryDef, fragments, definitionHash);
return [...fragments];
};
const getQueryString = (queryDef, fragmentDefs) => {
const getQueryString = (queryDef, fragmentDefs, definitionHash = {}) => {
let queryString = print(queryDef);
const queryFragments = getQueryFragments(queryDef);
const queryFragments = getQueryFragments(queryDef, definitionHash);
queryFragments.forEach(qf => {
const fragmentDef = fragmentDefs.find(fd => fd.name.value === qf);
@ -53,6 +56,14 @@ export const parseQueryString = queryString => {
throw new Error('Parsing operation failed');
}
const definitionHash = (parsedQueryString.definitions || []).reduce(
(defObj, queryObj) => {
defObj[queryObj.name.value] = queryObj;
return defObj;
},
{}
);
const queryDefs = parsedQueryString.definitions.filter(
def => def.kind === 'OperationDefinition'
);
@ -68,7 +79,7 @@ export const parseQueryString = queryString => {
const query = {
name: queryDef.name.value,
query: getQueryString(queryDef, fragmentDefs),
query: getQueryString(queryDef, fragmentDefs, definitionHash),
};
queries.push(query);