summary refs log tree commit diff
path: root/src/util/Constants.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/Constants.ts')
-rw-r--r--src/util/Constants.ts174
1 files changed, 120 insertions, 54 deletions
diff --git a/src/util/Constants.ts b/src/util/Constants.ts

index ee2684b8..35d11615 100644 --- a/src/util/Constants.ts +++ b/src/util/Constants.ts
@@ -1,73 +1,139 @@ import crypto from "crypto"; import { VerifyOptions } from "jsonwebtoken"; +import fs from "fs"; + +export interface RateLimit { + count: number; + timespan: number; +} export interface DefaultOptions { - user: { - maxGuilds: number; - maxUsername: number; - maxFriends: number; - }; - guild: { - maxRoles: number; - maxMembers: number; - maxChannels: number; - maxChannelsInCategory: number; - hideOfflineMember: number; - }; - message: { - characters: number; - ttsCharacters: number; - maxReactions: number; - maxAttachmentSize: number; - }; - channel: { - maxPins: number; - maxTopic: number; + limits: { + user: { + maxGuilds: number; + maxUsername: number; + maxFriends: number; + }; + guild: { + maxRoles: number; + maxMembers: number; + maxChannels: number; + maxChannelsInCategory: number; + hideOfflineMember: number; + }; + message: { + characters: number; + ttsCharacters: number; + maxReactions: number; + maxAttachmentSize: number; + }; + channel: { + maxPins: number; + maxTopic: number; + }; + rate: { + ip: { + enabled: boolean; + count: number; + timespan: number; + }; + routes: { + auth?: { + login?: RateLimit; + register?: RateLimit; + }; + channel?: {}; + // TODO: rate limit configuration for all routes + }; + }; }; - server: { + security: { jwtSecret: string; - ipRateLimit: { + forwadedFor: string | null; + captcha: { enabled: boolean; - count: number; - timespan: number; + service: "recaptcha" | null; // TODO: hcaptcha, custom + sitekey: string | null; }; - forwadedFor: false | string; + }; + register: { + email: { + required: boolean; + allowlist: boolean; + blocklist: boolean; + domains: string[]; + }; + dateOfBirth: { + required: boolean; + minimum: number; // in years + }; + requireCaptcha: boolean; + requireInvite: boolean; + allowNewRegistration: boolean; + allowMultipleAccounts: boolean; }; } export const DefaultOptions: DefaultOptions = { - user: { - maxGuilds: 100, - maxUsername: 32, - maxFriends: 1000, - }, - guild: { - maxRoles: 250, - maxMembers: 250000, - maxChannels: 500, - maxChannelsInCategory: 50, - hideOfflineMember: 1000, - }, - message: { - characters: 2000, - ttsCharacters: 200, - maxReactions: 20, - maxAttachmentSize: 8388608, - }, - channel: { - maxPins: 50, - maxTopic: 1024, + limits: { + user: { + maxGuilds: 100, + maxUsername: 32, + maxFriends: 1000, + }, + guild: { + maxRoles: 250, + maxMembers: 250000, + maxChannels: 500, + maxChannelsInCategory: 50, + hideOfflineMember: 1000, + }, + message: { + characters: 2000, + ttsCharacters: 200, + maxReactions: 20, + maxAttachmentSize: 8388608, + }, + channel: { + maxPins: 50, + maxTopic: 1024, + }, + rate: { + ip: { + enabled: true, + count: 1000, + timespan: 1000 * 60 * 10, + }, + routes: {}, + }, }, - server: { + security: { jwtSecret: crypto.randomBytes(256).toString("base64"), - ipRateLimit: { - enabled: true, - count: 1000, - timespan: 1000 * 60 * 10, - }, - forwadedFor: false, + forwadedFor: null, // forwadedFor: "X-Forwarded-For" // nginx/reverse proxy // forwadedFor: "CF-Connecting-IP" // cloudflare: + captcha: { + enabled: false, + service: null, + sitekey: null, + }, + }, + register: { + email: { + required: true, + allowlist: false, + blocklist: true, + domains: [], // TODO: efficicently save domain blocklist in database + // domains: fs.readFileSync(__dirname + "/blockedEmailDomains.txt", { encoding: "utf8" }).split("\n"), + }, + dateOfBirth: { + required: true, + minimum: 13, + }, + requireInvite: false, + requireCaptcha: true, + allowNewRegistration: true, + allowMultipleAccounts: true, }, };