diff options
author | Diego Magdaleno <diegomagdaleno@protonmail.com> | 2021-05-17 19:00:50 -0500 |
---|---|---|
committer | Diego Magdaleno <diegomagdaleno@protonmail.com> | 2021-05-17 19:00:50 -0500 |
commit | bb2d3715ea6be7a5fb62cf8d379f4eaee8f6ba17 (patch) | |
tree | 87085dcb7ecb77176061101f5643ccc53a406da0 /src/util | |
parent | Config: Those bracks dont go there (diff) | |
download | server-bb2d3715ea6be7a5fb62cf8d379f4eaee8f6ba17.tar.xz |
Config: Start working on the config refactor
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/Config.ts | 223 |
1 files changed, 131 insertions, 92 deletions
diff --git a/src/util/Config.ts b/src/util/Config.ts index f1f0f458..97322f9e 100644 --- a/src/util/Config.ts +++ b/src/util/Config.ts @@ -1,19 +1,4 @@ -import { Config, Snowflake } from "@fosscord/server-util"; -import crypto from "crypto"; - -export default { - init() { - return Config.init({ api: DefaultOptions }); - }, - get(): DefaultOptions { - return Config.getAll().api; - }, - set(val: any) { - return Config.setAll({ api: val }); - }, - getAll: Config.getAll, - setAll: Config.setAll, -}; +import Ajv, {JTDSchemaType} from "ajv/dist/jtd" export interface RateLimitOptions { count: number; @@ -64,7 +49,7 @@ export interface DefaultOptions { login?: RateLimitOptions; register?: RateLimitOptions; }; - channel?: {}; + channel?: string; // TODO: rate limit configuration for all routes }; }; @@ -107,85 +92,139 @@ export interface DefaultOptions { }; } -export const DefaultOptions: DefaultOptions = { - general: { - instance_id: Snowflake.generate(), +const schema: JTDSchemaType<DefaultOptions, {rateLimitOptions: RateLimitOptions}> = { + definitions: { + rateLimitOptions: { + properties: { + count: {type: "int32"}, + timespan: {type: "int32"} + } + } }, - permissions: { - user: { - createGuilds: true, + properties: { + general: { + properties: { + instance_id: {type: "string"} + } }, - }, - limits: { - user: { - maxGuilds: 100, - maxUsername: 32, - maxFriends: 1000, + permissions: { + properties: { + user: { + properties: { + createGuilds: {type: "boolean"} + } + } + } }, - guild: { - maxRoles: 250, - maxMembers: 250000, - maxChannels: 500, - maxChannelsInCategory: 50, - hideOfflineMember: 1000, + limits: { + properties: { + user: { + properties: { + maxGuilds: {type: "int32"}, + maxFriends: {type: "int32"}, + maxUsername: {type: "int32"} + } + }, + guild: { + properties: { + maxRoles: {type: "int32"}, + maxMembers: {type: "int32"}, + maxChannels: {type: "int32"}, + maxChannelsInCategory: {type: "int32"}, + hideOfflineMember: {type: "int32"} + } + }, + message: { + properties: { + characters: {type: "int32"}, + ttsCharacters: {type: "int32"}, + maxReactions: {type: "int32"}, + maxAttachmentSize: {type: "int32"}, + maxBulkDelete: {type: "int32"} + } + }, + channel: { + properties: { + maxPins: {type: "int32"}, + maxTopic: {type: "int32"}, + }, + }, + rate: { + properties: { + ip: { + properties: { + enabled: {type: "boolean"}, + count: {type: "int32"}, + timespan: {type: "int32"}, + } + }, + routes: { + optionalProperties: { + auth: { + optionalProperties: { + login: {ref: 'rateLimitOptions'}, + register: {ref: 'rateLimitOptions'} + } + }, + channel: {type: "string"} + } + } + } + } + } }, - message: { - characters: 2000, - ttsCharacters: 200, - maxReactions: 20, - maxAttachmentSize: 8388608, - maxBulkDelete: 100, + security: { + properties: { + jwtSecret: {type: "string"}, + forwadedFor: {type: "string", nullable: true}, + captcha: { + properties: { + enabled: {type: "boolean"}, + service: {enum: ['hcaptcha', 'recaptcha'], nullable: true}, + sitekey: {type: "string", nullable: true}, + secret: {type: "string", nullable: true} + } + } + } }, - channel: { - maxPins: 50, - maxTopic: 1024, + login: { + properties: { + requireCaptcha: {type: "boolean"} + } }, - rate: { - ip: { - enabled: true, - count: 1000, - timespan: 1000 * 60 * 10, + register: { + properties: { + email: { + properties: { + required: {type: "boolean"}, + allowlist: {type: "boolean"}, + blocklist: {type: "boolean"}, + domains: { elements: { + type: "string" + } + } + } }, - routes: {}, - }, - }, - security: { - jwtSecret: crypto.randomBytes(256).toString("base64"), - forwadedFor: null, - // forwadedFor: "X-Forwarded-For" // nginx/reverse proxy - // forwadedFor: "CF-Connecting-IP" // cloudflare: - captcha: { - enabled: false, - service: null, - sitekey: null, - secret: null, - }, - }, - login: { - requireCaptcha: false, - }, - register: { - email: { - required: true, - allowlist: false, - blocklist: true, - domains: [], // TODO: efficiently 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, - password: { - minLength: 8, - minNumbers: 2, - minUpperCase: 2, - minSymbols: 0, - blockInsecureCommonPasswords: false, - }, - }, -}; + dateOfBirth: { + properties: { + required: {type: "boolean"}, + minimum: {type: "int32"} + } + }, + requireCaptcha: {type: "boolean"}, + requireInvite: {type: "boolean"}, + allowNewRegistration: {type: "boolean"}, + allowMultipleAccounts: {type: "boolean"}, + password: { + properties: { + minLength: {type: "int32"}, + minNumbers: {type: "int32"}, + minUpperCase: {type: "int32"}, + minSymbols: {type: "int32"}, + blockInsecureCommonPasswords: {type: "boolean"} + } + } + } + } +} +} \ No newline at end of file |