mirror of
https://github.com/parse-community/parse-server
synced 2026-08-09 13:03:18 +00:00
fix: Default ACL overwrites custom ACL on Parse.Object update (#10061)
This commit is contained in:
@@ -951,4 +951,66 @@ describe('Parse.ACL', () => {
|
||||
expect(acl[user.id].write).toBeTrue();
|
||||
expect(acl[user.id].read).toBeTrue();
|
||||
});
|
||||
|
||||
it('should not overwrite ACL with defaultACL on update', async () => {
|
||||
await new Parse.Object('TestObject').save();
|
||||
const schema = await Parse.Server.database.loadSchema();
|
||||
await schema.updateClass(
|
||||
'TestObject',
|
||||
{},
|
||||
{
|
||||
create: { '*': true },
|
||||
update: { '*': true },
|
||||
addField: { '*': true },
|
||||
ACL: {
|
||||
'*': { read: true },
|
||||
currentUser: { read: true, write: true },
|
||||
},
|
||||
}
|
||||
);
|
||||
const user = await Parse.User.signUp('testuser', 'p@ssword');
|
||||
const obj = new Parse.Object('TestObject');
|
||||
await obj.save(null, { sessionToken: user.getSessionToken() });
|
||||
|
||||
const originalAcl = obj.getACL().toJSON();
|
||||
expect(originalAcl['*']).toEqual({ read: true });
|
||||
expect(originalAcl[user.id]).toEqual({ read: true, write: true });
|
||||
|
||||
obj.set('field', 'value');
|
||||
await obj.save(null, { sessionToken: user.getSessionToken() });
|
||||
|
||||
const updatedAcl = obj.getACL().toJSON();
|
||||
expect(updatedAcl).toEqual(originalAcl);
|
||||
});
|
||||
|
||||
it('should allow explicit ACL modification on update', async () => {
|
||||
await new Parse.Object('TestObject').save();
|
||||
const schema = await Parse.Server.database.loadSchema();
|
||||
await schema.updateClass(
|
||||
'TestObject',
|
||||
{},
|
||||
{
|
||||
create: { '*': true },
|
||||
update: { '*': true },
|
||||
ACL: {
|
||||
'*': { read: true },
|
||||
currentUser: { read: true, write: true },
|
||||
},
|
||||
}
|
||||
);
|
||||
const user = await Parse.User.signUp('testuser', 'p@ssword');
|
||||
const obj = new Parse.Object('TestObject');
|
||||
await obj.save(null, { sessionToken: user.getSessionToken() });
|
||||
|
||||
const customAcl = new Parse.ACL();
|
||||
customAcl.setPublicReadAccess(false);
|
||||
customAcl.setReadAccess(user.id, true);
|
||||
customAcl.setWriteAccess(user.id, true);
|
||||
obj.setACL(customAcl);
|
||||
await obj.save(null, { sessionToken: user.getSessionToken() });
|
||||
|
||||
const updatedAcl = obj.getACL().toJSON();
|
||||
expect(updatedAcl['*']).toBeUndefined();
|
||||
expect(updatedAcl[user.id]).toEqual({ read: true, write: true });
|
||||
});
|
||||
});
|
||||
|
||||
+2
-2
@@ -370,8 +370,8 @@ RestWrite.prototype.setRequiredFieldsIfNeeded = function () {
|
||||
}
|
||||
};
|
||||
|
||||
// add default ACL
|
||||
if (
|
||||
// add default ACL (only on CREATE, not UPDATE)
|
||||
if (!this.query &&
|
||||
schema?.classLevelPermissions?.ACL &&
|
||||
!this.data.ACL &&
|
||||
JSON.stringify(schema.classLevelPermissions.ACL) !==
|
||||
|
||||
Reference in New Issue
Block a user