Skip to content

Commit 53c4328

Browse files
datastore: prevent manipulating user input during save
1 parent 1716bae commit 53c4328

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

lib/datastore/request.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,9 @@ DatastoreRequest.prototype.save = function(entities, callback) {
390390

391391
if (Array.isArray(entityObject.data)) {
392392
ent.property = entityObject.data.map(function(data) {
393-
data.value = entity.valueToProperty(data.value);
393+
data = extend(true, {}, data, {
394+
value: entity.valueToProperty(data.value)
395+
});
394396

395397
if (is.boolean(data.excludeFromIndexes)) {
396398
var indexed = !data.excludeFromIndexes;

test/datastore/request.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,29 @@ describe('Request', function() {
455455
], done);
456456
});
457457

458+
it('should not alter the provided data object', function(done) {
459+
var data = [
460+
{
461+
name: 'test-name',
462+
value: {
463+
a: 'b',
464+
c: [1, 2, 3]
465+
},
466+
indexed: false
467+
}
468+
];
469+
var expectedData = extend(true, {}, data);
470+
471+
request.makeReq_ = function(method, req) {
472+
// By the time the request is made, the original object has already been
473+
// transformed into a raw request.
474+
assert.deepEqual(data, expectedData);
475+
done();
476+
};
477+
478+
request.save({ key: key, data: data }, assert.ifError);
479+
});
480+
458481
it('should return apiResponse in callback', function(done) {
459482
var key = new entity.Key({ namespace: 'ns', path: ['Company'] });
460483
var mockCommitResponse = {

0 commit comments

Comments
 (0)