Skip to content

Commit 5b5bfff

Browse files
committed
Adds index on _Role name property
In order to avoid having different _Role objects with the same name, adding an index on the name property of _Role is necessary. Fixes #3579
1 parent e6006e8 commit 5b5bfff

File tree

2 files changed

+29
-1
lines changed

2 files changed

+29
-1
lines changed

spec/ParseRole.spec.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,24 @@ describe('Parse Role testing', () => {
192192
});
193193
});
194194

195+
it("Different _Role objects cannot have the same name.", (done) => {
196+
const roleName = "MyRole";
197+
let aUser;
198+
createTestUser().then((user) => {
199+
aUser = user;
200+
return createRole(roleName, null, aUser);
201+
}).then((firstRole) => {
202+
expect(firstRole.getName()).toEqual(roleName);
203+
return createRole(roleName, null, aUser);
204+
}).then(() => {
205+
fail("_Role cannot have the same name as another role");
206+
done();
207+
}, (error) => {
208+
expect(error.code).toEqual(137);
209+
done();
210+
});
211+
});
212+
195213
it("Should properly resolve roles", (done) => {
196214
const admin = new Parse.Role("Admin", new Parse.ACL());
197215
const moderator = new Parse.Role("Moderator", new Parse.ACL());

src/Controllers/DatabaseController.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,9 +909,12 @@ DatabaseController.prototype.addPointerPermissions = function(schema, className,
909909
// have a Parse app without it having a _User collection.
910910
DatabaseController.prototype.performInitialization = function() {
911911
const requiredUserFields = { fields: { ...SchemaController.defaultColumns._Default, ...SchemaController.defaultColumns._User } };
912+
const requiredRoleFields = { fields: { ...SchemaController.defaultColumns._Default, ...SchemaController.defaultColumns._Role } };
912913

913914
const userClassPromise = this.loadSchema()
914915
.then(schema => schema.enforceClassExists('_User'))
916+
const roleClassPromise = this.loadSchema()
917+
.then(schema => schema.enforceClassExists('_Role'))
915918

916919
const usernameUniqueness = userClassPromise
917920
.then(() => this.adapter.ensureUniqueness('_User', requiredUserFields, ['username']))
@@ -927,9 +930,16 @@ DatabaseController.prototype.performInitialization = function() {
927930
return Promise.reject(error);
928931
});
929932

933+
const roleUniqueness = roleClassPromise
934+
.then(() => this.adapter.ensureUniqueness('_Role', requiredRoleFields, ['name']))
935+
.catch(error => {
936+
logger.warn('Unable to ensure uniqueness for role name: ', error);
937+
return Promise.reject(error);
938+
});
939+
930940
// Create tables for volatile classes
931941
const adapterInit = this.adapter.performInitialization({ VolatileClassesSchemas: SchemaController.VolatileClassesSchemas });
932-
return Promise.all([usernameUniqueness, emailUniqueness, adapterInit]);
942+
return Promise.all([usernameUniqueness, emailUniqueness, roleUniqueness, adapterInit]);
933943
}
934944

935945
function joinTableName(className, key) {

0 commit comments

Comments
 (0)