Skip to content

Commit

Permalink
test: clear cache between runs, require middleware later in helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
barisusakli authored and psychobunny committed Apr 19, 2021
1 parent d15e271 commit 2ea468d
Show file tree
Hide file tree
Showing 7 changed files with 27 additions and 21 deletions.
4 changes: 2 additions & 2 deletions src/controllers/helpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ const privileges = require('../privileges');
const categories = require('../categories');
const plugins = require('../plugins');
const meta = require('../meta');
const middleware = require('../middleware');

const helpers = module.exports;

Expand All @@ -22,7 +21,7 @@ helpers.noScriptErrors = async function (req, res, error, httpStatus) {
if (req.body.noscript !== 'true') {
return res.status(httpStatus).send(error);
}

const middleware = require('../middleware');
const httpStatusString = httpStatus.toString();
await middleware.buildHeaderAsync(req, res);
res.status(httpStatus).render(httpStatusString, {
Expand Down Expand Up @@ -127,6 +126,7 @@ helpers.notAllowed = async function (req, res, error) {
if (res.locals.isAPI) {
helpers.formatApiResponse(403, res, error);
} else {
const middleware = require('../middleware');
await middleware.buildHeaderAsync(req, res);
res.status(403).render('403', {
path: req.path,
Expand Down
2 changes: 1 addition & 1 deletion src/middleware/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ Object.assign(middleware, {
require('./render')(middleware);
require('./maintenance')(middleware);
require('./user')(middleware);
require('./uploads')(middleware);
middleware.uploads = require('./uploads');
require('./headers')(middleware);
require('./expose')(middleware);
middleware.assert = require('./assert');
Expand Down
34 changes: 19 additions & 15 deletions src/middleware/uploads.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,24 +5,28 @@ const meta = require('../meta');
const helpers = require('./helpers');
const user = require('../user');

console.log('----cooldown', meta.config.uploadRateLimitCooldown * 1000, new Error('a').stack);
const cache = new LRU({
maxAge: meta.config.uploadRateLimitCooldown * 1000,
});

module.exports = function (middleware) {
middleware.ratelimitUploads = helpers.try(async (req, res, next) => {
const { uid } = req;
if (!meta.config.uploadRateLimitThreshold || (uid && await user.isAdminOrGlobalMod(uid))) {
return next();
}
exports.clearCache = function () {
cache.reset();
};

const count = (cache.peek(`${req.ip}:uploaded_file_count`) || 0) + req.files.files.length;
console.log('req.ip', req.ip, count, req.files.files.length, meta.config.uploadRateLimitThreshold);
if (count > meta.config.uploadRateLimitThreshold) {
return next(new Error(['[[error:upload-ratelimit-reached]]']));
}
exports.ratelimit = helpers.try(async (req, res, next) => {
const { uid } = req;
if (!meta.config.uploadRateLimitThreshold || (uid && await user.isAdminOrGlobalMod(uid))) {
return next();
}

const count = (cache.peek(`${req.ip}:uploaded_file_count`) || 0) + req.files.files.length;
console.log('req.ip', req.ip, count, req.files.files.length, meta.config.uploadRateLimitThreshold);
if (count > meta.config.uploadRateLimitThreshold) {
return next(new Error(['[[error:upload-ratelimit-reached]]']));
}

cache.set(`${req.ip}:uploaded_file_count`, count);
next();
});

cache.set(`${req.ip}:uploaded_file_count`, count);
next();
});
};
2 changes: 1 addition & 1 deletion src/routes/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ module.exports = function (app, middleware, controllers) {
middleware.maintenanceMode,
multipartMiddleware,
middleware.validateFiles,
middleware.ratelimitUploads,
middleware.uploads.ratelimit,
middleware.applyCSRF,
];

Expand Down
2 changes: 1 addition & 1 deletion src/routes/write/topics.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ module.exports = function () {
setupApiRoute(router, 'delete', '/:tid/tags', [...middlewares, middleware.assert.topic], controllers.write.topics.deleteTags);

setupApiRoute(router, 'get', '/:tid/thumbs', [], controllers.write.topics.getThumbs);
setupApiRoute(router, 'post', '/:tid/thumbs', [multipartMiddleware, middleware.validateFiles, middleware.ratelimitUploads, ...middlewares], controllers.write.topics.addThumb);
setupApiRoute(router, 'post', '/:tid/thumbs', [multipartMiddleware, middleware.validateFiles, middleware.uploads.ratelimit, ...middlewares], controllers.write.topics.addThumb);
setupApiRoute(router, 'put', '/:tid/thumbs', [...middlewares, middleware.checkRequired.bind(null, ['tid'])], controllers.write.topics.migrateThumbs);
setupApiRoute(router, 'delete', '/:tid/thumbs', [...middlewares, middleware.checkRequired.bind(null, ['path'])], controllers.write.topics.deleteThumb);
setupApiRoute(router, 'put', '/:tid/thumbs/order', [...middlewares, middleware.checkRequired.bind(null, ['path', 'order'])], controllers.write.topics.reorderThumbs);
Expand Down
2 changes: 2 additions & 0 deletions test/mocks/databasemock.js
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,7 @@ async function setupMockDefaults() {
require('../../src/groups').cache.reset();
require('../../src/posts/cache').reset();
require('../../src/cache').reset();
require('../../src/middleware/uploads').clearCache();

winston.info('test_database flushed');
await setupDefaultConfigs(meta);
Expand All @@ -185,6 +186,7 @@ async function setupMockDefaults() {
meta.config.initialPostDelay = 0;
meta.config.newbiePostDelay = 0;
meta.config.autoDetectLang = 0;
// meta.config.uploadRateLimitCooldown = 1;

await enableDefaultPlugins();

Expand Down
2 changes: 1 addition & 1 deletion test/uploads.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ describe('Upload Controllers', () => {
it('should fail if the user exceeds the upload rate limit threshold', (done) => {
const oldValue = meta.config.allowedFileExtensions;
meta.config.allowedFileExtensions = 'png,jpg,bmp,html';

require('../src/middleware/uploads').clearCache();
// why / 2? see: helpers.uploadFile for a weird quirk where we actually upload 2 files per upload in our tests.
console.log('times', (meta.config.uploadRateLimitThreshold / 2) + 1);
const times = (meta.config.uploadRateLimitThreshold / 2) + 1;
Expand Down

0 comments on commit 2ea468d

Please sign in to comment.