Skip to content

Commit 292bdb7

Browse files
Allow protectedFields for Authenticated users and Public. Fix userField with keys/excludedKeys (#6415)
* fix error message and test it * protected fields fixes * clean * remove duplicate test, add some comments * no need for 'requiresAuthentication'
1 parent ca1ae33 commit 292bdb7

9 files changed

+1389
-44
lines changed

spec/ParseGraphQLServer.spec.js

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ const fetch = require('node-fetch');
55
const FormData = require('form-data');
66
const ws = require('ws');
77
require('./helper');
8+
const { updateCLP } = require('./dev');
9+
810
const pluralize = require('pluralize');
911
const { getMainDefinition } = require('apollo-utilities');
1012
const { ApolloLink, split } = require('apollo-link');
@@ -4632,6 +4634,84 @@ describe('ParseGraphQLServer', () => {
46324634
).toBeDefined();
46334635
});
46344636

4637+
it('should respect protectedFields', async done => {
4638+
await prepareData();
4639+
await parseGraphQLServer.parseGraphQLSchema.databaseController.schemaCache.clear();
4640+
4641+
const className = 'GraphQLClass';
4642+
4643+
await updateCLP(
4644+
{
4645+
get: { '*': true },
4646+
find: { '*': true },
4647+
4648+
protectedFields: {
4649+
'*': ['someField', 'someOtherField'],
4650+
authenticated: ['someField'],
4651+
'userField:pointerToUser': [],
4652+
[user2.id]: [],
4653+
},
4654+
},
4655+
className
4656+
);
4657+
4658+
const getObject = async (className, id, user) => {
4659+
const headers = user
4660+
? { ['X-Parse-Session-Token']: user.getSessionToken() }
4661+
: undefined;
4662+
4663+
const specificQueryResult = await apolloClient.query({
4664+
query: gql`
4665+
query GetSomeObject($id: ID!) {
4666+
get: graphQLClass(id: $id) {
4667+
pointerToUser {
4668+
username
4669+
id
4670+
}
4671+
someField
4672+
someOtherField
4673+
}
4674+
}
4675+
`,
4676+
variables: {
4677+
id: id,
4678+
},
4679+
context: {
4680+
headers: headers,
4681+
},
4682+
});
4683+
4684+
return specificQueryResult.data.get;
4685+
};
4686+
4687+
const id = object3.id;
4688+
4689+
/* not authenticated */
4690+
const objectPublic = await getObject(className, id, undefined);
4691+
4692+
expect(objectPublic.someField).toBeNull();
4693+
expect(objectPublic.someOtherField).toBeNull();
4694+
4695+
/* authenticated */
4696+
const objectAuth = await getObject(className, id, user1);
4697+
4698+
expect(objectAuth.someField).toBeNull();
4699+
expect(objectAuth.someOtherField).toBe('B');
4700+
4701+
/* pointer field */
4702+
const objectPointed = await getObject(className, id, user5);
4703+
4704+
expect(objectPointed.someField).toBe('someValue3');
4705+
expect(objectPointed.someOtherField).toBe('B');
4706+
4707+
/* for user id */
4708+
const objectForUser = await getObject(className, id, user2);
4709+
4710+
expect(objectForUser.someField).toBe('someValue3');
4711+
expect(objectForUser.someOtherField).toBe('B');
4712+
4713+
done();
4714+
});
46354715
describe_only_db('mongo')('read preferences', () => {
46364716
it('should read from primary by default', async () => {
46374717
try {

spec/ParseQuery.spec.js

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4868,4 +4868,36 @@ describe('Parse.Query testing', () => {
48684868
const results = await query.find();
48694869
equal(results[0].get('array').length, 105);
48704870
});
4871+
4872+
it('exclude keys (sdk query)', async done => {
4873+
const obj = new TestObject({ foo: 'baz', hello: 'world' });
4874+
await obj.save();
4875+
4876+
const query = new Parse.Query('TestObject');
4877+
query.exclude('foo');
4878+
4879+
const object = await query.get(obj.id);
4880+
expect(object.get('foo')).toBeUndefined();
4881+
expect(object.get('hello')).toBe('world');
4882+
done();
4883+
});
4884+
4885+
xit('todo: exclude keys with select key (sdk query get)', async done => {
4886+
// there is some problem with js sdk caching
4887+
4888+
const obj = new TestObject({ foo: 'baz', hello: 'world' });
4889+
await obj.save();
4890+
4891+
const query = new Parse.Query('TestObject');
4892+
4893+
query.withJSON({
4894+
keys: 'hello',
4895+
excludeKeys: 'hello',
4896+
});
4897+
4898+
const object = await query.get(obj.id);
4899+
expect(object.get('foo')).toBeUndefined();
4900+
expect(object.get('hello')).toBeUndefined();
4901+
done();
4902+
});
48714903
});

spec/PointerPermissions.spec.js

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2047,7 +2047,7 @@ describe('Pointer Permissions', () => {
20472047
}
20482048

20492049
async function logIn(userObject) {
2050-
await Parse.User.logIn(userObject.getUsername(), 'password');
2050+
return await Parse.User.logIn(userObject.getUsername(), 'password');
20512051
}
20522052

20532053
async function updateCLP(clp) {
@@ -3098,5 +3098,55 @@ describe('Pointer Permissions', () => {
30983098
done();
30993099
});
31003100
});
3101+
3102+
describe('using pointer-fields and queries with keys projection', () => {
3103+
let user1;
3104+
/**
3105+
* owner: user1
3106+
*
3107+
* testers: [user1]
3108+
*/
3109+
let obj;
3110+
3111+
/**
3112+
* Clear cache, create user and object, login user
3113+
*/
3114+
async function initialize() {
3115+
await Config.get(Parse.applicationId).database.schemaCache.clear();
3116+
3117+
user1 = await createUser('user1');
3118+
user1 = await logIn(user1);
3119+
3120+
obj = new Parse.Object(className);
3121+
3122+
obj.set('owner', user1);
3123+
obj.set('field', 'field');
3124+
obj.set('test', 'test');
3125+
3126+
await Parse.Object.saveAll([obj], { useMasterKey: true });
3127+
3128+
await obj.fetch();
3129+
}
3130+
3131+
beforeEach(async () => {
3132+
await initialize();
3133+
});
3134+
3135+
it('should be enforced regardless of pointer-field being included in keys (select)', async done => {
3136+
await updateCLP({
3137+
get: { '*': true },
3138+
find: { pointerFields: ['owner'] },
3139+
update: { pointerFields: ['owner'] },
3140+
});
3141+
3142+
const query = new Parse.Query('AnObject');
3143+
query.select('field', 'test');
3144+
3145+
const [object] = await query.find({ objectId: obj.id });
3146+
expect(object.get('field')).toBe('field');
3147+
expect(object.get('test')).toBe('test');
3148+
done();
3149+
});
3150+
});
31013151
});
31023152
});

0 commit comments

Comments
 (0)