Merge pull request #1291 from ParsePlatform/flovilmart.issue1257
Properly let masterKey add fields
This commit is contained in:
@@ -981,7 +981,7 @@ describe('schemas', () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not be able to add a field', done => {
|
it('should not be able to add a field', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1010,7 +1010,7 @@ describe('schemas', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should not be able to add a field', done => {
|
it('should not be able to add a field', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1038,7 +1038,7 @@ describe('schemas', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw with invalid userId (>10 chars)', done => {
|
it('should throw with invalid userId (>10 chars)', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1056,7 +1056,7 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw with invalid userId (<10 chars)', done => {
|
it('should throw with invalid userId (<10 chars)', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1074,7 +1074,7 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw with invalid userId (invalid char)', done => {
|
it('should throw with invalid userId (invalid char)', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1092,7 +1092,7 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw with invalid * (spaces)', done => {
|
it('should throw with invalid * (spaces)', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1110,7 +1110,7 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw with invalid * (spaces)', done => {
|
it('should throw with invalid * (spaces)', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1128,7 +1128,7 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw with invalid value', done => {
|
it('should throw with invalid value', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1146,7 +1146,7 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should throw with invalid value', done => {
|
it('should throw with invalid value', done => {
|
||||||
request.post({
|
request.post({
|
||||||
url: 'http://localhost:8378/1/schemas/AClass',
|
url: 'http://localhost:8378/1/schemas/AClass',
|
||||||
@@ -1164,10 +1164,10 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
function setPermissionsOnClass(className, permissions, doPut) {
|
function setPermissionsOnClass(className, permissions, doPut) {
|
||||||
let op = request.post;
|
let op = request.post;
|
||||||
if (doPut)
|
if (doPut)
|
||||||
{
|
{
|
||||||
op = request.put;
|
op = request.put;
|
||||||
}
|
}
|
||||||
@@ -1190,18 +1190,18 @@ describe('schemas', () => {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
it('validate CLP 1', done => {
|
it('validate CLP 1', done => {
|
||||||
let user = new Parse.User();
|
let user = new Parse.User();
|
||||||
user.setUsername('user');
|
user.setUsername('user');
|
||||||
user.setPassword('user');
|
user.setPassword('user');
|
||||||
|
|
||||||
let admin = new Parse.User();
|
let admin = new Parse.User();
|
||||||
admin.setUsername('admin');
|
admin.setUsername('admin');
|
||||||
admin.setPassword('admin');
|
admin.setPassword('admin');
|
||||||
|
|
||||||
let role = new Parse.Role('admin', new Parse.ACL());
|
let role = new Parse.Role('admin', new Parse.ACL());
|
||||||
|
|
||||||
setPermissionsOnClass('AClass', {
|
setPermissionsOnClass('AClass', {
|
||||||
'find': {
|
'find': {
|
||||||
'role:admin': true
|
'role:admin': true
|
||||||
@@ -1239,18 +1239,18 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('validate CLP 2', done => {
|
it('validate CLP 2', done => {
|
||||||
let user = new Parse.User();
|
let user = new Parse.User();
|
||||||
user.setUsername('user');
|
user.setUsername('user');
|
||||||
user.setPassword('user');
|
user.setPassword('user');
|
||||||
|
|
||||||
let admin = new Parse.User();
|
let admin = new Parse.User();
|
||||||
admin.setUsername('admin');
|
admin.setUsername('admin');
|
||||||
admin.setPassword('admin');
|
admin.setPassword('admin');
|
||||||
|
|
||||||
let role = new Parse.Role('admin', new Parse.ACL());
|
let role = new Parse.Role('admin', new Parse.ACL());
|
||||||
|
|
||||||
setPermissionsOnClass('AClass', {
|
setPermissionsOnClass('AClass', {
|
||||||
'find': {
|
'find': {
|
||||||
'role:admin': true
|
'role:admin': true
|
||||||
@@ -1304,18 +1304,18 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('validate CLP 3', done => {
|
it('validate CLP 3', done => {
|
||||||
let user = new Parse.User();
|
let user = new Parse.User();
|
||||||
user.setUsername('user');
|
user.setUsername('user');
|
||||||
user.setPassword('user');
|
user.setPassword('user');
|
||||||
|
|
||||||
let admin = new Parse.User();
|
let admin = new Parse.User();
|
||||||
admin.setUsername('admin');
|
admin.setUsername('admin');
|
||||||
admin.setPassword('admin');
|
admin.setPassword('admin');
|
||||||
|
|
||||||
let role = new Parse.Role('admin', new Parse.ACL());
|
let role = new Parse.Role('admin', new Parse.ACL());
|
||||||
|
|
||||||
setPermissionsOnClass('AClass', {
|
setPermissionsOnClass('AClass', {
|
||||||
'find': {
|
'find': {
|
||||||
'role:admin': true
|
'role:admin': true
|
||||||
@@ -1362,18 +1362,18 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('validate CLP 4', done => {
|
it('validate CLP 4', done => {
|
||||||
let user = new Parse.User();
|
let user = new Parse.User();
|
||||||
user.setUsername('user');
|
user.setUsername('user');
|
||||||
user.setPassword('user');
|
user.setPassword('user');
|
||||||
|
|
||||||
let admin = new Parse.User();
|
let admin = new Parse.User();
|
||||||
admin.setUsername('admin');
|
admin.setUsername('admin');
|
||||||
admin.setPassword('admin');
|
admin.setPassword('admin');
|
||||||
|
|
||||||
let role = new Parse.Role('admin', new Parse.ACL());
|
let role = new Parse.Role('admin', new Parse.ACL());
|
||||||
|
|
||||||
setPermissionsOnClass('AClass', {
|
setPermissionsOnClass('AClass', {
|
||||||
'find': {
|
'find': {
|
||||||
'role:admin': true
|
'role:admin': true
|
||||||
@@ -1400,7 +1400,7 @@ describe('schemas', () => {
|
|||||||
// borked CLP should not affec security
|
// borked CLP should not affec security
|
||||||
return setPermissionsOnClass('AClass', {
|
return setPermissionsOnClass('AClass', {
|
||||||
'found': {
|
'found': {
|
||||||
'role:admin': true
|
'role:admin': true
|
||||||
}
|
}
|
||||||
}, true).then(() => {
|
}, true).then(() => {
|
||||||
fail("Should not be able to save a borked CLP");
|
fail("Should not be able to save a borked CLP");
|
||||||
@@ -1430,21 +1430,21 @@ describe('schemas', () => {
|
|||||||
done();
|
done();
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
it('validate CLP 5', done => {
|
it('validate CLP 5', done => {
|
||||||
let user = new Parse.User();
|
let user = new Parse.User();
|
||||||
user.setUsername('user');
|
user.setUsername('user');
|
||||||
user.setPassword('user');
|
user.setPassword('user');
|
||||||
|
|
||||||
let user2 = new Parse.User();
|
let user2 = new Parse.User();
|
||||||
user2.setUsername('user2');
|
user2.setUsername('user2');
|
||||||
user2.setPassword('user2');
|
user2.setPassword('user2');
|
||||||
let admin = new Parse.User();
|
let admin = new Parse.User();
|
||||||
admin.setUsername('admin');
|
admin.setUsername('admin');
|
||||||
admin.setPassword('admin');
|
admin.setPassword('admin');
|
||||||
|
|
||||||
let role = new Parse.Role('admin', new Parse.ACL());
|
let role = new Parse.Role('admin', new Parse.ACL());
|
||||||
|
|
||||||
Promise.resolve().then(() => {
|
Promise.resolve().then(() => {
|
||||||
return Parse.Object.saveAll([user, user2, admin, role], {useMasterKey: true});
|
return Parse.Object.saveAll([user, user2, admin, role], {useMasterKey: true});
|
||||||
}).then(()=> {
|
}).then(()=> {
|
||||||
@@ -1495,5 +1495,21 @@ describe('schemas', () => {
|
|||||||
}).then(() => {
|
}).then(() => {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('can add field as master (issue #1257)', (done) => {
|
||||||
|
setPermissionsOnClass('AClass', {
|
||||||
|
'addField': {}
|
||||||
|
}).then(() => {
|
||||||
|
var obj = new Parse.Object('AClass');
|
||||||
|
obj.set('key', 'value');
|
||||||
|
return obj.save(null, {useMasterKey: true})
|
||||||
|
}).then((obj) => {
|
||||||
|
expect(obj.get('key')).toEqual('value');
|
||||||
|
done();
|
||||||
|
}, (err) => {
|
||||||
|
fail('should not fail');
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
})
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -103,9 +103,14 @@ DatabaseController.prototype.redirectClassNameForKey = function(className, key)
|
|||||||
// batch request, that could confuse other users of the schema.
|
// batch request, that could confuse other users of the schema.
|
||||||
DatabaseController.prototype.validateObject = function(className, object, query, options) {
|
DatabaseController.prototype.validateObject = function(className, object, query, options) {
|
||||||
let schema;
|
let schema;
|
||||||
|
let isMaster = !('acl' in options);
|
||||||
|
var aclGroup = options.acl || [];
|
||||||
return this.loadSchema().then(s => {
|
return this.loadSchema().then(s => {
|
||||||
schema = s;
|
schema = s;
|
||||||
return this.canAddField(schema, className, object, options.acl || []);
|
if (isMaster) {
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
return this.canAddField(schema, className, object, aclGroup);
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
return schema.validateObject(className, object, query);
|
return schema.validateObject(className, object, query);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user