From c8c09591f975e39f00eeddbc32cfff775d473962 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Wed, 7 Feb 2024 20:33:00 +0100 Subject: [PATCH] [backend] Add configurable post character limit (ISH-5) --- Iceshrimp.Backend/Core/Configuration/Config.cs | 9 +++++---- Iceshrimp.Backend/Core/Services/NoteService.cs | 10 ++++++++-- Iceshrimp.Backend/configuration.ini | 4 ++++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Iceshrimp.Backend/Core/Configuration/Config.cs b/Iceshrimp.Backend/Core/Configuration/Config.cs index 08dbeb1f..7fce83d2 100644 --- a/Iceshrimp.Backend/Core/Configuration/Config.cs +++ b/Iceshrimp.Backend/Core/Configuration/Config.cs @@ -30,10 +30,11 @@ public sealed class Config { public string UserAgent => $"Iceshrimp.NET/{Version} (https://{WebDomain})"; - public required int ListenPort { get; init; } = 3000; - public required string ListenHost { get; init; } = "localhost"; - public required string WebDomain { get; init; } - public required string AccountDomain { get; init; } + public required int ListenPort { get; init; } = 3000; + public required string ListenHost { get; init; } = "localhost"; + public required string WebDomain { get; init; } + public required string AccountDomain { get; init; } + public required int CharacterLimit { get; init; } = 8192; } public sealed class SecuritySection { diff --git a/Iceshrimp.Backend/Core/Services/NoteService.cs b/Iceshrimp.Backend/Core/Services/NoteService.cs index ed12c627..c0a437b2 100644 --- a/Iceshrimp.Backend/Core/Services/NoteService.cs +++ b/Iceshrimp.Backend/Core/Services/NoteService.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Database; using Iceshrimp.Backend.Core.Database.Tables; @@ -11,11 +12,13 @@ using Microsoft.Extensions.Options; namespace Iceshrimp.Backend.Core.Services; +[SuppressMessage("ReSharper", "SuggestBaseTypeForParameterInConstructor", + Justification = "We need IOptionsSnapshot for config hot reload")] public class NoteService( ILogger logger, DatabaseContext db, UserResolver userResolver, - IOptions config, + IOptionsSnapshot config, UserService userSvc, ActivityFetcherService fetchSvc, ActivityDeliverService deliverSvc, @@ -27,9 +30,12 @@ public class NoteService( public async Task CreateNoteAsync(User user, Note.NoteVisibility visibility, string? text = null, string? cw = null, Note? reply = null, Note? renote = null) { + if (text?.Length > config.Value.CharacterLimit) + throw GracefulException.BadRequest($"Text cannot be longer than {config.Value.CharacterLimit} characters"); + if (text is { Length: > 100000 }) throw GracefulException.BadRequest("Text cannot be longer than 100.000 characters"); - + var actor = await userRenderer.RenderAsync(user); var note = new Note { diff --git a/Iceshrimp.Backend/configuration.ini b/Iceshrimp.Backend/configuration.ini index e50d4899..388a9771 100644 --- a/Iceshrimp.Backend/configuration.ini +++ b/Iceshrimp.Backend/configuration.ini @@ -5,6 +5,10 @@ ListenHost = localhost ;; Caution: changing these settings after initial setup *will* break federation WebDomain = shrimp.example.org AccountDomain = example.org +;; End of problematic settings block + +;; Maximum number of characters allowed for local notes (must not be larger than the global limit, which is 100000 characters) +CharacterLimit = 8192 [Security] ;; Whether to require incoming ActivityPub requests carry a valid HTTP or LD signature