From 8796f694bc4216b40443618400d944da3c106a91 Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Mon, 9 Dec 2024 11:09:40 +0100 Subject: [PATCH] feat(api): :triangular_flag_on_post: Add emoji shortcode size controls --- CHANGELOG.md | 1 + api/api/v1/emojis/:id/index.ts | 2 +- api/api/v1/emojis/index.ts | 2 +- api/api/v2/instance/index.ts | 2 ++ config/config.example.toml | 1 + config/config.schema.json | 5 +++++ docs/api/mastodon.md | 3 ++- packages/config-manager/config.type.ts | 2 ++ 8 files changed, 15 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c16186c..3423c2ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ remove_on_failure = 31536000 [validation] max_emoji_size = 1000000 +max_emoji_shortcode_size = 100 max_emoji_description_size = 1000 ``` diff --git a/api/api/v1/emojis/:id/index.ts b/api/api/v1/emojis/:id/index.ts index 0317e708..204d4a13 100644 --- a/api/api/v1/emojis/:id/index.ts +++ b/api/api/v1/emojis/:id/index.ts @@ -33,7 +33,7 @@ export const schemas = { .string() .trim() .min(1) - .max(64) + .max(config.validation.max_emoji_shortcode_size) .regex( emojiValidator, "Shortcode must only contain letters (any case), numbers, dashes or underscores.", diff --git a/api/api/v1/emojis/index.ts b/api/api/v1/emojis/index.ts index 8f956b4e..befdac20 100644 --- a/api/api/v1/emojis/index.ts +++ b/api/api/v1/emojis/index.ts @@ -29,7 +29,7 @@ export const schemas = { .string() .trim() .min(1) - .max(64) + .max(config.validation.max_emoji_shortcode_size) .regex( emojiValidator, "Shortcode must only contain letters (any case), numbers, dashes or underscores.", diff --git a/api/api/v2/instance/index.ts b/api/api/v2/instance/index.ts index 93fe600b..61cdfcd8 100644 --- a/api/api/v2/instance/index.ts +++ b/api/api/v2/instance/index.ts @@ -202,6 +202,8 @@ export default apiRoute((app) => }, emojis: { emoji_size_limit: config.validation.max_emoji_size, + max_emoji_shortcode_characters: + config.validation.max_emoji_shortcode_size, max_emoji_description_characters: config.validation.max_emoji_description_size, }, diff --git a/config/config.example.toml b/config/config.example.toml index c4329abe..3809d3f2 100644 --- a/config/config.example.toml +++ b/config/config.example.toml @@ -165,6 +165,7 @@ max_media_size = 40_000_000 max_media_attachments = 10 max_media_description_size = 1000 max_emoji_size = 1000000 +max_emoji_shortcode_size = 100 max_emoji_description_size = 1000 max_poll_options = 20 max_poll_option_size = 500 diff --git a/config/config.schema.json b/config/config.schema.json index f985000c..41683991 100644 --- a/config/config.schema.json +++ b/config/config.schema.json @@ -534,6 +534,10 @@ "type": "integer", "default": 1000000 }, + "max_emoji_shortcode_size": { + "type": "integer", + "default": 100 + }, "max_emoji_description_size": { "type": "integer", "default": 1000 @@ -1873,6 +1877,7 @@ "max_media_attachments": 10, "max_media_description_size": 1000, "max_emoji_size": 1000000, + "max_emoji_shortcode_size": 100, "max_emoji_description_size": 1000, "max_poll_options": 20, "max_poll_option_size": 500, diff --git a/docs/api/mastodon.md b/docs/api/mastodon.md index a4202a9c..6150cb64 100644 --- a/docs/api/mastodon.md +++ b/docs/api/mastodon.md @@ -315,12 +315,13 @@ Single Sign-On (SSO) settings for the instance. This object contains two fields: Extra attributes have been added to the `/api/v2/instance` endpoint. These are identical to the `/api/v1/instance` endpoint, except that the `banner` attribute uses the normal Mastodon API attribute. ```ts -type ExtendedInstanceV2 = Instance & { +type ExtendedInstanceV2 = InstanceV2 & { versia_version: string; configuration: Instance["configuration"] & { emojis: { // In bytes emoji_size_limit: number; + max_emoji_shortcode_characters: number; max_emoji_description_characters: number; }; }; diff --git a/packages/config-manager/config.type.ts b/packages/config-manager/config.type.ts index 92247a6b..cd8016ae 100644 --- a/packages/config-manager/config.type.ts +++ b/packages/config-manager/config.type.ts @@ -295,6 +295,7 @@ export const configValidator = z max_media_attachments: z.number().int().default(10), max_media_description_size: z.number().int().default(1000), max_emoji_size: z.number().int().default(1000000), + max_emoji_shortcode_size: z.number().int().default(100), max_emoji_description_size: z.number().int().default(1000), max_poll_options: z.number().int().default(20), max_poll_option_size: z.number().int().default(500), @@ -386,6 +387,7 @@ export const configValidator = z max_media_attachments: 10, max_media_description_size: 1000, max_emoji_size: 1000000, + max_emoji_shortcode_size: 100, max_emoji_description_size: 1000, max_poll_options: 20, max_poll_option_size: 500,