@fedify/fedify 1.0.8 → 1.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. package/CHANGES.md +156 -0
  2. package/esm/federation/handler.js +15 -1
  3. package/esm/runtime/key.js +1 -1
  4. package/esm/sig/http.js +9 -1
  5. package/esm/testing/fixtures/example.com/orderedcollectionpage +24 -0
  6. package/esm/vocab/application.yaml +2 -0
  7. package/esm/vocab/group.yaml +2 -0
  8. package/esm/vocab/organization.yaml +2 -0
  9. package/esm/vocab/person.yaml +2 -0
  10. package/esm/vocab/service.yaml +2 -0
  11. package/esm/vocab/vocab.js +450 -110
  12. package/package.json +1 -1
  13. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/concat.d.ts.map +1 -1
  14. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/copy.d.ts.map +1 -1
  15. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/ends_with.d.ts.map +1 -1
  16. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/equals.d.ts.map +1 -1
  17. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/includes_needle.d.ts.map +1 -1
  18. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/index_of_needle.d.ts.map +1 -1
  19. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/last_index_of_needle.d.ts.map +1 -1
  20. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/mod.d.ts.map +1 -1
  21. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/repeat.d.ts.map +1 -1
  22. package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/starts_with.d.ts.map +1 -1
  23. package/types/deps/jsr.io/@std/http/1.0.10/_negotiation/common.d.ts.map +1 -0
  24. package/types/deps/jsr.io/@std/http/1.0.10/_negotiation/encoding.d.ts.map +1 -0
  25. package/types/deps/jsr.io/@std/http/1.0.10/_negotiation/language.d.ts.map +1 -0
  26. package/types/deps/jsr.io/@std/http/1.0.10/_negotiation/media_type.d.ts.map +1 -0
  27. package/types/deps/jsr.io/@std/http/1.0.10/negotiation.d.ts.map +1 -0
  28. package/types/federation/handler.d.ts.map +1 -1
  29. package/types/sig/http.d.ts.map +1 -1
  30. package/types/vocab/vocab.d.ts +30 -30
  31. package/types/vocab/vocab.d.ts.map +1 -1
  32. package/types/deps/jsr.io/@std/http/1.0.9/_negotiation/common.d.ts.map +0 -1
  33. package/types/deps/jsr.io/@std/http/1.0.9/_negotiation/encoding.d.ts.map +0 -1
  34. package/types/deps/jsr.io/@std/http/1.0.9/_negotiation/language.d.ts.map +0 -1
  35. package/types/deps/jsr.io/@std/http/1.0.9/_negotiation/media_type.d.ts.map +0 -1
  36. package/types/deps/jsr.io/@std/http/1.0.9/negotiation.d.ts.map +0 -1
  37. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/concat.js +0 -0
  38. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/copy.js +0 -0
  39. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/ends_with.js +0 -0
  40. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/equals.js +0 -0
  41. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/includes_needle.js +0 -0
  42. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/index_of_needle.js +0 -0
  43. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/last_index_of_needle.js +0 -0
  44. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/mod.js +0 -0
  45. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/repeat.js +0 -0
  46. /package/esm/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/starts_with.js +0 -0
  47. /package/esm/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/common.js +0 -0
  48. /package/esm/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/encoding.js +0 -0
  49. /package/esm/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/language.js +0 -0
  50. /package/esm/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/media_type.js +0 -0
  51. /package/esm/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/negotiation.js +0 -0
  52. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/concat.d.ts +0 -0
  53. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/copy.d.ts +0 -0
  54. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/ends_with.d.ts +0 -0
  55. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/equals.d.ts +0 -0
  56. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/includes_needle.d.ts +0 -0
  57. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/index_of_needle.d.ts +0 -0
  58. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/last_index_of_needle.d.ts +0 -0
  59. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/mod.d.ts +0 -0
  60. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/repeat.d.ts +0 -0
  61. /package/types/deps/jsr.io/@std/bytes/{1.0.3 → 1.0.4}/starts_with.d.ts +0 -0
  62. /package/types/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/common.d.ts +0 -0
  63. /package/types/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/encoding.d.ts +0 -0
  64. /package/types/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/language.d.ts +0 -0
  65. /package/types/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/_negotiation/media_type.d.ts +0 -0
  66. /package/types/deps/jsr.io/@std/http/{1.0.9 → 1.0.10}/negotiation.d.ts +0 -0
package/CHANGES.md CHANGED
@@ -3,6 +3,82 @@
3
3
  Fedify changelog
4
4
  ================
5
5
 
6
+ Version 1.0.10
7
+ --------------
8
+
9
+ Released on December 19, 2024.
10
+
11
+ - Fix a bug where `Actor`'s `inbox` and `outbox` properties had not been
12
+ able to be set to an `OrderedCollectionPage` object, even though it is
13
+ a subtype of `OrderedCollection` according to Activity Vocabulary
14
+ specification. [[#165]]
15
+
16
+ - The type of `Application()` constructor's `inbox` and `outbox` options
17
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
18
+ (was `OrderedCollection | null | undefined`).
19
+ - The type of `Application.clone()` method's `inbox` and `outbox` options
20
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
21
+ (was `OrderedCollection | null | undefined`).
22
+ - The return type of `Application.getInbox()` and
23
+ `Application.getOutbox()` methods is now `OrderedCollection |
24
+ OrderedCollectionPage | null` (was `OrderedCollection | null`).
25
+ - The type of `Group()` constructor's `inbox` and `outbox` options is
26
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
27
+ `OrderedCollection | null | undefined`).
28
+ - The type of `Group.clone()` method's `inbox` and `outbox` options is
29
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
30
+ `OrderedCollection | null | undefined`).
31
+ - The return type of `Group.getInbox()` and `Group.getOutbox()` methods
32
+ is now `OrderedCollection | OrderedCollectionPage | null` (was
33
+ `OrderedCollection | null`).
34
+ - The type of `Organization()` constructor's `inbox` and `outbox` options
35
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
36
+ (was `OrderedCollection | null | undefined`).
37
+ - The type of `Organization.clone()` method's `inbox` and `outbox` options
38
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
39
+ (was `OrderedCollection | null | undefined`).
40
+ - The return type of `Organization.getInbox()` and
41
+ `Organization.getOutbox()` methods is now `OrderedCollection |
42
+ OrderedCollectionPage | null` (was `OrderedCollection | null`).
43
+ - The type of `Person()` constructor's `inbox` and `outbox` options is
44
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
45
+ `OrderedCollection | null | undefined`).
46
+ - The type of `Person.clone()` method's `inbox` and `outbox` options is
47
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
48
+ `OrderedCollection | null | undefined`).
49
+ - The return type of `Person.getInbox()` and `Person.getOutbox()` methods
50
+ is now `OrderedCollection | OrderedCollectionPage | null` (was
51
+ `OrderedCollection | null`).
52
+ - The type of `Service()` constructor's `inbox` and `outbox` options is
53
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
54
+ `OrderedCollection | null | undefined`).
55
+ - The type of `Service.clone()` method's `inbox` and `outbox` options is
56
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
57
+ `OrderedCollection | null | undefined`).
58
+ - The return type of `Service.getInbox()` and `Service.getOutbox()`
59
+ methods is now `OrderedCollection | OrderedCollectionPage | null` (was
60
+ `OrderedCollection | null`).
61
+
62
+
63
+ Version 1.0.9
64
+ -------------
65
+
66
+ Released on December 14, 2024.
67
+
68
+ - Suppressed a `TypeError` with a message <q>unusable</q> due to Node.js's
69
+ mysterious behavior. [[#159]]
70
+
71
+ - The `verifyRequest()` function no longer throws a `TypeError`
72
+ when a given `Request` object's body is already consumed or locked.
73
+ Instead, it logs an error message to the `["fedify", "sig", "http"]`
74
+ logger category and returns `null`.
75
+ - The `Federation.fetch()` method no longer throws a `TypeError`
76
+ when a given `Request` object's body is already consumed or locked.
77
+ Instead, it logs an error message to the `["fedify", "federation",
78
+ "inbox"]` logger category and responds with a `500 Internal Server
79
+ Error`.
80
+
81
+
6
82
  Version 1.0.8
7
83
  -------------
8
84
 
@@ -268,6 +344,86 @@ Released on September 26, 2024.
268
344
  [#137]: https://github.com/dahlia/fedify/issues/137
269
345
 
270
346
 
347
+ Version 0.15.8
348
+ --------------
349
+
350
+ Released on November 159, 2024.
351
+
352
+ - Fix a bug where `Actor`'s `inbox` and `outbox` properties had not been
353
+ able to be set to an `OrderedCollectionPage` object, even though it is
354
+ a subtype of `OrderedCollection` according to Activity Vocabulary
355
+ specification. [[#165]]
356
+
357
+ - The type of `Application()` constructor's `inbox` and `outbox` options
358
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
359
+ (was `OrderedCollection | null | undefined`).
360
+ - The type of `Application.clone()` method's `inbox` and `outbox` options
361
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
362
+ (was `OrderedCollection | null | undefined`).
363
+ - The return type of `Application.getInbox()` and
364
+ `Application.getOutbox()` methods is now `OrderedCollection |
365
+ OrderedCollectionPage | null` (was `OrderedCollection | null`).
366
+ - The type of `Group()` constructor's `inbox` and `outbox` options is
367
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
368
+ `OrderedCollection | null | undefined`).
369
+ - The type of `Group.clone()` method's `inbox` and `outbox` options is
370
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
371
+ `OrderedCollection | null | undefined`).
372
+ - The return type of `Group.getInbox()` and `Group.getOutbox()` methods
373
+ is now `OrderedCollection | OrderedCollectionPage | null` (was
374
+ `OrderedCollection | null`).
375
+ - The type of `Organization()` constructor's `inbox` and `outbox` options
376
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
377
+ (was `OrderedCollection | null | undefined`).
378
+ - The type of `Organization.clone()` method's `inbox` and `outbox` options
379
+ is now `OrderedCollection | OrderedCollectionPage | null | undefined`
380
+ (was `OrderedCollection | null | undefined`).
381
+ - The return type of `Organization.getInbox()` and
382
+ `Organization.getOutbox()` methods is now `OrderedCollection |
383
+ OrderedCollectionPage | null` (was `OrderedCollection | null`).
384
+ - The type of `Person()` constructor's `inbox` and `outbox` options is
385
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
386
+ `OrderedCollection | null | undefined`).
387
+ - The type of `Person.clone()` method's `inbox` and `outbox` options is
388
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
389
+ `OrderedCollection | null | undefined`).
390
+ - The return type of `Person.getInbox()` and `Person.getOutbox()` methods
391
+ is now `OrderedCollection | OrderedCollectionPage | null` (was
392
+ `OrderedCollection | null`).
393
+ - The type of `Service()` constructor's `inbox` and `outbox` options is
394
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
395
+ `OrderedCollection | null | undefined`).
396
+ - The type of `Service.clone()` method's `inbox` and `outbox` options is
397
+ now `OrderedCollection | OrderedCollectionPage | null | undefined` (was
398
+ `OrderedCollection | null | undefined`).
399
+ - The return type of `Service.getInbox()` and `Service.getOutbox()`
400
+ methods is now `OrderedCollection | OrderedCollectionPage | null` (was
401
+ `OrderedCollection | null`).
402
+
403
+ [#165]: https://github.com/dahlia/fedify/issues/165
404
+
405
+
406
+ Version 0.15.7
407
+ --------------
408
+
409
+ Released on November 14, 2024.
410
+
411
+ - Suppressed a `TypeError` with a message <q>unusable</q> due to Node.js's
412
+ mysterious behavior. [[#159]]
413
+
414
+ - The `verifyRequest()` function no longer throws a `TypeError`
415
+ when a given `Request` object's body is already consumed or locked.
416
+ Instead, it logs an error message to the `["fedify", "sig", "http"]`
417
+ logger category and returns `null`.
418
+ - The `Federation.fetch()` method no longer throws a `TypeError`
419
+ when a given `Request` object's body is already consumed or locked.
420
+ Instead, it logs an error message to the `["fedify", "federation",
421
+ "inbox"]` logger category and responds with a `500 Internal Server
422
+ Error`.
423
+
424
+ [#159]: https://github.com/dahlia/fedify/issues/159
425
+
426
+
271
427
  Version 0.15.6
272
428
  --------------
273
429
 
@@ -1,6 +1,6 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { getLogger } from "@logtape/logtape";
3
- import { accepts } from "../deps/jsr.io/@std/http/1.0.9/negotiation.js";
3
+ import { accepts } from "../deps/jsr.io/@std/http/1.0.10/negotiation.js";
4
4
  import { verifyRequest } from "../sig/http.js";
5
5
  import { detachSignature, verifyJsonLd } from "../sig/ld.js";
6
6
  import { doesActorOwnKey } from "../sig/owner.js";
@@ -188,6 +188,20 @@ export async function handleInbox(request, { identifier, context, inboxContextFa
188
188
  return await onNotFound(request);
189
189
  }
190
190
  }
191
+ if (request.bodyUsed) {
192
+ logger.error("Request body has already been read.", { identifier });
193
+ return new Response("Internal server error.", {
194
+ status: 500,
195
+ headers: { "Content-Type": "text/plain; charset=utf-8" },
196
+ });
197
+ }
198
+ else if (request.body?.locked) {
199
+ logger.error("Request body is locked.", { identifier });
200
+ return new Response("Internal server error.", {
201
+ status: 500,
202
+ headers: { "Content-Type": "text/plain; charset=utf-8" },
203
+ });
204
+ }
191
205
  let json;
192
206
  try {
193
207
  json = await request.clone().json();
@@ -1,6 +1,6 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { createPublicKey } from "node:crypto";
3
- import { concat } from "../deps/jsr.io/@std/bytes/1.0.3/concat.js";
3
+ import { concat } from "../deps/jsr.io/@std/bytes/1.0.4/concat.js";
4
4
  import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.5/base64.js";
5
5
  import { decodeBase64Url } from "../deps/jsr.io/@std/encoding/1.0.5/base64url.js";
6
6
  import { decodeHex } from "../deps/jsr.io/@std/encoding/1.0.5/hex.js";
package/esm/sig/http.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { getLogger } from "@logtape/logtape";
3
- import { equals } from "../deps/jsr.io/@std/bytes/1.0.3/mod.js";
3
+ import { equals } from "../deps/jsr.io/@std/bytes/1.0.4/mod.js";
4
4
  import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/1.0.5/base64.js";
5
5
  import { CryptographicKey } from "../vocab/vocab.js";
6
6
  import { fetchKey, validateCryptoKey } from "./key.js";
@@ -69,6 +69,14 @@ const supportedHashAlgorithms = {
69
69
  */
70
70
  export async function verifyRequest(request, { documentLoader, contextLoader, timeWindow, currentTime, keyCache } = {}) {
71
71
  const logger = getLogger(["fedify", "sig", "http"]);
72
+ if (request.bodyUsed) {
73
+ logger.error("Failed to verify; the request body is already consumed.", { url: request.url });
74
+ return null;
75
+ }
76
+ else if (request.body?.locked) {
77
+ logger.error("Failed to verify; the request body is locked.", { url: request.url });
78
+ return null;
79
+ }
72
80
  const originalRequest = request;
73
81
  request = request.clone();
74
82
  const dateHeader = request.headers.get("Date");
@@ -0,0 +1,24 @@
1
+ {
2
+ "@context": "https://www.w3.org/ns/activitystreams",
3
+ "id": "https://example.com/orderedcollectionpage",
4
+ "type": "OrderedCollectionPage",
5
+ "partOf": "https://example.com/orderedcollectionpage",
6
+ "totalItems": 1,
7
+ "orderedItems": [
8
+ {
9
+ "id": "https://example.com/activities/1",
10
+ "type": "Create",
11
+ "published": "2024-11-19T15:24:56Z",
12
+ "actor": "https://example.com/users/1",
13
+ "to": "https://www.w3.org/ns/activitystreams#Public",
14
+ "object": {
15
+ "id": "https://example.com/notes/1",
16
+ "type": "Note",
17
+ "content": "This is a simple note",
18
+ "attributedTo": "https://example.com/users/1",
19
+ "to": "https://www.w3.org/ns/activitystreams#Public",
20
+ "published": "2024-11-19T15:24:56Z"
21
+ }
22
+ }
23
+ ]
24
+ }
@@ -102,6 +102,7 @@ properties:
102
102
  and dropping any activities already seen.
103
103
  range:
104
104
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
105
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
105
106
 
106
107
  - singularName: outbox
107
108
  functional: true
@@ -120,6 +121,7 @@ properties:
120
121
  implementing and deploying the server.
121
122
  range:
122
123
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
124
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
123
125
 
124
126
  - singularName: following
125
127
  functional: true
@@ -102,6 +102,7 @@ properties:
102
102
  and dropping any activities already seen.
103
103
  range:
104
104
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
105
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
105
106
 
106
107
  - singularName: outbox
107
108
  functional: true
@@ -120,6 +121,7 @@ properties:
120
121
  implementing and deploying the server.
121
122
  range:
122
123
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
124
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
123
125
 
124
126
  - singularName: following
125
127
  functional: true
@@ -102,6 +102,7 @@ properties:
102
102
  and dropping any activities already seen.
103
103
  range:
104
104
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
105
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
105
106
 
106
107
  - singularName: outbox
107
108
  functional: true
@@ -120,6 +121,7 @@ properties:
120
121
  implementing and deploying the server.
121
122
  range:
122
123
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
124
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
123
125
 
124
126
  - singularName: following
125
127
  functional: true
@@ -102,6 +102,7 @@ properties:
102
102
  and dropping any activities already seen.
103
103
  range:
104
104
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
105
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
105
106
 
106
107
  - singularName: outbox
107
108
  functional: true
@@ -120,6 +121,7 @@ properties:
120
121
  implementing and deploying the server.
121
122
  range:
122
123
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
124
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
123
125
 
124
126
  - singularName: following
125
127
  functional: true
@@ -102,6 +102,7 @@ properties:
102
102
  and dropping any activities already seen.
103
103
  range:
104
104
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
105
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
105
106
 
106
107
  - singularName: outbox
107
108
  functional: true
@@ -120,6 +121,7 @@ properties:
120
121
  implementing and deploying the server.
121
122
  range:
122
123
  - "https://www.w3.org/ns/activitystreams#OrderedCollection"
124
+ - "https://www.w3.org/ns/activitystreams#OrderedCollectionPage"
123
125
 
124
126
  - singularName: following
125
127
  functional: true