mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-06 11:36:58 +03:00
Add vote rate limit
This commit is contained in:
@@ -22,5 +22,12 @@
|
|||||||
"mode": "development",
|
"mode": "development",
|
||||||
"readOnly": false,
|
"readOnly": false,
|
||||||
"webhooks": [],
|
"webhooks": [],
|
||||||
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"] // List of supported categories any other category will be rejected
|
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"], // List of supported categories any other category will be rejected
|
||||||
|
"rateLimit": {
|
||||||
|
"vote": {
|
||||||
|
"windowMs": 900000, // 15 minutes
|
||||||
|
"max": 20, // 20 requests in 15min time window
|
||||||
|
"message": "Too many votes, please try again later"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
10
package-lock.json
generated
10
package-lock.json
generated
@@ -785,6 +785,11 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"express-rate-limit": {
|
||||||
|
"version": "5.1.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-5.1.3.tgz",
|
||||||
|
"integrity": "sha512-TINcxve5510pXj4n9/1AMupkj3iWxl3JuZaWhCdYDlZeoCPqweGZrxbrlqTCFb1CT5wli7s8e2SH/Qz2c9GorA=="
|
||||||
|
},
|
||||||
"extend": {
|
"extend": {
|
||||||
"version": "3.0.2",
|
"version": "3.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
|
||||||
@@ -1866,6 +1871,11 @@
|
|||||||
"semver": "^5.7.0"
|
"semver": "^5.7.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node-fetch": {
|
||||||
|
"version": "2.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
|
||||||
|
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
|
||||||
|
},
|
||||||
"node-forge": {
|
"node-forge": {
|
||||||
"version": "0.7.6",
|
"version": "0.7.6",
|
||||||
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
|
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
|
||||||
|
|||||||
@@ -14,13 +14,14 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"better-sqlite3": "^5.4.3",
|
"better-sqlite3": "^5.4.3",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
|
"express-rate-limit": "^5.1.3",
|
||||||
"http": "0.0.0",
|
"http": "0.0.0",
|
||||||
"iso8601-duration": "^1.2.0",
|
"iso8601-duration": "^1.2.0",
|
||||||
|
"node-fetch": "^2.6.0",
|
||||||
"redis": "^3.0.2",
|
"redis": "^3.0.2",
|
||||||
"sync-mysql": "^3.0.1",
|
"sync-mysql": "^3.0.1",
|
||||||
"uuid": "^3.3.2",
|
"uuid": "^3.3.2",
|
||||||
"youtube-api": "^2.0.10",
|
"youtube-api": "^2.0.10"
|
||||||
"node-fetch": "^2.6.0"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"mocha": "^7.1.1",
|
"mocha": "^7.1.1",
|
||||||
|
|||||||
@@ -3,8 +3,11 @@ var express = require('express');
|
|||||||
var app = express();
|
var app = express();
|
||||||
var config = require('./config.js');
|
var config = require('./config.js');
|
||||||
var redis = require('./utils/redis.js');
|
var redis = require('./utils/redis.js');
|
||||||
|
const getIP = require('./utils/getIP.js');
|
||||||
|
const getHash = require('./utils/getHash.js');
|
||||||
|
|
||||||
// Middleware
|
// Middleware
|
||||||
|
const voteRateLimitMiddleware = require('./middleware/voteRateLimit.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');
|
||||||
@@ -59,8 +62,8 @@ 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', voteOnSponsorTime.endpoint);
|
app.get('/api/voteOnSponsorTime', voteRateLimitMiddleware, voteOnSponsorTime.endpoint);
|
||||||
app.post('/api/voteOnSponsorTime', voteOnSponsorTime.endpoint);
|
app.post('/api/voteOnSponsorTime', voteRateLimitMiddleware, voteOnSponsorTime.endpoint);
|
||||||
|
|
||||||
//Endpoint when a sponsorTime is used up
|
//Endpoint when a sponsorTime is used up
|
||||||
app.get('/api/viewedVideoSponsorTime', viewedVideoSponsorTime);
|
app.get('/api/viewedVideoSponsorTime', viewedVideoSponsorTime);
|
||||||
|
|||||||
18
src/middleware/voteRateLimit.js
Normal file
18
src/middleware/voteRateLimit.js
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
const config = require('../config.js');
|
||||||
|
const getIP = require('../utils/getIP.js');
|
||||||
|
const getHash = require('../utils/getHash.js');
|
||||||
|
const rateLimit = require('express-rate-limit');
|
||||||
|
|
||||||
|
module.exports = rateLimit({
|
||||||
|
windowMs: config.rateLimit.vote.windowMs,
|
||||||
|
max: config.rateLimit.vote.max,
|
||||||
|
message: config.rateLimit.vote.message,
|
||||||
|
headers: false,
|
||||||
|
keyGenerator: (req /*, res*/) => {
|
||||||
|
return getHash(req.ip, 1);
|
||||||
|
},
|
||||||
|
skip: (/*req, res*/) => {
|
||||||
|
// skip rate limit if running in test mode
|
||||||
|
return process.env.npm_lifecycle_script === 'node test.js';
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -49,5 +49,12 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"]
|
"categoryList": ["sponsor", "intro", "outro", "interaction", "selfpromo", "music_offtopic"],
|
||||||
|
"rateLimit": {
|
||||||
|
"vote": {
|
||||||
|
"windowMs": 900000,
|
||||||
|
"max": 20,
|
||||||
|
"message": "Too many votes, please try again later"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user