From cde2755b46367fb420b9572104c74ca98b2766fa Mon Sep 17 00:00:00 2001 From: steven-supersolid Date: Mon, 12 Sep 2016 18:23:18 +0100 Subject: [PATCH 1/3] Ensure _acl is updated when _rperm and _wperm updated --- spec/MongoTransform.spec.js | 27 +++++++++++++++++--- src/Adapters/Storage/Mongo/MongoTransform.js | 17 ++++-------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/spec/MongoTransform.spec.js b/spec/MongoTransform.spec.js index f3eba2ffcd..9ae40e1615 100644 --- a/spec/MongoTransform.spec.js +++ b/spec/MongoTransform.spec.js @@ -221,7 +221,7 @@ describe('parseObjectToMongoObjectForCreate', () => { done(); }); - it('writes the old ACL format in addition to rperm and wperm', (done) => { + it('writes the old ACL format in addition to rperm and wperm on create', (done) => { var input = { _rperm: ['*'], _wperm: ['Kevin'], @@ -229,10 +229,29 @@ describe('parseObjectToMongoObjectForCreate', () => { var output = transform.parseObjectToMongoObjectForCreate(null, input, { fields: {} }); expect(typeof output._acl).toEqual('object'); - expect(output._acl["Kevin"].w).toBeTruthy(); - expect(output._acl["Kevin"].r).toBeUndefined(); + expect(output._acl['Kevin'].w).toBeTruthy(); + expect(output._acl['Kevin'].r).toBeUndefined(); + expect(output._rperm).toEqual(input._rperm); + expect(output._wperm).toEqual(input._wperm); done(); - }) + }); + + it('writes the old ACL format in addition to rperm and wperm on update', (done) => { + var input = { + _rperm: ['*'], + _wperm: ['Kevin'] + }; + + var output = transform.transformUpdate(null, input, { fields: {} }); + var set = output.$set; + expect(typeof set).toEqual('object'); + expect(typeof set._acl).toEqual('object'); + expect(set._acl['Kevin'].w).toBeTruthy(); + expect(set._acl['Kevin'].r).toBeUndefined(); + expect(set._rperm).toEqual(input._rperm); + expect(set._wperm).toEqual(input._wperm); + done(); + }); it('untransforms from _rperm and _wperm to ACL', (done) => { var input = { diff --git a/src/Adapters/Storage/Mongo/MongoTransform.js b/src/Adapters/Storage/Mongo/MongoTransform.js index d200276b0e..5671e1ee40 100644 --- a/src/Adapters/Storage/Mongo/MongoTransform.js +++ b/src/Adapters/Storage/Mongo/MongoTransform.js @@ -330,18 +330,11 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => { // Main exposed method to help update old objects. const transformUpdate = (className, restUpdate, parseFormatSchema) => { let mongoUpdate = {}; - let acl = addLegacyACL(restUpdate)._acl; - if (acl) { - mongoUpdate.$set = {}; - if (acl._rperm) { - mongoUpdate.$set._rperm = acl._rperm; - } - if (acl._wperm) { - mongoUpdate.$set._wperm = acl._wperm; - } - if (acl._acl) { - mongoUpdate.$set._acl = acl._acl; - } + let legacyACL = addLegacyACL(restUpdate)._acl; + if (legacyACL) { + mongoUpdate.$set = { + _acl: legacyACL + }; } for (var restKey in restUpdate) { var out = transformKeyValueForUpdate(className, restKey, restUpdate[restKey], parseFormatSchema); From cde907f81d8443791a8fd99ced6dfe9826d3dc42 Mon Sep 17 00:00:00 2001 From: steven-supersolid Date: Mon, 12 Sep 2016 18:52:06 +0100 Subject: [PATCH 2/3] alternative solution --- src/Adapters/Storage/Mongo/MongoTransform.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/Adapters/Storage/Mongo/MongoTransform.js b/src/Adapters/Storage/Mongo/MongoTransform.js index 5671e1ee40..c112e9c35f 100644 --- a/src/Adapters/Storage/Mongo/MongoTransform.js +++ b/src/Adapters/Storage/Mongo/MongoTransform.js @@ -330,11 +330,18 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => { // Main exposed method to help update old objects. const transformUpdate = (className, restUpdate, parseFormatSchema) => { let mongoUpdate = {}; - let legacyACL = addLegacyACL(restUpdate)._acl; - if (legacyACL) { - mongoUpdate.$set = { - _acl: legacyACL - }; + let acl = addLegacyACL(restUpdate); + if (acl) { + mongoUpdate.$set = {}; + if (acl._rperm) { + mongoUpdate.$set._rperm = acl._rperm; + } + if (acl._wperm) { + mongoUpdate.$set._wperm = acl._wperm; + } + if (acl._acl) { + mongoUpdate.$set._acl = acl._acl; + } } for (var restKey in restUpdate) { var out = transformKeyValueForUpdate(className, restKey, restUpdate[restKey], parseFormatSchema); From b1f9882e358e5777c8aa840fd0bf42a591d60d0b Mon Sep 17 00:00:00 2001 From: steven-supersolid Date: Tue, 13 Sep 2016 10:29:14 +0100 Subject: [PATCH 3/3] Only try to apply $set for permission updates --- src/Adapters/Storage/Mongo/MongoTransform.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Adapters/Storage/Mongo/MongoTransform.js b/src/Adapters/Storage/Mongo/MongoTransform.js index c112e9c35f..5f043252ed 100644 --- a/src/Adapters/Storage/Mongo/MongoTransform.js +++ b/src/Adapters/Storage/Mongo/MongoTransform.js @@ -331,7 +331,7 @@ const parseObjectToMongoObjectForCreate = (className, restCreate, schema) => { const transformUpdate = (className, restUpdate, parseFormatSchema) => { let mongoUpdate = {}; let acl = addLegacyACL(restUpdate); - if (acl) { + if (acl._rperm || acl._wperm || acl._acl) { mongoUpdate.$set = {}; if (acl._rperm) { mongoUpdate.$set._rperm = acl._rperm;