X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Fmiddlewares%2Frate-limiter.ts;h=1eef8b360d679f7025a001dcff6c9c48f26c08e7;hb=21609258dee096e1ecc3af7a2b9e841742ef7f7d;hp=bc95139693192d8d25811031c56d970482169307;hpb=e5a781ec25191c0dbb4a991f25307732d798619d;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/middlewares/rate-limiter.ts b/server/middlewares/rate-limiter.ts index bc9513969..1eef8b360 100644 --- a/server/middlewares/rate-limiter.ts +++ b/server/middlewares/rate-limiter.ts @@ -1,10 +1,12 @@ +import express from 'express' +import RateLimit, { Options as RateLimitHandlerOptions } from 'express-rate-limit' +import { RunnerModel } from '@server/models/runner/runner' import { UserRole } from '@shared/models' -import RateLimit from 'express-rate-limit' import { optionalAuthenticate } from './auth' const whitelistRoles = new Set([ UserRole.ADMINISTRATOR, UserRole.MODERATOR ]) -function buildRateLimiter (options: { +export function buildRateLimiter (options: { windowMs: number max: number skipFailedRequests?: boolean @@ -15,17 +17,33 @@ function buildRateLimiter (options: { skipFailedRequests: options.skipFailedRequests, handler: (req, res, next, options) => { + // Bypass rate limit for registered runners + if (req.body?.runnerToken) { + return RunnerModel.loadByToken(req.body.runnerToken) + .then(runner => { + if (runner) return next() + + return sendRateLimited(res, options) + }) + } + + // Bypass rate limit for admins/moderators return optionalAuthenticate(req, res, () => { if (res.locals.authenticated === true && whitelistRoles.has(res.locals.oauth.token.User.role)) { return next() } - return res.status(options.statusCode).send(options.message) + return sendRateLimited(res, options) }) } }) } -export { - buildRateLimiter +// --------------------------------------------------------------------------- +// Private +// --------------------------------------------------------------------------- + +function sendRateLimited (res: express.Response, options: RateLimitHandlerOptions) { + return res.status(options.statusCode).send(options.message) + }