@poe-platform/safe-bash 0.1.533 → 0.1.534

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/safe-bash/commands/archive/index.d.ts +2 -0
  2. package/dist/safe-bash/commands/archive/index.d.ts.map +1 -1
  3. package/dist/safe-bash/commands/archive/index.js +11 -3
  4. package/dist/safe-bash/commands/archive/index.js.map +1 -1
  5. package/dist/safe-bash/commands/archive/unzip/arguments.d.ts +32 -0
  6. package/dist/safe-bash/commands/archive/unzip/arguments.d.ts.map +1 -0
  7. package/dist/safe-bash/commands/archive/unzip/arguments.js +214 -0
  8. package/dist/safe-bash/commands/archive/unzip/arguments.js.map +1 -0
  9. package/dist/safe-bash/commands/archive/unzip/safety.d.ts +28 -0
  10. package/dist/safe-bash/commands/archive/unzip/safety.d.ts.map +1 -0
  11. package/dist/safe-bash/commands/archive/unzip/safety.js +288 -0
  12. package/dist/safe-bash/commands/archive/unzip/safety.js.map +1 -0
  13. package/dist/safe-bash/commands/archive/unzip.d.ts +4 -0
  14. package/dist/safe-bash/commands/archive/unzip.d.ts.map +1 -0
  15. package/dist/safe-bash/commands/archive/unzip.js +264 -0
  16. package/dist/safe-bash/commands/archive/unzip.js.map +1 -0
  17. package/dist/safe-bash/commands/archive/zip/safety.d.ts +28 -0
  18. package/dist/safe-bash/commands/archive/zip/safety.d.ts.map +1 -0
  19. package/dist/safe-bash/commands/archive/zip/safety.js +228 -0
  20. package/dist/safe-bash/commands/archive/zip/safety.js.map +1 -0
  21. package/dist/safe-bash/commands/archive/zip-format.d.ts +39 -0
  22. package/dist/safe-bash/commands/archive/zip-format.d.ts.map +1 -0
  23. package/dist/safe-bash/commands/archive/zip-format.js +509 -0
  24. package/dist/safe-bash/commands/archive/zip-format.js.map +1 -0
  25. package/dist/safe-bash/commands/archive/zip.d.ts +4 -0
  26. package/dist/safe-bash/commands/archive/zip.d.ts.map +1 -0
  27. package/dist/safe-bash/commands/archive/zip.js +290 -0
  28. package/dist/safe-bash/commands/archive/zip.js.map +1 -0
  29. package/dist/safe-bash/commands/bytes/compression/codec.d.ts +1 -1
  30. package/dist/safe-bash/commands/bytes/compression/codec.d.ts.map +1 -1
  31. package/dist/safe-bash/commands/bytes/compression/codec.js +2 -2
  32. package/dist/safe-bash/commands/bytes/compression/codec.js.map +1 -1
  33. package/dist/safe-bash/core.browser.js +1932 -387
  34. package/dist/safe-bash/core.browser.js.map +4 -4
  35. package/package.json +2 -2
@@ -1,6 +1,8 @@
1
1
  import { type CommandDefinition, type VirtualShellPlugin } from "../../contracts/index.js";
2
2
  import { type ArchiveCommandsOptions } from "./internal.js";
3
3
  export { DEFAULT_ARCHIVE_LIMITS } from "./internal.js";
4
+ export { createZipCommand } from "./zip.js";
5
+ export { createUnzipCommand } from "./unzip.js";
4
6
  export type { ArchiveCommandsOptions, ArchiveLimits } from "./internal.js";
5
7
  export declare function createTarCommand(options?: ArchiveCommandsOptions): CommandDefinition;
6
8
  export declare function createArchiveCommands(options?: ArchiveCommandsOptions): readonly CommandDefinition[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA+D,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIxJ,OAAO,EAA8G,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAIxK,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3E,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CAqCxF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,SAAS,iBAAiB,EAAE,CAExG;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,kBAAkB,CAMxF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/index.ts"],"names":[],"mappings":"AACA,OAAO,EAA+D,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIxJ,OAAO,EAA8G,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAMxK,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE3E,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CAqCxF;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,SAAS,iBAAiB,EAAE,CAExG;AAED,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,kBAAkB,CAUxF"}
@@ -6,7 +6,11 @@ import { readArchive } from "./extract.js";
6
6
  import { Budget, bounded, display, fail, fileSource, maybeStat, operation, publish, sameIdentity, settings, vfsPath } from "./internal.js";
7
7
  import { parseOptions } from "./options.js";
8
8
  import { compressed } from "./stream.js";
9
+ import { createZipCommand } from "./zip.js";
10
+ import { createUnzipCommand } from "./unzip.js";
9
11
  export { DEFAULT_ARCHIVE_LIMITS } from "./internal.js";
12
+ export { createZipCommand } from "./zip.js";
13
+ export { createUnzipCommand } from "./unzip.js";
10
14
  export function createTarCommand(options = {}) {
11
15
  const limits = settings(options);
12
16
  return { name: "tar", description: "Stream USTAR/PAX archives through the virtual filesystem", async execute(original) {
@@ -58,13 +62,17 @@ export function createTarCommand(options = {}) {
58
62
  } };
59
63
  }
60
64
  export function createArchiveCommands(options = {}) {
61
- return [createTarCommand(options)];
65
+ return [createTarCommand(options), createZipCommand(options), createUnzipCommand(options)];
62
66
  }
63
67
  export function archiveCommands(options = {}) {
64
68
  const commands = createArchiveCommands(options);
65
69
  return { name: "archive-commands", setup(host) {
66
- if (!options.replace && host.commands.has("tar"))
67
- throw new Error("Command already registered: tar");
70
+ if (!options.replace) {
71
+ for (const command of commands) {
72
+ if (host.commands.has(command.name))
73
+ throw new Error(`Command already registered: ${command.name}`);
74
+ }
75
+ }
68
76
  for (const command of commands)
69
77
  host.commands.register(command, { replace: options.replace ?? false });
70
78
  } };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/archive/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/archive/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { type ByteSource, type CommandContext } from "../../../contracts/index.js";
2
+ import { type ArchiveLimits } from "../internal.js";
3
+ export declare function parseArguments(context: Pick<CommandContext, "args" | "argumentValues">, limits: ArchiveLimits): {
4
+ list: boolean;
5
+ overwrite: boolean;
6
+ destination: string | undefined;
7
+ archive: string;
8
+ patterns: string[];
9
+ };
10
+ export declare class Selection {
11
+ private readonly limits;
12
+ private readonly signal;
13
+ private work;
14
+ private readonly patterns;
15
+ readonly matched: Set<number>;
16
+ constructor(patterns: readonly string[], limits: ArchiveLimits, signal: AbortSignal);
17
+ private step;
18
+ matches(name: string): Promise<boolean>;
19
+ }
20
+ export declare class Answers {
21
+ private readonly limits;
22
+ private readonly signal;
23
+ private readonly iterator;
24
+ private chunk;
25
+ private offset;
26
+ private bytes;
27
+ private pulls;
28
+ constructor(source: ByteSource, limits: ArchiveLimits, signal: AbortSignal);
29
+ read(maximum?: number): Promise<string | undefined>;
30
+ close(): Promise<void>;
31
+ }
32
+ //# sourceMappingURL=arguments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../../../../src/commands/archive/unzip/arguments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAGnH,OAAO,EAAyB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE3E,wBAAgB,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,aAAa;;;;;;EA8C7G;AAsCD,qBAAa,SAAS;IAIqB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAiB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAHxG,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,QAAQ,CAAC,OAAO,cAAqB;gBACzB,QAAQ,EAAE,SAAS,MAAM,EAAE,EAAmB,MAAM,EAAE,aAAa,EAAmB,MAAM,EAAE,WAAW;IAGrH,OAAO,CAAC,IAAI;IAGN,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAkC9C;AAED,qBAAa,OAAO;IAMc,OAAO,CAAC,QAAQ,CAAC,MAAM;IAAiB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAL/F,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IACrD,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,KAAK,CAAK;gBACN,MAAM,EAAE,UAAU,EAAmB,MAAM,EAAE,aAAa,EAAmB,MAAM,EAAE,WAAW;IAGtG,IAAI,CAAC,OAAO,SAAI,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAqB9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7B"}
@@ -0,0 +1,214 @@
1
+ import { getCommandArguments, readBytes } from "../../../contracts/index.js";
2
+ import { shellValueByteLength, shellValueBytes } from "../../../contracts/value.js";
3
+ import { yieldTurn } from "../../../contracts/yield.js";
4
+ import { checkPath, fail, text } from "../internal.js";
5
+ export function parseArguments(context, limits) {
6
+ const { args } = context;
7
+ let bytes = 0;
8
+ for (const argument of args) {
9
+ bytes += Buffer.byteLength(argument) + 1;
10
+ if (bytes > limits.maxArgumentBytes)
11
+ fail("argument byte limit exceeded");
12
+ if (argument.includes("\0"))
13
+ fail("NUL in argument");
14
+ }
15
+ if (context.argumentValues) {
16
+ const argumentsValue = getCommandArguments(context);
17
+ let rawBytes = 0;
18
+ for (const value of argumentsValue.values) {
19
+ const size = shellValueByteLength(value) + 1;
20
+ if (size > limits.maxArgumentBytes - rawBytes)
21
+ fail("argument byte limit exceeded");
22
+ rawBytes += size;
23
+ }
24
+ for (const value of argumentsValue.values)
25
+ text(shellValueBytes(value));
26
+ }
27
+ let list = false;
28
+ let overwrite = false;
29
+ let destination;
30
+ let archive;
31
+ let ended = false;
32
+ const patterns = [];
33
+ for (let index = 0; index < args.length; index++) {
34
+ const argument = args[index];
35
+ if (!ended && argument === "--") {
36
+ ended = true;
37
+ continue;
38
+ }
39
+ if (!ended && argument.startsWith("-") && argument !== "-") {
40
+ for (let offset = 1; offset < argument.length; offset++) {
41
+ const flag = argument[offset];
42
+ if (flag === "l")
43
+ list = true;
44
+ else if (flag === "o")
45
+ overwrite = true;
46
+ else if (flag === "d") {
47
+ if (destination !== undefined)
48
+ fail("-d may only be specified once");
49
+ destination = argument.slice(offset + 1) || args[++index];
50
+ if (!destination)
51
+ fail("must specify directory to which to extract with -d option");
52
+ checkPath(destination, limits);
53
+ break;
54
+ }
55
+ else
56
+ fail(`unsupported option: -${flag}`);
57
+ }
58
+ }
59
+ else if (archive === undefined)
60
+ archive = argument;
61
+ else
62
+ patterns.push(argument);
63
+ }
64
+ if (archive === undefined)
65
+ fail("usage: unzip [-l] [-o] [-d DIR] ARCHIVE [FILES...]");
66
+ checkPath(archive, limits);
67
+ return { list, overwrite, destination, archive, patterns };
68
+ }
69
+ function tokenize(pattern) {
70
+ const characters = Array.from(pattern);
71
+ const tokens = [];
72
+ for (let index = 0; index < characters.length; index++) {
73
+ const character = characters[index];
74
+ if (character === "*") {
75
+ if (tokens.at(-1)?.kind !== "star")
76
+ tokens.push({ kind: "star" });
77
+ }
78
+ else if (character === "?")
79
+ tokens.push({ kind: "any" });
80
+ else if (character === "\\") {
81
+ const escaped = characters[++index];
82
+ tokens.push(escaped === undefined ? { kind: "never" } : { kind: "literal", value: escaped });
83
+ }
84
+ else if (character === "[") {
85
+ const negative = characters[index + 1] === "!" || characters[index + 1] === "^";
86
+ if (negative)
87
+ index++;
88
+ const ranges = [];
89
+ let closed = false;
90
+ while (++index < characters.length) {
91
+ let first = characters[index];
92
+ if (first === "]") {
93
+ closed = true;
94
+ break;
95
+ }
96
+ if (first === "\\")
97
+ first = characters[++index] ?? "";
98
+ let last = first;
99
+ if (characters[index + 1] === "-" && characters[index + 2] && characters[index + 2] !== "]") {
100
+ index += 2;
101
+ last = characters[index];
102
+ if (last === "\\")
103
+ last = characters[++index] ?? "";
104
+ }
105
+ ranges.push([first.codePointAt(0) ?? -1, last.codePointAt(0) ?? -1]);
106
+ }
107
+ tokens.push(closed ? { kind: "class", ranges, negative } : { kind: "never" });
108
+ }
109
+ else
110
+ tokens.push({ kind: "literal", value: character });
111
+ }
112
+ return tokens;
113
+ }
114
+ export class Selection {
115
+ limits;
116
+ signal;
117
+ work = 0;
118
+ patterns;
119
+ matched = new Set();
120
+ constructor(patterns, limits, signal) {
121
+ this.limits = limits;
122
+ this.signal = signal;
123
+ this.patterns = patterns.map(tokenize);
124
+ }
125
+ step() {
126
+ if (++this.work > this.limits.maxPatternSteps)
127
+ fail("pattern work limit exceeded");
128
+ }
129
+ async matches(name) {
130
+ if (!this.patterns.length)
131
+ return true;
132
+ const characters = Array.from(name);
133
+ let selected = false;
134
+ for (let pattern = 0; pattern < this.patterns.length; pattern++) {
135
+ this.step();
136
+ let states = new Uint8Array(characters.length + 1);
137
+ states[0] = 1;
138
+ for (const token of this.patterns[pattern]) {
139
+ const next = new Uint8Array(states.length);
140
+ for (let index = 0; index < states.length; index++) {
141
+ this.step();
142
+ if (token.kind === "star")
143
+ next[index] = states[index] || (index > 0 ? next[index - 1] : 0);
144
+ else if (states[index] && index < characters.length) {
145
+ const character = characters[index];
146
+ let match = token.kind === "any" || (token.kind === "literal" && token.value === character);
147
+ if (token.kind === "class") {
148
+ let inRange = false;
149
+ for (const [first, last] of token.ranges) {
150
+ this.step();
151
+ if (character.codePointAt(0) >= first && character.codePointAt(0) <= last)
152
+ inRange = true;
153
+ }
154
+ match = inRange !== token.negative;
155
+ }
156
+ if (match)
157
+ next[index + 1] = 1;
158
+ }
159
+ if (this.work % 4096 === 0)
160
+ await yieldTurn(this.signal);
161
+ }
162
+ states = next;
163
+ }
164
+ if (states[characters.length]) {
165
+ this.matched.add(pattern);
166
+ selected = true;
167
+ }
168
+ }
169
+ return selected;
170
+ }
171
+ }
172
+ export class Answers {
173
+ limits;
174
+ signal;
175
+ iterator;
176
+ chunk = new Uint8Array();
177
+ offset = 0;
178
+ bytes = 0;
179
+ pulls = 0;
180
+ constructor(source, limits, signal) {
181
+ this.limits = limits;
182
+ this.signal = signal;
183
+ this.iterator = readBytes(source, signal)[Symbol.asyncIterator]();
184
+ }
185
+ async read(maximum = 9) {
186
+ const answer = [];
187
+ while (answer.length < maximum) {
188
+ this.signal.throwIfAborted();
189
+ if (this.offset === this.chunk.length) {
190
+ if (++this.pulls > this.limits.maxPatternSteps)
191
+ fail("overwrite input work limit exceeded");
192
+ if (this.pulls % 64 === 0)
193
+ await yieldTurn(this.signal);
194
+ const next = await this.iterator.next();
195
+ if (next.done)
196
+ break;
197
+ if (next.value.length > this.limits.maxFilesFromBytes - this.bytes)
198
+ fail("overwrite input byte limit exceeded");
199
+ this.bytes += next.value.length;
200
+ this.chunk = Uint8Array.from(next.value);
201
+ this.offset = 0;
202
+ if (!this.chunk.length)
203
+ continue;
204
+ }
205
+ const byte = this.chunk[this.offset++];
206
+ answer.push(byte);
207
+ if (byte === 10)
208
+ break;
209
+ }
210
+ return answer.length ? Buffer.from(answer).toString("utf8") : undefined;
211
+ }
212
+ async close() { await this.iterator.return?.(); }
213
+ }
214
+ //# sourceMappingURL=arguments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arguments.js","sourceRoot":"","sources":["../../../../src/commands/archive/unzip/arguments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type ByteSource, type CommandContext, type FileStat } from "../../../contracts/index.js";
2
+ import { type ArchiveLimits } from "../internal.js";
3
+ export declare class Extraction {
4
+ readonly context: CommandContext;
5
+ readonly limits: ArchiveLimits;
6
+ private readonly pending;
7
+ private readonly publications;
8
+ private readonly readers;
9
+ private closed;
10
+ private work;
11
+ private serial;
12
+ constructor(context: CommandContext, limits: ArchiveLimits);
13
+ operation<Value>(action: () => Promise<Value>): Promise<Value>;
14
+ close(): Promise<void>;
15
+ source(source: ByteSource): ByteSource;
16
+ input(path: string): ByteSource;
17
+ stat(path: string): Promise<FileStat | undefined>;
18
+ directory(raw: string, create: boolean): Promise<string>;
19
+ parents(root: string, path: string, create: boolean): Promise<void>;
20
+ member(root: string, name: string): string;
21
+ target(root: string, path: string, target: string): Promise<void>;
22
+ destination(path: string, archivePath: string, archiveStat: FileStat): Promise<FileStat | undefined>;
23
+ checked(root: string, path: string, expected: FileStat): Promise<void>;
24
+ metadata(root: string, path: string, identity: FileStat, mode: number, modified: Date): Promise<void>;
25
+ publish(root: string, path: string, chunks: readonly Uint8Array[], expected: FileStat | undefined, mode: number, modified: Date, target?: string): Promise<void>;
26
+ private stage;
27
+ }
28
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../../src/commands/archive/unzip/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiD,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEjJ,OAAO,EAAuD,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEzG,qBAAa,UAAU;IAOT,QAAQ,CAAC,OAAO,EAAE,cAAc;IAAE,QAAQ,CAAC,MAAM,EAAE,aAAa;IAN5E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBACE,OAAO,EAAE,cAAc,EAAW,MAAM,EAAE,aAAa;IACtE,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAS9D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU;IAqB/B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;IAchC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAQjD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAaxD,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAQpC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCjE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAOpG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtE,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAW3G,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAKlJ,KAAK;CA4DpB"}
@@ -0,0 +1,288 @@
1
+ import { dirname, isPathWithin, readBytes, resolvePath } from "../../../contracts/index.js";
2
+ import { retainFileSystemCleanup } from "@poe-platform/safe-fs/core";
3
+ import { checkPath, display, fail, hasIdentity, sameIdentity } from "../internal.js";
4
+ export class Extraction {
5
+ context;
6
+ limits;
7
+ pending = new Set();
8
+ publications = new Set();
9
+ readers = new Set();
10
+ closed = false;
11
+ work = 0;
12
+ serial = 0;
13
+ constructor(context, limits) {
14
+ this.context = context;
15
+ this.limits = limits;
16
+ }
17
+ async operation(action) {
18
+ this.context.signal.throwIfAborted();
19
+ if (this.closed)
20
+ fail("extraction is closed");
21
+ if (++this.work > this.limits.maxPatternSteps)
22
+ fail("filesystem work limit exceeded");
23
+ const pending = Promise.resolve().then(() => { this.context.signal.throwIfAborted(); return action(); });
24
+ this.pending.add(pending);
25
+ try {
26
+ const value = await pending;
27
+ this.context.signal.throwIfAborted();
28
+ return value;
29
+ }
30
+ finally {
31
+ this.pending.delete(pending);
32
+ }
33
+ }
34
+ async close() {
35
+ this.closed = true;
36
+ while (this.pending.size)
37
+ await Promise.allSettled([...this.pending]);
38
+ while (this.publications.size)
39
+ await Promise.allSettled([...this.publications]);
40
+ await Promise.allSettled([...this.readers].map(close => close()));
41
+ }
42
+ source(source) {
43
+ return { [Symbol.asyncIterator]: () => {
44
+ const state = {};
45
+ let closing;
46
+ const close = () => closing ??= (async () => {
47
+ try {
48
+ await state.iterator?.return?.();
49
+ }
50
+ finally {
51
+ this.readers.delete(close);
52
+ }
53
+ })();
54
+ this.readers.add(close);
55
+ this.context.signal.throwIfAborted();
56
+ state.iterator = source[Symbol.asyncIterator]();
57
+ return {
58
+ next: () => this.operation(async () => {
59
+ const result = await state.iterator.next();
60
+ if (result.done)
61
+ this.readers.delete(close);
62
+ return result;
63
+ }),
64
+ async return() { await close(); return { done: true, value: undefined }; },
65
+ };
66
+ } };
67
+ }
68
+ async *input(path) {
69
+ const { fs, signal } = this.context;
70
+ const capabilities = await this.operation(async () => await fs.capabilitiesFor?.(path, { signal }) ?? fs.capabilities);
71
+ if (fs.readStream && capabilities.streamingRead !== false) {
72
+ const source = await this.operation(async () => fs.readStream(path, { signal, chunkSize: this.limits.chunkSize }));
73
+ yield* readBytes(this.source(source), signal);
74
+ }
75
+ else {
76
+ const stat = await this.operation(() => fs.stat(path, { signal }));
77
+ if (stat.size > this.limits.maxBufferedFileBytes)
78
+ fail("filesystem lacks streaming reads: buffered file limit exceeded");
79
+ const bytes = await this.operation(() => fs.readFile(path, { signal, maxBytes: this.limits.maxBufferedFileBytes }));
80
+ if (bytes.length > this.limits.maxBufferedFileBytes)
81
+ fail("buffered file limit exceeded");
82
+ yield bytes;
83
+ }
84
+ }
85
+ async stat(path) {
86
+ try {
87
+ return await this.operation(() => this.context.fs.lstat(path, { signal: this.context.signal }));
88
+ }
89
+ catch (error) {
90
+ this.context.signal.throwIfAborted();
91
+ if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
92
+ return undefined;
93
+ throw error;
94
+ }
95
+ }
96
+ async directory(raw, create) {
97
+ checkPath(raw, this.limits);
98
+ let current = "/";
99
+ const { fs, signal } = this.context;
100
+ for (const component of raw.split("/")) {
101
+ if (!component || component === ".")
102
+ continue;
103
+ current = resolvePath(current, component);
104
+ const stat = await this.stat(current);
105
+ if (!stat && create)
106
+ await this.operation(() => fs.mkdir(current, { signal, mode: 0o755 }));
107
+ else if (!stat || stat.type !== "directory")
108
+ fail(`unsafe non-directory or symlink ancestor: ${display(current)}`);
109
+ }
110
+ return current;
111
+ }
112
+ async parents(root, path, create) {
113
+ if (!isPathWithin(root, path))
114
+ fail("extraction path escapes root");
115
+ await this.directory(dirname(path), create);
116
+ }
117
+ member(root, name) {
118
+ checkPath(name, this.limits);
119
+ if (name.startsWith("/") || name.split("/").includes(".."))
120
+ fail(`unsafe archive member: ${display(name)}`);
121
+ const path = resolvePath(root, name);
122
+ checkPath(path, this.limits);
123
+ if (!isPathWithin(root, path))
124
+ fail("extraction path escapes root");
125
+ return path;
126
+ }
127
+ async target(root, path, target) {
128
+ checkPath(target, this.limits);
129
+ if (target.startsWith("/"))
130
+ fail("symlink target escapes extraction root");
131
+ let current = dirname(path);
132
+ const components = (value) => {
133
+ checkPath(value, this.limits);
134
+ let descended = false;
135
+ const result = value.split("/");
136
+ for (const component of result) {
137
+ if (component === ".." && descended)
138
+ fail("unsafe non-leading parent in symlink target");
139
+ if (component && component !== "." && component !== "..")
140
+ descended = true;
141
+ }
142
+ return result;
143
+ };
144
+ let pending = components(target);
145
+ let links = 0;
146
+ let steps = 0;
147
+ while (pending.length) {
148
+ if (++steps > this.limits.maxDepth * 41)
149
+ fail("symlink target resolution limit exceeded");
150
+ const component = pending.shift();
151
+ if (!component || component === ".")
152
+ continue;
153
+ if (component === "..") {
154
+ if (current === root)
155
+ fail("symlink target escapes extraction root");
156
+ current = dirname(current);
157
+ continue;
158
+ }
159
+ const candidate = resolvePath(current, component);
160
+ checkPath(candidate, this.limits);
161
+ if (!isPathWithin(root, candidate))
162
+ fail("symlink target escapes extraction root");
163
+ const stat = await this.stat(candidate);
164
+ if (stat?.type === "symlink") {
165
+ if (++links > 40 || !this.context.fs.readlink)
166
+ fail("symlink target chain cannot be safely resolved");
167
+ const link = await this.operation(() => this.context.fs.readlink(candidate, { signal: this.context.signal }));
168
+ if (link.startsWith("/"))
169
+ fail("absolute symlink target chain is unsafe");
170
+ pending = [...components(link), ...pending];
171
+ if (pending.length > this.limits.maxDepth * 41)
172
+ fail("symlink target resolution limit exceeded");
173
+ }
174
+ else
175
+ current = candidate;
176
+ }
177
+ }
178
+ async destination(path, archivePath, archiveStat) {
179
+ const stat = await this.stat(path);
180
+ if (path === archivePath || (stat && sameIdentity(stat, archiveStat)))
181
+ fail("entry would overwrite input archive");
182
+ if (stat && stat.type !== "file")
183
+ fail(`unsafe non-regular destination: ${display(path)}`);
184
+ if (stat && (!hasIdentity(stat) || !hasIdentity(archiveStat)))
185
+ fail("cannot overwrite file with unknown input-archive backing identity");
186
+ return stat;
187
+ }
188
+ async checked(root, path, expected) {
189
+ await this.parents(root, path, false);
190
+ const current = await this.stat(path);
191
+ if (!current || current.type !== expected.type || !sameIdentity(current, expected))
192
+ fail("extraction entry changed before mutation");
193
+ }
194
+ async metadata(root, path, identity, mode, modified) {
195
+ const { fs, signal } = this.context;
196
+ if (fs.chmod && fs.capabilities.permissions !== false) {
197
+ await this.checked(root, path, identity);
198
+ await this.operation(() => fs.chmod(path, mode & 0o777, { signal }));
199
+ }
200
+ if (fs.utimes && fs.capabilities.timestamps !== false) {
201
+ await this.checked(root, path, identity);
202
+ await this.operation(() => fs.utimes(path, modified.getTime(), modified.getTime(), { signal }));
203
+ }
204
+ }
205
+ publish(root, path, chunks, expected, mode, modified, target) {
206
+ const publication = this.stage(root, path, chunks, expected, mode, modified, target);
207
+ this.publications.add(publication);
208
+ return publication.finally(() => { this.publications.delete(publication); });
209
+ }
210
+ async stage(root, path, chunks, expected, mode, modified, target) {
211
+ const { fs, signal } = this.context;
212
+ let temporary = "";
213
+ let identity;
214
+ let created = false;
215
+ let failure;
216
+ const cleanup = retainFileSystemCleanup(fs, async (view) => {
217
+ if (!created || !identity)
218
+ return;
219
+ try {
220
+ let parent = "/";
221
+ for (const component of dirname(temporary).split("/").filter(Boolean)) {
222
+ parent = resolvePath(parent, component);
223
+ if ((await view.lstat(parent)).type !== "directory")
224
+ return;
225
+ }
226
+ const current = await view.lstat(temporary);
227
+ if (current.type === identity.type && sameIdentity(current, identity))
228
+ await view.rm(temporary);
229
+ }
230
+ catch (error) {
231
+ if (typeof error !== "object" || error === null || !("code" in error) || error.code !== "ENOENT")
232
+ throw error;
233
+ }
234
+ }, { maxOperations: Math.min(4096, this.limits.maxDepth + 3) });
235
+ try {
236
+ await this.parents(root, path, true);
237
+ for (let attempt = 0; attempt < this.limits.maxMembers; attempt++) {
238
+ temporary = resolvePath(dirname(path), `.unzip-${++this.serial}`);
239
+ checkPath(temporary, this.limits);
240
+ if (temporary === path || await this.stat(temporary))
241
+ continue;
242
+ await this.operation(async () => {
243
+ if (target === undefined)
244
+ await fs.writeFile(temporary, new Uint8Array(), { signal, flag: "wx", mode: 0o600 });
245
+ else
246
+ await fs.symlink(target, temporary, { signal });
247
+ created = true;
248
+ identity = await fs.lstat(temporary);
249
+ });
250
+ if (!identity || !hasIdentity(identity))
251
+ fail("temporary file backing identity unavailable");
252
+ break;
253
+ }
254
+ if (!created)
255
+ fail("temporary file attempt limit exceeded");
256
+ if (target === undefined) {
257
+ for (const chunk of chunks) {
258
+ await this.checked(root, temporary, identity);
259
+ await this.operation(() => fs.appendFile(temporary, chunk, { signal }));
260
+ }
261
+ await this.metadata(root, temporary, identity, mode, modified);
262
+ }
263
+ await this.parents(root, path, false);
264
+ const current = await this.stat(path);
265
+ if (current ? !expected || !sameIdentity(current, expected) || current.type !== "file" : expected !== undefined)
266
+ fail("destination changed before publication");
267
+ const staging = await this.stat(temporary);
268
+ if (!staging || !identity || !sameIdentity(staging, identity) || staging.type !== (target === undefined ? "file" : "symlink"))
269
+ fail("temporary file changed before publication");
270
+ await this.operation(() => fs.rename(temporary, path, { signal }));
271
+ created = false;
272
+ }
273
+ catch (error) {
274
+ failure = { reason: error };
275
+ }
276
+ try {
277
+ await cleanup();
278
+ }
279
+ catch (error) {
280
+ if (failure)
281
+ throw new AggregateError([failure.reason, error], "unzip publication and cleanup failed");
282
+ throw error;
283
+ }
284
+ if (failure)
285
+ throw failure.reason;
286
+ }
287
+ }
288
+ //# sourceMappingURL=safety.js.map