Rate limit Socket IO communication - WIP (#4036)

Includes settings
    Includes i18n
    Includes a nice notification
    Disconnects on rate limit
    Includes feeding into metrics/stats
    Include console warn to server console.
This commit is contained in:
John McLear 2020-07-19 22:44:24 +01:00 committed by GitHub
parent 4f5cf2dc63
commit 40014d8230
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 75 additions and 8 deletions

View file

@ -37,6 +37,12 @@ var channels = require("channels");
var stats = require('../stats');
var remoteAddress = require("../utils/RemoteAddress").remoteAddress;
const nodeify = require("nodeify");
const { RateLimiterMemory } = require('rate-limiter-flexible');
const rateLimiter = new RateLimiterMemory({
points: settings.commitRateLimiting.points,
duration: settings.commitRateLimiting.duration
});
/**
* A associative array that saves informations about a session
@ -164,6 +170,19 @@ exports.handleDisconnect = async function(client)
*/
exports.handleMessage = async function(client, message)
{
var env = process.env.NODE_ENV || 'development';
if (env === 'production') {
try {
await rateLimiter.consume(client.handshake.address); // consume 1 point per event from IP
}catch(e){
console.warn("Rate limited: ", client.handshake.address, " to reduce the amount of rate limiting that happens edit the rateLimit values in settings.json");
stats.meter('rateLimited').mark();
client.json.send({disconnect:"rateLimited"});
return;
}
}
if (message == null) {
return;
}

View file

@ -343,6 +343,22 @@ exports.importExportRateLimiting = {
"max": 10
};
/*
* From Etherpad 1.9.0 onwards, commits from individual users are rate limited
*
* The default is to allow at most 10 changes per IP in a 1 second window.
* After that the change is rejected.
*
* See https://github.com/animir/node-rate-limiter-flexible/wiki/Overall-example#websocket-single-connection-prevent-flooding for more options
*/
exports.commitRateLimiting = {
// duration of the rate limit window (seconds)
"duration": 1,
// maximum number of chanes per IP to allow during the rate limit window
"points": 10
};
/*
* From Etherpad 1.8.3 onwards, the maximum allowed size for a single imported
* file is always bounded.