From bb0e66f39a733e5229947f69adffbc4d0e5ee4d5 Mon Sep 17 00:00:00 2001 From: Hong Minhee Date: Sat, 14 Sep 2024 02:57:53 +0900 Subject: [PATCH] Linked Data Signatures --- CHANGES.md | 5 + FEDERATION.md | 2 + docs/manual/actor.md | 20 ++-- docs/manual/log.md | 24 +++- docs/manual/send.md | 73 ++++++++++-- src/codegen/__snapshots__/class.test.ts.snap | 118 +++++++++---------- src/deno.json | 2 +- src/federation/handler.test.ts | 1 + src/federation/handler.ts | 68 ++++++++--- src/federation/send.test.ts | 70 ++++++++--- src/federation/send.ts | 45 +++++-- src/sig/ld.ts | 1 + src/sig/proof.test.ts | 4 +- src/testing/mod.ts | 7 +- src/vocab/accept.yaml | 1 + src/vocab/activity.yaml | 1 + src/vocab/add.yaml | 1 + src/vocab/announce.yaml | 1 + src/vocab/arrive.yaml | 1 + src/vocab/block.yaml | 1 + src/vocab/create.yaml | 1 + src/vocab/delete.yaml | 1 + src/vocab/dislike.yaml | 1 + src/vocab/flag.yaml | 1 + src/vocab/follow.yaml | 1 + src/vocab/ignore.yaml | 1 + src/vocab/intransitiveactivity.yaml | 1 + src/vocab/invite.yaml | 1 + src/vocab/join.yaml | 1 + src/vocab/leave.yaml | 1 + src/vocab/like.yaml | 1 + src/vocab/listen.yaml | 1 + src/vocab/move.yaml | 1 + src/vocab/offer.yaml | 1 + src/vocab/question.yaml | 1 + src/vocab/read.yaml | 1 + src/vocab/reject.yaml | 1 + src/vocab/remove.yaml | 1 + src/vocab/tentativeaccept.yaml | 1 + src/vocab/tentativereject.yaml | 1 + src/vocab/travel.yaml | 1 + src/vocab/undo.yaml | 1 + src/vocab/update.yaml | 1 + src/vocab/view.yaml | 1 + 44 files changed, 334 insertions(+), 136 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 1e6cd38..3960f88 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,6 +11,11 @@ To be released. - Fedify now supports [Linked Data Signatures], which is outdated but still widely used in the fediverse. + - A `Federation` object became to verify an activity's Linked Data + Signatures if it has one. If Linked Data Signatures are verified, + Object Integrity Proofs and HTTP Signatures are not verified. + - `Context.sendActivity()` method became to sign an activity with Linked + Data Signatures if there is at least one RSA-PKCS#1-v1.5 key pair. - Added `Signature` interface. - Added `signJsonLd()` function. - Added `SignJsonLdOptions` interface. diff --git a/FEDERATION.md b/FEDERATION.md index 509740a..fc93c59 100644 --- a/FEDERATION.md +++ b/FEDERATION.md @@ -9,11 +9,13 @@ Supported federation protocols and standards - [ActivityPub] (S2S) - [WebFinger] - [HTTP Signatures] + - [Linked Data Signatures] - [NodeInfo] [ActivityPub]: https://www.w3.org/TR/activitypub/ [WebFinger]: https://datatracker.ietf.org/doc/html/rfc7033 [HTTP Signatures]: https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures +[Linked Data Signatures]: https://web.archive.org/web/20170923124140/https://w3c-dvcg.github.io/ld-signatures/ [NodeInfo]: https://nodeinfo.diaspora.software/ diff --git a/docs/manual/actor.md b/docs/manual/actor.md index 139a5e2..ee7d19f 100644 --- a/docs/manual/actor.md +++ b/docs/manual/actor.md @@ -245,18 +245,20 @@ await kv.set(["keypair", "ed25519", handle], { > Fedify currently supports two key types: > > - RSA-PKCS#1-v1.5 (`"RSASSA-PKCS1-v1_5"`) is used for [HTTP -> Signatures](./send.md#http-signatures). +> Signatures](./send.md#http-signatures) and [Linked Data +> Signatures](./send.md#linked-data-signatures). > - Ed25519 (`"Ed25519"`) is used for [Object Integrity > Proofs](./send.md#object-integrity-proofs). > -> HTTP Signatures is a de facto standard for signing ActivityPub activities, -> and Object Integrity Proofs is a new standard for verifying the integrity -> of the objects in the fediverse. While HTTP Signatures is widely supported -> in the fediverse, it's limited to the RSA-PKCS#1-v1.5 algorithm, -> and unusable for [forwarding from inbox][1] and [several other cases][2]. +> HTTP Signatures and Linked Data Signatures are de facto standards for signing +> ActivityPub activities, and Object Integrity Proofs is a new standard for +> verifying the integrity of the objects in the fediverse. While HTTP +> Signatures and Linked Data Signatures are widely supported in the fediverse, +> it's limited to the RSA-PKCS#1-v1.5 algorithm. > -> If your federated app needs to support both HTTP Signatures and Object -> Integrity Proofs, you need to generate both RSA-PKCS#1-v1.5 and Ed25519 key +> If your federated app needs to support HTTP Signatures, Linked Data +> Signatures, and Object Integrity Proofs at the same time, +> you need to generate both RSA-PKCS#1-v1.5 and Ed25519 key > pairs for each actor, and store them in the database—and we recommend > you to support both key types. @@ -299,8 +301,6 @@ federation }); ~~~~ -[1]: https://www.w3.org/TR/activitypub/#inbox-forwarding -[2]: https://socialhub.activitypub.rocks/t/fep-8b32-object-integrity-proofs/2725/79?u=hongminhee [`CryptoKeyPair`]: https://developer.mozilla.org/en-US/docs/Web/API/CryptoKeyPair [Deno KV]: https://deno.com/kv diff --git a/docs/manual/log.md b/docs/manual/log.md index 3837843..64d0d6b 100644 --- a/docs/manual/log.md +++ b/docs/manual/log.md @@ -174,14 +174,32 @@ related to the document loader. When you are curious about what specific requests are made by the document loader, you can check the log messages in this category with the `"debug"` level. +### `["fedify", "sig", "http"]` + +*This category is available since Fedify 0.9.0.* + +The `["fedify", "sig", "ld"]` category is used for logging messages related +to [HTTP Signatures](./send.md#http-signatures). When you are curious about +the signature verification process, you can check the log messages in this +category with the `"debug"` level. + +### `["fedify", "sig", "ld"]` + +*This category is available since Fedify 1.0.0.* + +The `["fedify", "sig", "ld"]` category is used for logging messages related to +[Linked Data Signatures](./send.md#linked-data-signatures). When you are +curious about the signature verification process, you can check the log +messages in this category with the `"debug"` level. + ### `["fedify", "sig", "proof"]` *This category is available since Fedify 0.10.0.* The `["fedify", "sig", "proof"]` category is used for logging messages related -to Object Integrity Proofs. When you are curious about the proof verification -process, you can check the log messages in this category with the `"debug"` -level. +to [Object Integrity Proofs](./send.md#object-integrity-proofs). When you are +curious about the proof verification process, you can check the log messages in +this category with the `"debug"` level. ### `["fedify", "sig", "key"]` diff --git a/docs/manual/send.md b/docs/manual/send.md index c99d11e..21e1e9e 100644 --- a/docs/manual/send.md +++ b/docs/manual/send.md @@ -318,6 +318,52 @@ Fedify selects the first RSA-PKCS#1-v1.5 key pair among them. [HTTP Signatures]: https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures +Linked Data Signatures +---------------------- + +*This API is available since Fedify 1.0.0.* + +[Linked Data Signatures] is a more advanced and widely used, but *obsolete*, +mechanism for signing portable ActivityPub activities. As of September 2024, +major ActivityPub implementations, such as Mastodon, et al., still rely on +Linked Data Signatures for signing portable activities, despite they declare +that Linked Data Signatures is outdated. + +It shares the similar concept with [HTTP Signatures](#http-signatures), +but unlike HTTP Signatures, it can be used for signing portable activities. +For example, it can be used for [forwarding from inbox] and several other +cases that HTTP Signatures cannot handle. + +Fedify automatically includes the Linked Data Signature of activities by +signing them with the sender's private key if the [actor keys dispatcher is +set](./actor.md#public-keys-of-an-actor) and the actor has any RSA-PKCS#1-v1.5 +key pair. If there are multiple key pairs, Fedify uses the first +RSA-PKCS#1-v1.5 key pair among them. + +> [!TIP] +> The combination of HTTP Signatures and Linked Data Signatures is the most +> widely supported way to sign activities in the fediverse, as of September +> 2024. Despite Linked Data Signatures is outdated and not recommended for +> new implementations, it is still widely used in the fediverse due to Mastodon +> and other major implementations' reliance on it. +> +> However, for new implementations, you should consider using *both* [Object +> Integrity Proofs](#object-integrity-proofs) and Linked Data Signatures +> for maximum compatibility and future-proofing. Fortunately, Fedify supports +> both Object Integrity Proofs and Linked Data Signatures simultaneously, +> in addition to HTTP Signatures. + +> [!NOTE] +> If an activity is signed with both HTTP Signatures and Linked Data Signatures, +> the recipient verifies the Linked Data Signatures first when it is supported, +> and ignores the HTTP Signatures if the Linked Data Signatures are valid. +> If the recipient does not support Linked Data Signatures, it falls back to +> verifying the HTTP Signatures. + +[Linked Data Signatures]: https://web.archive.org/web/20170923124140/https://w3c-dvcg.github.io/ld-signatures/ +[forwarding from inbox]: https://www.w3.org/TR/activitypub/#inbox-forwarding + + Object Integrity Proofs ----------------------- @@ -325,10 +371,9 @@ Object Integrity Proofs [Object Integrity Proofs][FEP-8b32] is a mechanism to ensure the integrity of ActivityPub objects (not only activities!) in the fediverse. It shares -the similar concept with [HTTP Signatures](#http-signatures), but it has more -functionalities and is more flexible. For example, it can be used for -[forwarding from inbox] and [several other cases] that HTTP Signatures cannot -handle. However, as it is relatively new, it is not widely supported yet. +the similar concept with [Linked Data Signatures](#linked-data-signatures), +but it has more functionalities and is more flexible. However, as it is +relatively new, it is not widely supported yet. Fedify automatically includes the integrity proof of activities by signing them with the sender's private key if the [actor keys dispatcher is @@ -337,17 +382,19 @@ If there are multiple key pairs, Fedify creates the number of integrity proofs equal to the number of Ed25519 key pairs. > [!TIP] -> HTTPS Signatures and Object Integrity Proofs can coexist in an application. -> If an activity is signed with HTTP Signatures and Object Integrity Proofs, -> the recipient verifies the Object Integrity Proofs first when it is supported, -> and ignores the HTTP Signatures if the Object Integrity Proofs are valid. +> HTTPS Signatures, Linked Data Signatures, and Object Integrity Proofs can +> coexist in an application and be used together for maximum compatibility. +> +> If an activity is signed with HTTP Signatures, Linked Data Signatures, +> and Object Integrity Proofs, the recipient verifies the Object Integrity +> Proofs first when it is supported, and ignores the HTTP Signatures and +> Linked Data Signatures if the Object Integrity Proofs are valid. > If the recipient does not support Object Integrity Proofs, it falls back to -> verifying the HTTP Signatures. +> verifying the HTTP Signatures and Linked Data Signatures. > -> To support both HTTP Signatures and Object Integrity Proofs, you need to -> generate both RSA-PKCS#1-v1.5 and Ed25519 key pairs for each actor, and -> store them in the database. +> To support HTTP Signatures, Linked Data Signatures, and Object Integrity +> Proofs simultaneously, you need to generate both RSA-PKCS#1-v1.5 and Ed25519 +> key pairs for each actor, and store them in the database. [FEP-8b32]: https://w3id.org/fep/8b32 -[forwarding from inbox]: https://www.w3.org/TR/activitypub/#inbox-forwarding [several other cases]: https://socialhub.activitypub.rocks/t/fep-8b32-object-integrity-proofs/2725/79?u=hongminhee diff --git a/src/codegen/__snapshots__/class.test.ts.snap b/src/codegen/__snapshots__/class.test.ts.snap index 30bc6bb..92b2a56 100644 --- a/src/codegen/__snapshots__/class.test.ts.snap +++ b/src/codegen/__snapshots__/class.test.ts.snap @@ -11012,7 +11012,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Activity\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/v1\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/v1\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -11128,7 +11128,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/v1\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/v1\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -11807,7 +11807,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Accept\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -11833,7 +11833,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -12098,7 +12098,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Add\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -12124,7 +12124,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -12384,7 +12384,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Announce\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; return result; } @@ -12410,7 +12410,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; const compacted = await jsonld.compact( values, docContext, @@ -16076,7 +16076,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"IntransitiveActivity\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -16102,7 +16102,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -16380,7 +16380,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -17804,7 +17804,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Ignore\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -17830,7 +17830,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -18095,7 +18095,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Block\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -18121,7 +18121,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -20324,7 +20324,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Create\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; return result; } @@ -20350,7 +20350,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; const compacted = await jsonld.compact( values, docContext, @@ -20609,7 +20609,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Delete\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; return result; } @@ -20635,7 +20635,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; const compacted = await jsonld.compact( values, docContext, @@ -20892,7 +20892,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Dislike\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -20918,7 +20918,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -22314,7 +22314,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Flag\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -22340,7 +22340,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -22601,7 +22601,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Follow\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -22627,7 +22627,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -28126,7 +28126,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Offer\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -28152,7 +28152,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -28415,7 +28415,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Invite\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -28441,7 +28441,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -28700,7 +28700,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Join\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -28726,7 +28726,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -28985,7 +28985,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Leave\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -29011,7 +29011,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -29270,7 +29270,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Like\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -29296,7 +29296,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -29553,7 +29553,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Listen\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -29579,7 +29579,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -30071,7 +30071,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Move\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -30097,7 +30097,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -40692,7 +40692,7 @@ get quoteUrl(): (URL | null) { result[\\"type\\"] = \\"Question\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; return result; } @@ -40803,7 +40803,7 @@ get quoteUrl(): (URL | null) { ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; const compacted = await jsonld.compact( values, docContext, @@ -41271,7 +41271,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Read\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -41297,7 +41297,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -41556,7 +41556,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Reject\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -41582,7 +41582,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -42841,7 +42841,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Remove\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -42867,7 +42867,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -47054,7 +47054,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"TentativeAccept\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -47080,7 +47080,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -47339,7 +47339,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"TentativeReject\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -47365,7 +47365,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -48003,7 +48003,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Travel\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -48029,7 +48029,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -48293,7 +48293,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Undo\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -48319,7 +48319,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, @@ -48581,7 +48581,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"Update\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; return result; } @@ -48607,7 +48607,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\",{\\"toot\\":\\"http://joinmastodon.org/ns#\\",\\"misskey\\":\\"https://misskey-hub.net/ns#\\",\\"fedibird\\":\\"http://fedibird.com/ns#\\",\\"sensitive\\":\\"as:sensitive\\",\\"votersCount\\":\\"toot:votersCount\\",\\"Emoji\\":\\"toot:Emoji\\",\\"Hashtag\\":\\"as:Hashtag\\",\\"ChatMessage\\":\\"http://litepub.social/ns#ChatMessage\\",\\"quoteUrl\\":\\"as:quoteUrl\\",\\"_misskey_quote\\":\\"misskey:_misskey_quote\\",\\"quoteUri\\":\\"fedibird:quoteUri\\"}]; const compacted = await jsonld.compact( values, docContext, @@ -49136,7 +49136,7 @@ instruments?: (Object | URL)[];} result[\\"type\\"] = \\"View\\"; if (this.id != null) result[\\"id\\"] = this.id.href; - result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + result[\\"@context\\"] = [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; return result; } @@ -49162,7 +49162,7 @@ instruments?: (Object | URL)[];} ); } const docContext = options.context ?? - [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\"]; + [\\"https://www.w3.org/ns/activitystreams\\",\\"https://w3id.org/security/data-integrity/v1\\",\\"https://w3id.org/identity/v1\\"]; const compacted = await jsonld.compact( values, docContext, diff --git a/src/deno.json b/src/deno.json index 1c7b35b..d30064d 100644 --- a/src/deno.json +++ b/src/deno.json @@ -81,7 +81,7 @@ "cache": "deno task codegen && deno cache mod.ts", "check": "deno task codegen && deno fmt --check && deno lint && deno check */*.ts", "codegen": "deno run --allow-read --allow-write --check codegen/main.ts vocab/ ../runtime/ > vocab/vocab.ts && deno fmt vocab/vocab.ts && deno cache vocab/vocab.ts && deno check vocab/vocab.ts", - "test-without-codegen": "deno test --check --doc --allow-read --allow-write --unstable-kv --trace-leaks", + "test-without-codegen": "deno test --check --doc --allow-read --allow-write --allow-env --unstable-kv --trace-leaks", "test": "deno task codegen && deno task test-without-codegen", "coverage": "rm -rf coverage/ && deno task test --coverage && deno coverage --html coverage", "bench": "deno task codegen && deno bench --allow-read --allow-write --allow-net --allow-env --allow-run --unstable-kv", diff --git a/src/federation/handler.test.ts b/src/federation/handler.test.ts index 27f4ab0..70e29d5 100644 --- a/src/federation/handler.test.ts +++ b/src/federation/handler.test.ts @@ -728,6 +728,7 @@ test("handleCollection()", async () => { const createCtx = [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/data-integrity/v1", + "https://w3id.org/identity/v1", { toot: "http://joinmastodon.org/ns#", misskey: "https://misskey-hub.net/ns#", diff --git a/src/federation/handler.ts b/src/federation/handler.ts index c218595..1bc3598 100644 --- a/src/federation/handler.ts +++ b/src/federation/handler.ts @@ -3,6 +3,7 @@ import { accepts } from "@std/http/negotiation"; import type { DocumentLoader } from "../runtime/docloader.ts"; import { verifyRequest } from "../sig/http.ts"; import type { KeyCache } from "../sig/key.ts"; +import { detachSignature, verifyJsonLd } from "../sig/ld.ts"; import { doesActorOwnKey } from "../sig/owner.ts"; import { verifyObject } from "../sig/proof.ts"; import type { Recipient } from "../vocab/actor.ts"; @@ -424,27 +425,51 @@ export async function handleInbox( await kv.set([...kvPrefixes.publicKey, keyId.href], serialized); }, }; - let activity: Activity | null; - try { - activity = await verifyObject(Activity, json, { - contextLoader: context.contextLoader, - documentLoader: context.documentLoader, - keyCache, - }); - } catch (error) { - logger.error("Failed to parse activity:\n{error}", { handle, json, error }); + const ldSigVerified = await verifyJsonLd(json, { + contextLoader: context.contextLoader, + documentLoader: context.documentLoader, + keyCache, + }); + const jsonWithoutSig = detachSignature(json); + let activity: Activity | null = null; + if (ldSigVerified) { + logger.debug("Linked Data Signatures are verified.", { handle, json }); + activity = await Activity.fromJsonLd(jsonWithoutSig, context); + } else { + logger.debug("Linked Data Signatures are not verified.", { handle, json }); try { - await inboxErrorHandler?.(context, error); + activity = await verifyObject(Activity, jsonWithoutSig, { + contextLoader: context.contextLoader, + documentLoader: context.documentLoader, + keyCache, + }); } catch (error) { - logger.error( - "An unexpected error occurred in inbox error handler:\n{error}", - { error, activity: json }, + logger.error("Failed to parse activity:\n{error}", { + handle, + json, + error, + }); + try { + await inboxErrorHandler?.(context, error); + } catch (error) { + logger.error( + "An unexpected error occurred in inbox error handler:\n{error}", + { error, activity: json }, + ); + } + return new Response("Invalid activity.", { + status: 400, + headers: { "Content-Type": "text/plain; charset=utf-8" }, + }); + } + if (activity == null) { + logger.debug( + "Object Integrity Proofs are not verified.", + { handle, json }, ); + } else { + logger.debug("Object Integrity Proofs are verified.", { handle, json }); } - return new Response("Invalid activity.", { - status: 400, - headers: { "Content-Type": "text/plain; charset=utf-8" }, - }); } let httpSigKey: CryptographicKey | null = null; if (activity == null) { @@ -456,7 +481,10 @@ export async function handleInbox( keyCache, }); if (key == null) { - logger.error("Failed to verify the request signature.", { handle }); + logger.error( + "Failed to verify the request's HTTP Signatures.", + { handle }, + ); const response = new Response( "Failed to verify the request signature.", { @@ -465,10 +493,12 @@ export async function handleInbox( }, ); return response; + } else { + logger.debug("HTTP Signatures are verified.", { handle }); } httpSigKey = key; } - activity = await Activity.fromJsonLd(json, context); + activity = await Activity.fromJsonLd(jsonWithoutSig, context); } const cacheKey = activity.id == null ? null diff --git a/src/federation/send.test.ts b/src/federation/send.test.ts index a1ca4bf..d3a0d2b 100644 --- a/src/federation/send.test.ts +++ b/src/federation/send.test.ts @@ -1,11 +1,7 @@ -import { - assertEquals, - assertNotEquals, - assertRejects, - assertStrictEquals, -} from "@std/assert"; +import { assertEquals, assertNotEquals, assertRejects } from "@std/assert"; import * as mf from "mock_fetch"; import { verifyRequest } from "../sig/http.ts"; +import { detachSignature, verifyJsonLd } from "../sig/ld.ts"; import { doesActorOwnKey } from "../sig/owner.ts"; import { verifyObject } from "../sig/proof.ts"; import { mockDocumentLoader } from "../testing/docloader.ts"; @@ -13,7 +9,9 @@ import { ed25519Multikey, ed25519PrivateKey, rsaPrivateKey2, + rsaPrivateKey3, rsaPublicKey2, + rsaPublicKey3, } from "../testing/keys.ts"; import { test } from "../testing/mod.ts"; import type { Actor } from "../vocab/actor.ts"; @@ -125,28 +123,31 @@ test("extractInboxes()", () => { test("sendActivity()", async (t) => { mf.install(); - let verified: "http-sig" | "proof" | false | null = null; + let verified: ("http-sig" | "proof" | "ld-sig")[] | null = null; let request: Request | null = null; mf.mock("POST@/inbox", async (req) => { + verified = []; request = req.clone(); const options = { documentLoader: mockDocumentLoader, contextLoader: mockDocumentLoader, }; const reqClone = req.clone(); - const jsonLd = await req.json(); + let jsonLd = await req.json(); + if (await verifyJsonLd(jsonLd, options)) { + verified.push("ld-sig"); + } + jsonLd = detachSignature(jsonLd); const verifiedObject = await verifyObject(Activity, jsonLd, options); if (verifiedObject != null) { - verified = "proof"; - return new Response("", { status: 202 }); + verified.push("proof"); } const key = await verifyRequest(reqClone, options); const activity = await Activity.fromJsonLd(await reqClone.json(), options); if (key != null && await doesActorOwnKey(activity, key, options)) { - verified = "http-sig"; - return new Response("", { status: 202 }); + verified.push("http-sig"); } - verified = false; + if (verified.length > 0) return new Response("", { status: 202 }); return new Response("", { status: 401 }); }); @@ -165,7 +166,7 @@ test("sendActivity()", async (t) => { "X-Test": "test", }), }); - assertStrictEquals(verified, "http-sig"); + assertEquals(verified, ["http-sig"]); assertNotEquals(request, null); assertEquals(request?.method, "POST"); assertEquals(request?.url, "https://example.com/inbox"); @@ -184,7 +185,46 @@ test("sendActivity()", async (t) => { inbox: new URL("https://example.com/inbox"), contextLoader: mockDocumentLoader, }); - assertStrictEquals(verified, "proof"); + assertEquals(verified, ["proof"]); + assertNotEquals(request, null); + assertEquals(request?.method, "POST"); + assertEquals(request?.url, "https://example.com/inbox"); + assertEquals( + request?.headers.get("Content-Type"), + "application/activity+json", + ); + + verified = null; + await sendActivity({ + activity: activity.clone({ + actor: new URL("https://example.com/person2"), + }), + keys: [{ privateKey: rsaPrivateKey3, keyId: rsaPublicKey3.id! }], + inbox: new URL("https://example.com/inbox"), + contextLoader: mockDocumentLoader, + }); + assertEquals(verified, ["ld-sig", "http-sig"]); + assertNotEquals(request, null); + assertEquals(request?.method, "POST"); + assertEquals(request?.url, "https://example.com/inbox"); + assertEquals( + request?.headers.get("Content-Type"), + "application/activity+json", + ); + + verified = null; + await sendActivity({ + activity: activity.clone({ + actor: new URL("https://example.com/person2"), + }), + keys: [ + { privateKey: rsaPrivateKey3, keyId: rsaPublicKey3.id! }, + { privateKey: ed25519PrivateKey, keyId: ed25519Multikey.id! }, + ], + inbox: new URL("https://example.com/inbox"), + contextLoader: mockDocumentLoader, + }); + assertEquals(verified, ["ld-sig", "proof", "http-sig"]); assertNotEquals(request, null); assertEquals(request?.method, "POST"); assertEquals(request?.url, "https://example.com/inbox"); diff --git a/src/federation/send.ts b/src/federation/send.ts index b620d74..77363f9 100644 --- a/src/federation/send.ts +++ b/src/federation/send.ts @@ -1,3 +1,4 @@ +import { signJsonLd } from "@fedify/fedify"; import { getLogger } from "@logtape/logtape"; import type { DocumentLoader } from "../runtime/docloader.ts"; import { signRequest } from "../sig/http.ts"; @@ -144,8 +145,13 @@ export async function sendActivity( } const activityId = activity.id.href; let proofCreated = false; + let rsaKey: { keyId: URL; privateKey: CryptoKey } | null = null; for (const { keyId, privateKey } of keys) { validateCryptoKey(privateKey, "private"); + if (rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5") { + rsaKey = { keyId, privateKey }; + continue; + } if (privateKey.algorithm.name === "Ed25519") { activity = await signObject(activity, privateKey, keyId, { documentLoader, @@ -154,6 +160,29 @@ export async function sendActivity( proofCreated = true; } } + let jsonLd = await activity.toJsonLd({ + format: "compact", + contextLoader, + }); + if (rsaKey == null) { + logger.warn( + "No supported key found to create a Linked Data signature for " + + "the activity {activityId}. The activity will be sent without " + + "a Linked Data signature. In order to create a Linked Data " + + "signature, at least one RSASSA-PKCS1-v1_5 key must be provided.", + { + activityId, + keys: keys.map((pair) => ({ + keyId: pair.keyId.href, + privateKey: pair.privateKey, + })), + }, + ); + } else { + jsonLd = await signJsonLd(jsonLd, rsaKey.privateKey, rsaKey.keyId, { + contextLoader, + }); + } if (!proofCreated) { logger.warn( "No supported key found to create a proof for the activity {activityId}. " + @@ -168,10 +197,6 @@ export async function sendActivity( }, ); } - const jsonLd = await activity.toJsonLd({ - format: "compact", - contextLoader, - }); headers = new Headers(headers); headers.set("Content-Type", "application/activity+json"); let request = new Request(inbox, { @@ -179,15 +204,7 @@ export async function sendActivity( headers, body: JSON.stringify(jsonLd), }); - let requestSigned = false; - for (const { privateKey, keyId } of keys) { - if (privateKey.algorithm.name === "RSASSA-PKCS1-v1_5") { - request = await signRequest(request, privateKey, keyId); - requestSigned = true; - break; - } - } - if (!requestSigned) { + if (rsaKey == null) { logger.warn( "No supported key found to sign the request to {inbox}. " + "The request will be sent without a signature. " + @@ -201,6 +218,8 @@ export async function sendActivity( })), }, ); + } else { + request = await signRequest(request, rsaKey.privateKey, rsaKey.keyId); } const response = await fetch(request); if (!response.ok) { diff --git a/src/sig/ld.ts b/src/sig/ld.ts index 34af6a5..e435c0b 100644 --- a/src/sig/ld.ts +++ b/src/sig/ld.ts @@ -1,6 +1,7 @@ import { getLogger } from "@logtape/logtape"; import { decodeBase64, encodeBase64 } from "@std/encoding/base64"; import { encodeHex } from "@std/encoding/hex"; +// @ts-ignore TS7016 import jsonld from "jsonld"; import { type DocumentLoader, diff --git a/src/sig/proof.test.ts b/src/sig/proof.test.ts index 8998bb8..53fb98f 100644 --- a/src/sig/proof.test.ts +++ b/src/sig/proof.test.ts @@ -84,8 +84,8 @@ test("createProof()", async () => { assertEquals( proof.proofValue, decodeHex( - "e8f4680c67ca538a7814fc50e8eba95d545e4cfd887e676022ea69fd255cbd2f" + - "ae7ae190da409aa35d6bdad12c2cf329c9bc1450a547d61340e793fb0ce5b104", + "fc953e2bcff0712c49354a997ba29bc58d9f8061dee3895495e627cd27ecb968" + + "36adc9b823dbd670d49829c6a13a45f2d0950376800cca561b4784de79801b0a", ), ); assertEquals(proof.created, created); diff --git a/src/testing/mod.ts b/src/testing/mod.ts index fa720eb..7a9e8f7 100644 --- a/src/testing/mod.ts +++ b/src/testing/mod.ts @@ -44,10 +44,15 @@ export function test( ) return; records.push(record); }, + console: getConsoleSink(), }, filters: {}, loggers: [ - { category: [], sinks: ["buffer"], level: "debug" }, + { + category: [], + sinks: [Deno.env.get("LOG") === "always" ? "console" : "buffer"], + level: "debug", + }, ], }); try { diff --git a/src/vocab/accept.yaml b/src/vocab/accept.yaml index e8ea5b5..3b35cbf 100644 --- a/src/vocab/accept.yaml +++ b/src/vocab/accept.yaml @@ -11,4 +11,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/activity.yaml b/src/vocab/activity.yaml index 1170ea5..02dea08 100644 --- a/src/vocab/activity.yaml +++ b/src/vocab/activity.yaml @@ -14,6 +14,7 @@ defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/v1" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: - pluralName: actors diff --git a/src/vocab/add.yaml b/src/vocab/add.yaml index 7e42e52..b0f175c 100644 --- a/src/vocab/add.yaml +++ b/src/vocab/add.yaml @@ -12,4 +12,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/announce.yaml b/src/vocab/announce.yaml index 9e77674..300743f 100644 --- a/src/vocab/announce.yaml +++ b/src/vocab/announce.yaml @@ -11,6 +11,7 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" - toot: "http://joinmastodon.org/ns#" misskey: "https://misskey-hub.net/ns#" fedibird: "http://fedibird.com/ns#" diff --git a/src/vocab/arrive.yaml b/src/vocab/arrive.yaml index e6eb0d1..ebca371 100644 --- a/src/vocab/arrive.yaml +++ b/src/vocab/arrive.yaml @@ -11,4 +11,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/block.yaml b/src/vocab/block.yaml index 6fc85f8..3a53bac 100644 --- a/src/vocab/block.yaml +++ b/src/vocab/block.yaml @@ -12,4 +12,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/create.yaml b/src/vocab/create.yaml index 35fbf00..a1366c2 100644 --- a/src/vocab/create.yaml +++ b/src/vocab/create.yaml @@ -8,6 +8,7 @@ description: Indicates that the `actor` has created the `object`. defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" - toot: "http://joinmastodon.org/ns#" misskey: "https://misskey-hub.net/ns#" fedibird: "http://fedibird.com/ns#" diff --git a/src/vocab/delete.yaml b/src/vocab/delete.yaml index f820412..e5e05ae 100644 --- a/src/vocab/delete.yaml +++ b/src/vocab/delete.yaml @@ -10,6 +10,7 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" - toot: "http://joinmastodon.org/ns#" misskey: "https://misskey-hub.net/ns#" fedibird: "http://fedibird.com/ns#" diff --git a/src/vocab/dislike.yaml b/src/vocab/dislike.yaml index 81f89dd..b981402 100644 --- a/src/vocab/dislike.yaml +++ b/src/vocab/dislike.yaml @@ -8,4 +8,5 @@ description: Indicates that the `actor` dislikes the `object`. defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/flag.yaml b/src/vocab/flag.yaml index 9d6772d..4648686 100644 --- a/src/vocab/flag.yaml +++ b/src/vocab/flag.yaml @@ -11,4 +11,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/follow.yaml b/src/vocab/follow.yaml index eb303fa..2e3713f 100644 --- a/src/vocab/follow.yaml +++ b/src/vocab/follow.yaml @@ -12,4 +12,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/ignore.yaml b/src/vocab/ignore.yaml index 67a565c..c8b5345 100644 --- a/src/vocab/ignore.yaml +++ b/src/vocab/ignore.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/intransitiveactivity.yaml b/src/vocab/intransitiveactivity.yaml index a81ad95..54835d6 100644 --- a/src/vocab/intransitiveactivity.yaml +++ b/src/vocab/intransitiveactivity.yaml @@ -11,4 +11,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/invite.yaml b/src/vocab/invite.yaml index ae5f746..3507e4e 100644 --- a/src/vocab/invite.yaml +++ b/src/vocab/invite.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/join.yaml b/src/vocab/join.yaml index cdd1baa..3b4cfed 100644 --- a/src/vocab/join.yaml +++ b/src/vocab/join.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/leave.yaml b/src/vocab/leave.yaml index a58c6c1..b810531 100644 --- a/src/vocab/leave.yaml +++ b/src/vocab/leave.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/like.yaml b/src/vocab/like.yaml index 811be21..89ca3dd 100644 --- a/src/vocab/like.yaml +++ b/src/vocab/like.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/listen.yaml b/src/vocab/listen.yaml index a819d5e..3c8a72f 100644 --- a/src/vocab/listen.yaml +++ b/src/vocab/listen.yaml @@ -8,4 +8,5 @@ description: Indicates that the `actor` has listened to the `object`. defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/move.yaml b/src/vocab/move.yaml index 8e73c18..d7977ea 100644 --- a/src/vocab/move.yaml +++ b/src/vocab/move.yaml @@ -11,4 +11,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/offer.yaml b/src/vocab/offer.yaml index 0a65a26..e55b479 100644 --- a/src/vocab/offer.yaml +++ b/src/vocab/offer.yaml @@ -11,4 +11,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/question.yaml b/src/vocab/question.yaml index 94f3498..040b976 100644 --- a/src/vocab/question.yaml +++ b/src/vocab/question.yaml @@ -16,6 +16,7 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" - toot: "http://joinmastodon.org/ns#" misskey: "https://misskey-hub.net/ns#" fedibird: "http://fedibird.com/ns#" diff --git a/src/vocab/read.yaml b/src/vocab/read.yaml index 2d70521..638dc85 100644 --- a/src/vocab/read.yaml +++ b/src/vocab/read.yaml @@ -9,4 +9,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/reject.yaml b/src/vocab/reject.yaml index 5c02450..3e83de4 100644 --- a/src/vocab/reject.yaml +++ b/src/vocab/reject.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/remove.yaml b/src/vocab/remove.yaml index 7bc81a9..4a554b2 100644 --- a/src/vocab/remove.yaml +++ b/src/vocab/remove.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/tentativeaccept.yaml b/src/vocab/tentativeaccept.yaml index 8f1217b..69779a3 100644 --- a/src/vocab/tentativeaccept.yaml +++ b/src/vocab/tentativeaccept.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/tentativereject.yaml b/src/vocab/tentativereject.yaml index a037878..652dc4c 100644 --- a/src/vocab/tentativereject.yaml +++ b/src/vocab/tentativereject.yaml @@ -10,4 +10,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/travel.yaml b/src/vocab/travel.yaml index 03a7ea6..f750766 100644 --- a/src/vocab/travel.yaml +++ b/src/vocab/travel.yaml @@ -12,4 +12,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/undo.yaml b/src/vocab/undo.yaml index db05e76..10f4ac0 100644 --- a/src/vocab/undo.yaml +++ b/src/vocab/undo.yaml @@ -15,4 +15,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: [] diff --git a/src/vocab/update.yaml b/src/vocab/update.yaml index 69abc0a..dc2212a 100644 --- a/src/vocab/update.yaml +++ b/src/vocab/update.yaml @@ -13,6 +13,7 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" - toot: "http://joinmastodon.org/ns#" misskey: "https://misskey-hub.net/ns#" fedibird: "http://fedibird.com/ns#" diff --git a/src/vocab/view.yaml b/src/vocab/view.yaml index 5c62f8f..e88fd1f 100644 --- a/src/vocab/view.yaml +++ b/src/vocab/view.yaml @@ -9,4 +9,5 @@ description: | defaultContext: - "https://www.w3.org/ns/activitystreams" - "https://w3id.org/security/data-integrity/v1" +- "https://w3id.org/identity/v1" properties: []