Skip to content

Commit 130d290

Browse files
authored
fix: Throwing error in Cloud Code Triggers afterLogin, afterLogout crashes server (#8280)
BREAKING CHANGE: Throwing an error in Cloud Code Triggers `afterLogin`, `afterLogout` returns a rejected promise; in previous releases it crashed the server if you did not handle the error on the Node.js process level; consider adapting your code if your app currently handles these errors on the Node.js process level with `process.on('unhandledRejection', ...)`
1 parent 9d3c1c6 commit 130d290

File tree

2 files changed

+54
-37
lines changed

2 files changed

+54
-37
lines changed

Diff for: spec/CloudCode.spec.js

+30
Original file line numberDiff line numberDiff line change
@@ -3103,6 +3103,36 @@ describe('beforeLogin hook', () => {
31033103
done();
31043104
});
31053105

3106+
it('does not crash server when throwing in afterLogin hook', async () => {
3107+
const error = new Parse.Error(2000, 'afterLogin error');
3108+
const trigger = {
3109+
afterLogin() {
3110+
throw error;
3111+
},
3112+
};
3113+
const spy = spyOn(trigger, 'afterLogin').and.callThrough();
3114+
Parse.Cloud.afterLogin(trigger.afterLogin);
3115+
await Parse.User.signUp('user', 'pass');
3116+
const response = await Parse.User.logIn('user', 'pass').catch(e => e);
3117+
expect(spy).toHaveBeenCalled();
3118+
expect(response).toEqual(error);
3119+
});
3120+
3121+
it('does not crash server when throwing in afterLogout hook', async () => {
3122+
const error = new Parse.Error(2000, 'afterLogout error');
3123+
const trigger = {
3124+
afterLogout() {
3125+
throw error;
3126+
},
3127+
};
3128+
const spy = spyOn(trigger, 'afterLogout').and.callThrough();
3129+
Parse.Cloud.afterLogout(trigger.afterLogout);
3130+
await Parse.User.signUp('user', 'pass');
3131+
const response = await Parse.User.logOut().catch(e => e);
3132+
expect(spy).toHaveBeenCalled();
3133+
expect(response).toEqual(error);
3134+
});
3135+
31063136
it('should have expected data in request', async done => {
31073137
Parse.Cloud.beforeLogin(req => {
31083138
expect(req.object).toBeDefined();

Diff for: src/Routers/UsersRouter.js

+24-37
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ export class UsersRouter extends ClassesRouter {
281281
await createSession();
282282

283283
const afterLoginUser = Parse.User.fromJSON(Object.assign({ className: '_User' }, user));
284-
maybeRunTrigger(
284+
await maybeRunTrigger(
285285
TriggerTypes.afterLogin,
286286
{ ...req.auth, user: afterLoginUser },
287287
afterLoginUser,
@@ -360,49 +360,36 @@ export class UsersRouter extends ClassesRouter {
360360
});
361361
}
362362

363-
handleLogOut(req) {
363+
async handleLogOut(req) {
364364
const success = { response: {} };
365365
if (req.info && req.info.sessionToken) {
366-
return rest
367-
.find(
366+
const records = await rest.find(
367+
req.config,
368+
Auth.master(req.config),
369+
'_Session',
370+
{ sessionToken: req.info.sessionToken },
371+
undefined,
372+
req.info.clientSDK,
373+
req.info.context
374+
);
375+
if (records.results && records.results.length) {
376+
await rest.del(
368377
req.config,
369378
Auth.master(req.config),
370379
'_Session',
371-
{ sessionToken: req.info.sessionToken },
372-
undefined,
373-
req.info.clientSDK,
380+
records.results[0].objectId,
374381
req.info.context
375-
)
376-
.then(records => {
377-
if (records.results && records.results.length) {
378-
return rest
379-
.del(
380-
req.config,
381-
Auth.master(req.config),
382-
'_Session',
383-
records.results[0].objectId,
384-
req.info.context
385-
)
386-
.then(() => {
387-
this._runAfterLogoutTrigger(req, records.results[0]);
388-
return Promise.resolve(success);
389-
});
390-
}
391-
return Promise.resolve(success);
392-
});
382+
);
383+
await maybeRunTrigger(
384+
TriggerTypes.afterLogout,
385+
req.auth,
386+
Parse.Session.fromJSON(Object.assign({ className: '_Session' }, records.results[0])),
387+
null,
388+
req.config
389+
);
390+
}
393391
}
394-
return Promise.resolve(success);
395-
}
396-
397-
_runAfterLogoutTrigger(req, session) {
398-
// After logout trigger
399-
maybeRunTrigger(
400-
TriggerTypes.afterLogout,
401-
req.auth,
402-
Parse.Session.fromJSON(Object.assign({ className: '_Session' }, session)),
403-
null,
404-
req.config
405-
);
392+
return success;
406393
}
407394

408395
_throwOnBadEmailConfig(req) {

0 commit comments

Comments
 (0)