Skip to content

Commit e7f69e1

Browse files
dblythydplewis
authored andcommitted
New: requireAnyUserRoles and requireAllUserRoles for Parse Cloud Validator (#7097)
* new: requireUserRole for Parse Cloud Validator * change to requireUserRoles * Update CHANGELOG.md * revoke triggers * Update triggers.js * Update ParseLiveQueryServer.js * Update ParseLiveQueryServer.js * create requireUserRoles * rename to requireAny and requireAll * allow for a function
1 parent 0c38247 commit e7f69e1

File tree

6 files changed

+373
-208
lines changed

6 files changed

+373
-208
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ ___
1717
- IMPROVE: Optimize queries on classes with pointer permissions. [#7061](https://github.com/parse-community/parse-server/pull/7061). Thanks to [Pedro Diaz](https://github.com/pdiaz)
1818
- IMPROVE: Parse Server will from now on be continuously tested against all relevant Postgres versions (minor versions). Added Postgres compatibility table to Parse Server docs. [#7176](https://github.com/parse-community/parse-server/pull/7176). Thanks to [Corey Baker](https://github.com/cbaker6).
1919
- FIX: request.context for afterFind triggers. [#7078](https://github.com/parse-community/parse-server/pull/7078). Thanks to [dblythy](https://github.com/dblythy)
20+
- NEW: `requireAnyUserRoles` and `requireAllUserRoles` for Parse Cloud validator. [#7097](https://github.com/parse-community/parse-server/pull/7097). Thanks to [dblythy](https://github.com/dblythy)
21+
- NEW: Added convenience method Parse.Cloud.sendEmail(...) to send email via email adapter in Cloud Code. [#7089](https://github.com/parse-community/parse-server/pull/7089). Thanks to [dblythy](https://github.com/dblythy)
2022
- FIX: Winston Logger interpolating stdout to console [#7114](https://github.com/parse-community/parse-server/pull/7114). Thanks to [dplewis](https://github.com/dplewis)
2123

2224
### 4.5.0

spec/CloudCode.Validator.spec.js

+144
Original file line numberDiff line numberDiff line change
@@ -878,6 +878,150 @@ describe('cloud validator', () => {
878878
});
879879
});
880880

881+
it('basic validator requireAnyUserRoles', async function (done) {
882+
Parse.Cloud.define(
883+
'cloudFunction',
884+
() => {
885+
return true;
886+
},
887+
{
888+
requireUser: true,
889+
requireAnyUserRoles: ['Admin'],
890+
}
891+
);
892+
const user = await Parse.User.signUp('testuser', 'p@ssword');
893+
try {
894+
await Parse.Cloud.run('cloudFunction');
895+
fail('cloud validator should have failed.');
896+
} catch (e) {
897+
expect(e.message).toBe('Validation failed. User does not match the required roles.');
898+
}
899+
const roleACL = new Parse.ACL();
900+
roleACL.setPublicReadAccess(true);
901+
const role = new Parse.Role('Admin', roleACL);
902+
role.getUsers().add(user);
903+
await role.save({ useMasterKey: true });
904+
await Parse.Cloud.run('cloudFunction');
905+
done();
906+
});
907+
908+
it('basic validator requireAllUserRoles', async function (done) {
909+
Parse.Cloud.define(
910+
'cloudFunction',
911+
() => {
912+
return true;
913+
},
914+
{
915+
requireUser: true,
916+
requireAllUserRoles: ['Admin', 'Admin2'],
917+
}
918+
);
919+
const user = await Parse.User.signUp('testuser', 'p@ssword');
920+
try {
921+
await Parse.Cloud.run('cloudFunction');
922+
fail('cloud validator should have failed.');
923+
} catch (e) {
924+
expect(e.message).toBe('Validation failed. User does not match all the required roles.');
925+
}
926+
const roleACL = new Parse.ACL();
927+
roleACL.setPublicReadAccess(true);
928+
const role = new Parse.Role('Admin', roleACL);
929+
role.getUsers().add(user);
930+
931+
const role2 = new Parse.Role('Admin2', roleACL);
932+
role2.getUsers().add(user);
933+
await Promise.all([role.save({ useMasterKey: true }), role2.save({ useMasterKey: true })]);
934+
await Parse.Cloud.run('cloudFunction');
935+
done();
936+
});
937+
938+
it('allow requireAnyUserRoles to be a function', async function (done) {
939+
Parse.Cloud.define(
940+
'cloudFunction',
941+
() => {
942+
return true;
943+
},
944+
{
945+
requireUser: true,
946+
requireAnyUserRoles: () => {
947+
return ['Admin Func'];
948+
},
949+
}
950+
);
951+
const user = await Parse.User.signUp('testuser', 'p@ssword');
952+
try {
953+
await Parse.Cloud.run('cloudFunction');
954+
fail('cloud validator should have failed.');
955+
} catch (e) {
956+
expect(e.message).toBe('Validation failed. User does not match the required roles.');
957+
}
958+
const roleACL = new Parse.ACL();
959+
roleACL.setPublicReadAccess(true);
960+
const role = new Parse.Role('Admin Func', roleACL);
961+
role.getUsers().add(user);
962+
await role.save({ useMasterKey: true });
963+
await Parse.Cloud.run('cloudFunction');
964+
done();
965+
});
966+
967+
it('allow requireAllUserRoles to be a function', async function (done) {
968+
Parse.Cloud.define(
969+
'cloudFunction',
970+
() => {
971+
return true;
972+
},
973+
{
974+
requireUser: true,
975+
requireAllUserRoles: () => {
976+
return ['AdminA', 'AdminB'];
977+
},
978+
}
979+
);
980+
const user = await Parse.User.signUp('testuser', 'p@ssword');
981+
try {
982+
await Parse.Cloud.run('cloudFunction');
983+
fail('cloud validator should have failed.');
984+
} catch (e) {
985+
expect(e.message).toBe('Validation failed. User does not match all the required roles.');
986+
}
987+
const roleACL = new Parse.ACL();
988+
roleACL.setPublicReadAccess(true);
989+
const role = new Parse.Role('AdminA', roleACL);
990+
role.getUsers().add(user);
991+
992+
const role2 = new Parse.Role('AdminB', roleACL);
993+
role2.getUsers().add(user);
994+
await Promise.all([role.save({ useMasterKey: true }), role2.save({ useMasterKey: true })]);
995+
await Parse.Cloud.run('cloudFunction');
996+
done();
997+
});
998+
999+
it('basic requireAllUserRoles but no user', async function (done) {
1000+
Parse.Cloud.define(
1001+
'cloudFunction',
1002+
() => {
1003+
return true;
1004+
},
1005+
{
1006+
requireAllUserRoles: ['Admin'],
1007+
}
1008+
);
1009+
try {
1010+
await Parse.Cloud.run('cloudFunction');
1011+
fail('cloud validator should have failed.');
1012+
} catch (e) {
1013+
expect(e.message).toBe('Validation failed. Please login to continue.');
1014+
}
1015+
const user = await Parse.User.signUp('testuser', 'p@ssword');
1016+
const roleACL = new Parse.ACL();
1017+
roleACL.setPublicReadAccess(true);
1018+
const role = new Parse.Role('Admin', roleACL);
1019+
role.getUsers().add(user);
1020+
await role.save({ useMasterKey: true });
1021+
await Parse.Cloud.run('cloudFunction');
1022+
done();
1023+
});
1024+
8811025
it('basic beforeSave requireMaster', function (done) {
8821026
Parse.Cloud.beforeSave('BeforeSaveFail', () => {}, {
8831027
requireMaster: true,

0 commit comments

Comments
 (0)