@nifrajs/storage 3.5.0 → 4.0.0
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.
- package/dist/conformance.d.ts.map +1 -1
- package/dist/conformance.js +29 -14
- package/dist/conformance.js.map +1 -1
- package/dist/file.d.ts +2 -0
- package/dist/file.d.ts.map +1 -1
- package/dist/file.js +20 -9
- package/dist/file.js.map +1 -1
- package/dist/key.d.ts +1 -1
- package/dist/key.d.ts.map +1 -1
- package/dist/key.js +6 -1
- package/dist/key.js.map +1 -1
- package/dist/r2.d.ts +7 -1
- package/dist/r2.d.ts.map +1 -1
- package/dist/r2.js +28 -2
- package/dist/r2.js.map +1 -1
- package/package.json +4 -1
- package/src/conformance.ts +32 -16
- package/src/file.ts +26 -9
- package/src/key.ts +8 -1
- package/src/r2.ts +31 -4
|
@@ -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;
|
|
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"}
|
package/dist/conformance.js
CHANGED
|
@@ -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(
|
|
80
|
-
["get", () => storage.get(
|
|
81
|
-
["delete", () => storage.delete(
|
|
82
|
-
["exists", () => storage.exists(
|
|
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(
|
|
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(
|
|
164
|
+
unsafeCalls.push(["presign", (key) => presignable.presign(key, "get")]);
|
|
152
165
|
}
|
|
153
|
-
for (const
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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);
|
package/dist/conformance.js.map
CHANGED
|
@@ -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,
|
package/dist/file.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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":"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"}
|
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
|
-
*
|
|
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,
|
|
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
|
-
*
|
|
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;
|
|
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
|
-
|
|
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,
|
|
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
|
+
"version": "4.0.0",
|
|
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",
|
package/src/conformance.ts
CHANGED
|
@@ -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(
|
|
109
|
-
["get", () => storage.get(
|
|
110
|
-
["delete", () => storage.delete(
|
|
111
|
-
["exists", () => storage.exists(
|
|
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(
|
|
167
|
-
["copy destination", () => movable.copy(c,
|
|
168
|
-
["move source", () => movable.move(
|
|
169
|
-
["move destination", () => movable.move(c,
|
|
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(
|
|
201
|
+
unsafeCalls.push(["presign", (key) => presignable.presign(key, "get")])
|
|
188
202
|
}
|
|
189
203
|
|
|
190
|
-
for (const
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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(
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
}
|