Merge pull request #159 from ajayyy/experimental

Setup different ratelimit for views and votes
This commit is contained in:
Ajay Ramachandran
2020-10-11 13:12:49 -04:00
committed by GitHub
4 changed files with 38 additions and 18 deletions

View File

@@ -27,7 +27,13 @@
"vote": { "vote": {
"windowMs": 900000, // 15 minutes "windowMs": 900000, // 15 minutes
"max": 20, // 20 requests in 15min time window "max": 20, // 20 requests in 15min time window
"message": "Too many votes, please try again later" "message": "Too many votes, please try again later",
"statusCode": 200
},
"view": {
"windowMs": 900000, // 15 minutes
"max": 20, // 20 requests in 15min time window
"statusCode": 200
} }
} }
} }

View File

@@ -7,7 +7,7 @@ const getIP = require('./utils/getIP.js');
const getHash = require('./utils/getHash.js'); const getHash = require('./utils/getHash.js');
// Middleware // Middleware
const voteRateLimitMiddleware = require('./middleware/voteRateLimit.js'); const rateLimitMiddleware = require('./middleware/requestRateLimit.js');
var corsMiddleware = require('./middleware/cors.js'); var corsMiddleware = require('./middleware/cors.js');
var loggerMiddleware = require('./middleware/logger.js'); var loggerMiddleware = require('./middleware/logger.js');
const userCounter = require('./middleware/userCounter.js'); const userCounter = require('./middleware/userCounter.js');
@@ -34,6 +34,14 @@ var getIsUserVIP = require('./routes/getIsUserVIP.js');
var oldGetVideoSponsorTimes = require('./routes/oldGetVideoSponsorTimes.js'); var oldGetVideoSponsorTimes = require('./routes/oldGetVideoSponsorTimes.js');
var oldSubmitSponsorTimes = require('./routes/oldSubmitSponsorTimes.js'); var oldSubmitSponsorTimes = require('./routes/oldSubmitSponsorTimes.js');
// Rate limit endpoint lists
let voteEndpoints = [voteOnSponsorTime.endpoint];
let viewEndpoints = [viewedVideoSponsorTime];
if (config.rateLimit) {
// if (config.rateLimit.vote) voteEndpoints.unshift(rateLimitMiddleware(config.rateLimit.vote));
if (config.rateLimit.view) viewEndpoints.unshift(rateLimitMiddleware(config.rateLimit.view));
}
//setup CORS correctly //setup CORS correctly
app.use(corsMiddleware); app.use(corsMiddleware);
app.use(loggerMiddleware); app.use(loggerMiddleware);
@@ -62,12 +70,12 @@ app.post('/api/skipSegments', postSkipSegments);
app.get('/api/skipSegments/:prefix', getSkipSegmentsByHash); app.get('/api/skipSegments/:prefix', getSkipSegmentsByHash);
//voting endpoint //voting endpoint
app.get('/api/voteOnSponsorTime', voteRateLimitMiddleware, voteOnSponsorTime.endpoint); app.get('/api/voteOnSponsorTime', ...voteEndpoints);
app.post('/api/voteOnSponsorTime', voteRateLimitMiddleware, voteOnSponsorTime.endpoint); app.post('/api/voteOnSponsorTime', ...voteEndpoints);
//Endpoint when a sponsorTime is used up //Endpoint when a submission is skipped
app.get('/api/viewedVideoSponsorTime', voteRateLimitMiddleware, viewedVideoSponsorTime); app.get('/api/viewedVideoSponsorTime', ...viewEndpoints);
app.post('/api/viewedVideoSponsorTime', voteRateLimitMiddleware, viewedVideoSponsorTime); app.post('/api/viewedVideoSponsorTime', ...viewEndpoints);
//To set your username for the stats view //To set your username for the stats view
app.post('/api/setUsername', setUsername); app.post('/api/setUsername', setUsername);

View File

@@ -1,15 +1,15 @@
const config = require('../config.js');
const getIP = require('../utils/getIP.js'); const getIP = require('../utils/getIP.js');
const getHash = require('../utils/getHash.js'); const getHash = require('../utils/getHash.js');
const rateLimit = require('express-rate-limit'); const rateLimit = require('express-rate-limit');
module.exports = rateLimit({ module.exports = (limitConfig) => rateLimit({
windowMs: config.rateLimit.vote.windowMs, windowMs: limitConfig.windowMs,
max: config.rateLimit.vote.max, max: limitConfig.max,
message: config.rateLimit.vote.message, message: limitConfig.message,
statusCode: limitConfig.statusCode,
headers: false, headers: false,
keyGenerator: (req /*, res*/) => { keyGenerator: (req /*, res*/) => {
return getHash(req.ip, 1); return getHash(getIP(req), 1);
}, },
skip: (/*req, res*/) => { skip: (/*req, res*/) => {
// skip rate limit if running in test mode // skip rate limit if running in test mode

View File

@@ -51,10 +51,16 @@
], ],
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"], "categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"],
"rateLimit": { "rateLimit": {
"vote": { "vote": {
"windowMs": 900000, "windowMs": 900000,
"max": 20, "max": 20,
"message": "Too many votes, please try again later" "message": "Too many votes, please try again later",
"statusCode": 200
},
"view": {
"windowMs": 900000,
"max": 20,
"statusCode": 200
}
} }
}
} }