@oh-my-pi/pi-utils 17.4.0 → 17.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +22 -0
  3. package/THIRD-PARTY-NOTICES.txt +22909 -0
  4. package/dist/types/ar/arj.d.ts +5 -0
  5. package/dist/types/ar/asar.d.ts +7 -0
  6. package/dist/types/ar/bytes.d.ts +20 -0
  7. package/dist/types/ar/cab.d.ts +5 -0
  8. package/dist/types/ar/checksums.d.ts +10 -0
  9. package/dist/types/ar/codecs/bzip2.d.ts +4 -0
  10. package/dist/types/ar/codecs/gzip.d.ts +6 -0
  11. package/dist/types/ar/codecs/lzma.d.ts +6 -0
  12. package/dist/types/ar/codecs/lzw.d.ts +4 -0
  13. package/dist/types/ar/codecs/lzx.d.ts +7 -0
  14. package/dist/types/ar/codecs/xz.d.ts +4 -0
  15. package/dist/types/ar/codecs/zstd.d.ts +6 -0
  16. package/dist/types/ar/cpio.d.ts +7 -0
  17. package/dist/types/ar/deb.d.ts +5 -0
  18. package/dist/types/ar/entries.d.ts +22 -0
  19. package/dist/types/ar/error.d.ts +8 -0
  20. package/dist/types/ar/index.d.ts +11 -0
  21. package/dist/types/ar/iso.d.ts +5 -0
  22. package/dist/types/ar/limits.d.ts +33 -0
  23. package/dist/types/ar/lzh.d.ts +7 -0
  24. package/dist/types/ar/open.d.ts +45 -0
  25. package/dist/types/ar/paths.d.ts +18 -0
  26. package/dist/types/ar/rar/rar4-decoder.d.ts +6 -0
  27. package/dist/types/ar/rar/rar5-decoder.d.ts +6 -0
  28. package/dist/types/ar/rar.d.ts +5 -0
  29. package/dist/types/ar/reader.d.ts +28 -0
  30. package/dist/types/ar/registry.d.ts +17 -0
  31. package/dist/types/ar/rpm.d.ts +5 -0
  32. package/dist/types/ar/sevenzip/decode.d.ts +33 -0
  33. package/dist/types/ar/sevenzip.d.ts +5 -0
  34. package/dist/types/ar/source.d.ts +54 -0
  35. package/dist/types/ar/tar.d.ts +9 -0
  36. package/dist/types/ar/types.d.ts +99 -0
  37. package/dist/types/ar/unix-ar.d.ts +7 -0
  38. package/dist/types/ar/write.d.ts +10 -0
  39. package/dist/types/ar/zip.d.ts +10 -0
  40. package/dist/types/postmortem.d.ts +33 -0
  41. package/package.json +9 -3
  42. package/src/ar/arj.ts +314 -0
  43. package/src/ar/asar.ts +480 -0
  44. package/src/ar/bytes.ts +78 -0
  45. package/src/ar/cab.ts +377 -0
  46. package/src/ar/checksums.ts +62 -0
  47. package/src/ar/codecs/bzip2.ts +489 -0
  48. package/src/ar/codecs/gzip.ts +25 -0
  49. package/src/ar/codecs/lzma.ts +437 -0
  50. package/src/ar/codecs/lzw.ts +191 -0
  51. package/src/ar/codecs/lzx.ts +366 -0
  52. package/src/ar/codecs/xz.ts +522 -0
  53. package/src/ar/codecs/zstd.ts +25 -0
  54. package/src/ar/cpio.ts +389 -0
  55. package/src/ar/deb.ts +160 -0
  56. package/src/ar/entries.ts +97 -0
  57. package/src/ar/error.ts +11 -0
  58. package/src/ar/index.ts +16 -0
  59. package/src/ar/iso.ts +712 -0
  60. package/src/ar/limits.ts +80 -0
  61. package/src/ar/lzh.ts +659 -0
  62. package/src/ar/open.ts +225 -0
  63. package/src/ar/paths.ts +70 -0
  64. package/src/ar/rar/rar4-decoder.ts +459 -0
  65. package/src/ar/rar/rar5-decoder.ts +400 -0
  66. package/src/ar/rar.ts +735 -0
  67. package/src/ar/reader.ts +162 -0
  68. package/src/ar/registry.ts +208 -0
  69. package/src/ar/rpm.ts +320 -0
  70. package/src/ar/sevenzip/decode.ts +239 -0
  71. package/src/ar/sevenzip.ts +634 -0
  72. package/src/ar/source.ts +190 -0
  73. package/src/ar/tar.ts +771 -0
  74. package/src/ar/types.ts +131 -0
  75. package/src/ar/unix-ar.ts +312 -0
  76. package/src/ar/write.ts +55 -0
  77. package/src/ar/zip.ts +719 -0
  78. package/src/browsers.ts +2 -149
  79. package/src/docx/converter.ts +9 -9
  80. package/src/postmortem.ts +74 -0
  81. package/dist/types/docx/zip.d.ts +0 -6
  82. package/src/docx/zip.ts +0 -87
@@ -0,0 +1,80 @@
1
+ import { formatBytes } from "../format";
2
+ import { ArchiveError } from "./error";
3
+ import { formatArchivePathForError } from "./paths";
4
+
5
+ /**
6
+ * Resource ceilings enforced before archive metadata can drive expensive
7
+ * work. All sizes are attacker-controlled inputs until proven otherwise, so
8
+ * every allocation-driving field is checked against these before use.
9
+ * Mirrors `Limits` in the Rust `omp-ar` crate.
10
+ */
11
+ export interface ArchiveLimits {
12
+ /** Max indexed entries per archive. */
13
+ maxEntries: number;
14
+ /** Max bytes for any archive fully materialized in memory (tar buffers, solid/decompressed streams). */
15
+ maxInMemorySize: number;
16
+ /** Max bytes for archive metadata (ZIP central directory, ASAR JSON header, RAR/7z header areas). */
17
+ maxIndexSize: number;
18
+ /** Max declared bytes for a single extracted member. */
19
+ maxMemberSize: number;
20
+ /** Max byte length of a member path or link target. */
21
+ maxPathBytes: number;
22
+ /** Max symlink rewrites while resolving one path. */
23
+ maxLinkDepth: number;
24
+ }
25
+
26
+ export const DEFAULT_ARCHIVE_LIMITS: ArchiveLimits = {
27
+ maxEntries: 1_000_000,
28
+ maxInMemorySize: 256 * 1024 * 1024,
29
+ maxIndexSize: 64 * 1024 * 1024,
30
+ maxMemberSize: 64 * 1024 * 1024,
31
+ maxPathBytes: 4096,
32
+ maxLinkDepth: 40,
33
+ };
34
+
35
+ /** Reject an archive that would be fully materialized beyond `maxInMemorySize`. */
36
+ export function assertInMemorySize(size: number, limits: ArchiveLimits): void {
37
+ if (!Number.isSafeInteger(size) || size < 0) {
38
+ throw new ArchiveError("Archive is too large to read safely");
39
+ }
40
+ if (size > limits.maxInMemorySize) {
41
+ throw new ArchiveError(
42
+ `Archive is too large to read in memory (${formatBytes(size)} > ${formatBytes(limits.maxInMemorySize)} limit)`,
43
+ );
44
+ }
45
+ }
46
+
47
+ /** Reject archive metadata (index/header) beyond `maxIndexSize`. */
48
+ export function assertIndexSize(size: number, limits: ArchiveLimits, what: string): void {
49
+ if (!Number.isSafeInteger(size) || size < 0) {
50
+ throw new ArchiveError(`Invalid archive: ${what} has an invalid size`);
51
+ }
52
+ if (size > limits.maxIndexSize) {
53
+ throw new ArchiveError(
54
+ `Archive ${what} is too large (${formatBytes(size)} > ${formatBytes(limits.maxIndexSize)} limit)`,
55
+ );
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Reject a member whose declared (uncompressed) size exceeds `maxMemberSize`.
61
+ * The declared size is metadata — a crafted entry can claim multi-GB sizes
62
+ * that would be allocated up front before any data decompresses.
63
+ */
64
+ export function assertArchiveMemberSize(size: number, memberPath: string, limits: ArchiveLimits): void {
65
+ if (!Number.isSafeInteger(size) || size < 0) {
66
+ throw new ArchiveError(`Archive member '${formatArchivePathForError(memberPath)}' has an invalid size`);
67
+ }
68
+ if (size > limits.maxMemberSize) {
69
+ throw new ArchiveError(
70
+ `Archive member '${formatArchivePathForError(memberPath)}' is too large to extract in memory (${formatBytes(size)} > ${formatBytes(limits.maxMemberSize)} limit)`,
71
+ );
72
+ }
73
+ }
74
+
75
+ /** Reject an index that grew beyond `maxEntries` while parsing. */
76
+ export function assertEntryCount(count: number, limits: ArchiveLimits): void {
77
+ if (count > limits.maxEntries) {
78
+ throw new ArchiveError(`Archive has too many entries (> ${limits.maxEntries} limit)`);
79
+ }
80
+ }