Check composite keys containing hidden props
This commit is contained in:
parent
8fa7c94605
commit
dbe25f282d
15
lib/utils.js
15
lib/utils.js
|
@ -302,6 +302,19 @@ function selectFields(fields) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isProhibited(key, prohibitedKeys) {
|
||||||
|
if (!prohibitedKeys || !prohibitedKeys.length) return false;
|
||||||
|
if (typeof key !== 'string') {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (var k of prohibitedKeys) {
|
||||||
|
if (k === key) return true;
|
||||||
|
// x.secret, secret.y, or x.secret.y
|
||||||
|
if (key.split('.').indexOf(k) !== -1) return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sanitize the query object
|
* Sanitize the query object
|
||||||
* @param query {object} The query object
|
* @param query {object} The query object
|
||||||
|
@ -341,7 +354,7 @@ function sanitizeQuery(query, options) {
|
||||||
* Make sure prohibited keys are removed from the query to prevent
|
* Make sure prohibited keys are removed from the query to prevent
|
||||||
* sensitive values from being guessed
|
* sensitive values from being guessed
|
||||||
*/
|
*/
|
||||||
if (prohibitedKeys && prohibitedKeys.indexOf(this.key) !== -1) {
|
if (isProhibited(this.key, prohibitedKeys)) {
|
||||||
offendingKeys.push(this.key);
|
offendingKeys.push(this.key);
|
||||||
this.remove();
|
this.remove();
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -394,7 +394,6 @@ describe('DataSource define model', function() {
|
||||||
|
|
||||||
User.create({name: 'Jeff'}, function(err, data) {
|
User.create({name: 'Jeff'}, function(err, data) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.log(err);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var post = data.posts.build({title: 'My Post'});
|
var post = data.posts.build({title: 'My Post'});
|
||||||
|
|
|
@ -395,7 +395,10 @@ describe('ModelDefinition class', function() {
|
||||||
*/
|
*/
|
||||||
function givenChildren(hiddenProps) {
|
function givenChildren(hiddenProps) {
|
||||||
hiddenProps = hiddenProps || {hidden: ['secret']};
|
hiddenProps = hiddenProps || {hidden: ['secret']};
|
||||||
Child = memory.createModel('child', {}, hiddenProps);
|
Child = memory.createModel('child', {
|
||||||
|
name: String,
|
||||||
|
secret: String,
|
||||||
|
}, hiddenProps);
|
||||||
return Child.create([{
|
return Child.create([{
|
||||||
name: 'childA',
|
name: 'childA',
|
||||||
secret: 'secret',
|
secret: 'secret',
|
||||||
|
@ -412,6 +415,64 @@ describe('ModelDefinition class', function() {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('hidden nested properties', function() {
|
||||||
|
var Child;
|
||||||
|
beforeEach(givenChildren);
|
||||||
|
|
||||||
|
it('should be removed if used in where as a composite key - x.secret', function() {
|
||||||
|
return Child.find({
|
||||||
|
where: {'x.secret': 'guess'},
|
||||||
|
}).then(assertHiddenPropertyIsIgnored);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be removed if used in where as a composite key - secret.y', function() {
|
||||||
|
return Child.find({
|
||||||
|
where: {'secret.y': 'guess'},
|
||||||
|
}).then(assertHiddenPropertyIsIgnored);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should be removed if used in where as a composite key - a.secret.b', function() {
|
||||||
|
return Child.find({
|
||||||
|
where: {'a.secret.b': 'guess'},
|
||||||
|
}).then(assertHiddenPropertyIsIgnored);
|
||||||
|
});
|
||||||
|
|
||||||
|
function givenChildren() {
|
||||||
|
var hiddenProps = {hidden: ['secret']};
|
||||||
|
Child = memory.createModel('child', {
|
||||||
|
name: String,
|
||||||
|
x: {
|
||||||
|
secret: String,
|
||||||
|
},
|
||||||
|
secret: {
|
||||||
|
y: String,
|
||||||
|
},
|
||||||
|
a: {
|
||||||
|
secret: {
|
||||||
|
b: String,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}, hiddenProps);
|
||||||
|
return Child.create([{
|
||||||
|
name: 'childA',
|
||||||
|
x: {secret: 'secret'},
|
||||||
|
secret: {y: 'secret'},
|
||||||
|
a: {secret: {b: 'secret'}},
|
||||||
|
}, {
|
||||||
|
name: 'childB',
|
||||||
|
x: {secret: 'guess'},
|
||||||
|
secret: {y: 'guess'},
|
||||||
|
a: {secret: {b: 'guess'}},
|
||||||
|
}]);
|
||||||
|
}
|
||||||
|
|
||||||
|
function assertHiddenPropertyIsIgnored(children) {
|
||||||
|
// All children are found whether the `secret` condition matches or not
|
||||||
|
// as the condition is removed because it's hidden
|
||||||
|
children.length.should.equal(2);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
function assertParentIncludeChildren(parents) {
|
function assertParentIncludeChildren(parents) {
|
||||||
parents[0].toJSON().children.length.should.equal(1);
|
parents[0].toJSON().children.length.should.equal(1);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue