poe-code 15.0.5 → 15.0.6

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 (59) hide show
  1. package/dist/metafile.json +1 -1
  2. package/package.json +1 -1
  3. package/packages/safe-bash/dist/commands/archive/index.d.ts +2 -0
  4. package/packages/safe-bash/dist/commands/archive/index.d.ts.map +1 -1
  5. package/packages/safe-bash/dist/commands/archive/index.js +11 -3
  6. package/packages/safe-bash/dist/commands/archive/index.js.map +1 -1
  7. package/packages/safe-bash/dist/commands/archive/unzip/arguments.d.ts +32 -0
  8. package/packages/safe-bash/dist/commands/archive/unzip/arguments.d.ts.map +1 -0
  9. package/packages/safe-bash/dist/commands/archive/unzip/arguments.js +214 -0
  10. package/packages/safe-bash/dist/commands/archive/unzip/arguments.js.map +1 -0
  11. package/packages/safe-bash/dist/commands/archive/unzip/safety.d.ts +28 -0
  12. package/packages/safe-bash/dist/commands/archive/unzip/safety.d.ts.map +1 -0
  13. package/packages/safe-bash/dist/commands/archive/unzip/safety.js +288 -0
  14. package/packages/safe-bash/dist/commands/archive/unzip/safety.js.map +1 -0
  15. package/packages/safe-bash/dist/commands/archive/unzip.d.ts +4 -0
  16. package/packages/safe-bash/dist/commands/archive/unzip.d.ts.map +1 -0
  17. package/packages/safe-bash/dist/commands/archive/unzip.js +264 -0
  18. package/packages/safe-bash/dist/commands/archive/unzip.js.map +1 -0
  19. package/packages/safe-bash/dist/commands/archive/zip/safety.d.ts +28 -0
  20. package/packages/safe-bash/dist/commands/archive/zip/safety.d.ts.map +1 -0
  21. package/packages/safe-bash/dist/commands/archive/zip/safety.js +228 -0
  22. package/packages/safe-bash/dist/commands/archive/zip/safety.js.map +1 -0
  23. package/packages/safe-bash/dist/commands/archive/zip-format.d.ts +39 -0
  24. package/packages/safe-bash/dist/commands/archive/zip-format.d.ts.map +1 -0
  25. package/packages/safe-bash/dist/commands/archive/zip-format.js +509 -0
  26. package/packages/safe-bash/dist/commands/archive/zip-format.js.map +1 -0
  27. package/packages/safe-bash/dist/commands/archive/zip.d.ts +4 -0
  28. package/packages/safe-bash/dist/commands/archive/zip.d.ts.map +1 -0
  29. package/packages/safe-bash/dist/commands/archive/zip.js +290 -0
  30. package/packages/safe-bash/dist/commands/archive/zip.js.map +1 -0
  31. package/packages/safe-bash/dist/commands/bytes/compression/codec.d.ts +1 -1
  32. package/packages/safe-bash/dist/commands/bytes/compression/codec.d.ts.map +1 -1
  33. package/packages/safe-bash/dist/commands/bytes/compression/codec.js +2 -2
  34. package/packages/safe-bash/dist/commands/bytes/compression/codec.js.map +1 -1
  35. package/packages/safe-bash/dist/core.browser.js +1937 -389
  36. package/packages/safe-bash/dist/core.browser.js.map +4 -4
  37. package/packages/safe-bash/dist/shell/runtime.d.ts +1 -0
  38. package/packages/safe-bash/dist/shell/runtime.d.ts.map +1 -1
  39. package/packages/safe-bash/dist/shell/runtime.js +4 -1
  40. package/packages/safe-bash/dist/shell/runtime.js.map +1 -1
  41. package/packages/safe-fs/dist/core.d.ts +2 -1
  42. package/packages/safe-fs/dist/fs/scoped.d.ts +12 -2
  43. package/packages/safe-fs/dist/index.d.ts +2 -1
  44. package/packages/safe-js/dist/browser/chunks/{chunk-GQOAEEHU.js → chunk-3EJ7BQOJ.js} +89 -5
  45. package/packages/safe-js/dist/browser/chunks/{chunk-GQOAEEHU.js.map → chunk-3EJ7BQOJ.js.map} +3 -3
  46. package/packages/safe-js/dist/browser/safe-fs-core.js +3 -1
  47. package/packages/safe-js/dist/browser/safe-fs.js +3 -1
  48. package/packages/safe-js/dist/chunks/{chunk-DIISVPWF.js → chunk-742TUUOL.js} +89 -5
  49. package/packages/safe-js/dist/chunks/{chunk-DIISVPWF.js.map → chunk-742TUUOL.js.map} +3 -3
  50. package/packages/safe-js/dist/chunks/{chunk-L6LDJNBY.js → chunk-NMX3FJ3X.js} +3 -3
  51. package/packages/safe-js/dist/chunks/{chunk-CAWKMCKD.js → chunk-UVHJFEFO.js} +2 -2
  52. package/packages/safe-js/dist/cli.js +3 -3
  53. package/packages/safe-js/dist/index.js +3 -3
  54. package/packages/safe-js/dist/safe-fs-core.js +3 -1
  55. package/packages/safe-js/dist/safe-fs-core.js.map +1 -1
  56. package/packages/safe-js/dist/safe-fs-node.js +4 -2
  57. package/packages/safe-js/dist/safe-fs.js +4 -2
  58. /package/packages/safe-js/dist/chunks/{chunk-L6LDJNBY.js.map → chunk-NMX3FJ3X.js.map} +0 -0
  59. /package/packages/safe-js/dist/chunks/{chunk-CAWKMCKD.js.map → chunk-UVHJFEFO.js.map} +0 -0
@@ -0,0 +1,288 @@
1
+ import { dirname, isPathWithin, readBytes, resolvePath } from "../../../contracts/index.js";
2
+ import { retainFileSystemCleanup } from "poe-code/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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.js","sourceRoot":"","sources":["../../../../src/commands/archive/unzip/safety.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type CommandDefinition } from "../../contracts/index.js";
2
+ import { type ArchiveCommandsOptions } from "./internal.js";
3
+ export declare function createUnzipCommand(options?: ArchiveCommandsOptions): CommandDefinition;
4
+ //# sourceMappingURL=unzip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unzip.d.ts","sourceRoot":"","sources":["../../../src/commands/archive/unzip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyE,KAAK,iBAAiB,EAAiB,MAAM,0BAA0B,CAAC;AAGxJ,OAAO,EAAsE,KAAK,sBAAsB,EAAE,MAAM,eAAe,CAAC;AA8ChI,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CAmK1F"}
@@ -0,0 +1,264 @@
1
+ import { collectBytes, readBytes, resolvePath, writeBytes } from "../../contracts/index.js";
2
+ import { writeFileOutput } from "../../contracts/filesystem-output.js";
3
+ import { publicDiagnosticMessage } from "../../diagnostics.js";
4
+ import { Budget, bounded, checkPath, display, fail, settings, text, vfsPath } from "./internal.js";
5
+ import { decodeZipEntry, readZipArchive } from "./zip-format.js";
6
+ import { Answers, parseArguments, Selection } from "./unzip/arguments.js";
7
+ import { Extraction } from "./unzip/safety.js";
8
+ function filtered(name) {
9
+ let output = "";
10
+ for (const character of name) {
11
+ const code = character.charCodeAt(0);
12
+ output += code < 32 ? `^${String.fromCharCode(code + 64)}` : character;
13
+ }
14
+ return output;
15
+ }
16
+ function padded(name) {
17
+ return name + " ".repeat(Math.max(0, 22 - Buffer.byteLength(name)));
18
+ }
19
+ function date(entry) {
20
+ const modified = entry.modified;
21
+ const pad = (value) => String(value).padStart(2, "0");
22
+ return `${modified.getFullYear()}-${pad(modified.getMonth() + 1)}-${pad(modified.getDate())} ${pad(modified.getHours())}:${pad(modified.getMinutes())}`;
23
+ }
24
+ async function comment(bytes, budget) {
25
+ if (!bytes.length)
26
+ return;
27
+ const output = [];
28
+ let length = 0;
29
+ for (const byte of bytes) {
30
+ if (!byte)
31
+ break;
32
+ if (byte !== 13 && byte !== 19)
33
+ length += byte === 27 ? 2 : 1;
34
+ if (length > budget.limits.maxTextBytes - budget.textBytes)
35
+ fail("text output limit exceeded");
36
+ }
37
+ for (const byte of bytes) {
38
+ if (!byte)
39
+ break;
40
+ if (byte === 13 || byte === 19)
41
+ continue;
42
+ if (byte === 27)
43
+ output.push(94, 91);
44
+ else
45
+ output.push(byte);
46
+ }
47
+ if (output.length && output.at(-1) !== 10)
48
+ output.push(10);
49
+ const value = Uint8Array.from(output);
50
+ if (value.length > budget.limits.maxTextBytes - budget.textBytes)
51
+ fail("text output limit exceeded");
52
+ budget.textBytes += value.length;
53
+ await writeBytes(budget.context.stdout, value, budget.context.signal);
54
+ }
55
+ export function createUnzipCommand(options = {}) {
56
+ const limits = settings(options);
57
+ return { name: "unzip", description: "List and safely extract ZIP archives in the virtual filesystem", async execute(original) {
58
+ original.signal.throwIfAborted();
59
+ const controller = new AbortController();
60
+ const context = { ...original, signal: AbortSignal.any([original.signal, controller.signal]) };
61
+ const extraction = new Extraction(context, limits);
62
+ let answers;
63
+ let closing;
64
+ const close = () => closing ??= (async () => {
65
+ controller.abort(new Error("unzip command closed"));
66
+ await extraction.close();
67
+ await answers?.close().catch(() => { });
68
+ })();
69
+ original.registerCleanup?.(close);
70
+ const budget = new Budget(context, limits);
71
+ try {
72
+ const parsed = parseArguments(context, limits);
73
+ const selection = new Selection(parsed.patterns, limits, context.signal);
74
+ let archive = parsed.archive;
75
+ let archiveStat;
76
+ for (const candidate of [archive, `${archive}.zip`, `${archive}.ZIP`]) {
77
+ checkPath(candidate, limits);
78
+ const candidateStat = await extraction.stat(vfsPath(context.cwd, candidate));
79
+ if (candidateStat) {
80
+ archive = candidate;
81
+ archiveStat = candidateStat;
82
+ break;
83
+ }
84
+ }
85
+ if (!archiveStat) {
86
+ await budget.output(`unzip: cannot find or open ${archive}, ${archive}.zip or ${archive}.ZIP.\n`, true);
87
+ return { exitCode: 9 };
88
+ }
89
+ const archivePath = await extraction.operation(() => context.fs.realpath(vfsPath(context.cwd, archive), { signal: context.signal }));
90
+ archiveStat = await extraction.operation(() => context.fs.stat(archivePath, { signal: context.signal }));
91
+ if (archiveStat.type !== "file")
92
+ fail("input archive is not a regular file");
93
+ const bytes = await collectBytes(bounded(extraction.input(archivePath), limits.maxArchiveBytes, context.signal, limits.chunkSize), { signal: context.signal, maxBytes: limits.maxArchiveBytes });
94
+ await budget.output(`Archive: ${filtered(archive)}\n`);
95
+ const zip = await readZipArchive(bytes, limits, context.signal);
96
+ await comment(zip.comment, budget);
97
+ if (!zip.entries.length) {
98
+ await budget.output(`warning [${filtered(archive)}]: zipfile is empty\n`, true);
99
+ return { exitCode: 1 };
100
+ }
101
+ if (parsed.list)
102
+ await budget.output(" Length Date Time Name\n--------- ---------- ----- ----\n");
103
+ const rootRaw = parsed.destination === undefined ? context.cwd : vfsPath(context.cwd, parsed.destination);
104
+ const root = parsed.list ? resolvePath(rootRaw) : await extraction.directory(rootRaw, true);
105
+ answers = new Answers(extraction.source(context.stdin), limits, context.signal);
106
+ let overwrite = parsed.overwrite ? "all" : "ask";
107
+ let exitCode = 0;
108
+ let selected = 0;
109
+ let total = 0;
110
+ let actualTotal = 0;
111
+ const links = [];
112
+ const directories = [];
113
+ for (const entry of zip.entries) {
114
+ await budget.member(entry.size);
115
+ checkPath(entry.name, limits);
116
+ if (!await selection.matches(entry.name))
117
+ continue;
118
+ selected++;
119
+ total += entry.size;
120
+ if (parsed.list) {
121
+ await budget.output(`${String(entry.size).padStart(9)} ${date(entry)} ${filtered(entry.name)}\n`);
122
+ if (entry.comment)
123
+ await comment(entry.comment, budget);
124
+ continue;
125
+ }
126
+ let path = extraction.member(root, entry.name);
127
+ const fileType = entry.mode & 0o170000;
128
+ if (fileType && fileType !== 0o100000 && fileType !== 0o040000 && fileType !== 0o120000)
129
+ fail("unsupported special ZIP entry");
130
+ if (path === root && !entry.directory)
131
+ fail("entry would replace extraction root");
132
+ let shown = parsed.destination === undefined ? entry.name : `${parsed.destination.endsWith("/") ? parsed.destination : `${parsed.destination}/`}${entry.name}`;
133
+ await extraction.parents(root, path, true);
134
+ if (entry.directory) {
135
+ if (entry.size)
136
+ fail("directory has nonempty payload");
137
+ for await (const chunk of readBytes(decodeZipEntry(entry, limits, context.signal), context.signal)) {
138
+ await writeFileOutput(context, chunk, async () => { if (chunk.length)
139
+ fail("directory has nonempty payload"); });
140
+ }
141
+ const existing = await extraction.stat(path);
142
+ if (existing && existing.type !== "directory")
143
+ fail("directory destination is not a directory");
144
+ if (!existing) {
145
+ await extraction.operation(() => context.fs.mkdir(path, { signal: context.signal, mode: 0o755 }));
146
+ await budget.output(` creating: ${filtered(shown)}\n`);
147
+ }
148
+ const identity = await extraction.stat(path);
149
+ if (!identity || identity.type !== "directory")
150
+ fail("directory changed during creation");
151
+ directories.push({ path, entry, identity });
152
+ continue;
153
+ }
154
+ let existing = await extraction.destination(path, archivePath, archiveStat);
155
+ let skip = false;
156
+ let prompting = 0;
157
+ while (existing && overwrite !== "all") {
158
+ if (overwrite === "none") {
159
+ skip = true;
160
+ break;
161
+ }
162
+ if (++prompting > limits.maxMembers)
163
+ fail("overwrite prompt work limit exceeded");
164
+ await budget.output(`replace ${filtered(shown)}? [y]es, [n]o, [A]ll, [N]one, [r]ename: `, true);
165
+ const answer = await answers.read();
166
+ if (answer === undefined) {
167
+ await budget.output(' NULL\n(EOF or read error, treating as "[N]one" ...)\n', true);
168
+ overwrite = "none";
169
+ exitCode = 1;
170
+ skip = true;
171
+ break;
172
+ }
173
+ const choice = answer[0];
174
+ if (choice === "A") {
175
+ overwrite = "all";
176
+ break;
177
+ }
178
+ if (choice === "y" || choice === "Y")
179
+ break;
180
+ if (choice === "n" || choice === "N") {
181
+ if (choice === "N")
182
+ overwrite = "none";
183
+ skip = true;
184
+ break;
185
+ }
186
+ if (choice === "r" || choice === "R") {
187
+ let renamed = "";
188
+ while (!renamed) {
189
+ await budget.output("new name: ", true);
190
+ const value = await answers.read(limits.maxPathBytes);
191
+ if (value === undefined)
192
+ fail("EOF while reading replacement name");
193
+ renamed = value.endsWith("\n") ? value.slice(0, -1) : value;
194
+ }
195
+ path = extraction.member(root, renamed);
196
+ shown = parsed.destination === undefined ? renamed : `${parsed.destination.endsWith("/") ? parsed.destination : `${parsed.destination}/`}${renamed}`;
197
+ await extraction.parents(root, path, true);
198
+ existing = await extraction.destination(path, archivePath, archiveStat);
199
+ continue;
200
+ }
201
+ const response = choice === "\n" || choice === "\r" ? "{ENTER}" : answer.endsWith("\n") ? answer.slice(0, -1) : answer;
202
+ await budget.output(`error: invalid response [${response}]\n`, true);
203
+ }
204
+ if (skip)
205
+ continue;
206
+ const chunks = [];
207
+ let actual = 0;
208
+ for await (const chunk of readBytes(decodeZipEntry(entry, limits, context.signal), context.signal)) {
209
+ if (chunk.length > limits.maxEntryBytes - actual || chunk.length > limits.maxTotalBytes - actualTotal)
210
+ fail("actual decompressed byte limit exceeded");
211
+ actual += chunk.length;
212
+ actualTotal += chunk.length;
213
+ await writeFileOutput(context, chunk, async (bytes) => { chunks.push(Uint8Array.from(bytes)); });
214
+ }
215
+ if (entry.symlink) {
216
+ if (actual > limits.maxPathBytes)
217
+ fail("symlink target byte limit exceeded");
218
+ const target = text(Buffer.concat(chunks));
219
+ await extraction.target(root, path, target);
220
+ if (!context.fs.symlink || context.fs.capabilities.symlinks === false)
221
+ fail("filesystem does not support symlinks");
222
+ links.push({ path, shown, target, existing, entry });
223
+ await budget.output(` linking: ${padded(filtered(shown))} -> ${filtered(target)} \n`);
224
+ }
225
+ else {
226
+ await extraction.publish(root, path, chunks, existing, entry.mode, entry.modified);
227
+ await budget.output(`${entry.method === 0 ? " extracting" : " inflating"}: ${padded(filtered(shown))} \n`);
228
+ }
229
+ }
230
+ if (parsed.list)
231
+ await budget.output(`--------- -------\n${String(total).padStart(9)} ${selected} file${selected === 1 ? "" : "s"}\n`);
232
+ else {
233
+ if (links.length)
234
+ await budget.output("finishing deferred symbolic links:\n");
235
+ for (const link of links) {
236
+ await extraction.parents(root, link.path, false);
237
+ await extraction.target(root, link.path, link.target);
238
+ await extraction.destination(link.path, archivePath, archiveStat);
239
+ await extraction.publish(root, link.path, [], link.existing, link.entry.mode, link.entry.modified, link.target);
240
+ await budget.output(` ${padded(filtered(link.shown))} -> ${filtered(link.target)}\n`);
241
+ }
242
+ for (const { path, entry, identity } of directories.reverse()) {
243
+ await extraction.metadata(root, path, identity, entry.mode, entry.modified);
244
+ }
245
+ for (let index = 0; index < parsed.patterns.length; index++)
246
+ if (!selection.matched.has(index)) {
247
+ await budget.output(`caution: filename not matched: ${filtered(parsed.patterns[index])}\n`, true);
248
+ exitCode = 11;
249
+ }
250
+ }
251
+ return { exitCode: selected ? exitCode : 11 };
252
+ }
253
+ catch (error) {
254
+ original.signal.throwIfAborted();
255
+ const message = display(publicDiagnosticMessage(error, original.onInternalError).slice(0, limits.maxDiagnosticBytes));
256
+ await writeBytes(original.stderr, Buffer.from(`unzip: ${message}\n`).subarray(0, limits.maxDiagnosticBytes), original.signal);
257
+ return { exitCode: 2 };
258
+ }
259
+ finally {
260
+ await close();
261
+ }
262
+ } };
263
+ }
264
+ //# sourceMappingURL=unzip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unzip.js","sourceRoot":"","sources":["../../../src/commands/archive/unzip.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 ZipScope {
4
+ private readonly original;
5
+ readonly limits: ArchiveLimits;
6
+ readonly context: CommandContext;
7
+ private readonly controller;
8
+ private readonly pending;
9
+ private readonly readers;
10
+ private readonly closedReason;
11
+ private drain;
12
+ private work;
13
+ constructor(original: CommandContext, limits: ArchiveLimits);
14
+ readonly close: () => Promise<void>;
15
+ operation<Value>(action: () => Value | PromiseLike<Value>): Promise<Value>;
16
+ stat(path: string): Promise<FileStat | undefined>;
17
+ private source;
18
+ input(path: string): ByteSource;
19
+ }
20
+ export interface ZipPublication {
21
+ readonly output: string;
22
+ readonly parent: string;
23
+ readonly parentName: string;
24
+ readonly existing: FileStat | undefined;
25
+ readonly bytes: Uint8Array;
26
+ }
27
+ export declare function publishZip(scope: ZipScope, prepared: ZipPublication): Promise<void>;
28
+ //# sourceMappingURL=safety.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../../../src/commands/archive/zip/safety.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAE7G,OAAO,EAA8C,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEhG,qBAAa,QAAQ;IAQP,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAAkB,QAAQ,CAAC,MAAM,EAAE,aAAa;IAPrF,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsC;IACnE,OAAO,CAAC,KAAK,CAA4B;IACzC,OAAO,CAAC,IAAI,CAAK;gBACY,QAAQ,EAAE,cAAc,EAAW,MAAM,EAAE,aAAa;IAIrF,QAAQ,CAAC,KAAK,QAAO,OAAO,CAAC,IAAI,CAAC,CAYhC;IACI,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC;IAW1E,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAQvD,OAAO,CAAC,MAAM;IAiBP,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;CAcvC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FzF"}