* Cache users by objectID, and clear cache when updated via master key * Go back to caching by session token. Clear out cache by querying _Session when user is modified with Master Key (ew, hopefully that can be improved later) * Fix issue with user updates from different sessions causing stale reads * Tests aren't transpiled... * Still not transpiled
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
"use strict"
|
||||
const Parse = require("parse/node");
|
||||
const request = require('request');
|
||||
const InMemoryCacheAdapter = require('../src/Adapters/Cache/InMemoryCacheAdapter').InMemoryCacheAdapter;
|
||||
|
||||
describe('Cloud Code', () => {
|
||||
it('can load absolute cloud code file', done => {
|
||||
@@ -467,4 +469,92 @@ describe('Cloud Code', () => {
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('doesnt receive stale user in cloud code functions after user has been updated with master key (regression test for #1836)', done => {
|
||||
Parse.Cloud.define('testQuery', function(request, response) {
|
||||
response.success(request.user.get('data'));
|
||||
});
|
||||
|
||||
Parse.User.signUp('user', 'pass')
|
||||
.then(user => {
|
||||
user.set('data', 'AAA');
|
||||
return user.save();
|
||||
})
|
||||
.then(() => Parse.Cloud.run('testQuery'))
|
||||
.then(result => {
|
||||
expect(result).toEqual('AAA');
|
||||
Parse.User.current().set('data', 'BBB');
|
||||
return Parse.User.current().save(null, {useMasterKey: true});
|
||||
})
|
||||
.then(() => Parse.Cloud.run('testQuery'))
|
||||
.then(result => {
|
||||
expect(result).toEqual('BBB');
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('clears out the user cache for all sessions when the user is changed', done => {
|
||||
const cacheAdapter = new InMemoryCacheAdapter({ ttl: 100000000 });
|
||||
setServerConfiguration(Object.assign({}, defaultConfiguration, { cacheAdapter: cacheAdapter }));
|
||||
Parse.Cloud.define('checkStaleUser', (request, response) => {
|
||||
response.success(request.user.get('data'));
|
||||
});
|
||||
|
||||
let user = new Parse.User();
|
||||
user.set('username', 'test');
|
||||
user.set('password', 'moon-y');
|
||||
user.set('data', 'first data');
|
||||
user.signUp()
|
||||
.then(user => {
|
||||
let session1 = user.getSessionToken();
|
||||
request.get({
|
||||
url: 'http://localhost:8378/1/login?username=test&password=moon-y',
|
||||
json: true,
|
||||
headers: {
|
||||
'X-Parse-Application-Id': 'test',
|
||||
'X-Parse-REST-API-Key': 'rest',
|
||||
},
|
||||
}, (error, response, body) => {
|
||||
let session2 = body.sessionToken;
|
||||
|
||||
//Ensure both session tokens are in the cache
|
||||
Parse.Cloud.run('checkStaleUser')
|
||||
.then(() => {
|
||||
request.post({
|
||||
url: 'http://localhost:8378/1/functions/checkStaleUser',
|
||||
json: true,
|
||||
headers: {
|
||||
'X-Parse-Application-Id': 'test',
|
||||
'X-Parse-REST-API-Key': 'rest',
|
||||
'X-Parse-Session-Token': session2,
|
||||
}
|
||||
}, (error, response, body) => {
|
||||
Parse.Promise.all([cacheAdapter.get('test:user:' + session1), cacheAdapter.get('test:user:' + session2)])
|
||||
.then(cachedVals => {
|
||||
expect(cachedVals[0].objectId).toEqual(user.id);
|
||||
expect(cachedVals[1].objectId).toEqual(user.id);
|
||||
|
||||
//Change with session 1 and then read with session 2.
|
||||
user.set('data', 'second data');
|
||||
user.save()
|
||||
.then(() => {
|
||||
request.post({
|
||||
url: 'http://localhost:8378/1/functions/checkStaleUser',
|
||||
json: true,
|
||||
headers: {
|
||||
'X-Parse-Application-Id': 'test',
|
||||
'X-Parse-REST-API-Key': 'rest',
|
||||
'X-Parse-Session-Token': session2,
|
||||
}
|
||||
}, (error, response, body) => {
|
||||
expect(body.result).toEqual('second data');
|
||||
done();
|
||||
})
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user