Skip to content

Commit c114dc8

Browse files
authored
fix: Rate limiter may reject requests that contain a session token (#8399)
1 parent 8f7a8f4 commit c114dc8

File tree

2 files changed

+34
-4
lines changed

2 files changed

+34
-4
lines changed

spec/RateLimit.spec.js

+21
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,27 @@ describe('rate limit', () => {
1919
);
2020
});
2121

22+
it('can limit cloud functions with user session token', async () => {
23+
await Parse.User.#('myUser', 'password');
24+
Parse.Cloud.define('test', () => 'Abc');
25+
await reconfigureServer({
26+
rateLimit: [
27+
{
28+
requestPath: '/functions/*',
29+
requestTimeWindow: 10000,
30+
requestCount: 1,
31+
errorResponseMessage: 'Too many requests',
32+
includeInternalRequests: true,
33+
},
34+
],
35+
});
36+
const response1 = await Parse.Cloud.run('test');
37+
expect(response1).toBe('Abc');
38+
await expectAsync(Parse.Cloud.run('test')).toBeRejectedWith(
39+
new Parse.Error(Parse.Error.CONNECTION_FAILED, 'Too many requests')
40+
);
41+
});
42+
2243
it('can add global limit', async () => {
2344
Parse.Cloud.define('test', () => 'Abc');
2445
await reconfigureServer({

src/middlewares.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -276,15 +276,21 @@ const handleRateLimit = async (req, res, next) => {
276276
if (pathExp.test(req.url)) {
277277
await limit.handler(req, res, err => {
278278
if (err) {
279-
throw err;
279+
if (err.code === Parse.Error.CONNECTION_FAILED) {
280+
throw err;
281+
}
282+
req.config.loggerController.error(
283+
'An unknown error occured when attempting to apply the rate limiter: ',
284+
err
285+
);
280286
}
281287
});
282288
}
283289
})
284290
);
285291
} catch (error) {
286292
res.status(429);
287-
res.json({ code: Parse.Error.CONNECTION_FAILED, error });
293+
res.json({ code: Parse.Error.CONNECTION_FAILED, error: error.message });
288294
return;
289295
}
290296
next();
@@ -477,7 +483,10 @@ export const addRateLimit = (route, config) => {
477483
max: route.requestCount,
478484
message: route.errorResponseMessage || RateLimitOptions.errorResponseMessage.default,
479485
handler: (request, response, next, options) => {
480-
throw options.message;
486+
throw {
487+
code: Parse.Error.CONNECTION_FAILED,
488+
message: options.message,
489+
};
481490
},
482491
skip: request => {
483492
if (request.ip === '127.0.0.1' && !route.includeInternalRequests) {
@@ -498,7 +507,7 @@ export const addRateLimit = (route, config) => {
498507
}
499508
}
500509
}
501-
return request.auth.isMaster;
510+
return request.auth?.isMaster;
502511
},
503512
keyGenerator: request => {
504513
return request.config.ip;

0 commit comments

Comments
 (0)