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,
},
};
|