Skip to content

Commit c16f529

Browse files
authored
fix: internal indices for classes _Idempotency and _Role are not protected in defined schema (parse-community#8121)
1 parent 3351ca7 commit c16f529

File tree

2 files changed

+53
-9
lines changed

2 files changed

+53
-9
lines changed

spec/DefinedSchemas.spec.js

+36
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,42 @@ describe('DefinedSchemas', () => {
432432
expect(testSchema.indexes).toBeUndefined();
433433
expect(userSchema.indexes).toEqual(expectedIndexes);
434434
});
435+
436+
it('should detect protected indexes for _User class', () => {
437+
const definedSchema = new DefinedSchemas({}, {});
438+
const protectedUserIndexes = ['_id_', 'case_insensitive_email', 'username_1', 'email_1'];
439+
protectedUserIndexes.forEach(field => {
440+
expect(definedSchema.isProtectedIndex('_User', field)).toEqual(true);
441+
});
442+
expect(definedSchema.isProtectedIndex('_User', 'test')).toEqual(false);
443+
});
444+
445+
it('should detect protected indexes for _Role class', () => {
446+
const definedSchema = new DefinedSchemas({}, {});
447+
expect(definedSchema.isProtectedIndex('_Role', 'name_1')).toEqual(true);
448+
expect(definedSchema.isProtectedIndex('_Role', 'test')).toEqual(false);
449+
});
450+
451+
it('should detect protected indexes for _Idempotency class', () => {
452+
const definedSchema = new DefinedSchemas({}, {});
453+
expect(definedSchema.isProtectedIndex('_Idempotency', 'reqId_1')).toEqual(true);
454+
expect(definedSchema.isProtectedIndex('_Idempotency', 'test')).toEqual(false);
455+
});
456+
457+
it('should not detect protected indexes on user defined class', () => {
458+
const definedSchema = new DefinedSchemas({}, {});
459+
const protectedIndexes = [
460+
'case_insensitive_email',
461+
'username_1',
462+
'email_1',
463+
'reqId_1',
464+
'name_1',
465+
];
466+
protectedIndexes.forEach(field => {
467+
expect(definedSchema.isProtectedIndex('ExampleClass', field)).toEqual(false);
468+
});
469+
expect(definedSchema.isProtectedIndex('ExampleClass', '_id_')).toEqual(true);
470+
});
435471
});
436472

437473
describe('ClassLevelPermissions', () => {

src/SchemaMigrations/DefinedSchemas.js

+17-9
Original file line numberDiff line numberDiff line change
@@ -399,15 +399,23 @@ export class DefinedSchemas {
399399
}
400400

401401
isProtectedIndex(className: string, indexName: string) {
402-
let indexes = ['_id_'];
403-
if (className === '_User') {
404-
indexes = [
405-
...indexes,
406-
'case_insensitive_username',
407-
'case_insensitive_email',
408-
'username_1',
409-
'email_1',
410-
];
402+
const indexes = ['_id_'];
403+
switch (className) {
404+
case '_User':
405+
indexes.push(
406+
'case_insensitive_username',
407+
'case_insensitive_email',
408+
'username_1',
409+
'email_1'
410+
);
411+
break;
412+
case '_Role':
413+
indexes.push('name_1');
414+
break;
415+
416+
case '_Idempotency':
417+
indexes.push('reqId_1');
418+
break;
411419
}
412420

413421
return indexes.indexOf(indexName) !== -1;

0 commit comments

Comments
 (0)