@nifrajs/storage 2.2.0 → 2.4.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @nifrajs/storage
2
2
 
3
- Blob storage for nifra — one `StorageAdapter` interface, several adapters. The **persistence half of
3
+ Blob storage for nifra - one `StorageAdapter` interface, several adapters. The **persistence half of
4
4
  [`@nifrajs/uploads`](../uploads)**: `uploads` decides what's allowed (MIME, size, signed URLs, EXIF
5
5
  stripping); `storage` puts the bytes somewhere. **Dependency-free.**
6
6
 
@@ -23,7 +23,7 @@ const keys = await storage.list({ prefix: "avatars/" })
23
23
  | `FileStorage(root)` | a long-running server (Bun/Node/Deno) | persists content type + custom metadata in an adjacent sidecar tree; legacy objects still infer MIME from extension |
24
24
  | `R2Storage(env.BUCKET)` | the edge (Cloudflare R2) | round-trips `contentType` + metadata; binding typed structurally (no `@cloudflare/workers-types`) |
25
25
 
26
- Implement `StorageAdapter` (`put` / `get` / `delete` / `exists` / `list`) for **S3 / GCS / anything else** —
26
+ Implement `StorageAdapter` (`put` / `get` / `delete` / `exists` / `list`) for **S3 / GCS / anything else** -
27
27
  the same five methods, and your routes don't change.
28
28
 
29
29
  Run the executable contract against third-party adapters:
@@ -37,12 +37,12 @@ await assertStorageAdapterConformance({ createAdapter: () => new MyStorage() })
37
37
  Provider-specific mechanics stay optional: implement `PagedStorageAdapter`, `PresignableStorageAdapter`,
38
38
  and/or `MovableStorageAdapter` only when the provider supports cursor listing, URL signing, or server-side
39
39
  copy/move. Asset sensitivity, bucket routing, credentials, and TTL policy belong in the consuming app or
40
- private package—not in these mechanical interfaces.
40
+ private package-not in these mechanical interfaces.
41
41
 
42
42
  ## Key safety
43
43
 
44
- Keys are POSIX-ish relative paths (`avatars/u1.png`). **Every** adapter rejects unsafe keys — absolute
45
- paths, `..` traversal, NUL bytes, backslashes — via `assertSafeKey`, so a `FileStorage` key can never
44
+ Keys are POSIX-ish relative paths (`avatars/u1.png`). **Every** adapter rejects unsafe keys - absolute
45
+ paths, `..` traversal, NUL bytes, backslashes - via `assertSafeKey`, so a `FileStorage` key can never
46
46
  escape its root and a key valid in one adapter is valid in all.
47
47
 
48
48
  ```ts
@@ -52,15 +52,15 @@ import { assertSafeKey, StorageKeyError } from "@nifrajs/storage"
52
52
  ## API
53
53
 
54
54
  - `new MemoryStorage()` · `new FileStorage(root)` · `new R2Storage(bucket)`.
55
- - `put(key, data, { contentType?, metadata? })` — `data` is `Uint8Array | ArrayBuffer | string`.
55
+ - `put(key, data, { contentType?, metadata? })` - `data` is `Uint8Array | ArrayBuffer | string`.
56
56
  - `get(key)` → `{ body, size, contentType?, metadata? } | null` · `delete(key)` · `exists(key)` · `list({ prefix?, limit? })`.
57
57
  - `assertSafeKey(key)` / `StorageKeyError` · `toBytes(data)`.
58
- - `assertStorageAdapterConformance({ createAdapter })` — dependency-free executable adapter contract.
58
+ - `assertStorageAdapterConformance({ createAdapter })` - dependency-free executable adapter contract.
59
59
  - Optional interfaces: `PagedStorageAdapter` · `PresignableStorageAdapter` · `MovableStorageAdapter`.
60
60
 
61
61
  ## For AI agents
62
62
 
63
- Start with [`LLM.md`](./LLM.md) — this package's contract card (the exports you call + its footguns),
63
+ Start with [`LLM.md`](./LLM.md) - this package's contract card (the exports you call + its footguns),
64
64
  one cheap read instead of the whole corpus. For the wider framework: the repo's
65
65
  [`AGENTS.md`](../../AGENTS.md) is the copy-paste quick reference, and
66
66
  [`llms-full.txt`](../../llms-full.txt) is the full machine-readable corpus. Run `nifra check` as the
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Capability beacons for a storage adapter.
3
+ *
4
+ * `StorageAdapter` is meant to be implemented outside this package - that is the point of the
5
+ * interface - so a `for(context)` METHOD on it would break every adapter anyone has written. This is a
6
+ * wrapper instead: it takes any adapter and hands back one that announces what it is doing.
7
+ *
8
+ * import { useCapability } from "@nifrajs/core/capabilities"
9
+ * import { R2Storage, withCapabilityBeacon } from "@nifrajs/storage"
10
+ *
11
+ * const storage = withCapabilityBeacon(new R2Storage(env.BUCKET), { beacon: useCapability })
12
+ * await storage.for(c).put(key, bytes) // announces `storage.write` first
13
+ *
14
+ * Evidence from the CALL is per-route and exact. Evidence from an import is per-module, so it is as
15
+ * broad as the module holding it - which is why a beacon can say something a provenance rule cannot.
16
+ */
17
+ import type { StorageAdapter } from "./types.js";
18
+ /**
19
+ * `useCapability` from `@nifrajs/core/capabilities`, taken as a parameter rather than imported so this
20
+ * package keeps its zero dependencies.
21
+ */
22
+ export type CapabilityBeacon = (context: object, capability: string) => void;
23
+ /** Tokens the wrapper announces. Defaults: `storage.read` and `storage.write`. */
24
+ export interface StorageCapabilities {
25
+ readonly read?: string;
26
+ readonly write?: string;
27
+ }
28
+ export interface StorageBeaconOptions {
29
+ readonly beacon: CapabilityBeacon;
30
+ readonly capabilities?: StorageCapabilities;
31
+ }
32
+ /**
33
+ * A storage adapter that can be bound to a request context.
34
+ *
35
+ * Generic over the adapter, so wrapping a `PresignableStorageAdapter` gives back something that still
36
+ * presigns. The first version returned a plain `StorageAdapter` assembled from five hand-listed
37
+ * methods, which silently dropped `presign`, `listPage`, `copy` and `move` - so adding beacons to a
38
+ * certified S3 adapter quietly removed every optional capability it was certified for.
39
+ */
40
+ export type BeaconingStorageAdapter<A extends StorageAdapter = StorageAdapter> = A & {
41
+ /**
42
+ * A view bound to a request context: every operation announces its capability first, and fails
43
+ * closed when the route did not declare it.
44
+ */
45
+ for(context: object): A;
46
+ };
47
+ /**
48
+ * Wrap an adapter so `for(context)` announces each operation's capability.
49
+ *
50
+ * Forwarding is by Proxy rather than by enumeration, and that is the whole point: a wrapper that lists
51
+ * the methods it knows about is a wrapper that silently deletes the ones it does not, and an adapter's
52
+ * optional capabilities are precisely the methods a hand-written list forgets.
53
+ */
54
+ export declare function withCapabilityBeacon<A extends StorageAdapter>(adapter: A, options: StorageBeaconOptions): BeaconingStorageAdapter<A>;
55
+ //# sourceMappingURL=capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.d.ts","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAEhD;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,CAAA;AAE5E,kFAAkF;AAClF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAA;IACjC,QAAQ,CAAC,YAAY,CAAC,EAAE,mBAAmB,CAAA;CAC5C;AAoBD;;;;;;;GAOG;AACH,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,CAAC,GAAG;IACnF;;;OAGG;IACH,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,CAAC,CAAA;CACxB,CAAA;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,cAAc,EAC3D,OAAO,EAAE,CAAC,EACV,OAAO,EAAE,oBAAoB,GAC5B,uBAAuB,CAAC,CAAC,CAAC,CA4F5B"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Which capability each method announces.
3
+ *
4
+ * The five core methods plus the optional extensions an adapter may implement (`listPage` from
5
+ * `PagedStorageAdapter`, `copy`/`move` from `MovableStorageAdapter`). `presign` is absent on purpose:
6
+ * its token depends on the `operation` argument, since a PUT URL hands out write access.
7
+ */
8
+ const ACCESS = {
9
+ get: "read",
10
+ exists: "read",
11
+ list: "read",
12
+ listPage: "read",
13
+ put: "write",
14
+ delete: "write",
15
+ copy: "write",
16
+ move: "write",
17
+ };
18
+ /**
19
+ * Wrap an adapter so `for(context)` announces each operation's capability.
20
+ *
21
+ * Forwarding is by Proxy rather than by enumeration, and that is the whole point: a wrapper that lists
22
+ * the methods it knows about is a wrapper that silently deletes the ones it does not, and an adapter's
23
+ * optional capabilities are precisely the methods a hand-written list forgets.
24
+ */
25
+ export function withCapabilityBeacon(adapter, options) {
26
+ if (typeof options.beacon !== "function") {
27
+ throw new TypeError("@nifrajs/storage: withCapabilityBeacon needs a beacon function");
28
+ }
29
+ const read = options.capabilities?.read ?? "storage.read";
30
+ const write = options.capabilities?.write ?? "storage.write";
31
+ /**
32
+ * The token a call announces. `presign` reads its `operation` argument, because minting a PUT URL
33
+ * hands the holder write access to the bucket and must not be evidenced as a read.
34
+ *
35
+ * An unrecognised method announces WRITE. A declaration describes what a route MAY do, so the
36
+ * conservative answer is the correct one - an adapter extension nobody mapped should fail closed
37
+ * against a read-only route rather than slip through unannounced.
38
+ */
39
+ const tokenFor = (method, args) => {
40
+ if (method === "presign")
41
+ return args[1] === "put" ? write : read;
42
+ return ACCESS[method] === "read" ? read : write;
43
+ };
44
+ /**
45
+ * Proxy an extensible facade, never the adapter itself. A Proxy may not return a different value for
46
+ * a frozen non-writable method property; targeting the adapter therefore throws an invariant error
47
+ * before our wrapper can run. The facade preserves the prototype for `instanceof`, while every read,
48
+ * write and call still delegates to the real instance (including `#private` brands).
49
+ */
50
+ const facade = (read, hasFor) => {
51
+ const target = Object.create(Object.getPrototypeOf(adapter));
52
+ return new Proxy(target, {
53
+ get: (_target, prop) => read(prop),
54
+ has: (_target, prop) => (hasFor && prop === "for") || Reflect.has(adapter, prop),
55
+ ownKeys: () => Reflect.ownKeys(adapter),
56
+ getOwnPropertyDescriptor: (_target, prop) => {
57
+ const descriptor = Reflect.getOwnPropertyDescriptor(adapter, prop);
58
+ if (descriptor === undefined)
59
+ return undefined;
60
+ // The facade is extensible, so expose a configurable data view without copying a frozen
61
+ // descriptor onto the proxy target (which would recreate the invariant problem).
62
+ return {
63
+ configurable: true,
64
+ enumerable: descriptor.enumerable ?? false,
65
+ writable: true,
66
+ value: read(prop),
67
+ };
68
+ },
69
+ set: (_target, prop, value) => Reflect.set(adapter, prop, value, adapter),
70
+ });
71
+ };
72
+ // Built per call rather than cached per context: a map keyed by context would hold every request's
73
+ // context for the process lifetime, which is a leak with a request attached to it.
74
+ const bind = (context) => {
75
+ const methods = new Map();
76
+ return facade((prop) => {
77
+ const value = Reflect.get(adapter, prop, adapter);
78
+ if (typeof value !== "function" || typeof prop !== "string")
79
+ return value;
80
+ const cached = methods.get(prop);
81
+ if (cached !== undefined)
82
+ return cached;
83
+ const wrapped = (...args) => {
84
+ // A refused capability surfaces as a REJECTION, not a synchronous throw: these methods return
85
+ // promises, so a caller reaching for `.catch(…)` rather than `try` would otherwise miss it.
86
+ try {
87
+ options.beacon(context, tokenFor(prop, args));
88
+ }
89
+ catch (error) {
90
+ return Promise.reject(error);
91
+ }
92
+ return Reflect.apply(value, adapter, args);
93
+ };
94
+ methods.set(prop, wrapped);
95
+ return wrapped;
96
+ }, false);
97
+ };
98
+ // The unbound adapter keeps working exactly as before, including for methods this module has never
99
+ // heard of. Only the `for(...)` path announces anything.
100
+ //
101
+ // Methods come back bound to the target for the same reason the getter reads against it. They are
102
+ // cached per wrapper, so repeated property reads preserve identity and allocate once.
103
+ //
104
+ // An adapter with its own `for` method is shadowed by the wrapper's. That is a genuine (if unlikely)
105
+ // collision, and `for` is the name the sibling beacons already use, so it stays consistent rather
106
+ // than novel.
107
+ const methods = new Map();
108
+ return facade((prop) => {
109
+ if (prop === "for")
110
+ return bind;
111
+ const value = Reflect.get(adapter, prop, adapter);
112
+ if (typeof value !== "function")
113
+ return value;
114
+ const cached = methods.get(prop);
115
+ if (cached !== undefined)
116
+ return cached;
117
+ const bound = value.bind(adapter);
118
+ methods.set(prop, bound);
119
+ return bound;
120
+ }, true);
121
+ }
122
+ //# sourceMappingURL=capabilities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
@@ -16,7 +16,7 @@ export declare class StorageAdapterConformanceError extends Error {
16
16
  * only after proving byte + metadata round-trips, overwrite, missing/delete semantics, prefix/limit listing,
17
17
  * and uniform unsafe-key rejection across every key-taking method. When the adapter also implements an
18
18
  * optional capability ({@link PagedStorageAdapter}, {@link PresignableStorageAdapter},
19
- * {@link MovableStorageAdapter}), that capability's contract is proven too — implementing a capability
19
+ * {@link MovableStorageAdapter}), that capability's contract is proven too - implementing a capability
20
20
  * partially or unsafely fails conformance rather than silently escaping it.
21
21
  */
22
22
  export declare function assertStorageAdapterConformance(options: StorageAdapterConformanceOptions): Promise<void>;
@@ -22,7 +22,7 @@ const hasMove = (storage) => typeof storage.copy === "function" &&
22
22
  * only after proving byte + metadata round-trips, overwrite, missing/delete semantics, prefix/limit listing,
23
23
  * and uniform unsafe-key rejection across every key-taking method. When the adapter also implements an
24
24
  * optional capability ({@link PagedStorageAdapter}, {@link PresignableStorageAdapter},
25
- * {@link MovableStorageAdapter}), that capability's contract is proven too — implementing a capability
25
+ * {@link MovableStorageAdapter}), that capability's contract is proven too - implementing a capability
26
26
  * partially or unsafely fails conformance rather than silently escaping it.
27
27
  */
28
28
  export async function assertStorageAdapterConformance(options) {
package/dist/file.d.ts CHANGED
@@ -7,14 +7,33 @@ export declare class FileStorage implements StorageAdapter {
7
7
  /** Resolve `key` to an absolute path, asserting it stays inside `root` (defense-in-depth on top of `assertSafeKey`). */
8
8
  private pathFor;
9
9
  private symlinkError;
10
+ private assertTrustedDirectory;
11
+ /**
12
+ * Prove that another local principal cannot rename any directory leading to `base` after validation.
13
+ * A sticky shared parent (the ordinary `/tmp` case) is safe only while its child belongs to this uid.
14
+ * Root-owned system directories are trusted; a directory owned by any other uid is not.
15
+ */
16
+ private assertTrustedAncestorChain;
10
17
  /** Reject existing symbolic links below `base`; missing suffixes are safe for later creation. */
11
18
  private assertNoSymlinkPath;
12
- /** Create parents, re-check them, and refuse a final-component symlink at open time. */
19
+ /**
20
+ * Open an existing file without following its final component, then prove the descriptor is the file
21
+ * still reachable through a symlink-free path below the same root inode. Reads use the descriptor,
22
+ * not the pathname checked earlier, closing their check/open race.
23
+ */
24
+ private openContained;
25
+ private assertOpenedContained;
26
+ /**
27
+ * Create parents and open without truncating. The opened inode is validated against the current,
28
+ * fully resolved path before any caller data is written, closing the check/open symlink race.
29
+ */
13
30
  private writeContained;
14
31
  put(key: string, data: StorageData, options?: PutOptions): Promise<void>;
15
32
  get(key: string): Promise<StorageObject | null>;
16
33
  delete(key: string): Promise<void>;
17
34
  exists(key: string): Promise<boolean>;
35
+ /** Revalidate an opened inode immediately before unlinking its pathname. */
36
+ private removeContained;
18
37
  list(options?: ListOptions): Promise<string[]>;
19
38
  private walk;
20
39
  }
@@ -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,iGAAiG;YACnF,mBAAmB;IAsBjC,wFAAwF;YAC1E,cAAc;IA0BtB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,GAAE,UAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB5E,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IA+B/C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAYrC,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;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"}
package/dist/file.js CHANGED
@@ -5,8 +5,8 @@
5
5
  * objects created before sidecar support still infer content type from their extension.
6
6
  */
7
7
  import { constants } from "node:fs";
8
- import { lstat, mkdir, open, readdir, readFile, rm, stat } from "node:fs/promises";
9
- import { dirname, join, posix, resolve, sep } from "node:path";
8
+ import { lstat, mkdir, open, readdir, realpath, unlink } from "node:fs/promises";
9
+ import { basename, dirname, join, posix, resolve, sep } from "node:path";
10
10
  import { assertSafeKey, StorageKeyError } from "./key.js";
11
11
  import { toBytes, } from "./types.js";
12
12
  const CONTENT_TYPES = {
@@ -62,11 +62,52 @@ 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) {
66
+ // Node exposes POSIX mode bits on Bun/Node/Deno Unix runtimes. A group/world-writable ancestor lets
67
+ // another local principal swap path components between otherwise-correct checks; fail closed so
68
+ // descriptor validation only has to defend against ordinary filesystem races within one principal.
69
+ if (process.platform === "win32" || !info.isDirectory())
70
+ return;
71
+ const uid = typeof process.getuid === "function" ? process.getuid() : undefined;
72
+ const untrustedOwner = uid !== undefined && info.uid !== uid && info.uid !== 0;
73
+ if (untrustedOwner || (Number(info.mode) & 0o022) !== 0) {
74
+ throw new StorageKeyError(`storage key ${JSON.stringify(key)} crosses an untrusted writable directory`);
75
+ }
76
+ }
77
+ /**
78
+ * Prove that another local principal cannot rename any directory leading to `base` after validation.
79
+ * A sticky shared parent (the ordinary `/tmp` case) is safe only while its child belongs to this uid.
80
+ * Root-owned system directories are trusted; a directory owned by any other uid is not.
81
+ */
82
+ async assertTrustedAncestorChain(base, key) {
83
+ if (process.platform === "win32" || typeof process.getuid !== "function")
84
+ return;
85
+ const uid = process.getuid();
86
+ let current = await realpath(base);
87
+ let child = await lstat(current);
88
+ for (;;) {
89
+ const parent = dirname(current);
90
+ if (parent === current)
91
+ return;
92
+ const info = await lstat(parent);
93
+ const mode = Number(info.mode);
94
+ const trustedOwner = info.uid === uid || info.uid === 0;
95
+ const writableByAnotherPrincipal = (mode & 0o022) !== 0;
96
+ const stickyProtectsChild = (mode & 0o1000) !== 0 && child.uid === uid;
97
+ if (!trustedOwner || (writableByAnotherPrincipal && !stickyProtectsChild)) {
98
+ throw new StorageKeyError(`storage key ${JSON.stringify(key)} crosses an untrusted writable ancestor`);
99
+ }
100
+ current = parent;
101
+ child = info;
102
+ }
103
+ }
65
104
  /** Reject existing symbolic links below `base`; missing suffixes are safe for later creation. */
66
105
  async assertNoSymlinkPath(base, path, key) {
67
106
  try {
68
- if ((await lstat(base)).isSymbolicLink())
107
+ const info = await lstat(base);
108
+ if (info.isSymbolicLink())
69
109
  throw this.symlinkError(key);
110
+ this.assertTrustedDirectory(info, key);
70
111
  }
71
112
  catch (error) {
72
113
  if (error instanceof StorageKeyError)
@@ -80,8 +121,10 @@ export class FileStorage {
80
121
  for (const segment of suffix.split(sep)) {
81
122
  current = join(current, segment);
82
123
  try {
83
- if ((await lstat(current)).isSymbolicLink())
124
+ const info = await lstat(current);
125
+ if (info.isSymbolicLink())
84
126
  throw this.symlinkError(key);
127
+ this.assertTrustedDirectory(info, key);
85
128
  }
86
129
  catch (error) {
87
130
  if (error instanceof StorageKeyError)
@@ -92,14 +135,93 @@ export class FileStorage {
92
135
  }
93
136
  }
94
137
  }
95
- /** Create parents, re-check them, and refuse a final-component symlink at open time. */
138
+ /**
139
+ * Open an existing file without following its final component, then prove the descriptor is the file
140
+ * still reachable through a symlink-free path below the same root inode. Reads use the descriptor,
141
+ * not the pathname checked earlier, closing their check/open race.
142
+ */
143
+ async openContained(base, path, key) {
144
+ await this.assertNoSymlinkPath(base, path, key);
145
+ let baseBefore;
146
+ try {
147
+ baseBefore = await lstat(base);
148
+ }
149
+ catch (error) {
150
+ if (error.code === "ENOENT")
151
+ return null;
152
+ throw error;
153
+ }
154
+ let handle;
155
+ try {
156
+ handle = await open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
157
+ }
158
+ catch (error) {
159
+ const code = error.code;
160
+ if (code === "ENOENT")
161
+ return null;
162
+ if (code === "ELOOP")
163
+ throw this.symlinkError(key);
164
+ throw error;
165
+ }
166
+ try {
167
+ await this.assertOpenedContained(base, path, key, handle, baseBefore);
168
+ return handle;
169
+ }
170
+ catch (error) {
171
+ await handle.close();
172
+ throw error;
173
+ }
174
+ }
175
+ async assertOpenedContained(base, path, key, handle, baseBefore) {
176
+ await this.assertNoSymlinkPath(base, path, key);
177
+ try {
178
+ const [opened, current, baseAfter, resolvedBase, resolvedPath] = await Promise.all([
179
+ handle.stat(),
180
+ lstat(path),
181
+ lstat(base),
182
+ realpath(base),
183
+ realpath(path),
184
+ ]);
185
+ const baseChanged = baseBefore.dev !== baseAfter.dev || baseBefore.ino !== baseAfter.ino;
186
+ const targetChanged = current.isSymbolicLink() || opened.dev !== current.dev || opened.ino !== current.ino;
187
+ const escaped = resolvedPath !== resolvedBase && !resolvedPath.startsWith(resolvedBase + sep);
188
+ if (baseChanged || targetChanged || escaped)
189
+ throw this.symlinkError(key);
190
+ }
191
+ catch (error) {
192
+ if (error.code === "ENOENT")
193
+ throw this.symlinkError(key);
194
+ throw error;
195
+ }
196
+ }
197
+ /**
198
+ * Create parents and open without truncating. The opened inode is validated against the current,
199
+ * fully resolved path before any caller data is written, closing the check/open symlink race.
200
+ */
96
201
  async writeContained(base, path, key, data) {
97
202
  await this.assertNoSymlinkPath(base, path, key);
98
203
  await mkdir(dirname(path), { recursive: true });
99
204
  await this.assertNoSymlinkPath(base, path, key);
100
205
  try {
101
- const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC | constants.O_NOFOLLOW, 0o666);
206
+ const baseBefore = await lstat(base);
207
+ const handle = await open(path, constants.O_WRONLY | constants.O_CREAT | constants.O_NOFOLLOW, 0o666);
102
208
  try {
209
+ // Do not truncate until the descriptor is proven to be the same file currently reachable
210
+ // through a symlink-free path beneath the same storage-root directory.
211
+ await this.assertNoSymlinkPath(base, path, key);
212
+ const [opened, current, baseAfter, resolvedBase, resolvedPath] = await Promise.all([
213
+ handle.stat(),
214
+ lstat(path),
215
+ lstat(base),
216
+ realpath(base),
217
+ realpath(path),
218
+ ]);
219
+ const baseChanged = baseBefore.dev !== baseAfter.dev || baseBefore.ino !== baseAfter.ino;
220
+ const targetChanged = current.isSymbolicLink() || opened.dev !== current.dev || opened.ino !== current.ino;
221
+ const escaped = resolvedPath !== resolvedBase && !resolvedPath.startsWith(resolvedBase + sep);
222
+ if (baseChanged || targetChanged || escaped)
223
+ throw this.symlinkError(key);
224
+ await handle.truncate(0);
103
225
  await handle.writeFile(data);
104
226
  }
105
227
  finally {
@@ -123,27 +245,33 @@ export class FileStorage {
123
245
  }));
124
246
  }
125
247
  else {
126
- await this.assertNoSymlinkPath(this.metadataRoot, metadataPath, key);
127
- await rm(metadataPath, { force: true });
248
+ await this.removeContained(this.metadataRoot, metadataPath, key);
128
249
  }
129
250
  }
130
251
  async get(key) {
131
252
  const path = this.pathFor(key);
132
- await this.assertNoSymlinkPath(this.root, path, key);
253
+ const bodyHandle = await this.openContained(this.root, path, key);
254
+ if (bodyHandle === null)
255
+ return null;
133
256
  let body;
134
257
  try {
135
- body = new Uint8Array(await readFile(path));
258
+ body = new Uint8Array(await bodyHandle.readFile());
136
259
  }
137
- catch (error) {
138
- if (error.code === "ENOENT")
139
- return null;
140
- throw error;
260
+ finally {
261
+ await bodyHandle.close();
141
262
  }
142
263
  let stored = {};
143
264
  try {
144
265
  const metadataPath = this.metadataPathFor(key);
145
- await this.assertNoSymlinkPath(this.metadataRoot, metadataPath, key);
146
- stored = JSON.parse(await readFile(metadataPath, "utf8"));
266
+ const metadataHandle = await this.openContained(this.metadataRoot, metadataPath, key);
267
+ if (metadataHandle !== null) {
268
+ try {
269
+ stored = JSON.parse(await metadataHandle.readFile({ encoding: "utf8" }));
270
+ }
271
+ finally {
272
+ await metadataHandle.close();
273
+ }
274
+ }
147
275
  }
148
276
  catch (error) {
149
277
  if (error instanceof StorageKeyError)
@@ -165,22 +293,61 @@ export class FileStorage {
165
293
  const path = this.pathFor(key);
166
294
  const metadataPath = this.metadataPathFor(key);
167
295
  await Promise.all([
168
- this.assertNoSymlinkPath(this.root, path, key),
169
- this.assertNoSymlinkPath(this.metadataRoot, metadataPath, key),
296
+ this.removeContained(this.root, path, key),
297
+ this.removeContained(this.metadataRoot, metadataPath, key),
170
298
  ]);
171
- await Promise.all([rm(path, { force: true }), rm(metadataPath, { force: true })]);
172
299
  }
173
300
  async exists(key) {
174
301
  const path = this.pathFor(key);
175
- await this.assertNoSymlinkPath(this.root, path, key);
302
+ const handle = await this.openContained(this.root, path, key);
303
+ if (handle === null)
304
+ return false;
176
305
  try {
177
- await stat(path);
178
306
  return true;
179
307
  }
180
- catch (error) {
181
- if (error.code === "ENOENT")
182
- return false;
183
- throw error;
308
+ finally {
309
+ await handle.close();
310
+ }
311
+ }
312
+ /** Revalidate an opened inode immediately before unlinking its pathname. */
313
+ async removeContained(base, path, key) {
314
+ const handle = await this.openContained(base, path, key);
315
+ if (handle === null)
316
+ return;
317
+ try {
318
+ await this.assertTrustedAncestorChain(base, key);
319
+ const baseBefore = await lstat(base);
320
+ await this.assertOpenedContained(base, path, key, handle, baseBefore);
321
+ if (process.platform === "linux") {
322
+ // Node exposes no unlinkat(2), but Linux's procfs gives an equivalent descriptor-relative path.
323
+ // Anchor the final lookup to an opened, validated parent so replacing an intermediate directory
324
+ // cannot redirect deletion outside the storage root.
325
+ const parentPath = dirname(path);
326
+ const parentHandle = await this.openContained(base, parentPath, key);
327
+ if (parentHandle === null)
328
+ throw this.symlinkError(key);
329
+ try {
330
+ const anchoredPath = join("/proc/self/fd", String(parentHandle.fd), basename(path));
331
+ const [opened, current] = await Promise.all([handle.stat(), lstat(anchoredPath)]);
332
+ if (current.isSymbolicLink() ||
333
+ opened.dev !== current.dev ||
334
+ opened.ino !== current.ino) {
335
+ throw this.symlinkError(key);
336
+ }
337
+ await unlink(anchoredPath);
338
+ }
339
+ finally {
340
+ await parentHandle.close();
341
+ }
342
+ }
343
+ else {
344
+ // Other Node-compatible runtimes expose no descriptor-relative unlink. The verified ownership /
345
+ // permission chain above removes the cross-principal swap capability before this pathname lookup.
346
+ await unlink(path);
347
+ }
348
+ }
349
+ finally {
350
+ await handle.close();
184
351
  }
185
352
  }
186
353
  async list(options = {}) {
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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"}