@fedify/fedify 1.3.18 → 1.3.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/CHANGES.md +59 -0
  2. package/esm/deno.js +2 -2
  3. package/esm/federation/handler.js +15 -15
  4. package/esm/vocab/announce.yaml +3 -1
  5. package/esm/vocab/create.yaml +3 -1
  6. package/esm/vocab/delete.yaml +3 -1
  7. package/esm/vocab/question.yaml +75 -73
  8. package/esm/vocab/update.yaml +3 -1
  9. package/esm/vocab/vocab.js +193 -178
  10. package/package.json +1 -1
  11. package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/common.d.ts.map +1 -1
  12. package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/encoding.d.ts.map +1 -1
  13. package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/language.d.ts.map +1 -1
  14. package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/media_type.d.ts.map +1 -1
  15. package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/negotiation.d.ts.map +1 -1
  16. package/types/vocab/vocab.d.ts.map +1 -1
  17. /package/esm/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/common.js +0 -0
  18. /package/esm/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/encoding.js +0 -0
  19. /package/esm/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/language.js +0 -0
  20. /package/esm/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/media_type.js +0 -0
  21. /package/esm/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/negotiation.js +0 -0
  22. /package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/common.d.ts +0 -0
  23. /package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/encoding.d.ts +0 -0
  24. /package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/language.d.ts +0 -0
  25. /package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/_negotiation/media_type.d.ts +0 -0
  26. /package/types/deps/jsr.io/@std/http/{1.0.16 → 1.0.20}/negotiation.d.ts +0 -0
package/CHANGES.md CHANGED
@@ -3,6 +3,32 @@
3
3
  Fedify changelog
4
4
  ================
5
5
 
6
+ Version 1.3.20
7
+ --------------
8
+
9
+ Released on August 8, 2025.
10
+
11
+ - Fixed a critical authentication bypass vulnerability in the inbox handler
12
+ that allowed unauthenticated attackers to impersonate any ActivityPub actor.
13
+ The vulnerability occurred because activities were processed before
14
+ verifying that the HTTP Signatures key belonged to the claimed actor.
15
+ Now authentication verification is performed before activity processing to
16
+ prevent actor impersonation attacks. [[CVE-2025-54888]]
17
+
18
+ [CVE-2025-54888]: https://github.com/fedify-dev/fedify/security/advisories/GHSA-6jcc-xgcr-q3h4
19
+
20
+
21
+ Version 1.3.19
22
+ --------------
23
+
24
+ Released on June 30, 2025.
25
+
26
+ - Fixed JSON-LD serialization of the `Question.voters` property to correctly
27
+ serialize as a plain number (e.g., `"votersCount": 123`) instead of as a
28
+ typed literal object (e.g., `"votersCount":{"type":"xsd:nonNegativeInteger",
29
+ "@value":123}`).
30
+
31
+
6
32
  Version 1.3.18
7
33
  --------------
8
34
 
@@ -357,6 +383,17 @@ Released on November 30, 2024.
357
383
  [#193]: https://github.com/fedify-dev/fedify/issues/193
358
384
 
359
385
 
386
+ Version 1.2.23
387
+ --------------
388
+
389
+ Released on June 30, 2025.
390
+
391
+ - Fixed JSON-LD serialization of the `Question.voters` property to correctly
392
+ serialize as a plain number (e.g., `"votersCount": 123`) instead of as a
393
+ typed literal object (e.g., `"votersCount":{"type":"xsd:nonNegativeInteger",
394
+ "@value":123}`).
395
+
396
+
360
397
  Version 1.2.22
361
398
  --------------
362
399
 
@@ -759,6 +796,17 @@ Released on October 31, 2024.
759
796
  [#118]: https://github.com/fedify-dev/fedify/issues/118
760
797
 
761
798
 
799
+ Version 1.1.23
800
+ --------------
801
+
802
+ Released on June 30, 2025.
803
+
804
+ - Fixed JSON-LD serialization of the `Question.voters` property to correctly
805
+ serialize as a plain number (e.g., `"votersCount": 123`) instead of as a
806
+ typed literal object (e.g., `"votersCount":{"type":"xsd:nonNegativeInteger",
807
+ "@value":123}`).
808
+
809
+
762
810
  Version 1.1.22
763
811
  --------------
764
812
 
@@ -1202,6 +1250,17 @@ Released on October 20, 2024.
1202
1250
  [#150]: https://github.com/fedify-dev/fedify/issues/150
1203
1251
 
1204
1252
 
1253
+ Version 1.0.26
1254
+ --------------
1255
+
1256
+ Released on June 30, 2025.
1257
+
1258
+ - Fixed JSON-LD serialization of the `Question.voters` property to correctly
1259
+ serialize as a plain number (e.g., `"votersCount": 123`) instead of as a
1260
+ typed literal object (e.g., `"votersCount":{"type":"xsd:nonNegativeInteger",
1261
+ "@value":123}`).
1262
+
1263
+
1205
1264
  Version 1.0.25
1206
1265
  --------------
1207
1266
 
package/esm/deno.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export default {
2
2
  "name": "@fedify/fedify",
3
- "version": "1.3.18",
3
+ "version": "1.3.20",
4
4
  "license": "MIT",
5
5
  "exports": {
6
6
  ".": "./mod.ts",
@@ -37,7 +37,7 @@ export default {
37
37
  "@opentelemetry/semantic-conventions": "npm:@opentelemetry/semantic-conventions@^1.27.0",
38
38
  "@phensley/language-tag": "npm:@phensley/language-tag@^1.9.0",
39
39
  "@std/assert": "jsr:@std/assert@^0.226.0",
40
- "@std/async": "jsr:@std/async@^1.0.5",
40
+ "@std/async": "jsr:@std/async@1.0.13",
41
41
  "@std/bytes": "jsr:@std/bytes@^1.0.2",
42
42
  "@std/collections": "jsr:@std/collections@^1.0.6",
43
43
  "@std/encoding": "jsr:@std/encoding@1.0.7",
@@ -1,6 +1,6 @@
1
1
  import { getLogger } from "@logtape/logtape";
2
2
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
3
- import { accepts } from "../deps/jsr.io/@std/http/1.0.16/negotiation.js";
3
+ import { accepts } from "../deps/jsr.io/@std/http/1.0.20/negotiation.js";
4
4
  import metadata from "../deno.js";
5
5
  import { verifyRequest } from "../sig/http.js";
6
6
  import { detachSignature, verifyJsonLd } from "../sig/ld.js";
@@ -418,20 +418,6 @@ async function handleInboxInternal(request, { recipient, context: ctx, inboxCont
418
418
  span.setAttribute("activitypub.activity.id", activity.id.href);
419
419
  }
420
420
  span.setAttribute("activitypub.activity.type", getTypeId(activity).href);
421
- const routeResult = await routeActivity({
422
- context: ctx,
423
- json,
424
- activity,
425
- recipient,
426
- inboxListeners,
427
- inboxContextFactory,
428
- inboxErrorHandler,
429
- kv,
430
- kvPrefixes,
431
- queue,
432
- span,
433
- tracerProvider,
434
- });
435
421
  if (httpSigKey != null && !await doesActorOwnKey(activity, httpSigKey, ctx)) {
436
422
  logger.error("The signer ({keyId}) and the actor ({actorId}) do not match.", {
437
423
  activity: json,
@@ -449,6 +435,20 @@ async function handleInboxInternal(request, { recipient, context: ctx, inboxCont
449
435
  headers: { "Content-Type": "text/plain; charset=utf-8" },
450
436
  });
451
437
  }
438
+ const routeResult = await routeActivity({
439
+ context: ctx,
440
+ json,
441
+ activity,
442
+ recipient,
443
+ inboxListeners,
444
+ inboxContextFactory,
445
+ inboxErrorHandler,
446
+ kv,
447
+ kvPrefixes,
448
+ queue,
449
+ span,
450
+ tracerProvider,
451
+ });
452
452
  if (routeResult === "alreadyProcessed") {
453
453
  return new Response(`Activity <${activity.id}> has already been processed.`, {
454
454
  status: 202,
@@ -16,7 +16,9 @@ defaultContext:
16
16
  misskey: "https://misskey-hub.net/ns#"
17
17
  fedibird: "http://fedibird.com/ns#"
18
18
  sensitive: "as:sensitive"
19
- votersCount: "toot:votersCount"
19
+ votersCount:
20
+ "@id": "toot:votersCount"
21
+ "@type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
20
22
  Emoji: "toot:Emoji"
21
23
  Hashtag: "as:Hashtag"
22
24
  quoteUrl: "as:quoteUrl"
@@ -13,7 +13,9 @@ defaultContext:
13
13
  misskey: "https://misskey-hub.net/ns#"
14
14
  fedibird: "http://fedibird.com/ns#"
15
15
  sensitive: "as:sensitive"
16
- votersCount: "toot:votersCount"
16
+ votersCount:
17
+ "@id": "toot:votersCount"
18
+ "@type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
17
19
  Emoji: "toot:Emoji"
18
20
  Hashtag: "as:Hashtag"
19
21
  ChatMessage: "http://litepub.social/ns#ChatMessage"
@@ -15,7 +15,9 @@ defaultContext:
15
15
  misskey: "https://misskey-hub.net/ns#"
16
16
  fedibird: "http://fedibird.com/ns#"
17
17
  sensitive: "as:sensitive"
18
- votersCount: "toot:votersCount"
18
+ votersCount:
19
+ "@id": "toot:votersCount"
20
+ "@type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
19
21
  Emoji: "toot:Emoji"
20
22
  Hashtag: "as:Hashtag"
21
23
  ChatMessage: "http://litepub.social/ns#ChatMessage"
@@ -14,85 +14,87 @@ description: |
14
14
  used to express possible answers, but a Question object *must not* have both
15
15
  properties.
16
16
  defaultContext:
17
- - "https://w3id.org/identity/v1"
18
- - "https://www.w3.org/ns/activitystreams"
19
- - "https://w3id.org/security/data-integrity/v1"
20
- - toot: "http://joinmastodon.org/ns#"
21
- misskey: "https://misskey-hub.net/ns#"
22
- fedibird: "http://fedibird.com/ns#"
23
- sensitive: "as:sensitive"
24
- votersCount: "toot:votersCount"
25
- Emoji: "toot:Emoji"
26
- Hashtag: "as:Hashtag"
27
- quoteUrl: "as:quoteUrl"
28
- _misskey_quote: "misskey:_misskey_quote"
29
- quoteUri: "fedibird:quoteUri"
17
+ - "https://w3id.org/identity/v1"
18
+ - "https://www.w3.org/ns/activitystreams"
19
+ - "https://w3id.org/security/data-integrity/v1"
20
+ - toot: "http://joinmastodon.org/ns#"
21
+ misskey: "https://misskey-hub.net/ns#"
22
+ fedibird: "http://fedibird.com/ns#"
23
+ sensitive: "as:sensitive"
24
+ votersCount:
25
+ "@id": "toot:votersCount"
26
+ "@type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
27
+ Emoji: "toot:Emoji"
28
+ Hashtag: "as:Hashtag"
29
+ quoteUrl: "as:quoteUrl"
30
+ _misskey_quote: "misskey:_misskey_quote"
31
+ quoteUri: "fedibird:quoteUri"
30
32
 
31
33
  properties:
32
- - pluralName: exclusiveOptions
33
- singularName: exclusiveOption
34
- singularAccessor: false
35
- compactName: oneOf
36
- uri: "https://www.w3.org/ns/activitystreams#oneOf"
37
- description: |
38
- Identifies an exclusive option for a Question. Use of `exclusiveOptions`
39
- implies that the Question can have only a single answer. To indicate that
40
- a Question can have multiple answers, use `inclusiveOptions`.
41
- range:
42
- - "https://www.w3.org/ns/activitystreams#Object"
34
+ - pluralName: exclusiveOptions
35
+ singularName: exclusiveOption
36
+ singularAccessor: false
37
+ compactName: oneOf
38
+ uri: "https://www.w3.org/ns/activitystreams#oneOf"
39
+ description: |
40
+ Identifies an exclusive option for a Question. Use of `exclusiveOptions`
41
+ implies that the Question can have only a single answer. To indicate that
42
+ a Question can have multiple answers, use `inclusiveOptions`.
43
+ range:
44
+ - "https://www.w3.org/ns/activitystreams#Object"
43
45
 
44
- - pluralName: inclusiveOptions
45
- singularName: inclusiveOption
46
- singularAccessor: false
47
- compactName: anyOf
48
- uri: "https://www.w3.org/ns/activitystreams#anyOf"
49
- description: |
50
- Identifies an inclusive option for a Question. Use of `inclusiveOptions`
51
- implies that the Question can have multiple answers. To indicate that
52
- a Question can have only one answer, use `exclusiveOptions`.
53
- range:
54
- - "https://www.w3.org/ns/activitystreams#Object"
46
+ - pluralName: inclusiveOptions
47
+ singularName: inclusiveOption
48
+ singularAccessor: false
49
+ compactName: anyOf
50
+ uri: "https://www.w3.org/ns/activitystreams#anyOf"
51
+ description: |
52
+ Identifies an inclusive option for a Question. Use of `inclusiveOptions`
53
+ implies that the Question can have multiple answers. To indicate that
54
+ a Question can have only one answer, use `exclusiveOptions`.
55
+ range:
56
+ - "https://www.w3.org/ns/activitystreams#Object"
55
57
 
56
- - singularName: closed
57
- functional: true
58
- compactName: closed
59
- uri: "https://www.w3.org/ns/activitystreams#closed"
60
- description: |
61
- Indicates that a question has been closed, and answers are no longer
62
- accepted.
63
- range:
64
- - "http://www.w3.org/2001/XMLSchema#dateTime"
65
- - "http://www.w3.org/2001/XMLSchema#boolean"
58
+ - singularName: closed
59
+ functional: true
60
+ compactName: closed
61
+ uri: "https://www.w3.org/ns/activitystreams#closed"
62
+ description: |
63
+ Indicates that a question has been closed, and answers are no longer
64
+ accepted.
65
+ range:
66
+ - "http://www.w3.org/2001/XMLSchema#dateTime"
67
+ - "http://www.w3.org/2001/XMLSchema#boolean"
66
68
 
67
- - singularName: voters
68
- functional: true
69
- compactName: votersCount
70
- uri: "http://joinmastodon.org/ns#votersCount"
71
- description: |
72
- How many people have voted in the poll. Distinct from how many votes have
73
- been cast (in the case of multiple-choice polls).
74
- range:
75
- - "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
69
+ - singularName: voters
70
+ functional: true
71
+ compactName: votersCount
72
+ uri: "http://joinmastodon.org/ns#votersCount"
73
+ description: |
74
+ How many people have voted in the poll. Distinct from how many votes have
75
+ been cast (in the case of multiple-choice polls).
76
+ range:
77
+ - "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
76
78
 
77
- - singularName: quoteUrl
78
- functional: true
79
- compactName: quoteUrl
80
- uri: "https://www.w3.org/ns/activitystreams#quoteUrl"
81
- redundantProperties:
82
- - compactName: _misskey_quote
83
- uri: "https://misskey-hub.net/ns#_misskey_quote"
84
- - compactName: quoteUri
85
- uri: "http://fedibird.com/ns#quoteUri"
86
- description: |
87
- The URI of the ActivityStreams object that this object quotes.
79
+ - singularName: quoteUrl
80
+ functional: true
81
+ compactName: quoteUrl
82
+ uri: "https://www.w3.org/ns/activitystreams#quoteUrl"
83
+ redundantProperties:
84
+ - compactName: _misskey_quote
85
+ uri: "https://misskey-hub.net/ns#_misskey_quote"
86
+ - compactName: quoteUri
87
+ uri: "http://fedibird.com/ns#quoteUri"
88
+ description: |
89
+ The URI of the ActivityStreams object that this object quotes.
88
90
 
89
- This property sets three JSON-LD properties at once under the hood:
91
+ This property sets three JSON-LD properties at once under the hood:
90
92
 
91
- 1. https://www.w3.org/ns/activitystreams#quoteUrl
92
- 2. https://misskey-hub.net/ns#_misskey_quote
93
- 3. http://fedibird.com/ns#quoteUri
93
+ 1. https://www.w3.org/ns/activitystreams#quoteUrl
94
+ 2. https://misskey-hub.net/ns#_misskey_quote
95
+ 3. http://fedibird.com/ns#quoteUri
94
96
 
95
- When a JSON-LD object is parsed, this property is filled with one of
96
- the values of those three properties in order.
97
- range:
98
- - "fedify:url"
97
+ When a JSON-LD object is parsed, this property is filled with one of
98
+ the values of those three properties in order.
99
+ range:
100
+ - "fedify:url"
@@ -37,7 +37,9 @@ defaultContext:
37
37
  suspended: "toot:suspended"
38
38
  memorial: "toot:memorial"
39
39
  indexable: "toot:indexable"
40
- votersCount: "toot:votersCount"
40
+ votersCount:
41
+ "@id": "toot:votersCount"
42
+ "@type": "http://www.w3.org/2001/XMLSchema#nonNegativeInteger"
41
43
  Emoji: "toot:Emoji"
42
44
  Hashtag: "as:Hashtag"
43
45
  schema: "http://schema.org#"