mirror of
				https://github.com/NodeBB/NodeBB.git
				synced 2025-10-27 17:16:14 +01:00 
			
		
		
		
	test: clear cache between runs, require middleware later in helpers
This commit is contained in:
		
				
					committed by
					
						 Andrew Rodrigues
						Andrew Rodrigues
					
				
			
			
				
	
			
			
			
						parent
						
							d15e27107e
						
					
				
				
					commit
					2ea468daa3
				
			| @@ -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; | ||||
|  | ||||
| @@ -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, { | ||||
| @@ -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, | ||||
|   | ||||
| @@ -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'); | ||||
|   | ||||
| @@ -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(); | ||||
| 		} | ||||
|  | ||||
| 		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(); | ||||
| 	}); | ||||
| exports.clearCache = function () { | ||||
| 	cache.reset(); | ||||
| }; | ||||
|  | ||||
| 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(); | ||||
| }); | ||||
|  | ||||
|   | ||||
| @@ -31,7 +31,7 @@ module.exports = function (app, middleware, controllers) { | ||||
| 		middleware.maintenanceMode, | ||||
| 		multipartMiddleware, | ||||
| 		middleware.validateFiles, | ||||
| 		middleware.ratelimitUploads, | ||||
| 		middleware.uploads.ratelimit, | ||||
| 		middleware.applyCSRF, | ||||
| 	]; | ||||
|  | ||||
|   | ||||
| @@ -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); | ||||
|   | ||||
| @@ -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); | ||||
| @@ -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(); | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user