oapi: policies

This commit is contained in:
Puyodead1 2023-03-24 21:53:59 -04:00
parent 1b1fbce4d3
commit 3fa2a95429
No known key found for this signature in database
GPG Key ID: A4FA4FEC0DD353FC
12 changed files with 39295 additions and 48 deletions

View File

@ -3606,6 +3606,226 @@
"description": "A container for useful snowflake-related methods.", "description": "A container for useful snowflake-related methods.",
"type": "object" "type": "object"
}, },
"UserLimits": {
"type": "object",
"properties": {
"maxGuilds": {
"type": "integer",
"default": 1048576
},
"maxUsername": {
"type": "integer",
"default": 32
},
"maxFriends": {
"type": "integer",
"default": 5000
}
},
"required": [
"maxFriends",
"maxGuilds",
"maxUsername"
]
},
"GuildLimits": {
"type": "object",
"properties": {
"maxRoles": {
"type": "integer",
"default": 1000
},
"maxEmojis": {
"type": "integer",
"default": 2000
},
"maxMembers": {
"type": "integer",
"default": 25000000
},
"maxChannels": {
"type": "integer",
"default": 65535
},
"maxChannelsInCategory": {
"type": "integer",
"default": 65535
}
},
"required": [
"maxChannels",
"maxChannelsInCategory",
"maxEmojis",
"maxMembers",
"maxRoles"
]
},
"MessageLimits": {
"type": "object",
"properties": {
"maxCharacters": {
"type": "integer",
"default": 1048576
},
"maxTTSCharacters": {
"type": "integer",
"default": 160
},
"maxReactions": {
"type": "integer",
"default": 2048
},
"maxAttachmentSize": {
"type": "integer",
"default": 1073741824
},
"maxBulkDelete": {
"type": "integer",
"default": 1000
},
"maxEmbedDownloadSize": {
"type": "integer",
"default": 5242880
}
},
"required": [
"maxAttachmentSize",
"maxBulkDelete",
"maxCharacters",
"maxEmbedDownloadSize",
"maxReactions",
"maxTTSCharacters"
]
},
"ChannelLimits": {
"type": "object",
"properties": {
"maxPins": {
"type": "integer",
"default": 500
},
"maxTopic": {
"type": "integer",
"default": 1024
},
"maxWebhooks": {
"type": "integer",
"default": 100
}
},
"required": [
"maxPins",
"maxTopic",
"maxWebhooks"
]
},
"RateLimits": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean",
"default": false
},
"ip": {
"$ref": "#/components/schemas/RateLimitOptions"
},
"global": {
"$ref": "#/components/schemas/RateLimitOptions"
},
"error": {
"$ref": "#/components/schemas/RateLimitOptions"
},
"routes": {
"$ref": "#/components/schemas/RouteRateLimit"
}
},
"required": [
"enabled",
"error",
"global",
"ip",
"routes"
]
},
"RateLimitOptions": {
"type": "object",
"properties": {
"bot": {
"type": "integer"
},
"count": {
"type": "integer"
},
"window": {
"type": "integer"
},
"onyIp": {
"type": "boolean"
}
},
"required": [
"count",
"window"
]
},
"RouteRateLimit": {
"type": "object",
"properties": {
"guild": {
"$ref": "#/components/schemas/RateLimitOptions"
},
"webhook": {
"$ref": "#/components/schemas/RateLimitOptions"
},
"channel": {
"$ref": "#/components/schemas/RateLimitOptions"
},
"auth": {}
},
"required": [
"auth",
"channel",
"guild",
"webhook"
]
},
"GlobalRateLimits": {
"type": "object",
"properties": {
"register": {
"$ref": "#/components/schemas/GlobalRateLimit"
},
"sendMessage": {
"$ref": "#/components/schemas/GlobalRateLimit"
}
},
"required": [
"register",
"sendMessage"
]
},
"GlobalRateLimit": {
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 100
},
"window": {
"type": "integer",
"default": 3600000
},
"enabled": {
"type": "boolean",
"default": true
}
},
"required": [
"enabled",
"limit",
"window"
]
},
"TenorGifResponse": { "TenorGifResponse": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -5672,6 +5892,58 @@
"url" "url"
] ]
}, },
"GeneralConfigurationResponse": {
"type": "object",
"properties": {
"instanceName": {
"type": "string",
"default": "Spacebar Instance"
},
"instanceDescription": {
"type": "string",
"default": "This is a Spacebar instance made in the pre-release days",
"nullable": true
},
"frontPage": {
"type": "string",
"default": null,
"nullable": true
},
"tosPage": {
"type": "string",
"default": null,
"nullable": true
},
"correspondenceEmail": {
"type": "string",
"default": null,
"nullable": true
},
"correspondenceUserID": {
"type": "string",
"default": null,
"nullable": true
},
"image": {
"type": "string",
"default": null,
"nullable": true
},
"instanceId": {
"type": "string"
}
},
"required": [
"correspondenceEmail",
"correspondenceUserID",
"frontPage",
"image",
"instanceDescription",
"instanceId",
"instanceName",
"tosPage"
]
},
"GenerateRegistrationTokensResponse": { "GenerateRegistrationTokensResponse": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -6064,6 +6336,92 @@
"enabled" "enabled"
] ]
}, },
"InstanceDomainsResponse": {
"type": "object",
"properties": {
"cdn": {
"type": "string"
},
"gateway": {
"type": "string"
},
"defaultApiVersion": {
"type": "string"
},
"apiEndpoint": {
"type": "string"
}
},
"required": [
"apiEndpoint",
"cdn",
"defaultApiVersion",
"gateway"
]
},
"InstanceStatsResponse": {
"type": "object",
"properties": {
"counts": {
"type": "object",
"properties": {
"user": {
"type": "integer"
},
"guild": {
"type": "integer"
},
"message": {
"type": "integer"
},
"members": {
"type": "integer"
}
},
"additionalProperties": false,
"required": [
"guild",
"members",
"message",
"user"
]
}
},
"required": [
"counts"
]
},
"LimitsConfigurationResponse": {
"type": "object",
"properties": {
"user": {
"$ref": "#/components/schemas/UserLimits"
},
"guild": {
"$ref": "#/components/schemas/GuildLimits"
},
"message": {
"$ref": "#/components/schemas/MessageLimits"
},
"channel": {
"$ref": "#/components/schemas/ChannelLimits"
},
"rate": {
"$ref": "#/components/schemas/RateLimits"
},
"absoluteRate": {
"$ref": "#/components/schemas/GlobalRateLimits"
}
},
"required": [
"absoluteRate",
"channel",
"guild",
"message",
"rate",
"user"
]
},
"LocationMetadataResponse": { "LocationMetadataResponse": {
"type": "object", "type": "object",
"properties": { "properties": {
@ -7636,8 +7994,25 @@
} }
], ],
"responses": { "responses": {
"default": { "200": {
"description": "No description available" "description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstanceStatsResponse"
}
}
}
},
"403": {
"description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/APIErrorResponse"
}
}
}
} }
}, },
"tags": [ "tags": [
@ -7648,8 +8023,15 @@
"/policies/instance/limits/": { "/policies/instance/limits/": {
"get": { "get": {
"responses": { "responses": {
"default": { "200": {
"description": "No description available" "description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/LimitsConfigurationResponse"
}
}
}
} }
}, },
"tags": [ "tags": [
@ -7660,8 +8042,15 @@
"/policies/instance/": { "/policies/instance/": {
"get": { "get": {
"responses": { "responses": {
"default": { "200": {
"description": "No description available" "description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GeneralConfigurationResponse"
}
}
}
} }
}, },
"tags": [ "tags": [
@ -7672,8 +8061,15 @@
"/policies/instance/domains/": { "/policies/instance/domains/": {
"get": { "get": {
"responses": { "responses": {
"default": { "200": {
"description": "No description available" "description": "",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/InstanceDomainsResponse"
}
}
}
} }
}, },
"tags": [ "tags": [

File diff suppressed because it is too large Load Diff

View File

@ -16,25 +16,38 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Router, Request, Response } from "express";
import { route } from "@spacebar/api"; import { route } from "@spacebar/api";
import { Config } from "@spacebar/util"; import { Config } from "@spacebar/util";
import { Request, Response, Router } from "express";
const router = Router(); const router = Router();
router.get("/", route({}), async (req: Request, res: Response) => { router.get(
const { cdn, gateway, api } = Config.get(); "/",
route({
responses: {
200: {
body: "InstanceDomainsResponse",
},
},
}),
async (req: Request, res: Response) => {
const { cdn, gateway, api } = Config.get();
const IdentityForm = { const IdentityForm = {
cdn: cdn.endpointPublic || process.env.CDN || "http://localhost:3001", cdn:
gateway: cdn.endpointPublic ||
gateway.endpointPublic || process.env.CDN ||
process.env.GATEWAY || "http://localhost:3001",
"ws://localhost:3001", gateway:
defaultApiVersion: api.defaultVersion ?? 9, gateway.endpointPublic ||
apiEndpoint: api.endpointPublic ?? "http://localhost:3001/api/", process.env.GATEWAY ||
}; "ws://localhost:3001",
defaultApiVersion: api.defaultVersion ?? 9,
apiEndpoint: api.endpointPublic ?? "http://localhost:3001/api/",
};
res.json(IdentityForm); res.json(IdentityForm);
}); },
);
export default router; export default router;

View File

@ -16,14 +16,24 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Router, Request, Response } from "express";
import { route } from "@spacebar/api"; import { route } from "@spacebar/api";
import { Config } from "@spacebar/util"; import { Config } from "@spacebar/util";
import { Request, Response, Router } from "express";
const router = Router(); const router = Router();
router.get("/", route({}), async (req: Request, res: Response) => { router.get(
const { general } = Config.get(); "/",
res.json(general); route({
}); responses: {
200: {
body: "GeneralConfigurationResponse",
},
},
}),
async (req: Request, res: Response) => {
const { general } = Config.get();
res.json(general);
},
);
export default router; export default router;

View File

@ -16,14 +16,24 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { Router, Request, Response } from "express";
import { route } from "@spacebar/api"; import { route } from "@spacebar/api";
import { Config } from "@spacebar/util"; import { Config } from "@spacebar/util";
import { Request, Response, Router } from "express";
const router = Router(); const router = Router();
router.get("/", route({}), async (req: Request, res: Response) => { router.get(
const { limits } = Config.get(); "/",
res.json(limits); route({
}); responses: {
200: {
body: "LimitsConfigurationResponse",
},
},
}),
async (req: Request, res: Response) => {
const { limits } = Config.get();
res.json(limits);
},
);
export default router; export default router;

View File

@ -28,20 +28,33 @@ import {
import { Request, Response, Router } from "express"; import { Request, Response, Router } from "express";
const router = Router(); const router = Router();
router.get("/", route({}), async (req: Request, res: Response) => { router.get(
if (!Config.get().security.statsWorldReadable) { "/",
const rights = await getRights(req.user_id); route({
rights.hasThrow("VIEW_SERVER_STATS"); responses: {
} 200: {
body: "InstanceStatsResponse",
res.json({ },
counts: { 403: {
user: await User.count(), body: "APIErrorResponse",
guild: await Guild.count(), },
message: await Message.count(),
members: await Member.count(),
}, },
}); }),
}); async (req: Request, res: Response) => {
if (!Config.get().security.statsWorldReadable) {
const rights = await getRights(req.user_id);
rights.hasThrow("VIEW_SERVER_STATS");
}
res.json({
counts: {
user: await User.count(),
guild: await Guild.count(),
message: await Message.count(),
members: await Member.count(),
},
});
},
);
export default router; export default router;

View File

@ -16,11 +16,11 @@
along with this program. If not, see <https://www.gnu.org/licenses/>. along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import { RouteRateLimit, RateLimitOptions } from "."; import { RateLimitOptions, RouteRateLimit } from ".";
export class RateLimits { export class RateLimits {
enabled: boolean = false; enabled: boolean = false;
ip: Omit<RateLimitOptions, "bot_count"> = { ip: RateLimitOptions = {
count: 500, count: 500,
window: 5, window: 5,
}; };

View File

@ -0,0 +1,3 @@
import { GeneralConfiguration } from "../../config";
export type GeneralConfigurationResponse = GeneralConfiguration;

View File

@ -0,0 +1,6 @@
export interface InstanceDomainsResponse {
cdn: string;
gateway: string;
defaultApiVersion: string;
apiEndpoint: string;
}

View File

@ -0,0 +1,8 @@
export interface InstanceStatsResponse {
counts: {
user: number;
guild: number;
message: number;
members: number;
};
}

View File

@ -0,0 +1,3 @@
import { LimitsConfiguration } from "../../config";
export type LimitsConfigurationResponse = LimitsConfiguration;

View File

@ -11,6 +11,7 @@ export * from "./ChannelPinsResponse";
export * from "./ChannelWebhooksResponse"; export * from "./ChannelWebhooksResponse";
export * from "./GatewayBotResponse"; export * from "./GatewayBotResponse";
export * from "./GatewayResponse"; export * from "./GatewayResponse";
export * from "./GeneralConfigurationResponse";
export * from "./GenerateRegistrationTokensResponse"; export * from "./GenerateRegistrationTokensResponse";
export * from "./GuildBansResponse"; export * from "./GuildBansResponse";
export * from "./GuildChannelsResponse"; export * from "./GuildChannelsResponse";
@ -29,6 +30,9 @@ export * from "./GuildVanityUrl";
export * from "./GuildVoiceRegionsResponse"; export * from "./GuildVoiceRegionsResponse";
export * from "./GuildWidgetJsonResponse"; export * from "./GuildWidgetJsonResponse";
export * from "./GuildWidgetSettingsResponse"; export * from "./GuildWidgetSettingsResponse";
export * from "./InstanceDomainsResponse";
export * from "./InstanceStatsResponse";
export * from "./LimitsConfigurationResponse";
export * from "./LocationMetadataResponse"; export * from "./LocationMetadataResponse";
export * from "./MemberJoinGuildResponse"; export * from "./MemberJoinGuildResponse";
export * from "./OAuthAuthorizeResponse"; export * from "./OAuthAuthorizeResponse";