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'
This commit is contained in:
Old Grandpa
2020-02-19 12:34:08 +03:00
committed by GitHub
parent ca1ae336c9
commit 292bdb713a
9 changed files with 1390 additions and 45 deletions

View File

@@ -5,6 +5,8 @@ const fetch = require('node-fetch');
const FormData = require('form-data');
const ws = require('ws');
require('./helper');
const { updateCLP } = require('./dev');
const pluralize = require('pluralize');
const { getMainDefinition } = require('apollo-utilities');
const { ApolloLink, split } = require('apollo-link');
@@ -4632,6 +4634,84 @@ describe('ParseGraphQLServer', () => {
).toBeDefined();
});
it('should respect protectedFields', async done => {
await prepareData();
await parseGraphQLServer.parseGraphQLSchema.databaseController.schemaCache.clear();
const className = 'GraphQLClass';
await updateCLP(
{
get: { '*': true },
find: { '*': true },
protectedFields: {
'*': ['someField', 'someOtherField'],
authenticated: ['someField'],
'userField:pointerToUser': [],
[user2.id]: [],
},
},
className
);
const getObject = async (className, id, user) => {
const headers = user
? { ['X-Parse-Session-Token']: user.getSessionToken() }
: undefined;
const specificQueryResult = await apolloClient.query({
query: gql`
query GetSomeObject($id: ID!) {
get: graphQLClass(id: $id) {
pointerToUser {
username
id
}
someField
someOtherField
}
}
`,
variables: {
id: id,
},
context: {
headers: headers,
},
});
return specificQueryResult.data.get;
};
const id = object3.id;
/* not authenticated */
const objectPublic = await getObject(className, id, undefined);
expect(objectPublic.someField).toBeNull();
expect(objectPublic.someOtherField).toBeNull();
/* authenticated */
const objectAuth = await getObject(className, id, user1);
expect(objectAuth.someField).toBeNull();
expect(objectAuth.someOtherField).toBe('B');
/* pointer field */
const objectPointed = await getObject(className, id, user5);
expect(objectPointed.someField).toBe('someValue3');
expect(objectPointed.someOtherField).toBe('B');
/* for user id */
const objectForUser = await getObject(className, id, user2);
expect(objectForUser.someField).toBe('someValue3');
expect(objectForUser.someOtherField).toBe('B');
done();
});
describe_only_db('mongo')('read preferences', () => {
it('should read from primary by default', async () => {
try {