@push.rocks/smartlinuxrepo 0.0.0-stage → 0.1.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.
Files changed (131) hide show
  1. package/.smartconfig.json +64 -0
  2. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  3. package/dist_ts/00_commitinfo_data.js +9 -0
  4. package/dist_ts/alpine/apkindex.d.ts +39 -0
  5. package/dist_ts/alpine/apkindex.js +211 -0
  6. package/dist_ts/alpine/pkginfo.d.ts +45 -0
  7. package/dist_ts/alpine/pkginfo.js +159 -0
  8. package/dist_ts/alpine/reader.d.ts +20 -0
  9. package/dist_ts/alpine/reader.js +89 -0
  10. package/dist_ts/arch/builder.d.ts +41 -0
  11. package/dist_ts/arch/builder.js +234 -0
  12. package/dist_ts/arch/reader.d.ts +16 -0
  13. package/dist_ts/arch/reader.js +271 -0
  14. package/dist_ts/arch/signer.d.ts +21 -0
  15. package/dist_ts/arch/signer.js +66 -0
  16. package/dist_ts/arch/vercmp.d.ts +12 -0
  17. package/dist_ts/arch/vercmp.js +170 -0
  18. package/dist_ts/debian/control.d.ts +22 -0
  19. package/dist_ts/debian/control.js +137 -0
  20. package/dist_ts/debian/gostring.d.ts +26 -0
  21. package/dist_ts/debian/gostring.js +145 -0
  22. package/dist_ts/debian/indexbuilder.d.ts +47 -0
  23. package/dist_ts/debian/indexbuilder.js +299 -0
  24. package/dist_ts/debian/mailaddress.d.ts +12 -0
  25. package/dist_ts/debian/mailaddress.js +736 -0
  26. package/dist_ts/debian/reader.d.ts +30 -0
  27. package/dist_ts/debian/reader.js +110 -0
  28. package/dist_ts/index.d.ts +23 -0
  29. package/dist_ts/index.js +18 -0
  30. package/dist_ts/plugins.d.ts +8 -0
  31. package/dist_ts/plugins.js +11 -0
  32. package/dist_ts/readers/ar.d.ts +31 -0
  33. package/dist_ts/readers/ar.js +87 -0
  34. package/dist_ts/readers/bytes.d.ts +58 -0
  35. package/dist_ts/readers/bytes.js +147 -0
  36. package/dist_ts/readers/bytesource.d.ts +40 -0
  37. package/dist_ts/readers/bytesource.js +154 -0
  38. package/dist_ts/readers/decompress.d.ts +43 -0
  39. package/dist_ts/readers/decompress.js +269 -0
  40. package/dist_ts/readers/gzipmember.d.ts +32 -0
  41. package/dist_ts/readers/gzipmember.js +176 -0
  42. package/dist_ts/readers/tar.d.ts +85 -0
  43. package/dist_ts/readers/tar.js +731 -0
  44. package/dist_ts/readers/text.d.ts +16 -0
  45. package/dist_ts/readers/text.js +96 -0
  46. package/dist_ts/rpm/builder.d.ts +28 -0
  47. package/dist_ts/rpm/builder.js +208 -0
  48. package/dist_ts/rpm/header.d.ts +138 -0
  49. package/dist_ts/rpm/header.js +546 -0
  50. package/dist_ts/rpm/reader.d.ts +20 -0
  51. package/dist_ts/rpm/reader.js +306 -0
  52. package/dist_ts/rpm/repoconfig.d.ts +15 -0
  53. package/dist_ts/rpm/repoconfig.js +38 -0
  54. package/dist_ts/rpm/repodata.d.ts +44 -0
  55. package/dist_ts/rpm/repodata.js +148 -0
  56. package/dist_ts/rpm/sign.d.ts +30 -0
  57. package/dist_ts/rpm/sign.js +183 -0
  58. package/dist_ts/rpm/updates.d.ts +38 -0
  59. package/dist_ts/rpm/updates.js +265 -0
  60. package/dist_ts/rpm/xml.d.ts +18 -0
  61. package/dist_ts/rpm/xml.js +90 -0
  62. package/dist_ts/shared/architecture.d.ts +8 -0
  63. package/dist_ts/shared/architecture.js +17 -0
  64. package/dist_ts/shared/errors.d.ts +38 -0
  65. package/dist_ts/shared/errors.js +22 -0
  66. package/dist_ts/shared/gopath.d.ts +13 -0
  67. package/dist_ts/shared/gopath.js +53 -0
  68. package/dist_ts/shared/gostrings.d.ts +14 -0
  69. package/dist_ts/shared/gostrings.js +29 -0
  70. package/dist_ts/shared/limits.d.ts +47 -0
  71. package/dist_ts/shared/limits.js +57 -0
  72. package/dist_ts/shared/types.d.ts +213 -0
  73. package/dist_ts/shared/types.js +13 -0
  74. package/dist_ts/shared/url.d.ts +18 -0
  75. package/dist_ts/shared/url.js +371 -0
  76. package/dist_ts/shared/validation.d.ts +21 -0
  77. package/dist_ts/shared/validation.js +58 -0
  78. package/dist_ts/signing/keys.d.ts +36 -0
  79. package/dist_ts/signing/keys.js +89 -0
  80. package/dist_ts/signing/openpgpframing.d.ts +33 -0
  81. package/dist_ts/signing/openpgpframing.js +93 -0
  82. package/dist_ts/signing/signers.d.ts +63 -0
  83. package/dist_ts/signing/signers.js +248 -0
  84. package/dist_ts/writers/gotar.d.ts +43 -0
  85. package/dist_ts/writers/gotar.js +218 -0
  86. package/license.md +19 -0
  87. package/package.json +56 -3
  88. package/readme.md +176 -0
  89. package/ts/00_commitinfo_data.ts +8 -0
  90. package/ts/alpine/apkindex.ts +241 -0
  91. package/ts/alpine/pkginfo.ts +183 -0
  92. package/ts/alpine/reader.ts +96 -0
  93. package/ts/arch/builder.ts +283 -0
  94. package/ts/arch/reader.ts +307 -0
  95. package/ts/arch/signer.ts +70 -0
  96. package/ts/arch/vercmp.ts +188 -0
  97. package/ts/debian/control.ts +150 -0
  98. package/ts/debian/gostring.ts +150 -0
  99. package/ts/debian/indexbuilder.ts +355 -0
  100. package/ts/debian/mailaddress.ts +754 -0
  101. package/ts/debian/reader.ts +126 -0
  102. package/ts/index.ts +46 -0
  103. package/ts/plugins.ts +13 -0
  104. package/ts/readers/ar.ts +102 -0
  105. package/ts/readers/bytes.ts +182 -0
  106. package/ts/readers/bytesource.ts +164 -0
  107. package/ts/readers/decompress.ts +332 -0
  108. package/ts/readers/gzipmember.ts +209 -0
  109. package/ts/readers/tar.ts +835 -0
  110. package/ts/readers/text.ts +91 -0
  111. package/ts/rpm/builder.ts +253 -0
  112. package/ts/rpm/header.ts +628 -0
  113. package/ts/rpm/reader.ts +317 -0
  114. package/ts/rpm/repoconfig.ts +45 -0
  115. package/ts/rpm/repodata.ts +219 -0
  116. package/ts/rpm/sign.ts +200 -0
  117. package/ts/rpm/updates.ts +314 -0
  118. package/ts/rpm/xml.ts +101 -0
  119. package/ts/shared/architecture.ts +16 -0
  120. package/ts/shared/errors.ts +78 -0
  121. package/ts/shared/gopath.ts +54 -0
  122. package/ts/shared/gostrings.ts +31 -0
  123. package/ts/shared/limits.ts +93 -0
  124. package/ts/shared/types.ts +251 -0
  125. package/ts/shared/url.ts +387 -0
  126. package/ts/shared/validation.ts +71 -0
  127. package/ts/signing/keys.ts +110 -0
  128. package/ts/signing/openpgpframing.ts +115 -0
  129. package/ts/signing/signers.ts +315 -0
  130. package/ts/writers/gotar.ts +256 -0
  131. package/README.md +0 -3
@@ -0,0 +1,546 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { readExact, readUpTo } from '../readers/bytes.js';
3
+ import { LinuxRepoError, limitExceeded, truncated } from '../shared/errors.js';
4
+ /**
5
+ * RPM lead and header structures, read the way go-rpmutils v0.4.0 (Gitea
6
+ * 28.2.0's pin, `go.mod:85`) reads them (`header.go:75-146`,
7
+ * `rpmutils.go:97-136`), so that a package Gitea accepts is accepted and one
8
+ * Gitea refuses (or panics on) is refused:
9
+ * - an index entry of a fixed-size type covers `offset .. offset + size*count`;
10
+ * any other type is a run of `count` NUL-terminated strings; an entry that
11
+ * does not fit the data is `malformed-header`;
12
+ * - a later entry with the same tag replaces an earlier one;
13
+ * - the main header's SHA-256 (signature tag 273), else SHA-1 (269), is
14
+ * checked as lowercase hex (`digest-mismatch`).
15
+ */
16
+ export const RPM_LEAD_BYTES = 96;
17
+ const LEAD_MAGIC = [0xed, 0xab, 0xee, 0xdb];
18
+ const HEADER_MAGIC = 0x8eade801;
19
+ const HEADER_INTRO_BYTES = 16;
20
+ const INDEX_ENTRY_BYTES = 16;
21
+ /** Header data types. */
22
+ export const RPM_TYPE = {
23
+ null: 0,
24
+ char: 1,
25
+ int8: 2,
26
+ int16: 3,
27
+ int32: 4,
28
+ int64: 5,
29
+ string: 6,
30
+ bin: 7,
31
+ stringArray: 8,
32
+ i18nString: 9,
33
+ };
34
+ /** Element sizes of the fixed-size types (go-rpmutils `typeSizes`); every other type is string-like. */
35
+ const TYPE_SIZES = new Map([
36
+ [RPM_TYPE.null, 0],
37
+ [RPM_TYPE.char, 1],
38
+ [RPM_TYPE.int8, 1],
39
+ [RPM_TYPE.int16, 2],
40
+ [RPM_TYPE.int32, 4],
41
+ [RPM_TYPE.int64, 8],
42
+ [RPM_TYPE.bin, 1],
43
+ ]);
44
+ /** Data alignment go-rpmutils applies when it writes a header (`typeAlign`). */
45
+ const TYPE_ALIGNMENT = new Map([
46
+ [RPM_TYPE.int16, 2],
47
+ [RPM_TYPE.int32, 4],
48
+ [RPM_TYPE.int64, 8],
49
+ ]);
50
+ /** Signature header tags. */
51
+ export const RPM_SIGNATURE_TAG = {
52
+ headerSignatures: 62,
53
+ dsa: 267,
54
+ rsa: 268,
55
+ sha1: 269,
56
+ longArchiveSize: 271,
57
+ sha256: 273,
58
+ size: 1000,
59
+ pgp: 1002,
60
+ md5: 1004,
61
+ gpg: 1005,
62
+ payloadSize: 1007,
63
+ reservedSpace: 1008,
64
+ };
65
+ /** Region tags below this value are dropped when a header is rewritten. */
66
+ const RPM_TAG_HEADER_REGIONS = 64;
67
+ /**
68
+ * A parsed header: its exact bytes, as read, and its index entries. The index
69
+ * stays in the header bytes; only the end of each entry's contents is kept
70
+ * beside it (4 bytes per entry), and finding the end of a string entry may
71
+ * build a NUL directory of about 3% of the data (`NulIndex`), so a header
72
+ * costs little more than its own bytes: reading a 64 MiB header peaks at
73
+ * about 1.33x its bytes with 4.19M entries and 1.12x with data of all NULs
74
+ * (Node 24.20.0). `IRpmHeaderEntry` objects are made only for the entries
75
+ * asked for.
76
+ */
77
+ export class RpmHeader {
78
+ /** The header bytes as read: intro, index and data (with the padding of a signature header). */
79
+ bytes;
80
+ data;
81
+ /** Number of index entries. */
82
+ entryCount;
83
+ view;
84
+ ends;
85
+ lookup = new Map();
86
+ maxEntries;
87
+ constructor(bytesArg, endsArg, dataStartArg, maxEntriesArg) {
88
+ this.bytes = bytesArg;
89
+ this.data = bytesArg.subarray(dataStartArg);
90
+ this.entryCount = endsArg.length;
91
+ this.view = new DataView(bytesArg.buffer, bytesArg.byteOffset, bytesArg.byteLength);
92
+ this.ends = endsArg;
93
+ this.maxEntries = maxEntriesArg;
94
+ }
95
+ /** The tag of index entry `indexArg`. */
96
+ tagAt(indexArg) {
97
+ return this.view.getInt32(HEADER_INTRO_BYTES + indexArg * INDEX_ENTRY_BYTES);
98
+ }
99
+ /** Index entry `indexArg`. */
100
+ entryAt(indexArg) {
101
+ const at = HEADER_INTRO_BYTES + indexArg * INDEX_ENTRY_BYTES;
102
+ return {
103
+ tag: this.view.getInt32(at),
104
+ type: this.view.getInt32(at + 4),
105
+ count: this.view.getInt32(at + 12),
106
+ start: this.view.getInt32(at + 8),
107
+ end: this.ends[indexArg],
108
+ };
109
+ }
110
+ /** The effective entry for a tag (the last one in the index), or `null`. */
111
+ entry(tagArg) {
112
+ let found = this.lookup.get(tagArg);
113
+ if (found === undefined) {
114
+ found = null;
115
+ for (let i = this.entryCount - 1; i >= 0; i--) {
116
+ if (this.tagAt(i) === tagArg) {
117
+ found = this.entryAt(i);
118
+ break;
119
+ }
120
+ }
121
+ this.lookup.set(tagArg, found);
122
+ }
123
+ return found;
124
+ }
125
+ /** The index positions of every effective entry (the last one per tag), in ascending tag order. */
126
+ effectiveIndexes() {
127
+ const order = new Uint32Array(this.entryCount);
128
+ for (let i = 0; i < order.length; i++) {
129
+ order[i] = i;
130
+ }
131
+ order.sort((a, b) => this.tagAt(a) - this.tagAt(b) || a - b);
132
+ // within one tag the positions ascend: keep the last of each run
133
+ let kept = 0;
134
+ for (let i = 0; i < order.length; i++) {
135
+ if (i + 1 === order.length || this.tagAt(order[i + 1]) !== this.tagAt(order[i])) {
136
+ order[kept++] = order[i];
137
+ }
138
+ }
139
+ return order.subarray(0, kept);
140
+ }
141
+ contents(entryArg) {
142
+ return this.data.subarray(entryArg.start, entryArg.end);
143
+ }
144
+ /**
145
+ * go-rpmutils `GetStrings` on the raw bytes: `null` when the tag is absent
146
+ * or not a string type. A negative count (a Go slice panic) is
147
+ * `malformed-header`; more values than `maxEntries` is `limit-exceeded`.
148
+ */
149
+ strings(tagArg) {
150
+ const entry = this.entry(tagArg);
151
+ if (entry === null ||
152
+ (entry.type !== RPM_TYPE.string && entry.type !== RPM_TYPE.stringArray && entry.type !== RPM_TYPE.i18nString)) {
153
+ return null;
154
+ }
155
+ if (entry.count < 0) {
156
+ throw new LinuxRepoError('malformed-header', `RPM tag ${tagArg} has a negative count`, { field: `tag ${tagArg}` });
157
+ }
158
+ this.assertCount(entry);
159
+ const values = [];
160
+ const contents = this.contents(entry);
161
+ let offset = 0;
162
+ for (let i = 0; i < entry.count; i++) {
163
+ const nul = contents.indexOf(0, offset);
164
+ values.push(contents.subarray(offset, nul));
165
+ offset = nul + 1;
166
+ }
167
+ return values;
168
+ }
169
+ /** go-rpmutils `getInts`: `null` when the tag is absent or not an integer type. */
170
+ integers(tagArg) {
171
+ const entry = this.entry(tagArg);
172
+ if (entry === null) {
173
+ return null;
174
+ }
175
+ let width;
176
+ switch (entry.type) {
177
+ case RPM_TYPE.char:
178
+ case RPM_TYPE.int8:
179
+ width = 1;
180
+ break;
181
+ case RPM_TYPE.int16:
182
+ width = 2;
183
+ break;
184
+ case RPM_TYPE.int32:
185
+ width = 4;
186
+ break;
187
+ case RPM_TYPE.int64:
188
+ width = 8;
189
+ break;
190
+ default:
191
+ return null;
192
+ }
193
+ this.assertCount(entry);
194
+ const contents = this.contents(entry);
195
+ const view = new DataView(contents.buffer, contents.byteOffset, contents.byteLength);
196
+ const values = [];
197
+ for (let offset = 0; offset + width <= contents.length; offset += width) {
198
+ values.push(width === 1
199
+ ? BigInt(view.getUint8(offset))
200
+ : width === 2
201
+ ? BigInt(view.getUint16(offset))
202
+ : width === 4
203
+ ? BigInt(view.getUint32(offset))
204
+ : view.getBigUint64(offset));
205
+ }
206
+ return { width, values };
207
+ }
208
+ /** go-rpmutils `GetUint32s`: `null` when absent, not an integer type, or 64-bit. */
209
+ uint32s(tagArg) {
210
+ const integers = this.integers(tagArg);
211
+ if (integers === null || integers.width === 8) {
212
+ return null;
213
+ }
214
+ return integers.values.map(Number);
215
+ }
216
+ /** go-rpmutils `GetUint64s`: `null` when absent or not an integer type. */
217
+ uint64s(tagArg) {
218
+ return this.integers(tagArg)?.values ?? null;
219
+ }
220
+ /** go-rpmutils `GetBytes`: `null` when absent or not binary. */
221
+ binary(tagArg) {
222
+ const entry = this.entry(tagArg);
223
+ return entry === null || entry.type !== RPM_TYPE.bin ? null : this.contents(entry);
224
+ }
225
+ assertCount(entryArg) {
226
+ if (entryArg.count > this.maxEntries) {
227
+ throw limitExceeded('maxEntries', this.maxEntries, `RPM tag ${entryArg.tag}`);
228
+ }
229
+ }
230
+ }
231
+ /**
232
+ * Reads the lead, the signature header and the main header from `readerArg`
233
+ * and checks the main header digest. The signature header plus the main
234
+ * header count against `maxMetadataBytes`. The reader is left at the payload.
235
+ */
236
+ export async function readRpmHeaders(readerArg, limitsArg) {
237
+ const lead = await readUpTo(readerArg, RPM_LEAD_BYTES);
238
+ const magicLength = Math.min(lead.length, LEAD_MAGIC.length);
239
+ for (let i = 0; i < magicLength; i++) {
240
+ if (lead[i] !== LEAD_MAGIC[i]) {
241
+ throw new LinuxRepoError('unsupported-package-format', 'the input is not an RPM package (bad lead magic)', {
242
+ field: 'lead',
243
+ });
244
+ }
245
+ }
246
+ if (lead.length < RPM_LEAD_BYTES) {
247
+ throw truncated('RPM lead');
248
+ }
249
+ const isSource = ((lead[6] << 8) | lead[7]) === 1;
250
+ const signature = await readHeader(readerArg, limitsArg, 0, true, 'RPM signature header');
251
+ const main = await readHeader(readerArg, limitsArg, signature.bytes.length, false, 'RPM main header');
252
+ checkMainHeaderDigest(signature, main);
253
+ const mainStart = RPM_LEAD_BYTES + signature.bytes.length;
254
+ return { lead, isSource, signature, main, mainStart };
255
+ }
256
+ async function readHeader(readerArg, limitsArg, alreadyReadArg, isSignatureArg, whatArg) {
257
+ const intro = await readExact(readerArg, HEADER_INTRO_BYTES, whatArg);
258
+ const introView = new DataView(intro.buffer, intro.byteOffset, intro.byteLength);
259
+ if (introView.getUint32(0) !== HEADER_MAGIC) {
260
+ throw new LinuxRepoError('malformed-header', `bad magic for the ${whatArg}`, { field: whatArg });
261
+ }
262
+ const indexCount = introView.getUint32(8);
263
+ const dataLength = introView.getUint32(12);
264
+ // go-rpmutils computes both in uint32: a wrapped index size cannot hold
265
+ // `indexCount` entries, and a wrapped padded size reads that many bytes
266
+ if (indexCount * INDEX_ENTRY_BYTES > 0xffffffff) {
267
+ throw new LinuxRepoError('malformed-header', `the ${whatArg} index is too large`, { field: whatArg });
268
+ }
269
+ const readLength = isSignatureArg ? ((dataLength + 7) & 0xfffffff8) >>> 0 : dataLength;
270
+ const total = HEADER_INTRO_BYTES + indexCount * INDEX_ENTRY_BYTES + readLength;
271
+ if (alreadyReadArg + total > limitsArg.maxMetadataBytes) {
272
+ throw limitExceeded('maxMetadataBytes', limitsArg.maxMetadataBytes, 'the RPM signature and main headers');
273
+ }
274
+ // one buffer for the whole header, filled in place
275
+ const bytes = new Uint8Array(total);
276
+ bytes.set(intro, 0);
277
+ for (let filled = HEADER_INTRO_BYTES; filled < total;) {
278
+ const chunk = await readerArg.read(total - filled);
279
+ if (chunk === null) {
280
+ throw truncated(whatArg);
281
+ }
282
+ bytes.set(chunk, filled);
283
+ filled += chunk.length;
284
+ }
285
+ const dataStart = HEADER_INTRO_BYTES + indexCount * INDEX_ENTRY_BYTES;
286
+ return new RpmHeader(bytes, parseIndex(bytes, indexCount, dataStart, whatArg), dataStart, limitsArg.maxEntries);
287
+ }
288
+ /** Checks every index entry against the data and returns the end of each entry's contents. */
289
+ function parseIndex(bytesArg, indexCountArg, dataStartArg, whatArg) {
290
+ const view = new DataView(bytesArg.buffer, bytesArg.byteOffset, bytesArg.byteLength);
291
+ const data = bytesArg.subarray(dataStartArg);
292
+ const nuls = new NulIndex(data);
293
+ // an end lies inside the data, whose length is a uint32
294
+ const ends = new Uint32Array(indexCountArg);
295
+ for (let i = 0; i < indexCountArg; i++) {
296
+ const at = HEADER_INTRO_BYTES + i * INDEX_ENTRY_BYTES;
297
+ const tag = view.getInt32(at);
298
+ const type = view.getInt32(at + 4);
299
+ const offset = view.getInt32(at + 8);
300
+ const count = view.getInt32(at + 12);
301
+ const size = TYPE_SIZES.get(type);
302
+ let end;
303
+ if (size !== undefined) {
304
+ end = offset + size * count;
305
+ }
306
+ else if (count > 0) {
307
+ // the `count` strings must each end in a NUL inside the data
308
+ end = offset < 0 || offset > data.length ? -1 : nuls.endOfStrings(offset, count);
309
+ if (end < 0) {
310
+ throw new LinuxRepoError('malformed-header', `${whatArg} tag ${tag} is truncated`, { field: `tag ${tag}` });
311
+ }
312
+ }
313
+ else {
314
+ end = offset;
315
+ }
316
+ if (offset < 0 || end < offset || end > data.length) {
317
+ throw new LinuxRepoError('malformed-header', `${whatArg} tag ${tag} lies outside the header data`, {
318
+ field: `tag ${tag}`,
319
+ });
320
+ }
321
+ ends[i] = end;
322
+ }
323
+ return ends;
324
+ }
325
+ const NUL_BLOCK_BYTES = 4096;
326
+ const NUL_SUBBLOCK_BYTES = 64;
327
+ const SUBBLOCKS_PER_BLOCK = NUL_BLOCK_BYTES / NUL_SUBBLOCK_BYTES;
328
+ /**
329
+ * A rank directory over the NUL bytes of a header's data, built on first use,
330
+ * so that finding the end of `count` strings costs two binary searches and
331
+ * two scans of at most 64 bytes instead of a scan per entry (a crafted index
332
+ * can point many entries at one long run). It holds the NULs before every
333
+ * 4 KiB block (4 bytes each) and, relative to its block, before every 64-byte
334
+ * sub-block (2 bytes each): about 3% of the data, however many NULs it holds.
335
+ */
336
+ class NulIndex {
337
+ data;
338
+ directory = null;
339
+ constructor(data) {
340
+ this.data = data;
341
+ }
342
+ /** The offset just past the `countArg`-th NUL at or after `offsetArg` (`0 <= offsetArg <= data.length`), or -1. */
343
+ endOfStrings(offsetArg, countArg) {
344
+ if (offsetArg >= this.data.length) {
345
+ return -1;
346
+ }
347
+ if (countArg === 1) {
348
+ // a short string ends within one block; a longer one goes through the
349
+ // directory, so entries pointing into one long run never rescan it
350
+ const window = this.data.subarray(offsetArg, offsetArg + NUL_BLOCK_BYTES + 1);
351
+ const nul = window.indexOf(0);
352
+ if (nul >= 0) {
353
+ return offsetArg + nul + 1;
354
+ }
355
+ if (offsetArg + window.length === this.data.length) {
356
+ return -1;
357
+ }
358
+ }
359
+ const directory = this.build();
360
+ // the NUL wanted is the one with `rank` NULs before it
361
+ const rank = this.rank(directory, offsetArg) + countArg - 1;
362
+ return rank < directory.total ? this.select(directory, rank) + 1 : -1;
363
+ }
364
+ /** The number of NULs before `offsetArg` (`offsetArg < data.length`). */
365
+ rank(directoryArg, offsetArg) {
366
+ const subblock = Math.floor(offsetArg / NUL_SUBBLOCK_BYTES);
367
+ let rank = directoryArg.blocks[Math.floor(offsetArg / NUL_BLOCK_BYTES)] + directoryArg.subblocks[subblock];
368
+ for (let i = subblock * NUL_SUBBLOCK_BYTES; i < offsetArg; i++) {
369
+ if (this.data[i] === 0) {
370
+ rank++;
371
+ }
372
+ }
373
+ return rank;
374
+ }
375
+ /** The position of the NUL with `rankArg` NULs before it (`rankArg` below the total). */
376
+ select(directoryArg, rankArg) {
377
+ const { blocks, subblocks } = directoryArg;
378
+ // the last block with at most `rankArg` NULs before it
379
+ let low = 0;
380
+ let high = blocks.length - 1;
381
+ while (low < high) {
382
+ const middle = (low + high + 1) >>> 1;
383
+ if (blocks[middle] <= rankArg) {
384
+ low = middle;
385
+ }
386
+ else {
387
+ high = middle - 1;
388
+ }
389
+ }
390
+ let remaining = rankArg - blocks[low];
391
+ // the last sub-block of that block with at most `remaining` NULs before it in the block
392
+ high = Math.min(subblocks.length, (low + 1) * SUBBLOCKS_PER_BLOCK) - 1;
393
+ low *= SUBBLOCKS_PER_BLOCK;
394
+ while (low < high) {
395
+ const middle = (low + high + 1) >>> 1;
396
+ if (subblocks[middle] <= remaining) {
397
+ low = middle;
398
+ }
399
+ else {
400
+ high = middle - 1;
401
+ }
402
+ }
403
+ remaining -= subblocks[low];
404
+ for (let i = low * NUL_SUBBLOCK_BYTES, end = Math.min(this.data.length, i + NUL_SUBBLOCK_BYTES); i < end; i++) {
405
+ if (this.data[i] === 0 && remaining-- === 0) {
406
+ return i;
407
+ }
408
+ }
409
+ // unreachable while the directory matches the data: a codec fault, not a verdict on the package
410
+ throw new Error('the RPM header NUL directory does not match the header data');
411
+ }
412
+ build() {
413
+ if (this.directory === null) {
414
+ const data = this.data;
415
+ const blocks = new Uint32Array(Math.ceil(data.length / NUL_BLOCK_BYTES));
416
+ const subblocks = new Uint16Array(Math.ceil(data.length / NUL_SUBBLOCK_BYTES));
417
+ let total = 0;
418
+ let inBlock = 0;
419
+ for (let i = 0; i < data.length; i++) {
420
+ if (i % NUL_SUBBLOCK_BYTES === 0) {
421
+ if (i % NUL_BLOCK_BYTES === 0) {
422
+ blocks[i / NUL_BLOCK_BYTES] = total;
423
+ inBlock = 0;
424
+ }
425
+ subblocks[i / NUL_SUBBLOCK_BYTES] = inBlock;
426
+ }
427
+ if (data[i] === 0) {
428
+ total++;
429
+ inBlock++;
430
+ }
431
+ }
432
+ this.directory = { blocks, subblocks, total };
433
+ }
434
+ return this.directory;
435
+ }
436
+ }
437
+ /**
438
+ * go-rpmutils `getHashAndType` + the check in `readHeader`: the SHA-256 tag
439
+ * when it is a non-empty string, else the SHA-1 tag; a value of one character
440
+ * or less disables the check.
441
+ */
442
+ function checkMainHeaderDigest(signatureArg, mainArg) {
443
+ let expected = firstString(signatureArg, RPM_SIGNATURE_TAG.sha256);
444
+ let algorithm = 'sha256';
445
+ if (expected === null || expected.length === 0) {
446
+ expected = firstString(signatureArg, RPM_SIGNATURE_TAG.sha1);
447
+ algorithm = 'sha1';
448
+ }
449
+ if (expected === null || expected.length <= 1) {
450
+ return;
451
+ }
452
+ const actual = new TextEncoder().encode(plugins.crypto.createHash(algorithm).update(mainArg.bytes).digest('hex'));
453
+ if (actual.length !== expected.length || actual.some((byte, i) => byte !== expected[i])) {
454
+ throw new LinuxRepoError('digest-mismatch', `the RPM main header does not match its ${algorithm.toUpperCase()} digest`, {
455
+ field: algorithm === 'sha256' ? 'tag 273' : 'tag 269',
456
+ });
457
+ }
458
+ }
459
+ /** go-rpmutils `getSha256`/`getSha1`: `vals[0]` panics on an empty array. */
460
+ function firstString(headerArg, tagArg) {
461
+ const values = headerArg.strings(tagArg);
462
+ if (values === null) {
463
+ return null;
464
+ }
465
+ if (values.length === 0) {
466
+ throw new LinuxRepoError('malformed-header', `RPM signature tag ${tagArg} holds no value`, { field: `tag ${tagArg}` });
467
+ }
468
+ return values[0];
469
+ }
470
+ /**
471
+ * Serializes a signature header as go-rpmutils `WriteTo(…, 62)` does
472
+ * (`writeheader.go:66-123`): entries below tag 64 are dropped, the rest are
473
+ * written in ascending tag order with INT16/32/64 data aligned, the region
474
+ * tag 62 comes first in the index with its 16-byte trailer as the last data
475
+ * item, and the whole header is padded to 8 bytes.
476
+ *
477
+ * The entries are the effective entries of `sourceArg` whose tags are not in
478
+ * `removedArg`, copied without an object per entry, and `addedArg`, whose
479
+ * tags must be in `removedArg`.
480
+ */
481
+ export function writeSignatureHeader(sourceArg, removedArg, addedArg) {
482
+ const kept = sourceArg.effectiveIndexes();
483
+ let keptCount = 0;
484
+ for (const indexValue of kept) {
485
+ const tag = sourceArg.tagAt(indexValue);
486
+ if (tag >= RPM_TAG_HEADER_REGIONS && !removedArg.has(tag)) {
487
+ kept[keptCount++] = indexValue;
488
+ }
489
+ }
490
+ const added = addedArg.filter((entry) => entry.tag >= RPM_TAG_HEADER_REGIONS).sort((a, b) => a.tag - b.tag);
491
+ /** Calls `visitArg` for every entry in ascending tag order, with the offset of its data. */
492
+ const layout = (visitArg) => {
493
+ let dataLength = 0;
494
+ for (let k = 0, a = 0; k < keptCount || a < added.length;) {
495
+ let entry;
496
+ let contents = null;
497
+ if (a < added.length && (k === keptCount || added[a].tag < sourceArg.tagAt(kept[k]))) {
498
+ const item = added[a++];
499
+ entry = { tag: item.tag, type: item.type, count: item.count, start: 0, end: item.contents.length };
500
+ contents = item.contents;
501
+ }
502
+ else {
503
+ entry = sourceArg.entryAt(kept[k++]);
504
+ }
505
+ const alignment = TYPE_ALIGNMENT.get(entry.type);
506
+ if (alignment !== undefined && dataLength % alignment !== 0) {
507
+ dataLength += alignment - (dataLength % alignment);
508
+ }
509
+ visitArg(entry, contents, dataLength);
510
+ dataLength += entry.end - entry.start;
511
+ }
512
+ return dataLength;
513
+ };
514
+ const trailerOffset = layout(() => undefined);
515
+ const dataLength = trailerOffset + INDEX_ENTRY_BYTES;
516
+ const indexCount = keptCount + added.length + 1;
517
+ const unpadded = HEADER_INTRO_BYTES + indexCount * INDEX_ENTRY_BYTES + dataLength;
518
+ const bytes = new Uint8Array(unpadded + ((8 - (dataLength % 8)) % 8));
519
+ const view = new DataView(bytes.buffer);
520
+ view.setUint32(0, HEADER_MAGIC);
521
+ view.setUint32(8, indexCount);
522
+ view.setUint32(12, dataLength);
523
+ const dataStart = HEADER_INTRO_BYTES + indexCount * INDEX_ENTRY_BYTES;
524
+ const writeIndex = (indexArg, tagArg, typeArg, offsetArg, countArg) => {
525
+ const at = HEADER_INTRO_BYTES + indexArg * INDEX_ENTRY_BYTES;
526
+ view.setInt32(at, tagArg);
527
+ view.setInt32(at + 4, typeArg);
528
+ view.setInt32(at + 8, offsetArg);
529
+ view.setInt32(at + 12, countArg);
530
+ };
531
+ writeIndex(0, RPM_SIGNATURE_TAG.headerSignatures, RPM_TYPE.bin, trailerOffset, INDEX_ENTRY_BYTES);
532
+ let written = 1;
533
+ layout((entryArg, contentsArg, offsetArg) => {
534
+ writeIndex(written++, entryArg.tag, entryArg.type, offsetArg, entryArg.count);
535
+ if (entryArg.end > entryArg.start) {
536
+ bytes.set(contentsArg ?? sourceArg.contents(entryArg), dataStart + offsetArg);
537
+ }
538
+ });
539
+ const trailer = dataStart + trailerOffset;
540
+ view.setInt32(trailer, RPM_SIGNATURE_TAG.headerSignatures);
541
+ view.setInt32(trailer + 4, RPM_TYPE.bin);
542
+ view.setInt32(trailer + 8, -INDEX_ENTRY_BYTES * indexCount);
543
+ view.setInt32(trailer + 12, INDEX_ENTRY_BYTES);
544
+ return bytes;
545
+ }
546
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvcnBtL2hlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUcvRTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDakMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM1QyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUM7QUFDaEMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUM7QUFDOUIsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUM7QUFFN0IseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixJQUFJLEVBQUUsQ0FBQztJQUNQLElBQUksRUFBRSxDQUFDO0lBQ1AsSUFBSSxFQUFFLENBQUM7SUFDUCxLQUFLLEVBQUUsQ0FBQztJQUNSLEtBQUssRUFBRSxDQUFDO0lBQ1IsS0FBSyxFQUFFLENBQUM7SUFDUixNQUFNLEVBQUUsQ0FBQztJQUNULEdBQUcsRUFBRSxDQUFDO0lBQ04sV0FBVyxFQUFFLENBQUM7SUFDZCxVQUFVLEVBQUUsQ0FBQztDQUNMLENBQUM7QUFFWCx3R0FBd0c7QUFDeEcsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQWlCO0lBQ3pDLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDLFFBQVEsQ0FBQyxJQUFJ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
@@ -0,0 +1,20 @@
1
+ import { type ILinuxPackageLimits } from '../shared/limits.js';
2
+ import type { IRpmPackageRecord } from '../shared/types.js';
3
+ /**
4
+ * Reads an RPM package into a record holding exactly what Gitea 28.2.0's
5
+ * `rpm.ParsePackage` derives (`modules/packages/rpm/metadata.go:102-299`),
6
+ * plus the digests of the whole file.
7
+ *
8
+ * Gitea reads only the lead and the two headers; so does the reader, which
9
+ * then drains the payload for the digests. The differences from Gitea:
10
+ * `installedSize` falls back to LONGSIZE (5009) and `archiveSize` to the
11
+ * signature tag LONGARCHIVESIZE (271) when the 32-bit tag gives no value;
12
+ * numbers above `Number.MAX_SAFE_INTEGER`, tags with more than `maxEntries`
13
+ * values, and a NAME or built version that is not a path segment (empty,
14
+ * `.`, `..`, or holding `/` or a control character) are refused. Strings are decoded with the shared
15
+ * Go-compatible decoder (each byte of an invalid UTF-8 sequence becomes
16
+ * U+FFFD); Gitea 28.2.0 refuses such packages because its JSON v2 encoder
17
+ * rejects invalid UTF-8; the codec accepts them, so it accepts a superset of
18
+ * what Gitea accepts.
19
+ */
20
+ export declare function readRpmPackage(source: AsyncIterable<Uint8Array>, limits?: Partial<ILinuxPackageLimits>): Promise<IRpmPackageRecord>;