mirror of
https://github.com/monkeytypegame/monkeytype.git
synced 2025-02-27 00:04:37 +08:00
298 lines
6.7 KiB
TypeScript
298 lines
6.7 KiB
TypeScript
import { Response, NextFunction } from "express";
|
|
import rateLimit, { Options } from "express-rate-limit";
|
|
import MonkeyError from "../utils/error";
|
|
|
|
const REQUEST_MULTIPLIER = process.env.MODE === "dev" ? 100 : 1;
|
|
|
|
const getAddress = (req: MonkeyTypes.Request, _res: Response): string => {
|
|
return (req.headers["cf-connecting-ip"] ||
|
|
req.headers["x-forwarded-for"] ||
|
|
req.ip ||
|
|
"255.255.255.255") as string;
|
|
};
|
|
|
|
const customHandler = (
|
|
_req: MonkeyTypes.Request,
|
|
_res: Response,
|
|
_next: NextFunction,
|
|
_options: Options
|
|
): void => {
|
|
throw new MonkeyError(429, "Too many attempts, please try again later.");
|
|
};
|
|
|
|
const ONE_HOUR = 1000 * 60 * 60;
|
|
|
|
// Config Routing
|
|
export const configUpdate = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 500 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const configGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 120 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// Leaderboards Routing
|
|
export const leaderboardsGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// New Quotes Routing
|
|
export const newQuotesGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 500 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const newQuotesAdd = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const newQuotesAction = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 500 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// Quote Ratings Routing
|
|
export const quoteRatingsGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 500 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const quoteRatingsSubmit = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 500 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// Quote reporting
|
|
export const quoteReportSubmit = rateLimit({
|
|
windowMs: 30 * 60 * 1000, // 30 min
|
|
max: 50 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// Presets Routing
|
|
export const presetsGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const presetsAdd = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const presetsRemove = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const presetsEdit = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// PSA (Public Service Announcement) Routing
|
|
export const psaGet = rateLimit({
|
|
windowMs: 60 * 1000,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// Results Routing
|
|
export const resultsGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const resultsAdd = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 500 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const resultsTagsUpdate = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 30 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const resultsDeleteAll = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 10 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const resultsLeaderboardGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const resultsLeaderboardQualificationGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// Users Routing
|
|
export const userGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userSignup = rateLimit({
|
|
windowMs: 24 * ONE_HOUR, // 1 day
|
|
max: 3 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userDelete = rateLimit({
|
|
windowMs: 24 * ONE_HOUR, // 1 day
|
|
max: 3 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userCheckName = rateLimit({
|
|
windowMs: 60 * 1000,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userUpdateName = rateLimit({
|
|
windowMs: 24 * ONE_HOUR, // 1 day
|
|
max: 3 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userUpdateLBMemory = rateLimit({
|
|
windowMs: 60 * 1000,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userUpdateEmail = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userClearPB = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userTagsGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userTagsRemove = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 30 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userTagsClearPB = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 60 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userTagsEdit = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 30 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userTagsAdd = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 30 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const userDiscordLink = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 15 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const usersTagsEdit = userDiscordLink;
|
|
|
|
export const userDiscordUnlink = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 15 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
// ApeKeys Routing
|
|
export const apeKeysGet = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 120 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const apeKeysGenerate = rateLimit({
|
|
windowMs: ONE_HOUR,
|
|
max: 15 * REQUEST_MULTIPLIER,
|
|
keyGenerator: getAddress,
|
|
handler: customHandler,
|
|
});
|
|
|
|
export const apeKeysUpdate = apeKeysGenerate;
|
|
|
|
export const apeKeysDelete = apeKeysGenerate;
|