diff --git a/Iceshrimp.Backend/Core/Configuration/Constants.cs b/Iceshrimp.Backend/Core/Configuration/Constants.cs index 78d8e80e..7383b272 100644 --- a/Iceshrimp.Backend/Core/Configuration/Constants.cs +++ b/Iceshrimp.Backend/Core/Configuration/Constants.cs @@ -2,6 +2,7 @@ namespace Iceshrimp.Backend.Core.Configuration; public static class Constants { public const string ActivityStreamsNs = "https://www.w3.org/ns/activitystreams"; + public const string W3IdSecurityNs = "https://w3id.org/security"; public static readonly string[] SystemUsers = ["instance.actor", "relay.actor"]; public static readonly string[] BrowserSafeMimeTypes = [ diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs index f2eedf18..6ecc705a 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActivity.cs @@ -5,11 +5,11 @@ using JC = Newtonsoft.Json.JsonConverterAttribute; namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; public class ASActivity : ASObject { - [J("https://www.w3.org/ns/activitystreams#actor")] + [J($"{Constants.ActivityStreamsNs}#actor")] [JC(typeof(ASActorConverter))] public ASActor? Actor { get; set; } - [J("https://www.w3.org/ns/activitystreams#object")] + [J($"{Constants.ActivityStreamsNs}#object")] [JC(typeof(ASObjectConverter))] public ASObject? Object { get; set; } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActor.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActor.cs index d4cec8ff..1fb01134 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActor.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASActor.cs @@ -20,15 +20,15 @@ public class ASActor : ASObject { [JC(typeof(VC))] public string? MkSummary { get; set; } - [J("https://www.w3.org/ns/activitystreams#summary")] + [J($"{Constants.ActivityStreamsNs}#summary")] [JC(typeof(VC))] public string? Summary { get; set; } - [J("https://www.w3.org/ns/activitystreams#name")] + [J($"{Constants.ActivityStreamsNs}#name")] [JC(typeof(VC))] public string? DisplayName { get; set; } - [J("https://www.w3.org/ns/activitystreams#preferredUsername")] + [J($"{Constants.ActivityStreamsNs}#preferredUsername")] [JC(typeof(VC))] public string? Username { get; set; } @@ -44,7 +44,7 @@ public class ASActor : ASObject { [JC(typeof(VC))] public bool? IsMemorial { get; set; } - [J("https://www.w3.org/ns/activitystreams#manuallyApprovesFollowers")] + [J($"{Constants.ActivityStreamsNs}#manuallyApprovesFollowers")] [JC(typeof(VC))] public bool? IsLocked { get; set; } @@ -60,11 +60,11 @@ public class ASActor : ASObject { [JC(typeof(VC))] public string? Birthday { get; set; } - [J("https://www.w3.org/ns/activitystreams#endpoints")] + [J($"{Constants.ActivityStreamsNs}#endpoints")] [JC(typeof(ASEndpointsConverter))] public ASEndpoints? Endpoints { get; set; } - [J("https://www.w3.org/ns/activitystreams#outbox")] + [J($"{Constants.ActivityStreamsNs}#outbox")] [JC(typeof(ASCollectionConverter))] public ASCollection? Outbox { get; set; } @@ -72,27 +72,27 @@ public class ASActor : ASObject { [JC(typeof(ASLinkConverter))] public ASLink? Inbox { get; set; } - [J("https://www.w3.org/ns/activitystreams#followers")] + [J($"{Constants.ActivityStreamsNs}#followers")] [JC(typeof(ASCollectionConverter))] public ASCollection? Followers { get; set; } - [J("https://www.w3.org/ns/activitystreams#following")] + [J($"{Constants.ActivityStreamsNs}#following")] [JC(typeof(ASCollectionConverter))] public ASCollection? Following { get; set; } - [J("https://www.w3.org/ns/activitystreams#sharedInbox")] + [J($"{Constants.ActivityStreamsNs}#sharedInbox")] [JC(typeof(ASLinkConverter))] public ASLink? SharedInbox { get; set; } - [J("https://www.w3.org/ns/activitystreams#url")] + [J($"{Constants.ActivityStreamsNs}#url")] [JC(typeof(ASLinkConverter))] public ASLink? Url { get; set; } - [J("https://www.w3.org/ns/activitystreams#movedTo")] + [J($"{Constants.ActivityStreamsNs}#movedTo")] [JC(typeof(ASLinkConverter))] public ASLink? MovedTo { get; set; } - [J("https://www.w3.org/ns/activitystreams#alsoKnownAs")] + [J($"{Constants.ActivityStreamsNs}#alsoKnownAs")] public List? AlsoKnownAs { get; set; } [J("http://joinmastodon.org/ns#featured")] @@ -103,19 +103,19 @@ public class ASActor : ASObject { [JC(typeof(ASLinkConverter))] public ASLink? FeaturedTags { get; set; } - [J("https://www.w3.org/ns/activitystreams#icon")] + [J($"{Constants.ActivityStreamsNs}#icon")] [JC(typeof(ASImageConverter))] public ASImage? Avatar { get; set; } - [J("https://www.w3.org/ns/activitystreams#image")] + [J($"{Constants.ActivityStreamsNs}#image")] [JC(typeof(ASImageConverter))] public ASImage? Banner { get; set; } - [J("https://w3id.org/security#publicKey")] + [J($"{Constants.W3IdSecurityNs}#publicKey")] [JC(typeof(ASPublicKeyConverter))] public ASPublicKey? PublicKey { get; set; } - public bool IsBot => Type == "https://www.w3.org/ns/activitystreams#Service"; + public bool IsBot => Type == $"{Constants.ActivityStreamsNs}#Service"; public void Normalize(string uri, string acct) { if (Type == null || !ActorTypes.Contains(Type)) throw new Exception("Actor is of invalid type"); diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASAttachment.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASAttachment.cs index 7c79ffd5..226ec18a 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASAttachment.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASAttachment.cs @@ -13,19 +13,19 @@ public class ASAttachment : ASObjectBase { } public class ASDocument : ASAttachment { - [J("https://www.w3.org/ns/activitystreams#url")] + [J($"{Constants.ActivityStreamsNs}#url")] [JC(typeof(ASObjectBaseConverter))] public ASObjectBase? Url { get; set; } - [J("https://www.w3.org/ns/activitystreams#mediaType")] + [J($"{Constants.ActivityStreamsNs}#mediaType")] [JC(typeof(ValueObjectConverter))] public string? MediaType { get; set; } - [J("https://www.w3.org/ns/activitystreams#sensitive")] + [J($"{Constants.ActivityStreamsNs}#sensitive")] [JC(typeof(ValueObjectConverter))] public bool? Sensitive { get; set; } - [J("https://www.w3.org/ns/activitystreams#name")] + [J($"{Constants.ActivityStreamsNs}#name")] [JC(typeof(ValueObjectConverter))] public string? Description { get; set; } } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASCollection.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASCollection.cs index b823fd83..c2c4e018 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASCollection.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASCollection.cs @@ -1,3 +1,4 @@ +using Iceshrimp.Backend.Core.Configuration; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using J = Newtonsoft.Json.JsonPropertyAttribute; @@ -11,11 +12,11 @@ public class ASCollection() : ASObjectBase where T : ASObject { Id = id; } - [J("https://www.w3.org/ns/activitystreams#items")] + [J($"{Constants.ActivityStreamsNs}#items")] [JC(typeof(ASCollectionItemsConverter))] public List? Items { get; set; } - [J("https://www.w3.org/ns/activitystreams#totalItems")] + [J($"{Constants.ActivityStreamsNs}#totalItems")] [JC(typeof(VC))] public long? TotalItems { get; set; } } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASEndpoints.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASEndpoints.cs index a90f6b32..b64fab48 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASEndpoints.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASEndpoints.cs @@ -1,10 +1,11 @@ +using Iceshrimp.Backend.Core.Configuration; using J = Newtonsoft.Json.JsonPropertyAttribute; using JC = Newtonsoft.Json.JsonConverterAttribute; namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; public class ASEndpoints { - [J("https://www.w3.org/ns/activitystreams#sharedInbox")] + [J($"{Constants.ActivityStreamsNs}#sharedInbox")] [JC(typeof(ASObjectBaseConverter))] public ASObjectBase? SharedInbox { get; set; } } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASImage.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASImage.cs index 27500570..5dcc0029 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASImage.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASImage.cs @@ -1,3 +1,4 @@ +using Iceshrimp.Backend.Core.Configuration; using J = Newtonsoft.Json.JsonPropertyAttribute; using JC = Newtonsoft.Json.JsonConverterAttribute; using VC = Iceshrimp.Backend.Core.Federation.ActivityStreams.Types.ValueObjectConverter; @@ -5,11 +6,11 @@ using VC = Iceshrimp.Backend.Core.Federation.ActivityStreams.Types.ValueObjectCo namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; public class ASImage { - [J("https://www.w3.org/ns/activitystreams#url")] + [J($"{Constants.ActivityStreamsNs}#url")] [JC(typeof(ASLinkConverter))] public ASLink? Url { get; set; } - [J("https://www.w3.org/ns/activitystreams#sensitive")] + [J($"{Constants.ActivityStreamsNs}#sensitive")] [JC(typeof(VC))] public bool? Sensitive { get; set; } } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASLink.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASLink.cs index 2ff64b80..5aa27391 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASLink.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASLink.cs @@ -1,14 +1,15 @@ +using Iceshrimp.Backend.Core.Configuration; using J = Newtonsoft.Json.JsonPropertyAttribute; using JC = Newtonsoft.Json.JsonConverterAttribute; namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; public class ASLink(string url) : ASObjectBase(url) { - [J("https://www.w3.org/ns/activitystreams#href")] + [J($"{Constants.ActivityStreamsNs}#href")] [JC(typeof(ASObjectBaseConverter))] public ASObjectBase? Href { get; set; } - [J("https://www.w3.org/ns/activitystreams#name")] + [J($"{Constants.ActivityStreamsNs}#name")] [JC(typeof(ValueObjectConverter))] public string? Name { get; set; } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNote.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNote.cs index 5c59fddf..6346bf05 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNote.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNote.cs @@ -11,51 +11,51 @@ public class ASNote : ASObject { [JC(typeof(VC))] public string? MkContent { get; set; } - [J("https://www.w3.org/ns/activitystreams#content")] + [J($"{Constants.ActivityStreamsNs}#content")] [JC(typeof(VC))] public string? Content { get; set; } - [J("https://www.w3.org/ns/activitystreams#url")] + [J($"{Constants.ActivityStreamsNs}#url")] [JC(typeof(ASLinkConverter))] public ASLink? Url { get; set; } - [J("https://www.w3.org/ns/activitystreams#sensitive")] + [J($"{Constants.ActivityStreamsNs}#sensitive")] [JC(typeof(VC))] public bool? Sensitive { get; set; } - [J("https://www.w3.org/ns/activitystreams#published")] + [J($"{Constants.ActivityStreamsNs}#published")] [JC(typeof(VC))] public DateTime? PublishedAt { get; set; } - [J("https://www.w3.org/ns/activitystreams#source")] + [J($"{Constants.ActivityStreamsNs}#source")] [JC(typeof(ASNoteSourceConverter))] public ASNoteSource? Source { get; set; } - [J("https://www.w3.org/ns/activitystreams#to")] + [J($"{Constants.ActivityStreamsNs}#to")] public List To { get; set; } = []; - [J("https://www.w3.org/ns/activitystreams#cc")] + [J($"{Constants.ActivityStreamsNs}#cc")] public List Cc { get; set; } = []; - [J("https://www.w3.org/ns/activitystreams#attributedTo")] + [J($"{Constants.ActivityStreamsNs}#attributedTo")] public List AttributedTo { get; set; } = []; - [J("https://www.w3.org/ns/activitystreams#inReplyTo")] + [J($"{Constants.ActivityStreamsNs}#inReplyTo")] [JC(typeof(ASObjectBaseConverter))] public ASObjectBase? InReplyTo { get; set; } - [J("https://www.w3.org/ns/activitystreams#tag")] + [J($"{Constants.ActivityStreamsNs}#tag")] [JC(typeof(ASTagConverter))] public List? Tags { get; set; } - [J("https://www.w3.org/ns/activitystreams#attachment")] + [J($"{Constants.ActivityStreamsNs}#attachment")] [JC(typeof(ASAttachmentConverter))] public List? Attachments { get; set; } public Note.NoteVisibility GetVisibility(ASActor actor) { - if (To.Any(p => p.Id == "https://www.w3.org/ns/activitystreams#Public")) + if (To.Any(p => p.Id == $"{Constants.ActivityStreamsNs}#Public")) return Note.NoteVisibility.Public; - if (Cc.Any(p => p.Id == "https://www.w3.org/ns/activitystreams#Public")) + if (Cc.Any(p => p.Id == $"{Constants.ActivityStreamsNs}#Public")) return Note.NoteVisibility.Home; if (To.Any(p => p.Id is not null && p.Id == (actor.Followers?.Id ?? actor.Id + "/followers"))) return Note.NoteVisibility.Followers; diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNoteSource.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNoteSource.cs index c47bcca4..e7da8a86 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNoteSource.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASNoteSource.cs @@ -1,3 +1,4 @@ +using Iceshrimp.Backend.Core.Configuration; using J = Newtonsoft.Json.JsonPropertyAttribute; using JC = Newtonsoft.Json.JsonConverterAttribute; using VC = Iceshrimp.Backend.Core.Federation.ActivityStreams.Types.ValueObjectConverter; @@ -5,11 +6,11 @@ using VC = Iceshrimp.Backend.Core.Federation.ActivityStreams.Types.ValueObjectCo namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; public class ASNoteSource { - [J("https://www.w3.org/ns/activitystreams#content")] + [J($"{Constants.ActivityStreamsNs}#content")] [JC(typeof(VC))] public string? Content { get; set; } - [J("https://www.w3.org/ns/activitystreams#mediaType")] + [J($"{Constants.ActivityStreamsNs}#mediaType")] [JC(typeof(VC))] public string? MediaType { get; set; } } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASOrderedCollection.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASOrderedCollection.cs index 09ecee1e..d97da126 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASOrderedCollection.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASOrderedCollection.cs @@ -1,8 +1,9 @@ +using Iceshrimp.Backend.Core.Configuration; using J = Newtonsoft.Json.JsonPropertyAttribute; namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; public class ASOrderedCollection : ASCollection where T : ASObject { - [J("https://www.w3.org/ns/activitystreams#orderedItems")] + [J($"{Constants.ActivityStreamsNs}#orderedItems")] public List? OrderedItems { get; set; } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASPublicKey.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASPublicKey.cs index c7493121..f5811c86 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASPublicKey.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASPublicKey.cs @@ -1,3 +1,4 @@ +using Iceshrimp.Backend.Core.Configuration; using J = Newtonsoft.Json.JsonPropertyAttribute; using JC = Newtonsoft.Json.JsonConverterAttribute; using VC = Iceshrimp.Backend.Core.Federation.ActivityStreams.Types.ValueObjectConverter; @@ -5,11 +6,11 @@ using VC = Iceshrimp.Backend.Core.Federation.ActivityStreams.Types.ValueObjectCo namespace Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; public class ASPublicKey : ASObject { - [J("https://w3id.org/security#owner")] + [J($"{Constants.W3IdSecurityNs}#owner")] [JC(typeof(ASObjectBaseConverter))] public ASObjectBase? Owner { get; set; } - [J("https://w3id.org/security#publicKeyPem")] + [J($"{Constants.W3IdSecurityNs}#publicKeyPem")] [JC(typeof(VC))] public string? PublicKey { get; set; } } diff --git a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs index 57d709da..49954717 100644 --- a/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs +++ b/Iceshrimp.Backend/Core/Federation/ActivityStreams/Types/ASTag.cs @@ -13,11 +13,11 @@ public class ASTag : ASObjectBase { } public class ASTagLink : ASTag { - [J("https://www.w3.org/ns/activitystreams#href")] + [J($"{Constants.ActivityStreamsNs}#href")] [JC(typeof(ASObjectBaseConverter))] public ASObjectBase? Href { get; set; } - [J("https://www.w3.org/ns/activitystreams#name")] + [J($"{Constants.ActivityStreamsNs}#name")] [JC(typeof(ValueObjectConverter))] public string? Name { get; set; } } diff --git a/Iceshrimp.Backend/Core/Federation/Cryptography/LdSignature.cs b/Iceshrimp.Backend/Core/Federation/Cryptography/LdSignature.cs index 2bfa5f3e..36f89f8e 100644 --- a/Iceshrimp.Backend/Core/Federation/Cryptography/LdSignature.cs +++ b/Iceshrimp.Backend/Core/Federation/Cryptography/LdSignature.cs @@ -1,6 +1,7 @@ using System.Net; using System.Security.Cryptography; using System.Text; +using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Federation.ActivityStreams; using Iceshrimp.Backend.Core.Helpers; using Iceshrimp.Backend.Core.Middleware; @@ -20,7 +21,7 @@ public static class LdSignature { } public static async Task VerifyAsync(JObject activity, string key) { - var options = activity["https://w3id.org/security#signature"]; + var options = activity[$"{Constants.W3IdSecurityNs}#signature"]; if (options?.ToObject() is not { Length: 1 } signatures) return false; var signature = signatures[0]; if (signature.Type is not ["_:RsaSignature2017"]) return false; @@ -61,7 +62,7 @@ public static class LdSignature { options.Signature = signature; - activity.Add("https://w3id.org/security#signature", JToken.FromObject(options)); + activity.Add($"{Constants.W3IdSecurityNs}#signature", JToken.FromObject(options)); return LdHelpers.Expand(activity)?[0] as JObject ?? throw new GracefulException(HttpStatusCode.UnprocessableEntity, "Failed to expand signed activity"); @@ -78,9 +79,9 @@ public static class LdSignature { inputOptions.Remove("@id"); inputOptions.Remove("@type"); - inputOptions.Remove("https://w3id.org/security#signatureValue"); + inputOptions.Remove($"{Constants.W3IdSecurityNs}#signatureValue"); - inputData.Remove("https://w3id.org/security#signature"); + inputData.Remove($"{Constants.W3IdSecurityNs}#signature"); var canonicalData = LdHelpers.Canonicalize(inputData); var canonicalOptions = LdHelpers.Canonicalize(inputOptions); @@ -94,7 +95,7 @@ public static class LdSignature { private class SignatureOptions { [J("@type")] public required List Type { get; set; } - [J("https://w3id.org/security#signatureValue")] + [J($"{Constants.W3IdSecurityNs}#signatureValue")] [JC(typeof(VC))] public string? Signature { get; set; } @@ -102,15 +103,15 @@ public static class LdSignature { [JC(typeof(VC))] public string? Creator { get; set; } - [J("https://w3id.org/security#nonce", NullValueHandling = NullValueHandling.Ignore)] + [J($"{Constants.W3IdSecurityNs}#nonce", NullValueHandling = NullValueHandling.Ignore)] [JC(typeof(VC))] public string? Nonce { get; set; } - [J("https://w3id.org/security#domain", NullValueHandling = NullValueHandling.Ignore)] + [J($"{Constants.W3IdSecurityNs}#domain", NullValueHandling = NullValueHandling.Ignore)] [JC(typeof(VC))] public string? Domain { get; set; } - [J("https://w3id.org/security#created", NullValueHandling = NullValueHandling.Ignore)] + [J($"{Constants.W3IdSecurityNs}#created", NullValueHandling = NullValueHandling.Ignore)] [JC(typeof(VC))] //FIXME: is this valid? it should output datetime in ISO format public DateTime? Created { get; set; } diff --git a/Iceshrimp.Tests/Cryptography/LdSignatureTests.cs b/Iceshrimp.Tests/Cryptography/LdSignatureTests.cs index 8a8bc724..625c6350 100644 --- a/Iceshrimp.Tests/Cryptography/LdSignatureTests.cs +++ b/Iceshrimp.Tests/Cryptography/LdSignatureTests.cs @@ -1,4 +1,5 @@ using System.Security.Cryptography; +using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Federation.ActivityStreams; using Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; using Iceshrimp.Backend.Core.Federation.Cryptography; @@ -53,7 +54,7 @@ public class LdSignatureTests { var data = (_signed.DeepClone() as JObject)!; data.Should().NotBeNull(); - data.Remove("https://w3id.org/security#signature"); + data.Remove($"{Constants.W3IdSecurityNs}#signature"); var verify = await LdSignature.VerifyAsync(data, _keypair.ExportRSAPublicKeyPem()); verify.Should().BeFalse(); } @@ -64,10 +65,10 @@ public class LdSignatureTests { data.Should().NotBeNull(); var signature = - data["https://w3id.org/security#signature"]?[0]?["https://w3id.org/security#signatureValue"]?[0]?["@value"]; + data[$"{Constants.W3IdSecurityNs}#signature"]?[0]?[$"{Constants.W3IdSecurityNs}#signatureValue"]?[0]?["@value"]; signature.Should().NotBeNull(); - data["https://w3id.org/security#signature"]![0]!["https://w3id.org/security#signatureValue"]![0]!["@value"] += + data[$"{Constants.W3IdSecurityNs}#signature"]![0]![$"{Constants.W3IdSecurityNs}#signatureValue"]![0]!["@value"] += "test"; var e = await Assert.ThrowsExceptionAsync(async () => await LdSignature.VerifyAsync(data, @@ -83,10 +84,10 @@ public class LdSignatureTests { data.Should().NotBeNull(); var creator = - data["https://w3id.org/security#signature"]?[0]?["http://purl.org/dc/terms/creator"]?[0]?["@value"]; + data[$"{Constants.W3IdSecurityNs}#signature"]?[0]?["http://purl.org/dc/terms/creator"]?[0]?["@value"]; creator.Should().NotBeNull(); - data["https://w3id.org/security#signature"]![0]!["http://purl.org/dc/terms/creator"]![0]!["@value"] += "test"; + data[$"{Constants.W3IdSecurityNs}#signature"]![0]!["http://purl.org/dc/terms/creator"]![0]!["@value"] += "test"; var verify = await LdSignature.VerifyAsync(data, _keypair.ExportRSAPublicKeyPem()); verify.Should().BeFalse(); }