summary refs log tree commit diff
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/package-lock.json41
-rw-r--r--api/package.json10
-rw-r--r--api/src/util/Config.ts372
3 files changed, 37 insertions, 386 deletions
diff --git a/api/package-lock.json b/api/package-lock.json

index 3308a6be..6305b089 100644 --- a/api/package-lock.json +++ b/api/package-lock.json
@@ -19,7 +19,6 @@ "atomically": "^1.7.0", "bcrypt": "^5.0.1", "body-parser": "^1.19.0", - "canvas": "^2.8.0", "cheerio": "^1.0.0-rc.9", "dot-prop": "^6.0.1", "dotenv": "^8.2.0", @@ -2703,7 +2702,10 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "dev": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", "nan": "^2.14.0", @@ -3686,6 +3688,9 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { "mimic-response": "^2.0.0" }, @@ -7184,6 +7189,9 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "optional": true, + "peer": true, "engines": { "node": ">=8" }, @@ -7515,7 +7523,10 @@ "node_modules/nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true, + "peer": true }, "node_modules/nanoassert": { "version": "1.1.0", @@ -9528,6 +9539,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, "funding": [ { "type": "github", @@ -9547,6 +9559,9 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "optional": true, + "peer": true, "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -13762,6 +13777,9 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.8.0.tgz", "integrity": "sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==", + "dev": true, + "optional": true, + "peer": true, "requires": { "@mapbox/node-pre-gyp": "^1.0.0", "nan": "^2.14.0", @@ -14609,6 +14627,9 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "dev": true, + "optional": true, + "peer": true, "requires": { "mimic-response": "^2.0.0" } @@ -17420,7 +17441,10 @@ "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", + "dev": true, + "optional": true, + "peer": true }, "minimalistic-assert": { "version": "1.0.1", @@ -17682,7 +17706,10 @@ "nan": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz", - "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==" + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==", + "dev": true, + "optional": true, + "peer": true }, "nanoassert": { "version": "1.1.0", @@ -19304,12 +19331,16 @@ "simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true }, "simple-get": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "dev": true, + "optional": true, + "peer": true, "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", diff --git a/api/package.json b/api/package.json
index 967c9df8..7d957ed8 100644 --- a/api/package.json +++ b/api/package.json
@@ -41,7 +41,6 @@ "atomically": "^1.7.0", "bcrypt": "^5.0.1", "body-parser": "^1.19.0", - "canvas": "^2.8.0", "cheerio": "^1.0.0-rc.9", "dot-prop": "^6.0.1", "dotenv": "^8.2.0", @@ -61,10 +60,7 @@ "mongoose-long": "^0.3.2", "multer": "^1.4.2", "node-fetch": "^2.6.1", - "require_optional": "^1.0.1" - }, - "devDependencies": { - "0x": "^4.10.2", + "require_optional": "^1.0.1", "@types/amqplib": "^0.8.1", "@types/bcrypt": "^5.0.0", "@types/express": "^4.17.9", @@ -74,10 +70,6 @@ "@types/node": "^14.17.9", "@types/node-fetch": "^2.5.7", "@zerollup/ts-transform-paths": "^1.7.18", - "caxa": "^2.1.0", - "jest": "^26.6.3", - "saslprep": "^1.0.3", - "ts-node": "^9.1.1", "ts-node-dev": "^1.1.6", "typescript": "^4.1.2" } diff --git a/api/src/util/Config.ts b/api/src/util/Config.ts deleted file mode 100644
index c86afbe7..00000000 --- a/api/src/util/Config.ts +++ /dev/null
@@ -1,372 +0,0 @@ -// @ts-nocheck -import Ajv, { JSONSchemaType } from "ajv"; -import { getConfigPathForFile } from "@fosscord/util/dist/util/Config"; -import { Config } from "@fosscord/util"; - -export interface RateLimitOptions { - count: number; - timespan: number; -} - -export interface DefaultOptions { - gateway: string; - general: { - instance_id: string; - }; - permissions: { - user: { - createGuilds: boolean; - }; - }; - 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; - maxBulkDelete: number; - }; - channel: { - maxPins: number; - maxTopic: number; - }; - rate: { - ip: { - enabled: boolean; - count: number; - timespan: number; - }; - routes: { - auth?: { - login?: RateLimitOptions; - register?: RateLimitOptions; - }; - channel?: string; - // TODO: rate limit configuration for all routes - }; - }; - }; - security: { - jwtSecret: string; - forwadedFor: string | null; - captcha: { - enabled: boolean; - service: "recaptcha" | "hcaptcha" | null; // TODO: hcaptcha, custom - sitekey: string | null; - secret: string | null; - }; - }; - login: { - requireCaptcha: boolean; - }; - register: { - email: { - necessary: boolean; - allowlist: boolean; - blocklist: boolean; - domains: string[]; - }; - dateOfBirth: { - necessary: boolean; - minimum: number; // in years - }; - requireCaptcha: boolean; - requireInvite: boolean; - allowNewRegistration: boolean; - allowMultipleAccounts: boolean; - password: { - minLength: number; - minNumbers: number; - minUpperCase: number; - minSymbols: number; - blockInsecureCommonPasswords: boolean; // TODO: efficiently save password blocklist in database - }; - }; -} - -const schema: JSONSchemaType<DefaultOptions> & { - definitions: { - rateLimitOptions: JSONSchemaType<RateLimitOptions>; - }; -} = { - type: "object", - definitions: { - rateLimitOptions: { - type: "object", - properties: { - count: { type: "number" }, - timespan: { type: "number" } - }, - required: ["count", "timespan"] - } - }, - properties: { - gateway: { - type: "string" - }, - general: { - type: "object", - properties: { - instance_id: { - type: "string" - } - }, - required: ["instance_id"], - additionalProperties: false - }, - permissions: { - type: "object", - properties: { - user: { - type: "object", - properties: { - createGuilds: { - type: "boolean" - } - }, - required: ["createGuilds"], - additionalProperties: false - } - }, - required: ["user"], - additionalProperties: false - }, - limits: { - type: "object", - properties: { - user: { - type: "object", - properties: { - maxFriends: { - type: "number" - }, - maxGuilds: { - type: "number" - }, - maxUsername: { - type: "number" - } - }, - required: ["maxFriends", "maxGuilds", "maxUsername"], - additionalProperties: false - }, - guild: { - type: "object", - properties: { - maxRoles: { - type: "number" - }, - maxMembers: { - type: "number" - }, - maxChannels: { - type: "number" - }, - maxChannelsInCategory: { - type: "number" - }, - hideOfflineMember: { - type: "number" - } - }, - required: ["maxRoles", "maxMembers", "maxChannels", "maxChannelsInCategory", "hideOfflineMember"], - additionalProperties: false - }, - message: { - type: "object", - properties: { - characters: { - type: "number" - }, - ttsCharacters: { - type: "number" - }, - maxReactions: { - type: "number" - }, - maxAttachmentSize: { - type: "number" - }, - maxBulkDelete: { - type: "number" - } - }, - required: ["characters", "ttsCharacters", "maxReactions", "maxAttachmentSize", "maxBulkDelete"], - additionalProperties: false - }, - channel: { - type: "object", - properties: { - maxPins: { - type: "number" - }, - maxTopic: { - type: "number" - } - }, - required: ["maxPins", "maxTopic"], - additionalProperties: false - }, - rate: { - type: "object", - properties: { - ip: { - type: "object", - properties: { - enabled: { type: "boolean" }, - count: { type: "number" }, - timespan: { type: "number" } - }, - required: ["enabled", "count", "timespan"], - additionalProperties: false - }, - routes: { - type: "object", - properties: { - auth: { - type: "object", - properties: { - login: { $ref: "#/definitions/rateLimitOptions" }, - register: { $ref: "#/definitions/rateLimitOptions" } - }, - nullable: true, - required: [], - additionalProperties: false - }, - channel: { - type: "string", - nullable: true - } - }, - required: [], - additionalProperties: false - } - }, - required: ["ip", "routes"] - } - }, - required: ["channel", "guild", "message", "rate", "user"], - additionalProperties: false - }, - security: { - type: "object", - properties: { - jwtSecret: { - type: "string" - }, - forwadedFor: { - type: "string", - nullable: true - }, - captcha: { - type: "object", - properties: { - enabled: { type: "boolean" }, - service: { - type: "string", - enum: ["hcaptcha", "recaptcha", null], - nullable: true - }, - sitekey: { - type: "string", - nullable: true - }, - secret: { - type: "string", - nullable: true - } - }, - required: ["enabled", "secret", "service", "sitekey"], - additionalProperties: false - } - }, - required: ["captcha", "forwadedFor", "jwtSecret"], - additionalProperties: false - }, - login: { - type: "object", - properties: { - requireCaptcha: { type: "boolean" } - }, - required: ["requireCaptcha"], - additionalProperties: false - }, - register: { - type: "object", - properties: { - email: { - type: "object", - properties: { - necessary: { type: "boolean" }, - allowlist: { type: "boolean" }, - blocklist: { type: "boolean" }, - domains: { - type: "array", - items: { - type: "string" - } - } - }, - required: ["allowlist", "blocklist", "domains", "necessary"], - additionalProperties: false - }, - dateOfBirth: { - type: "object", - properties: { - necessary: { type: "boolean" }, - minimum: { type: "number" } - }, - required: ["minimum", "necessary"], - additionalProperties: false - }, - requireCaptcha: { type: "boolean" }, - requireInvite: { type: "boolean" }, - allowNewRegistration: { type: "boolean" }, - allowMultipleAccounts: { type: "boolean" }, - password: { - type: "object", - properties: { - minLength: { type: "number" }, - minNumbers: { type: "number" }, - minUpperCase: { type: "number" }, - minSymbols: { type: "number" }, - blockInsecureCommonPasswords: { type: "boolean" } - }, - required: ["minLength", "minNumbers", "minUpperCase", "minSymbols", "blockInsecureCommonPasswords"], - additionalProperties: false - } - }, - required: [ - "allowMultipleAccounts", - "allowNewRegistration", - "dateOfBirth", - "email", - "password", - "requireCaptcha", - "requireInvite" - ], - additionalProperties: false - } - }, - required: ["gateway", "general", "limits", "login", "permissions", "register", "security"], - additionalProperties: false -}; - -const ajv = new Ajv(); -const validator = ajv.compile(schema); - -const configPath = getConfigPathForFile("fosscord", "api", ".json"); - -export const apiConfig = new Config<DefaultOptions>({ path: configPath, schemaValidator: validator, schema: schema });