@nifrajs/storage 3.5.0 → 4.0.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,kFAAkF;AAClF,MAAM,WAAW,gCAAgC;IAC/C,sDAAsD;IACtD,QAAQ,CAAC,aAAa,EAAE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACvE;AAED,8EAA8E;AAC9E,qBAAa,8BAA+B,SAAQ,KAAK;IAErD,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO;CAKlB;AAkBD;;;;;;;;;GASG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,IAAI,CAAC,CA4Jf"}
1
+ {"version":3,"file":"conformance.d.ts","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,cAAc,EACf,MAAM,YAAY,CAAA;AAEnB,kFAAkF;AAClF,MAAM,WAAW,gCAAgC;IAC/C,sDAAsD;IACtD,QAAQ,CAAC,aAAa,EAAE,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACvE;AAED,8EAA8E;AAC9E,qBAAa,8BAA+B,SAAQ,KAAK;IAErD,QAAQ,CAAC,KAAK,EAAE,MAAM;gBAAb,KAAK,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,CAAC,EAAE,OAAO;CAKlB;AAgCD;;;;;;;;;GASG;AACH,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,IAAI,CAAC,CA8Jf"}
@@ -11,6 +11,19 @@ const fail = (check, message, cause) => {
11
11
  throw new StorageAdapterConformanceError(check, message, cause);
12
12
  };
13
13
  const decode = (bytes) => new TextDecoder().decode(bytes);
14
+ // Every shape the key contract refuses (`assertSafeKey`). An adapter that refuses the obvious
15
+ // `../escape` and nothing else would still let a nested `..`, an absolute key, or a backslash through.
16
+ const UNSAFE_KEYS = [
17
+ "../escape",
18
+ "nifra-conformance/../../escape",
19
+ "/nifra-conformance/absolute",
20
+ "nifra-conformance\\..\\escape",
21
+ "nifra-conformance/nul\0",
22
+ "",
23
+ "nifra-conformance//empty-segment",
24
+ "nifra-conformance/./dot-segment",
25
+ "nifra-conformance/trailing/",
26
+ ];
14
27
  const hasPaging = (storage) => typeof storage.listPage === "function";
15
28
  const hasPresign = (storage) => typeof storage.presign === "function";
16
29
  const hasMove = (storage) => typeof storage.copy === "function" &&
@@ -76,10 +89,10 @@ export async function assertStorageAdapterConformance(options) {
76
89
  fail("list limit", "limit was not respected");
77
90
  }
78
91
  const unsafeCalls = [
79
- ["put", () => storage.put("../escape", "x")],
80
- ["get", () => storage.get("../escape")],
81
- ["delete", () => storage.delete("../escape")],
82
- ["exists", () => storage.exists("../escape")],
92
+ ["put", (key) => storage.put(key, "x")],
93
+ ["get", (key) => storage.get(key)],
94
+ ["delete", (key) => storage.delete(key)],
95
+ ["exists", (key) => storage.exists(key)],
83
96
  ];
84
97
  if (hasPaging(storage)) {
85
98
  const paged = storage;
@@ -132,7 +145,7 @@ export async function assertStorageAdapterConformance(options) {
132
145
  fail("move", "move must remove the source object");
133
146
  }
134
147
  await movable.delete(moved);
135
- unsafeCalls.push(["copy source", () => movable.copy("../escape", copied)], ["copy destination", () => movable.copy(c, "../escape")], ["move source", () => movable.move("../escape", moved)], ["move destination", () => movable.move(c, "../escape")]);
148
+ unsafeCalls.push(["copy source", (key) => movable.copy(key, copied)], ["copy destination", (key) => movable.copy(c, key)], ["move source", (key) => movable.move(key, moved)], ["move destination", (key) => movable.move(c, key)]);
136
149
  }
137
150
  if (hasPresign(storage)) {
138
151
  const presignable = storage;
@@ -148,16 +161,18 @@ export async function assertStorageAdapterConformance(options) {
148
161
  fail("presign", `${operation} presign returned an already-expired URL`);
149
162
  }
150
163
  }
151
- unsafeCalls.push(["presign", () => presignable.presign("../escape", "get")]);
164
+ unsafeCalls.push(["presign", (key) => presignable.presign(key, "get")]);
152
165
  }
153
- for (const [method, call] of unsafeCalls) {
154
- try {
155
- await call();
156
- fail("key safety", `${method} accepted a traversal key`);
157
- }
158
- catch (error) {
159
- if (error instanceof StorageAdapterConformanceError)
160
- throw error;
166
+ for (const key of UNSAFE_KEYS) {
167
+ for (const [method, call] of unsafeCalls) {
168
+ try {
169
+ await call(key);
170
+ fail("key safety", `${method} accepted the unsafe key ${JSON.stringify(key)}`);
171
+ }
172
+ catch (error) {
173
+ if (error instanceof StorageAdapterConformanceError)
174
+ throw error;
175
+ }
161
176
  }
162
177
  }
163
178
  await storage.delete(a);
@@ -1 +1 @@
1
- {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conformance.js","sourceRoot":"","sources":["../src/conformance.ts"],"names":[],"mappings":"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"}
package/dist/file.d.ts CHANGED
@@ -16,6 +16,8 @@ export declare class FileStorage implements StorageAdapter {
16
16
  private assertTrustedAncestorChain;
17
17
  /** Reject existing symbolic links below `base`; missing suffixes are safe for later creation. */
18
18
  private assertNoSymlinkPath;
19
+ /** {@link openContained} for an object: a directory under the root is a key prefix, not an object. */
20
+ private openObject;
19
21
  /**
20
22
  * Open an existing file without following its final component, then prove the descriptor is the file
21
23
  * still reachable through a symlink-free path below the same root inode. Reads use the descriptor,
@@ -1 +1 @@
1
- {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAA;AA4BnB,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAEzB,IAAI,EAAE,MAAM;IAOxB,OAAO,CAAC,eAAe;IAWvB,wHAAwH;IACxH,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,sBAAsB;IAc9B;;;;OAIG;YACW,0BAA0B;IAuBxC,iGAAiG;YACnF,mBAAmB;IA0BjC;;;;OAIG;YACW,aAAa;YA6Bb,qBAAqB;IA2BnC;;;OAGG;YACW,cAAc;IA6CtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAqC/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3C,4EAA4E;YAC9D,eAAe;IAsCvB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAU1C,IAAI;CAiBnB"}
1
+ {"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAUA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAA;AA4BnB,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;gBAEzB,IAAI,EAAE,MAAM;IAOxB,OAAO,CAAC,eAAe;IAWvB,wHAAwH;IACxH,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,sBAAsB;IAsB9B;;;;OAIG;YACW,0BAA0B;IAuBxC,iGAAiG;YACnF,mBAAmB;IA0BjC,sGAAsG;YACxF,UAAU;IAOxB;;;;OAIG;YACW,aAAa;YA6Bb,qBAAqB;IA2BnC;;;OAGG;YACW,cAAc;IA8CtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAqC/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAW3C,4EAA4E;YAC9D,eAAe;IAsCvB,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAU1C,IAAI;CAiBnB"}
package/dist/file.js CHANGED
@@ -62,7 +62,7 @@ export class FileStorage {
62
62
  symlinkError(key) {
63
63
  return new StorageKeyError(`storage key ${JSON.stringify(key)} crosses a symbolic link beneath the storage root`);
64
64
  }
65
- assertTrustedDirectory(info, key) {
65
+ assertTrustedDirectory(info, key, dir) {
66
66
  // Node exposes POSIX mode bits on Bun/Node/Deno Unix runtimes. A group/world-writable ancestor lets
67
67
  // another local principal swap path components between otherwise-correct checks; fail closed so
68
68
  // descriptor validation only has to defend against ordinary filesystem races within one principal.
@@ -71,7 +71,9 @@ export class FileStorage {
71
71
  const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
72
72
  const untrustedOwner = uid !== undefined && info.uid !== uid && info.uid !== 0;
73
73
  if (untrustedOwner || (Number(info.mode) & 0o022) !== 0) {
74
- throw new StorageKeyError(`storage key ${JSON.stringify(key)} crosses an untrusted writable directory`);
74
+ throw new StorageKeyError(`storage key ${JSON.stringify(key)} crosses an untrusted writable directory: ${dir} ${untrustedOwner
75
+ ? "belongs to another user"
76
+ : "is group- or world-writable (chmod go-w removes that)"}`);
75
77
  }
76
78
  }
77
79
  /**
@@ -107,7 +109,7 @@ export class FileStorage {
107
109
  const info = await lstat(base);
108
110
  if (info.isSymbolicLink())
109
111
  throw this.symlinkError(key);
110
- this.assertTrustedDirectory(info, key);
112
+ this.assertTrustedDirectory(info, key, base);
111
113
  }
112
114
  catch (error) {
113
115
  if (error instanceof StorageKeyError)
@@ -124,7 +126,7 @@ export class FileStorage {
124
126
  const info = await lstat(current);
125
127
  if (info.isSymbolicLink())
126
128
  throw this.symlinkError(key);
127
- this.assertTrustedDirectory(info, key);
129
+ this.assertTrustedDirectory(info, key, current);
128
130
  }
129
131
  catch (error) {
130
132
  if (error instanceof StorageKeyError)
@@ -135,6 +137,14 @@ export class FileStorage {
135
137
  }
136
138
  }
137
139
  }
140
+ /** {@link openContained} for an object: a directory under the root is a key prefix, not an object. */
141
+ async openObject(base, path, key) {
142
+ const handle = await this.openContained(base, path, key);
143
+ if (handle === null || (await handle.stat()).isFile())
144
+ return handle;
145
+ await handle.close();
146
+ return null;
147
+ }
138
148
  /**
139
149
  * Open an existing file without following its final component, then prove the descriptor is the file
140
150
  * still reachable through a symlink-free path below the same root inode. Reads use the descriptor,
@@ -200,7 +210,8 @@ export class FileStorage {
200
210
  */
201
211
  async writeContained(base, path, key, data) {
202
212
  await this.assertNoSymlinkPath(base, path, key);
203
- await mkdir(dirname(path), { recursive: true });
213
+ // 0o755 whatever the umask: a group-writable directory (umask 002) would fail the trust check above.
214
+ await mkdir(dirname(path), { recursive: true, mode: 0o755 });
204
215
  await this.assertNoSymlinkPath(base, path, key);
205
216
  try {
206
217
  const baseBefore = await lstat(base);
@@ -250,7 +261,7 @@ export class FileStorage {
250
261
  }
251
262
  async get(key) {
252
263
  const path = this.pathFor(key);
253
- const bodyHandle = await this.openContained(this.root, path, key);
264
+ const bodyHandle = await this.openObject(this.root, path, key);
254
265
  if (bodyHandle === null)
255
266
  return null;
256
267
  let body;
@@ -263,7 +274,7 @@ export class FileStorage {
263
274
  let stored = {};
264
275
  try {
265
276
  const metadataPath = this.metadataPathFor(key);
266
- const metadataHandle = await this.openContained(this.metadataRoot, metadataPath, key);
277
+ const metadataHandle = await this.openObject(this.metadataRoot, metadataPath, key);
267
278
  if (metadataHandle !== null) {
268
279
  try {
269
280
  stored = JSON.parse(await metadataHandle.readFile({ encoding: "utf8" }));
@@ -299,7 +310,7 @@ export class FileStorage {
299
310
  }
300
311
  async exists(key) {
301
312
  const path = this.pathFor(key);
302
- const handle = await this.openContained(this.root, path, key);
313
+ const handle = await this.openObject(this.root, path, key);
303
314
  if (handle === null)
304
315
  return false;
305
316
  try {
@@ -311,7 +322,7 @@ export class FileStorage {
311
322
  }
312
323
  /** Revalidate an opened inode immediately before unlinking its pathname. */
313
324
  async removeContained(base, path, key) {
314
- const handle = await this.openContained(base, path, key);
325
+ const handle = await this.openObject(base, path, key);
315
326
  if (handle === null)
316
327
  return;
317
328
  try {
package/dist/file.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../src/file.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,EAAmB,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACjG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AACxE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AACzD,OAAO,EAML,OAAO,GACR,MAAM,YAAY,CAAA;AAEnB,MAAM,aAAa,GAAqC;IACtD,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,YAAY;IACjB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,iBAAiB;IACtB,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,UAAU;IACf,EAAE,EAAE,iBAAiB;IACrB,GAAG,EAAE,WAAW;IAChB,IAAI,EAAE,YAAY;IAClB,GAAG,EAAE,YAAY;IACjB,GAAG,EAAE,iBAAiB;CACvB,CAAA;AAED,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAC7D,OAAO,aAAa,CAAC,GAAG,CAAC,CAAA;AAC3B,CAAC;AAED,MAAM,OAAO,WAAW;IACL,IAAI,CAAQ;IACZ,YAAY,CAAQ;IAErC,YAAY,IAAY;QACtB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACzB,iGAAiG;QACjG,2EAA2E;QAC3E,IAAI,CAAC,YAAY,GAAG,GAAG,IAAI,CAAC,IAAI,iBAAiB,CAAA;IACnD,CAAC;IAEO,eAAe,CAAC,GAAW;QACjC,aAAa,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,OAAO,CAAC,CAAA;QACtD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,eAAe,CACvB,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CACvE,CAAA;QACH,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,wHAAwH;IAChH,OAAO,CAAC,GAAW;QACzB,aAAa,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACpC,IAAI,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,eAAe,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;QAC1F,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,OAAO,IAAI,eAAe,CACxB,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,mDAAmD,CACtF,CAAA;IACH,CAAC;IAEO,sBAAsB,CAC5B,IAAuC,EACvC,GAAW,EACX,GAAW;QAEX,oGAAoG;QACpG,gGAAgG;QAChG,mGAAmG;QACnG,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YAAE,OAAM;QAC/D,MAAM,GAAG,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/E,MAAM,cAAc,GAAG,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;QAC9E,IAAI,cAAc,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,eAAe,CACvB,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,6CAA6C,GAAG,IAChF,cAAc;gBACZ,CAAC,CAAC,yBAAyB;gBAC3B,CAAC,CAAC,uDACN,EAAE,CACH,CAAA;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,0BAA0B,CAAC,IAAY,EAAE,GAAW;QAChE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU;YAAE,OAAM;QAChF,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAC5B,IAAI,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAA;QAClC,IAAI,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAA;QAChC,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;YAC/B,IAAI,MAAM,KAAK,OAAO;gBAAE,OAAM;YAC9B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAA;YAChC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;YACvD,MAAM,0BAA0B,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;YACvD,MAAM,mBAAmB,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAA;YACtE,IAAI,CAAC,YAAY,IAAI,CAAC,0BAA0B,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC1E,MAAM,IAAI,eAAe,CACvB,eAAe,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,yCAAyC,CAC5E,CAAA;YACH,CAAC;YACD,OAAO,GAAG,MAAM,CAAA;YAChB,KAAK,GAAG,IAAI,CAAA;QACd,CAAC;IACH,CAAC;IAED,iGAAiG;IACzF,KAAK,CAAC,mBAAmB,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW;QACvE,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;YAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;gBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YACvD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,eAAe;gBAAE,MAAM,KAAK,CAAA;YACjD,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAM;YAC9D,MAAM,KAAK,CAAA;QACb,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAA;QACnD,IAAI,OAAO,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAChC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,CAAA;gBACjC,IAAI,IAAI,CAAC,cAAc,EAAE;oBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;gBACvD,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;YACjD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,eAAe;oBAAE,MAAM,KAAK,CAAA;gBACjD,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAM;gBAC9D,MAAM,KAAK,CAAA;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,sGAAsG;IAC9F,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QACxD,IAAI,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;YAAE,OAAO,MAAM,CAAA;QACpE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACpB,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;;OAIG;IACK,KAAK,CAAC,aAAa,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW;QACjE,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC/C,IAAI,UAA6C,CAAA;QACjD,IAAI,CAAC;YACH,UAAU,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAA;YACnE,MAAM,KAAK,CAAA;QACb,CAAC;QAED,IAAI,MAAkB,CAAA;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAA;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAA;YAClD,IAAI,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAA;YAClC,IAAI,IAAI,KAAK,OAAO;gBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YAClD,MAAM,KAAK,CAAA;QACb,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;YACrE,OAAO,MAAM,CAAA;QACf,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,IAAY,EACZ,IAAY,EACZ,GAAW,EACX,MAAkB,EAClB,UAA6C;QAE7C,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC/C,IAAI,CAAC;YACH,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjF,MAAM,CAAC,IAAI,EAAE;gBACb,KAAK,CAAC,IAAI,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC;aACf,CAAC,CAAA;YACF,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAA;YACxF,MAAM,aAAa,GACjB,OAAO,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAA;YACtF,MAAM,OAAO,GAAG,YAAY,KAAK,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,CAAA;YAC7F,IAAI,WAAW,IAAI,aAAa,IAAI,OAAO;gBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YACpF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,cAAc,CAC1B,IAAY,EACZ,IAAY,EACZ,GAAW,EACX,IAAyB;QAEzB,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC/C,qGAAqG;QACrG,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5D,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC/C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;YACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CACvB,IAAI,EACJ,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,UAAU,EAC7D,KAAK,CACN,CAAA;YACD,IAAI,CAAC;gBACH,yFAAyF;gBACzF,uEAAuE;gBACvE,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;gBAC/C,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBACjF,MAAM,CAAC,IAAI,EAAE;oBACb,KAAK,CAAC,IAAI,CAAC;oBACX,KAAK,CAAC,IAAI,CAAC;oBACX,QAAQ,CAAC,IAAI,CAAC;oBACd,QAAQ,CAAC,IAAI,CAAC;iBACf,CAAC,CAAA;gBACF,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CAAA;gBACxF,MAAM,aAAa,GACjB,OAAO,CAAC,cAAc,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAA;gBACtF,MAAM,OAAO,GACX,YAAY,KAAK,YAAY,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,YAAY,GAAG,GAAG,CAAC,CAAA;gBAC/E,IAAI,WAAW,IAAI,aAAa,IAAI,OAAO;oBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;gBAEzE,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;gBACxB,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;YAC9B,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO;gBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YACnF,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAiB,EAAE,UAAsB,EAAE;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;QAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAC9C,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACxE,MAAM,IAAI,CAAC,cAAc,CACvB,IAAI,CAAC,YAAY,EACjB,YAAY,EACZ,GAAG,EACH,IAAI,CAAC,SAAS,CAAC;gBACb,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClF,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC1E,CAAC,CACH,CAAA;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,CAAC,CAAA;QAClE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC9D,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QACpC,IAAI,IAAgB,CAAA;QACpB,IAAI,CAAC;YACH,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAA;QACpD,CAAC;gBAAS,CAAC;YACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;QAC1B,CAAC;QACD,IAAI,MAAM,GAA0E,EAAE,CAAA;QACtF,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;YAC9C,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,CAAC,CAAA;YAClF,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;gBAC5B,IAAI,CAAC;oBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,cAAc,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAkB,CAAA;gBAC3F,CAAC;wBAAS,CAAC;oBACT,MAAM,cAAc,CAAC,KAAK,EAAE,CAAA;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,eAAe;gBAAE,MAAM,KAAK,CAAA;YACjD,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC,EAAE,CAAC;gBAC1F,MAAM,KAAK,CAAA;YACb,CAAC;YACD,8FAA8F;QAChG,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,gBAAgB,CAAC,GAAG,CAAC,CAAA;QAC/D,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxE,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAC9C,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;YAC1C,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,CAAC;SAC3D,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QAC1D,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QACjC,IAAI,CAAC;YACH,OAAO,IAAI,CAAA;QACb,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;IAED,4EAA4E;IACpE,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,IAAY,EAAE,GAAW;QACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,CAAA;QACrD,IAAI,MAAM,KAAK,IAAI;YAAE,OAAM;QAC3B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,0BAA0B,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;YAChD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;YACpC,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;YACrE,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACjC,gGAAgG;gBAChG,gGAAgG;gBAChG,qDAAqD;gBACrD,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;gBAChC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,CAAA;gBACpE,IAAI,YAAY,KAAK,IAAI;oBAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;gBACvD,IAAI,CAAC;oBACH,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;oBACnF,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;oBACjF,IACE,OAAO,CAAC,cAAc,EAAE;wBACxB,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG;wBAC1B,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,EAC1B,CAAC;wBACD,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;oBAC9B,CAAC;oBACD,MAAM,MAAM,CAAC,YAAY,CAAC,CAAA;gBAC5B,CAAC;wBAAS,CAAC;oBACT,MAAM,YAAY,CAAC,KAAK,EAAE,CAAA;gBAC5B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,gGAAgG;gBAChG,kGAAkG;gBAClG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAuB,EAAE;QAClC,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;QACpC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QACrB,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAC9B,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,MAAgB,CAAC,CAAC,CAAA;QACjE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAA;QAClE,OAAO,GAAG,CAAA;IACZ,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,MAAc,EAAE,GAAa;QAC3D,IAAI,KAAe,CAAA;QACnB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAA;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAM,CAAC,+BAA+B;QACxC,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;YAC5B,4FAA4F;YAC5F,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;YAC3D,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;YAC9B,IAAI,IAAI,CAAC,cAAc,EAAE;gBAAE,SAAQ;YACnC,IAAI,IAAI,CAAC,WAAW,EAAE;gBAAE,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;iBAClD,IAAI,IAAI,CAAC,MAAM,EAAE;gBAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACvC,CAAC;IACH,CAAC;CACF"}
package/dist/key.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Storage-key safety. A key is a POSIX-ish relative path (`avatars/u1.png`); we reject anything that
3
3
  * could escape a `FileStorage` root or otherwise misbehave - absolute paths, `..` traversal, NUL bytes,
4
- * and backslashes (Windows traversal). Enforced by EVERY adapter (not just `FileStorage`) so a key is
4
+ * backslashes (Windows traversal), and empty or `.` segments (aliases on a file system). Enforced by EVERY adapter (not just `FileStorage`) so a key is
5
5
  * portable across them, and so the check can't be forgotten on the one adapter where it's a vulnerability.
6
6
  */
7
7
  export declare class StorageKeyError extends Error {
package/dist/key.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../src/key.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAc/C"}
1
+ {"version":3,"file":"key.d.ts","sourceRoot":"","sources":["../src/key.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED,iFAAiF;AACjF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAqB/C"}
package/dist/key.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Storage-key safety. A key is a POSIX-ish relative path (`avatars/u1.png`); we reject anything that
3
3
  * could escape a `FileStorage` root or otherwise misbehave - absolute paths, `..` traversal, NUL bytes,
4
- * and backslashes (Windows traversal). Enforced by EVERY adapter (not just `FileStorage`) so a key is
4
+ * backslashes (Windows traversal), and empty or `.` segments (aliases on a file system). Enforced by EVERY adapter (not just `FileStorage`) so a key is
5
5
  * portable across them, and so the check can't be forgotten on the one adapter where it's a vulnerability.
6
6
  */
7
7
  export class StorageKeyError extends Error {
@@ -22,6 +22,11 @@ export function assertSafeKey(key) {
22
22
  if (segment === "..") {
23
23
  throw new StorageKeyError(`unsafe storage key ${JSON.stringify(key)} (".." path traversal)`);
24
24
  }
25
+ // A file system reads `a/./b`, `a//b` and `a/b/` as `a/b`, and an object store does not - so one
26
+ // backend would alias two keys another keeps apart.
27
+ if (segment === "" || segment === ".") {
28
+ throw new StorageKeyError(`unsafe storage key ${JSON.stringify(key)} (an empty or "." segment aliases another key)`);
29
+ }
25
30
  }
26
31
  }
27
32
  //# sourceMappingURL=key.js.map
package/dist/key.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"key.js","sourceRoot":"","sources":["../src/key.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,yCAAyC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IACnF,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,eAAe,CACvB,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gCAAgC,CAC1E,CAAA;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,eAAe,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QAC9F,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"key.js","sourceRoot":"","sources":["../src/key.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAA;IAC/B,CAAC;CACF;AAED,iFAAiF;AACjF,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,eAAe,CAAC,yCAAyC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IACnF,CAAC;IACD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,eAAe,CACvB,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gCAAgC,CAC1E,CAAA;IACH,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,eAAe,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;QAC9F,CAAC;QACD,iGAAiG;QACjG,oDAAoD;QACpD,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACtC,MAAM,IAAI,eAAe,CACvB,sBAAsB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gDAAgD,CAC1F,CAAA;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
package/dist/r2.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { type ListOptions, type PutOptions, type StorageAdapter, type StorageData, type StorageObject } from "./types.js";
1
+ import { type ListOptions, type PutOptions, type StorageAdapter, type StorageData, type StorageListPage, type StorageListPageOptions, type StorageObject } from "./types.js";
2
2
  /** The slice of R2's object metadata this adapter reads. */
3
3
  export interface R2ObjectLike {
4
4
  readonly size: number;
@@ -23,10 +23,13 @@ export interface R2BucketLike {
23
23
  list(options?: {
24
24
  prefix?: string;
25
25
  limit?: number;
26
+ cursor?: string;
26
27
  }): Promise<{
27
28
  objects: ReadonlyArray<{
28
29
  key: string;
29
30
  }>;
31
+ truncated?: boolean;
32
+ cursor?: string;
30
33
  }>;
31
34
  }
32
35
  export declare class R2Storage implements StorageAdapter {
@@ -36,6 +39,9 @@ export declare class R2Storage implements StorageAdapter {
36
39
  get(key: string): Promise<StorageObject | null>;
37
40
  delete(key: string): Promise<void>;
38
41
  exists(key: string): Promise<boolean>;
42
+ /** Every key (up to `limit`), following R2's cursor past the 1000 keys one call returns. */
39
43
  list(options?: ListOptions): Promise<string[]>;
44
+ /** One page of at most 1000 keys, and the cursor for the next while there are more. */
45
+ listPage(options?: StorageListPageOptions): Promise<StorageListPage>;
40
46
  }
41
47
  //# sourceMappingURL=r2.d.ts.map
package/dist/r2.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAA;AAEnB,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjD;AAED,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GAAG,eAAe,EACpC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC7F,OAAO,CAAC,OAAO,CAAC,CAAA;IACnB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,YAAY,GAAG;QAAE,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1F,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAA;CACzD;AAED,qBAAa,SAAU,YAAW,cAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAE3C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAe/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrC,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAOzD"}
1
+ {"version":3,"file":"r2.d.ts","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAA;AAEnB,4DAA4D;AAC5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACzD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjD;AAED,0FAA0F;AAC1F,MAAM,WAAW,YAAY;IAC3B,GAAG,CACD,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GAAG,eAAe,EACpC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC7F,OAAO,CAAC,OAAO,CAAC,CAAA;IACnB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,YAAY,GAAG;QAAE,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC,CAAA;IAC1F,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAA;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,aAAa,CAAC;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC/F;AAKD,qBAAa,SAAU,YAAW,cAAc;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAE3C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAe/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK3C,4FAA4F;IACtF,IAAI,CAAC,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAexD,uFAAuF;IACjF,QAAQ,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,eAAe,CAAC;CAW/E"}
package/dist/r2.js CHANGED
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import { assertSafeKey } from "./key.js";
8
8
  import { toBytes, } from "./types.js";
9
+ /** The most keys one R2 `list()` call returns; the rest arrive behind its cursor. */
10
+ const R2_PAGE = 1000;
9
11
  export class R2Storage {
10
12
  bucket;
11
13
  constructor(bucket) {
@@ -44,14 +46,38 @@ export class R2Storage {
44
46
  assertSafeKey(key);
45
47
  return (await this.bucket.head(key)) !== null;
46
48
  }
49
+ /** Every key (up to `limit`), following R2's cursor past the 1000 keys one call returns. */
47
50
  async list(options = {}) {
51
+ const keys = [];
52
+ let cursor;
53
+ do {
54
+ const pageOptions = {};
55
+ if (options.prefix !== undefined)
56
+ pageOptions.prefix = options.prefix;
57
+ if (options.limit !== undefined)
58
+ pageOptions.limit = options.limit - keys.length;
59
+ if (cursor !== undefined)
60
+ pageOptions.cursor = cursor;
61
+ const page = await this.listPage(pageOptions);
62
+ keys.push(...page.keys);
63
+ cursor = page.cursor;
64
+ } while (cursor !== undefined && (options.limit === undefined || keys.length < options.limit));
65
+ return keys;
66
+ }
67
+ /** One page of at most 1000 keys, and the cursor for the next while there are more. */
68
+ async listPage(options = {}) {
48
69
  const listOpts = {};
49
70
  if (options.prefix !== undefined)
50
71
  listOpts.prefix = options.prefix;
51
72
  if (options.limit !== undefined)
52
- listOpts.limit = options.limit;
73
+ listOpts.limit = Math.min(options.limit, R2_PAGE);
74
+ if (options.cursor !== undefined)
75
+ listOpts.cursor = options.cursor;
53
76
  const result = await this.bucket.list(listOpts);
54
- return result.objects.map((o) => o.key);
77
+ const keys = result.objects.map((o) => o.key);
78
+ return result.truncated === true && result.cursor !== undefined
79
+ ? { keys, cursor: result.cursor }
80
+ : { keys };
55
81
  }
56
82
  }
57
83
  //# sourceMappingURL=r2.js.map
package/dist/r2.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"r2.js","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAML,OAAO,GACR,MAAM,YAAY,CAAA;AAyBnB,MAAM,OAAO,SAAS;IACS;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,IAAiB,EAAE,UAAsB,EAAE;QAChE,aAAa,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,GAAG,GAGL,EAAE,CAAA;QACN,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS;YAAE,GAAG,CAAC,YAAY,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAA;QAC9F,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,GAAG,CAAC,cAAc,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAA;QAChF,mEAAmE;QACnE,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,aAAa,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACzC,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;QAChC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAA;QACvD,OAAO;YACL,IAAI;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,WAAW,KAAK,SAAS;gBAChD,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE;gBAClD,CAAC,CAAC,EAAE,CAAC;YACP,GAAG,CAAC,MAAM,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACpF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,aAAa,CAAC,GAAG,CAAC,CAAA;QAClB,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,aAAa,CAAC,GAAG,CAAC,CAAA;QAClB,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAA;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,UAAuB,EAAE;QAClC,MAAM,QAAQ,GAAwC,EAAE,CAAA;QACxD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;YAAE,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAClE,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;IACzC,CAAC;CACF"}
1
+ {"version":3,"file":"r2.js","sourceRoot":"","sources":["../src/r2.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nifrajs/storage",
3
- "version": "3.5.0",
3
+ "version": "4.0.2",
4
4
  "description": "Blob storage mechanics for nifra - traversal-safe memory, filesystem, and R2 adapters, optional provider capabilities, and executable adapter conformance.",
5
5
  "keywords": [
6
6
  "bun",
@@ -13,6 +13,9 @@
13
13
  "filesystem"
14
14
  ],
15
15
  "type": "module",
16
+ "nifra": {
17
+ "environment": "library"
18
+ },
16
19
  "main": "./dist/index.js",
17
20
  "module": "./dist/index.js",
18
21
  "types": "./dist/index.d.ts",
@@ -29,6 +29,20 @@ const fail = (check: string, message: string, cause?: unknown): never => {
29
29
 
30
30
  const decode = (bytes: Uint8Array): string => new TextDecoder().decode(bytes)
31
31
 
32
+ // Every shape the key contract refuses (`assertSafeKey`). An adapter that refuses the obvious
33
+ // `../escape` and nothing else would still let a nested `..`, an absolute key, or a backslash through.
34
+ const UNSAFE_KEYS = [
35
+ "../escape",
36
+ "nifra-conformance/../../escape",
37
+ "/nifra-conformance/absolute",
38
+ "nifra-conformance\\..\\escape",
39
+ "nifra-conformance/nul\0",
40
+ "",
41
+ "nifra-conformance//empty-segment",
42
+ "nifra-conformance/./dot-segment",
43
+ "nifra-conformance/trailing/",
44
+ ]
45
+
32
46
  const hasPaging = (storage: StorageAdapter): storage is PagedStorageAdapter =>
33
47
  typeof (storage as PagedStorageAdapter).listPage === "function"
34
48
 
@@ -104,11 +118,11 @@ export async function assertStorageAdapterConformance(
104
118
  fail("list limit", "limit was not respected")
105
119
  }
106
120
 
107
- const unsafeCalls: Array<readonly [string, () => Promise<unknown>]> = [
108
- ["put", () => storage.put("../escape", "x")],
109
- ["get", () => storage.get("../escape")],
110
- ["delete", () => storage.delete("../escape")],
111
- ["exists", () => storage.exists("../escape")],
121
+ const unsafeCalls: Array<readonly [string, (key: string) => Promise<unknown>]> = [
122
+ ["put", (key) => storage.put(key, "x")],
123
+ ["get", (key) => storage.get(key)],
124
+ ["delete", (key) => storage.delete(key)],
125
+ ["exists", (key) => storage.exists(key)],
112
126
  ]
113
127
  if (hasPaging(storage)) {
114
128
  const paged = storage
@@ -163,10 +177,10 @@ export async function assertStorageAdapterConformance(
163
177
  await movable.delete(moved)
164
178
 
165
179
  unsafeCalls.push(
166
- ["copy source", () => movable.copy("../escape", copied)],
167
- ["copy destination", () => movable.copy(c, "../escape")],
168
- ["move source", () => movable.move("../escape", moved)],
169
- ["move destination", () => movable.move(c, "../escape")],
180
+ ["copy source", (key) => movable.copy(key, copied)],
181
+ ["copy destination", (key) => movable.copy(c, key)],
182
+ ["move source", (key) => movable.move(key, moved)],
183
+ ["move destination", (key) => movable.move(c, key)],
170
184
  )
171
185
  }
172
186
 
@@ -184,15 +198,17 @@ export async function assertStorageAdapterConformance(
184
198
  fail("presign", `${operation} presign returned an already-expired URL`)
185
199
  }
186
200
  }
187
- unsafeCalls.push(["presign", () => presignable.presign("../escape", "get")])
201
+ unsafeCalls.push(["presign", (key) => presignable.presign(key, "get")])
188
202
  }
189
203
 
190
- for (const [method, call] of unsafeCalls) {
191
- try {
192
- await call()
193
- fail("key safety", `${method} accepted a traversal key`)
194
- } catch (error) {
195
- if (error instanceof StorageAdapterConformanceError) throw error
204
+ for (const key of UNSAFE_KEYS) {
205
+ for (const [method, call] of unsafeCalls) {
206
+ try {
207
+ await call(key)
208
+ fail("key safety", `${method} accepted the unsafe key ${JSON.stringify(key)}`)
209
+ } catch (error) {
210
+ if (error instanceof StorageAdapterConformanceError) throw error
211
+ }
196
212
  }
197
213
  }
198
214
 
package/src/file.ts CHANGED
@@ -81,7 +81,11 @@ export class FileStorage implements StorageAdapter {
81
81
  )
82
82
  }
83
83
 
84
- private assertTrustedDirectory(info: Awaited<ReturnType<typeof lstat>>, key: string): void {
84
+ private assertTrustedDirectory(
85
+ info: Awaited<ReturnType<typeof lstat>>,
86
+ key: string,
87
+ dir: string,
88
+ ): void {
85
89
  // Node exposes POSIX mode bits on Bun/Node/Deno Unix runtimes. A group/world-writable ancestor lets
86
90
  // another local principal swap path components between otherwise-correct checks; fail closed so
87
91
  // descriptor validation only has to defend against ordinary filesystem races within one principal.
@@ -90,7 +94,11 @@ export class FileStorage implements StorageAdapter {
90
94
  const untrustedOwner = uid !== undefined && info.uid !== uid && info.uid !== 0
91
95
  if (untrustedOwner || (Number(info.mode) & 0o022) !== 0) {
92
96
  throw new StorageKeyError(
93
- `storage key ${JSON.stringify(key)} crosses an untrusted writable directory`,
97
+ `storage key ${JSON.stringify(key)} crosses an untrusted writable directory: ${dir} ${
98
+ untrustedOwner
99
+ ? "belongs to another user"
100
+ : "is group- or world-writable (chmod go-w removes that)"
101
+ }`,
94
102
  )
95
103
  }
96
104
  }
@@ -128,7 +136,7 @@ export class FileStorage implements StorageAdapter {
128
136
  try {
129
137
  const info = await lstat(base)
130
138
  if (info.isSymbolicLink()) throw this.symlinkError(key)
131
- this.assertTrustedDirectory(info, key)
139
+ this.assertTrustedDirectory(info, key, base)
132
140
  } catch (error) {
133
141
  if (error instanceof StorageKeyError) throw error
134
142
  if ((error as NodeJS.ErrnoException).code === "ENOENT") return
@@ -141,7 +149,7 @@ export class FileStorage implements StorageAdapter {
141
149
  try {
142
150
  const info = await lstat(current)
143
151
  if (info.isSymbolicLink()) throw this.symlinkError(key)
144
- this.assertTrustedDirectory(info, key)
152
+ this.assertTrustedDirectory(info, key, current)
145
153
  } catch (error) {
146
154
  if (error instanceof StorageKeyError) throw error
147
155
  if ((error as NodeJS.ErrnoException).code === "ENOENT") return
@@ -150,6 +158,14 @@ export class FileStorage implements StorageAdapter {
150
158
  }
151
159
  }
152
160
 
161
+ /** {@link openContained} for an object: a directory under the root is a key prefix, not an object. */
162
+ private async openObject(base: string, path: string, key: string): Promise<FileHandle | null> {
163
+ const handle = await this.openContained(base, path, key)
164
+ if (handle === null || (await handle.stat()).isFile()) return handle
165
+ await handle.close()
166
+ return null
167
+ }
168
+
153
169
  /**
154
170
  * Open an existing file without following its final component, then prove the descriptor is the file
155
171
  * still reachable through a symlink-free path below the same root inode. Reads use the descriptor,
@@ -222,7 +238,8 @@ export class FileStorage implements StorageAdapter {
222
238
  data: Uint8Array | string,
223
239
  ): Promise<void> {
224
240
  await this.assertNoSymlinkPath(base, path, key)
225
- await mkdir(dirname(path), { recursive: true })
241
+ // 0o755 whatever the umask: a group-writable directory (umask 002) would fail the trust check above.
242
+ await mkdir(dirname(path), { recursive: true, mode: 0o755 })
226
243
  await this.assertNoSymlinkPath(base, path, key)
227
244
  try {
228
245
  const baseBefore = await lstat(base)
@@ -281,7 +298,7 @@ export class FileStorage implements StorageAdapter {
281
298
 
282
299
  async get(key: string): Promise<StorageObject | null> {
283
300
  const path = this.pathFor(key)
284
- const bodyHandle = await this.openContained(this.root, path, key)
301
+ const bodyHandle = await this.openObject(this.root, path, key)
285
302
  if (bodyHandle === null) return null
286
303
  let body: Uint8Array
287
304
  try {
@@ -292,7 +309,7 @@ export class FileStorage implements StorageAdapter {
292
309
  let stored: { contentType?: string; metadata?: Readonly<Record<string, string>> } = {}
293
310
  try {
294
311
  const metadataPath = this.metadataPathFor(key)
295
- const metadataHandle = await this.openContained(this.metadataRoot, metadataPath, key)
312
+ const metadataHandle = await this.openObject(this.metadataRoot, metadataPath, key)
296
313
  if (metadataHandle !== null) {
297
314
  try {
298
315
  stored = JSON.parse(await metadataHandle.readFile({ encoding: "utf8" })) as typeof stored
@@ -327,7 +344,7 @@ export class FileStorage implements StorageAdapter {
327
344
 
328
345
  async exists(key: string): Promise<boolean> {
329
346
  const path = this.pathFor(key)
330
- const handle = await this.openContained(this.root, path, key)
347
+ const handle = await this.openObject(this.root, path, key)
331
348
  if (handle === null) return false
332
349
  try {
333
350
  return true
@@ -338,7 +355,7 @@ export class FileStorage implements StorageAdapter {
338
355
 
339
356
  /** Revalidate an opened inode immediately before unlinking its pathname. */
340
357
  private async removeContained(base: string, path: string, key: string): Promise<void> {
341
- const handle = await this.openContained(base, path, key)
358
+ const handle = await this.openObject(base, path, key)
342
359
  if (handle === null) return
343
360
  try {
344
361
  await this.assertTrustedAncestorChain(base, key)
package/src/key.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Storage-key safety. A key is a POSIX-ish relative path (`avatars/u1.png`); we reject anything that
3
3
  * could escape a `FileStorage` root or otherwise misbehave - absolute paths, `..` traversal, NUL bytes,
4
- * and backslashes (Windows traversal). Enforced by EVERY adapter (not just `FileStorage`) so a key is
4
+ * backslashes (Windows traversal), and empty or `.` segments (aliases on a file system). Enforced by EVERY adapter (not just `FileStorage`) so a key is
5
5
  * portable across them, and so the check can't be forgotten on the one adapter where it's a vulnerability.
6
6
  */
7
7
 
@@ -26,5 +26,12 @@ export function assertSafeKey(key: string): void {
26
26
  if (segment === "..") {
27
27
  throw new StorageKeyError(`unsafe storage key ${JSON.stringify(key)} (".." path traversal)`)
28
28
  }
29
+ // A file system reads `a/./b`, `a//b` and `a/b/` as `a/b`, and an object store does not - so one
30
+ // backend would alias two keys another keeps apart.
31
+ if (segment === "" || segment === ".") {
32
+ throw new StorageKeyError(
33
+ `unsafe storage key ${JSON.stringify(key)} (an empty or "." segment aliases another key)`,
34
+ )
35
+ }
29
36
  }
30
37
  }
package/src/r2.ts CHANGED
@@ -10,6 +10,8 @@ import {
10
10
  type PutOptions,
11
11
  type StorageAdapter,
12
12
  type StorageData,
13
+ type StorageListPage,
14
+ type StorageListPageOptions,
13
15
  type StorageObject,
14
16
  toBytes,
15
17
  } from "./types.ts"
@@ -34,9 +36,13 @@ export interface R2BucketLike {
34
36
  list(options?: {
35
37
  prefix?: string
36
38
  limit?: number
37
- }): Promise<{ objects: ReadonlyArray<{ key: string }> }>
39
+ cursor?: string
40
+ }): Promise<{ objects: ReadonlyArray<{ key: string }>; truncated?: boolean; cursor?: string }>
38
41
  }
39
42
 
43
+ /** The most keys one R2 `list()` call returns; the rest arrive behind its cursor. */
44
+ const R2_PAGE = 1000
45
+
40
46
  export class R2Storage implements StorageAdapter {
41
47
  constructor(private readonly bucket: R2BucketLike) {}
42
48
 
@@ -77,11 +83,32 @@ export class R2Storage implements StorageAdapter {
77
83
  return (await this.bucket.head(key)) !== null
78
84
  }
79
85
 
86
+ /** Every key (up to `limit`), following R2's cursor past the 1000 keys one call returns. */
80
87
  async list(options: ListOptions = {}): Promise<string[]> {
81
- const listOpts: { prefix?: string; limit?: number } = {}
88
+ const keys: string[] = []
89
+ let cursor: string | undefined
90
+ do {
91
+ const pageOptions: { prefix?: string; limit?: number; cursor?: string } = {}
92
+ if (options.prefix !== undefined) pageOptions.prefix = options.prefix
93
+ if (options.limit !== undefined) pageOptions.limit = options.limit - keys.length
94
+ if (cursor !== undefined) pageOptions.cursor = cursor
95
+ const page = await this.listPage(pageOptions)
96
+ keys.push(...page.keys)
97
+ cursor = page.cursor
98
+ } while (cursor !== undefined && (options.limit === undefined || keys.length < options.limit))
99
+ return keys
100
+ }
101
+
102
+ /** One page of at most 1000 keys, and the cursor for the next while there are more. */
103
+ async listPage(options: StorageListPageOptions = {}): Promise<StorageListPage> {
104
+ const listOpts: { prefix?: string; limit?: number; cursor?: string } = {}
82
105
  if (options.prefix !== undefined) listOpts.prefix = options.prefix
83
- if (options.limit !== undefined) listOpts.limit = options.limit
106
+ if (options.limit !== undefined) listOpts.limit = Math.min(options.limit, R2_PAGE)
107
+ if (options.cursor !== undefined) listOpts.cursor = options.cursor
84
108
  const result = await this.bucket.list(listOpts)
85
- return result.objects.map((o) => o.key)
109
+ const keys = result.objects.map((o) => o.key)
110
+ return result.truncated === true && result.cursor !== undefined
111
+ ? { keys, cursor: result.cursor }
112
+ : { keys }
86
113
  }
87
114
  }