From 7c0e6dfea1d2d06faade6847368bb3ca187d5fc4 Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sun, 10 Mar 2024 23:46:23 +0100 Subject: [PATCH] [backend/federation] Use dotNetRdf ForceArray option instead of patching the AS context (ISH-153) --- .../ActivityStreams/Contexts/as.json | 3 +- .../Federation/ActivityStreams/LDHelpers.cs | 6 +++- .../Federation/ActivityStreams/Types/ASTag.cs | 35 ++----------------- 3 files changed, 9 insertions(+), 35 deletions(-) diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json index 66b6d064..bd703726 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Contexts/as.json @@ -200,8 +200,7 @@ }, "tag": { "@id": "as:tag", - "@type": "@id", - "@container": "@list" + "@type": "@id" }, "target": { "@id": "as:target", diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs index 128d928b..669a41c9 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/LDHelpers.cs @@ -1,3 +1,4 @@ +using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Database.Tables; using Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; using Iceshrimp.Backend.Core.Federation.Cryptography; @@ -60,12 +61,15 @@ public static class LdHelpers JToken.Parse(File.ReadAllText(Path.Combine("Core", "Federation", "ActivityStreams", "Contexts", "as-extensions.json"))); + private static IEnumerable ASForceArray => ["tag", "to", "cc", "bcc", "bto"]; + private static readonly JsonLdProcessorOptions Options = new() { DocumentLoader = CustomLoader, ExpandContext = ASExtensions, ProcessingMode = JsonLdProcessingMode.JsonLd11, - KeepIRIs = ["https://www.w3.org/ns/activitystreams#Public"] + KeepIRIs = [$"{Constants.ActivityStreamsNs}#Public"], + ForceArray = ASForceArray.Select(p => $"{Constants.ActivityStreamsNs}#{p}").ToList() }; public static readonly JsonSerializerSettings JsonSerializerSettings = new() diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs index 50e08b24..35aaf7e1 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs @@ -54,7 +54,7 @@ public class ASEmoji : ASTag public sealed class ASTagConverter : JsonConverter { - public override bool CanWrite => true; + public override bool CanWrite => false; public override bool CanConvert(Type objectType) { @@ -74,27 +74,7 @@ public sealed class ASTagConverter : JsonConverter if (reader.TokenType == JsonToken.StartArray) { - // We have to use @list here because otherwise Akkoma will refuse to process activities with only one Tag. - // To solve this, we've patched the AS2 context to render & parse the tag type as @list, forcing it to be an array. - // Ref: https://akkoma.dev/AkkomaGang/akkoma/issues/720 - var array = JArray.Load(reader); - if (array.Count > 0) - { - try - { - return array.SelectToken("$.[*].@list") - ?.Children() - .OfType() - .Select(HandleObject) - .OfType() - .ToList(); - } - catch - { - //ignored - } - } - + var array = JArray.Load(reader); var result = new List(); foreach (var token in array) { @@ -125,15 +105,6 @@ public sealed class ASTagConverter : JsonConverter public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { - if (value == null) - { - writer.WriteNull(); - return; - } - - writer.WriteStartObject(); - writer.WritePropertyName("@list"); - serializer.Serialize(writer, value); - writer.WriteEndObject(); + throw new NotImplementedException(); } } \ No newline at end of file