@push.rocks/smartlinuxrepo 1.1.1 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/alpine/apkindexreader.d.ts +87 -0
- package/dist_ts/alpine/apkindexreader.js +193 -0
- package/dist_ts/arch/indexreader.d.ts +35 -0
- package/dist_ts/arch/indexreader.js +45 -0
- package/dist_ts/arch/reader.js +2 -2
- package/dist_ts/debian/indexbuilder.js +8 -23
- package/dist_ts/debian/indexreader.d.ts +107 -0
- package/dist_ts/debian/indexreader.js +274 -0
- package/dist_ts/debian/reader.js +6 -2
- package/dist_ts/debian/rules.d.ts +18 -0
- package/dist_ts/debian/rules.js +81 -2
- package/dist_ts/index.d.ts +14 -4
- package/dist_ts/index.js +9 -3
- package/dist_ts/readers/decompress.d.ts +14 -5
- package/dist_ts/readers/decompress.js +401 -26
- package/dist_ts/readers/document.d.ts +36 -0
- package/dist_ts/readers/document.js +110 -0
- package/dist_ts/rpm/repodata.d.ts +3 -2
- package/dist_ts/rpm/repodata.js +5 -4
- package/dist_ts/rpm/repodatareader.d.ts +173 -0
- package/dist_ts/rpm/repodatareader.js +414 -0
- package/dist_ts/rpm/xmlreader.d.ts +70 -0
- package/dist_ts/rpm/xmlreader.js +576 -0
- package/dist_ts/shared/errors.d.ts +12 -4
- package/dist_ts/shared/errors.js +1 -1
- package/dist_ts/shared/limits.d.ts +9 -2
- package/dist_ts/shared/limits.js +5 -2
- package/dist_ts/shared/types.d.ts +2 -0
- package/dist_ts/signing/verifiers.d.ts +43 -0
- package/dist_ts/signing/verifiers.js +81 -2
- package/package.json +1 -1
- package/readme.md +56 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/alpine/apkindexreader.ts +265 -0
- package/ts/arch/indexreader.ts +66 -0
- package/ts/arch/reader.ts +3 -2
- package/ts/debian/indexbuilder.ts +13 -23
- package/ts/debian/indexreader.ts +372 -0
- package/ts/debian/reader.ts +7 -2
- package/ts/debian/rules.ts +83 -1
- package/ts/index.ts +40 -2
- package/ts/readers/decompress.ts +442 -32
- package/ts/readers/document.ts +136 -0
- package/ts/rpm/repodata.ts +4 -3
- package/ts/rpm/repodatareader.ts +582 -0
- package/ts/rpm/xmlreader.ts +680 -0
- package/ts/shared/errors.ts +13 -4
- package/ts/shared/limits.ts +10 -2
- package/ts/shared/types.ts +3 -0
- package/ts/signing/verifiers.ts +113 -1
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type ILinuxPackageLimits } from '../shared/limits.js';
|
|
2
|
+
import type { TLinuxCompression } from '../shared/types.js';
|
|
3
|
+
/** One stanza of a `Packages` index. */
|
|
4
|
+
export interface IDebianPackagesStanza {
|
|
5
|
+
/** The stanza's lines, first line through the last LF, without a separating empty line (a view into `decoded`). */
|
|
6
|
+
readonly bytes: Uint8Array;
|
|
7
|
+
/** The stanza's offset in `decoded`. */
|
|
8
|
+
readonly offset: number;
|
|
9
|
+
/** The first-line value of the stanza's last `Filename` field: the unit key. */
|
|
10
|
+
readonly filename: string;
|
|
11
|
+
/** The first-line values of the last `Package`, `Version` and `Architecture` fields; `''` when absent. */
|
|
12
|
+
readonly package: string;
|
|
13
|
+
readonly version: string;
|
|
14
|
+
readonly architecture: string;
|
|
15
|
+
}
|
|
16
|
+
/** A `Packages` index read into its stanzas. */
|
|
17
|
+
export interface IDebianPackagesIndex {
|
|
18
|
+
/** The decompressed document (a copy for `'none'`); every `offset` indexes into it. */
|
|
19
|
+
readonly decoded: Uint8Array;
|
|
20
|
+
/** Every stanza in document order, duplicates included. */
|
|
21
|
+
readonly stanzas: readonly IDebianPackagesStanza[];
|
|
22
|
+
}
|
|
23
|
+
/** One field of a `Release` file. */
|
|
24
|
+
export interface IDebianReleaseField {
|
|
25
|
+
/** The field name as written. */
|
|
26
|
+
readonly name: string;
|
|
27
|
+
/**
|
|
28
|
+
* The first-line value without surrounding spaces and tabs, then `"\n"`
|
|
29
|
+
* plus each continuation line verbatim.
|
|
30
|
+
*/
|
|
31
|
+
readonly value: string;
|
|
32
|
+
/** The field's line(s), each with its LF. */
|
|
33
|
+
readonly bytes: Uint8Array;
|
|
34
|
+
}
|
|
35
|
+
/** One file of a `Release` checksum list. */
|
|
36
|
+
export interface IDebianReleaseFile {
|
|
37
|
+
readonly path: string;
|
|
38
|
+
readonly size: number;
|
|
39
|
+
/** As written: hex of the algorithm's length. */
|
|
40
|
+
readonly digest: string;
|
|
41
|
+
}
|
|
42
|
+
/** A `Release` file read into its fields and checksum lists. */
|
|
43
|
+
export interface IDebianRelease {
|
|
44
|
+
/** Every field in order, the checksum fields included. */
|
|
45
|
+
readonly fields: readonly IDebianReleaseField[];
|
|
46
|
+
/** The `MD5Sum`, `SHA1`, `SHA256` and `SHA512` lists; `[]` when the field is absent. */
|
|
47
|
+
readonly files: {
|
|
48
|
+
readonly md5Sum: readonly IDebianReleaseFile[];
|
|
49
|
+
readonly sha1: readonly IDebianReleaseFile[];
|
|
50
|
+
readonly sha256: readonly IDebianReleaseFile[];
|
|
51
|
+
readonly sha512: readonly IDebianReleaseFile[];
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reads a `Packages` index (`dists/<d>/<c>/binary-<a>/Packages`, `.gz`,
|
|
56
|
+
* `.xz`; the caller names `compression` from the file name) into its stanzas.
|
|
57
|
+
*
|
|
58
|
+
* - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
|
|
59
|
+
* is `limit-exceeded`.
|
|
60
|
+
* - A stanza is a maximal run of non-empty lines; one or more empty lines
|
|
61
|
+
* separate stanzas, and leading or trailing empty lines are accepted.
|
|
62
|
+
* - A line holding only spaces or tabs is `malformed-index` (Gitea and the
|
|
63
|
+
* codec cannot write one; Debian Policy and the strip rule would read it
|
|
64
|
+
* differently). A stanza starting with a continuation line is
|
|
65
|
+
* `malformed-index`. A line without `:` is accepted (Gitea can write one).
|
|
66
|
+
* - Field names are the Go `TrimSpace` of the bytes before the first `:`,
|
|
67
|
+
* matched ASCII case-insensitively; values are the Go `TrimSpace` of the
|
|
68
|
+
* rest of the field's first line, decoded as Go does (U+FFFD for invalid
|
|
69
|
+
* UTF-8), from the field's last occurrence.
|
|
70
|
+
* - A stanza without `Filename` is `missing-field` (`Filename`, `value` the
|
|
71
|
+
* stanza offset).
|
|
72
|
+
*
|
|
73
|
+
* Bounds: the decoded document by `maxIndexBytes`, stanzas by `maxEntries`,
|
|
74
|
+
* one stanza by `maxMetadataBytes`. Every stanza is returned in document
|
|
75
|
+
* order, duplicates included; `bytes` are views into `decoded`.
|
|
76
|
+
*/
|
|
77
|
+
export declare function readDebianPackagesIndex(inputArg: {
|
|
78
|
+
bytes: Uint8Array;
|
|
79
|
+
compression: TLinuxCompression;
|
|
80
|
+
limits?: Partial<ILinuxPackageLimits>;
|
|
81
|
+
}): Promise<IDebianPackagesIndex>;
|
|
82
|
+
/**
|
|
83
|
+
* Reads a `Release` file (the plain `dists/<d>/Release`) into its fields and
|
|
84
|
+
* checksum lists. For an `InRelease`, verify it with `createOpenPgpVerifier`
|
|
85
|
+
* and pass the verified `signedText` here (plus a final LF when it lacks one).
|
|
86
|
+
*
|
|
87
|
+
* - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
|
|
88
|
+
* is `limit-exceeded`.
|
|
89
|
+
* - Exactly one stanza: an empty line, a line holding only spaces or tabs, a
|
|
90
|
+
* continuation line before the first field, a field line without `:`, a
|
|
91
|
+
* field name that is empty or holds a space or tab, a second checksum field
|
|
92
|
+
* of one algorithm, or an empty document is `malformed-index`.
|
|
93
|
+
* - `MD5Sum`, `SHA1`, `SHA256` and `SHA512` (ASCII case-insensitive) hold an
|
|
94
|
+
* empty first-line value and continuation lines of leading whitespace, then
|
|
95
|
+
* exactly three tokens separated by one or more spaces or tabs: the digest
|
|
96
|
+
* (hex of the algorithm's length), the size (decimal digits within a safe
|
|
97
|
+
* integer) and the path. Anything else is `invalid-field` (`field` the field
|
|
98
|
+
* name as written, `value` the line's offset).
|
|
99
|
+
*
|
|
100
|
+
* Bounds: the document by `maxIndexBytes`, fields and the files per list by
|
|
101
|
+
* `maxEntries`. Field names and values are decoded as Go does (U+FFFD for
|
|
102
|
+
* invalid UTF-8); `bytes` are views into a copy of the input.
|
|
103
|
+
*/
|
|
104
|
+
export declare function readDebianRelease(inputArg: {
|
|
105
|
+
bytes: Uint8Array;
|
|
106
|
+
limits?: Partial<ILinuxPackageLimits>;
|
|
107
|
+
}): Promise<IDebianRelease>;
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import { LinuxRepoError } from '../shared/errors.js';
|
|
2
|
+
import { resolveLinuxPackageLimits } from '../shared/limits.js';
|
|
3
|
+
import { assertLinuxCompression, assertReaderBytes, assertReaderInput, checkUnitBytes, countUnit, isBlankLine, lines, readIndexDocument, } from '../readers/document.js';
|
|
4
|
+
import { decodeGoUtf8, decodeLatin1 } from '../readers/text.js';
|
|
5
|
+
import { fromByteString, goTrimSpace } from './gostring.js';
|
|
6
|
+
const SPACE = 0x20;
|
|
7
|
+
const TAB = 0x09;
|
|
8
|
+
const COLON = 0x3a;
|
|
9
|
+
/** The four checksum fields of a Release, lower-cased, with their list key and hex length. */
|
|
10
|
+
const RELEASE_CHECKSUM_FIELDS = new Map([
|
|
11
|
+
['md5sum', { key: 'md5Sum', hexLength: 32 }],
|
|
12
|
+
['sha1', { key: 'sha1', hexLength: 40 }],
|
|
13
|
+
['sha256', { key: 'sha256', hexLength: 64 }],
|
|
14
|
+
['sha512', { key: 'sha512', hexLength: 128 }],
|
|
15
|
+
]);
|
|
16
|
+
/**
|
|
17
|
+
* Reads a `Packages` index (`dists/<d>/<c>/binary-<a>/Packages`, `.gz`,
|
|
18
|
+
* `.xz`; the caller names `compression` from the file name) into its stanzas.
|
|
19
|
+
*
|
|
20
|
+
* - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
|
|
21
|
+
* is `limit-exceeded`.
|
|
22
|
+
* - A stanza is a maximal run of non-empty lines; one or more empty lines
|
|
23
|
+
* separate stanzas, and leading or trailing empty lines are accepted.
|
|
24
|
+
* - A line holding only spaces or tabs is `malformed-index` (Gitea and the
|
|
25
|
+
* codec cannot write one; Debian Policy and the strip rule would read it
|
|
26
|
+
* differently). A stanza starting with a continuation line is
|
|
27
|
+
* `malformed-index`. A line without `:` is accepted (Gitea can write one).
|
|
28
|
+
* - Field names are the Go `TrimSpace` of the bytes before the first `:`,
|
|
29
|
+
* matched ASCII case-insensitively; values are the Go `TrimSpace` of the
|
|
30
|
+
* rest of the field's first line, decoded as Go does (U+FFFD for invalid
|
|
31
|
+
* UTF-8), from the field's last occurrence.
|
|
32
|
+
* - A stanza without `Filename` is `missing-field` (`Filename`, `value` the
|
|
33
|
+
* stanza offset).
|
|
34
|
+
*
|
|
35
|
+
* Bounds: the decoded document by `maxIndexBytes`, stanzas by `maxEntries`,
|
|
36
|
+
* one stanza by `maxMetadataBytes`. Every stanza is returned in document
|
|
37
|
+
* order, duplicates included; `bytes` are views into `decoded`.
|
|
38
|
+
*/
|
|
39
|
+
export async function readDebianPackagesIndex(inputArg) {
|
|
40
|
+
assertReaderInput(inputArg);
|
|
41
|
+
assertReaderBytes(inputArg.bytes);
|
|
42
|
+
assertLinuxCompression(inputArg.compression);
|
|
43
|
+
const limits = resolveLinuxPackageLimits(inputArg.limits);
|
|
44
|
+
const decoded = await readIndexDocument(inputArg.bytes, inputArg.compression, limits);
|
|
45
|
+
const stanzas = [];
|
|
46
|
+
let stanza = null;
|
|
47
|
+
const finish = (endArg) => {
|
|
48
|
+
if (stanza === null) {
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const current = stanza;
|
|
52
|
+
stanza = null;
|
|
53
|
+
if (current.filename === null) {
|
|
54
|
+
throw new LinuxRepoError('missing-field', 'a Packages stanza has no Filename field', {
|
|
55
|
+
field: 'Filename',
|
|
56
|
+
value: current.start,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
stanzas.push({
|
|
60
|
+
bytes: decoded.subarray(current.start, endArg),
|
|
61
|
+
offset: current.start,
|
|
62
|
+
filename: current.filename,
|
|
63
|
+
package: current.package,
|
|
64
|
+
version: current.version,
|
|
65
|
+
architecture: current.architecture,
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
for (const line of lines(decoded, limits.maxHeaderBytes, 'Packages')) {
|
|
69
|
+
if (line.end === line.start) {
|
|
70
|
+
finish(line.start);
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (isBlankLine(decoded, line)) {
|
|
74
|
+
throw new LinuxRepoError('malformed-index', 'a Packages line holds only spaces or tabs', {
|
|
75
|
+
field: 'Packages',
|
|
76
|
+
value: line.start,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const first = decoded[line.start];
|
|
80
|
+
if (stanza === null) {
|
|
81
|
+
if (first === SPACE || first === TAB) {
|
|
82
|
+
throw new LinuxRepoError('malformed-index', 'a Packages stanza starts with a continuation line', {
|
|
83
|
+
field: 'Packages',
|
|
84
|
+
value: line.start,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
countUnit(stanzas.length + 1, limits, 'Packages stanza');
|
|
88
|
+
stanza = { start: line.start, filename: null, package: '', version: '', architecture: '' };
|
|
89
|
+
}
|
|
90
|
+
checkUnitBytes(line.end + 1 - stanza.start, limits, 'Packages stanza');
|
|
91
|
+
if (first === SPACE || first === TAB) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
readPackagesField(decoded, line, stanza);
|
|
95
|
+
}
|
|
96
|
+
finish(decoded.length);
|
|
97
|
+
return { decoded, stanzas };
|
|
98
|
+
}
|
|
99
|
+
/** Takes the key fields' first-line values; a later occurrence replaces an earlier one. */
|
|
100
|
+
function readPackagesField(bytesArg, lineArg, stanzaArg) {
|
|
101
|
+
const line = bytesArg.subarray(lineArg.start, lineArg.end);
|
|
102
|
+
const colon = line.indexOf(COLON);
|
|
103
|
+
if (colon < 0) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const name = asciiLower(goTrimSpace(decodeLatin1(line.subarray(0, colon))));
|
|
107
|
+
if (name !== 'filename' && name !== 'package' && name !== 'version' && name !== 'architecture') {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const value = fromByteString(goTrimSpace(decodeLatin1(line.subarray(colon + 1))));
|
|
111
|
+
if (name === 'filename') {
|
|
112
|
+
stanzaArg.filename = value;
|
|
113
|
+
}
|
|
114
|
+
else if (name === 'package') {
|
|
115
|
+
stanzaArg.package = value;
|
|
116
|
+
}
|
|
117
|
+
else if (name === 'version') {
|
|
118
|
+
stanzaArg.version = value;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
stanzaArg.architecture = value;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Reads a `Release` file (the plain `dists/<d>/Release`) into its fields and
|
|
126
|
+
* checksum lists. For an `InRelease`, verify it with `createOpenPgpVerifier`
|
|
127
|
+
* and pass the verified `signedText` here (plus a final LF when it lacks one).
|
|
128
|
+
*
|
|
129
|
+
* - Lines end in LF, the last one too; a line longer than `maxHeaderBytes`
|
|
130
|
+
* is `limit-exceeded`.
|
|
131
|
+
* - Exactly one stanza: an empty line, a line holding only spaces or tabs, a
|
|
132
|
+
* continuation line before the first field, a field line without `:`, a
|
|
133
|
+
* field name that is empty or holds a space or tab, a second checksum field
|
|
134
|
+
* of one algorithm, or an empty document is `malformed-index`.
|
|
135
|
+
* - `MD5Sum`, `SHA1`, `SHA256` and `SHA512` (ASCII case-insensitive) hold an
|
|
136
|
+
* empty first-line value and continuation lines of leading whitespace, then
|
|
137
|
+
* exactly three tokens separated by one or more spaces or tabs: the digest
|
|
138
|
+
* (hex of the algorithm's length), the size (decimal digits within a safe
|
|
139
|
+
* integer) and the path. Anything else is `invalid-field` (`field` the field
|
|
140
|
+
* name as written, `value` the line's offset).
|
|
141
|
+
*
|
|
142
|
+
* Bounds: the document by `maxIndexBytes`, fields and the files per list by
|
|
143
|
+
* `maxEntries`. Field names and values are decoded as Go does (U+FFFD for
|
|
144
|
+
* invalid UTF-8); `bytes` are views into a copy of the input.
|
|
145
|
+
*/
|
|
146
|
+
export async function readDebianRelease(inputArg) {
|
|
147
|
+
assertReaderInput(inputArg);
|
|
148
|
+
assertReaderBytes(inputArg.bytes);
|
|
149
|
+
const limits = resolveLinuxPackageLimits(inputArg.limits);
|
|
150
|
+
const decoded = await readIndexDocument(inputArg.bytes, 'none', limits);
|
|
151
|
+
const malformed = (messageArg, offsetArg) => new LinuxRepoError('malformed-index', messageArg, { field: 'Release', value: offsetArg });
|
|
152
|
+
const fields = [];
|
|
153
|
+
const files = {
|
|
154
|
+
md5Sum: [],
|
|
155
|
+
sha1: [],
|
|
156
|
+
sha256: [],
|
|
157
|
+
sha512: [],
|
|
158
|
+
};
|
|
159
|
+
const seenChecksumFields = new Set();
|
|
160
|
+
let field = null;
|
|
161
|
+
const finishField = (endArg) => {
|
|
162
|
+
if (field !== null) {
|
|
163
|
+
const value = [field.firstValue, ...field.continuations].join('\n');
|
|
164
|
+
fields.push({ name: field.name, value, bytes: decoded.subarray(field.start, endArg) });
|
|
165
|
+
field = null;
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
for (const line of lines(decoded, limits.maxHeaderBytes, 'Release')) {
|
|
169
|
+
if (line.end === line.start) {
|
|
170
|
+
throw malformed('a Release file holds an empty line', line.start);
|
|
171
|
+
}
|
|
172
|
+
if (isBlankLine(decoded, line)) {
|
|
173
|
+
throw malformed('a Release line holds only spaces or tabs', line.start);
|
|
174
|
+
}
|
|
175
|
+
const first = decoded[line.start];
|
|
176
|
+
if (first === SPACE || first === TAB) {
|
|
177
|
+
if (field === null) {
|
|
178
|
+
throw malformed('a Release file starts with a continuation line', line.start);
|
|
179
|
+
}
|
|
180
|
+
const current = field;
|
|
181
|
+
if (current.checksum !== null) {
|
|
182
|
+
const list = files[current.checksum.key];
|
|
183
|
+
countUnit(list.length + 1, limits, `Release ${current.name} file`);
|
|
184
|
+
list.push(readChecksumLine(decoded, line, current.name, current.checksum.hexLength));
|
|
185
|
+
}
|
|
186
|
+
current.continuations.push(decodeGoUtf8(decoded.subarray(line.start, line.end)));
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
finishField(line.start);
|
|
190
|
+
const colon = decoded.subarray(line.start, line.end).indexOf(COLON);
|
|
191
|
+
if (colon < 0) {
|
|
192
|
+
throw malformed('a Release field line has no ":"', line.start);
|
|
193
|
+
}
|
|
194
|
+
const nameBytes = decoded.subarray(line.start, line.start + colon);
|
|
195
|
+
if (nameBytes.length === 0 || nameBytes.includes(SPACE) || nameBytes.includes(TAB)) {
|
|
196
|
+
throw malformed('a Release field name is empty or holds a space or tab', line.start);
|
|
197
|
+
}
|
|
198
|
+
const name = decodeGoUtf8(nameBytes);
|
|
199
|
+
const lower = asciiLower(decodeLatin1(nameBytes));
|
|
200
|
+
const checksum = RELEASE_CHECKSUM_FIELDS.get(lower) ?? null;
|
|
201
|
+
const firstValue = decodeGoUtf8(trimSpaceTab(decoded.subarray(line.start + colon + 1, line.end)));
|
|
202
|
+
if (checksum !== null) {
|
|
203
|
+
if (seenChecksumFields.has(lower)) {
|
|
204
|
+
throw malformed(`a Release file holds a second ${name} field`, line.start);
|
|
205
|
+
}
|
|
206
|
+
seenChecksumFields.add(lower);
|
|
207
|
+
if (firstValue !== '') {
|
|
208
|
+
throw new LinuxRepoError('invalid-field', `the ${name} field has a value on its first line`, {
|
|
209
|
+
field: name,
|
|
210
|
+
value: line.start,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
countUnit(fields.length + 1, limits, 'Release field');
|
|
215
|
+
field = { name, start: line.start, firstValue, continuations: [], checksum };
|
|
216
|
+
}
|
|
217
|
+
finishField(decoded.length);
|
|
218
|
+
if (fields.length === 0) {
|
|
219
|
+
throw malformed('a Release file holds no field', 0);
|
|
220
|
+
}
|
|
221
|
+
return { fields, files };
|
|
222
|
+
}
|
|
223
|
+
/** One checksum line: leading whitespace, then digest, size and path separated by spaces or tabs. */
|
|
224
|
+
function readChecksumLine(bytesArg, lineArg, fieldArg, hexLengthArg) {
|
|
225
|
+
const tokens = [];
|
|
226
|
+
let i = lineArg.start;
|
|
227
|
+
while (i < lineArg.end) {
|
|
228
|
+
while (i < lineArg.end && (bytesArg[i] === SPACE || bytesArg[i] === TAB)) {
|
|
229
|
+
i += 1;
|
|
230
|
+
}
|
|
231
|
+
if (i === lineArg.end) {
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
const start = i;
|
|
235
|
+
while (i < lineArg.end && bytesArg[i] !== SPACE && bytesArg[i] !== TAB) {
|
|
236
|
+
i += 1;
|
|
237
|
+
}
|
|
238
|
+
tokens.push([start, i]);
|
|
239
|
+
if (tokens.length > 3) {
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
const last = bytesArg[lineArg.end - 1];
|
|
244
|
+
const invalid = (whatArg) => new LinuxRepoError('invalid-field', `a ${fieldArg} line ${whatArg}`, { field: fieldArg, value: lineArg.start });
|
|
245
|
+
if (tokens.length !== 3 || last === SPACE || last === TAB) {
|
|
246
|
+
throw invalid('is not "<digest> <size> <path>"');
|
|
247
|
+
}
|
|
248
|
+
const digest = decodeLatin1(bytesArg.subarray(tokens[0][0], tokens[0][1]));
|
|
249
|
+
if (digest.length !== hexLengthArg || !/^[0-9a-fA-F]+$/.test(digest)) {
|
|
250
|
+
throw invalid(`has a digest that is not ${hexLengthArg} hex digits`);
|
|
251
|
+
}
|
|
252
|
+
const sizeText = decodeLatin1(bytesArg.subarray(tokens[1][0], tokens[1][1]));
|
|
253
|
+
const size = /^[0-9]+$/.test(sizeText) ? Number(sizeText) : Number.NaN;
|
|
254
|
+
if (!Number.isSafeInteger(size)) {
|
|
255
|
+
throw invalid('has a size that is not decimal digits within a safe integer');
|
|
256
|
+
}
|
|
257
|
+
return { path: decodeGoUtf8(bytesArg.subarray(tokens[2][0], tokens[2][1])), size, digest };
|
|
258
|
+
}
|
|
259
|
+
function trimSpaceTab(bytesArg) {
|
|
260
|
+
let start = 0;
|
|
261
|
+
let end = bytesArg.length;
|
|
262
|
+
while (start < end && (bytesArg[start] === SPACE || bytesArg[start] === TAB)) {
|
|
263
|
+
start += 1;
|
|
264
|
+
}
|
|
265
|
+
while (end > start && (bytesArg[end - 1] === SPACE || bytesArg[end - 1] === TAB)) {
|
|
266
|
+
end -= 1;
|
|
267
|
+
}
|
|
268
|
+
return bytesArg.subarray(start, end);
|
|
269
|
+
}
|
|
270
|
+
/** ASCII-only lowercasing of a byte string. */
|
|
271
|
+
function asciiLower(valueArg) {
|
|
272
|
+
return valueArg.replace(/[A-Z]+/g, (matchArg) => matchArg.toLowerCase());
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhyZWFkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZWJpYW4vaW5kZXhyZWFkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSx5QkFBeUIsRUFBNEIsTUFBTSxxQkFBcUIsQ0FBQztBQUUxRixPQUFPLEVBQ0wsc0JBQXNCLEVBQ3RCLGlCQUFpQixFQUNqQixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxXQUFXLEVBQ1gsS0FBSyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUEwRDVELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQztBQUNuQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBRW5CLDhGQUE4RjtBQUM5RixNQUFNLHVCQUF1QixHQUFtRixJQUFJLEdBQUcsQ0FBQztJQUN0SCxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQzVDLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDeEMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM1QyxDQUFDLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDO0NBQ3JDLENBQUMsQ0FBQztBQUVaOzs7Ozs7Ozs7Ozs7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
|
package/dist_ts/debian/reader.js
CHANGED
|
@@ -78,7 +78,11 @@ async function readControl(inputArg, limitsArg) {
|
|
|
78
78
|
if (member.size > limitsArg.maxMetadataBytes) {
|
|
79
79
|
throw limitExceeded('maxMetadataBytes', limitsArg.maxMetadataBytes, `control member ${member.name}`);
|
|
80
80
|
}
|
|
81
|
-
const control = await withDecompressingReader(member.body, compression, {
|
|
81
|
+
const control = await withDecompressingReader(member.body, compression, {
|
|
82
|
+
maxOutputBytes: limitsArg.maxDecompressedMetadataBytes,
|
|
83
|
+
outputLimit: 'maxDecompressedMetadataBytes',
|
|
84
|
+
maxZstdFrames: limitsArg.maxEntries,
|
|
85
|
+
}, async (decompressed) => {
|
|
82
86
|
const tar = new TarReader(decompressed, {
|
|
83
87
|
maxEntries: limitsArg.maxEntries,
|
|
84
88
|
maxHeaderBytes: limitsArg.maxHeaderBytes,
|
|
@@ -107,4 +111,4 @@ async function readControl(inputArg, limitsArg) {
|
|
|
107
111
|
}
|
|
108
112
|
}
|
|
109
113
|
}
|
|
110
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGViaWFuL3JlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSx5QkFBeUIsRUFBNEIsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFakQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUFFLHNCQUFzQixFQUF1QixNQUFNLGNBQWMsQ0FBQztBQUUzRSxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFFbEMsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQXNDO0lBQzlELEVBQUUsRUFBRSxNQUFNO0lBQ1YsS0FBSyxFQUFFLE1BQU07SUFDYixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxNQUFNO0NBQ2YsQ0FBQztBQUVGOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsaUJBQWlCLENBQ3JDLE1BQWlDLEVBQ2pDLE1BQXFDO0lBRXJDLE1BQU0sUUFBUSxHQUFHLHlCQUF5QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELE1BQU0sS0FBSyxHQUFHLElBQUksaUJBQWlCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztJ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
|
|
@@ -20,3 +20,21 @@ export declare function isDebianReleaseValue(valueArg: string): boolean;
|
|
|
20
20
|
* returns a record the builder refuses for its file name.
|
|
21
21
|
*/
|
|
22
22
|
export declare function hasPoolFileNameRefusedCharacter(textArg: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* The stanza without its index-owned fields: `Filename`, `Size`, `MD5sum`,
|
|
25
|
+
* `SHA1`, `SHA256` and `SHA512`, matched ASCII case-insensitively on the Go
|
|
26
|
+
* `TrimSpace` of the bytes before the line's first `:`, each with its
|
|
27
|
+
* continuation lines. The one line walk `renderDebianPackagesStanza` applies
|
|
28
|
+
* to a record's control text, on bytes:
|
|
29
|
+
* - a line starting with a space or tab follows the dropping state of its field;
|
|
30
|
+
* - otherwise the field is dropped exactly when its name is one of the six;
|
|
31
|
+
* - a line without a `:` is kept and ends dropping.
|
|
32
|
+
*
|
|
33
|
+
* Lines end at LF and keep it; a final line without LF is a line too. The
|
|
34
|
+
* result is a new array, the kept lines in order. Applied to a stanza that
|
|
35
|
+
* `readDebianPackagesIndex` returns, from Gitea or from the codec for the same
|
|
36
|
+
* control file, it yields the same bytes: the trimmed control text without
|
|
37
|
+
* the index-owned fields, plus a final LF. A non-`Uint8Array` is
|
|
38
|
+
* `invalid-input`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function stripDebianIndexOwnedFields(stanzaArg: Uint8Array): Uint8Array;
|
package/dist_ts/debian/rules.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { decodeLatin1 } from '../readers/text.js';
|
|
2
|
+
import { assertBytes, hasControlCharacter } from '../shared/validation.js';
|
|
3
|
+
import { goTrimSpace } from './gostring.js';
|
|
2
4
|
/** Gitea's distribution and component rule (`modules/packages/debian/metadata.go:67`, applied at upload). */
|
|
3
5
|
export const DEBIAN_SYMBOL_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9.~+_-]*$/;
|
|
4
6
|
/**
|
|
@@ -37,4 +39,81 @@ const POOL_FILE_NAME_REFUSED_PATTERN = /[/#?\s\p{Cc}]/u;
|
|
|
37
39
|
export function hasPoolFileNameRefusedCharacter(textArg) {
|
|
38
40
|
return POOL_FILE_NAME_REFUSED_PATTERN.test(textArg);
|
|
39
41
|
}
|
|
40
|
-
|
|
42
|
+
/**
|
|
43
|
+
* The fields a `Packages` stanza writes itself (`renderDebianPackagesStanza`;
|
|
44
|
+
* Gitea `services/packages/debian/repository.go:202-209`): `Filename`,
|
|
45
|
+
* `Size`, `MD5sum`, `SHA1`, `SHA256`, `SHA512`.
|
|
46
|
+
*/
|
|
47
|
+
const INDEX_OWNED_FIELDS = new Set(['filename', 'size', 'md5sum', 'sha1', 'sha256', 'sha512']);
|
|
48
|
+
const LF = 0x0a;
|
|
49
|
+
/**
|
|
50
|
+
* Whether the bytes before a line's first `:` name an index-owned field: Go
|
|
51
|
+
* `strings.TrimSpace` of them, matched ASCII case-insensitively. Every other
|
|
52
|
+
* byte is compared as is, so no non-ASCII text matches (for these six names
|
|
53
|
+
* this equals `toLowerCase()` on the decoded name, the renderer's former rule).
|
|
54
|
+
*/
|
|
55
|
+
function isIndexOwnedFieldName(nameArg) {
|
|
56
|
+
const name = goTrimSpace(decodeLatin1(nameArg));
|
|
57
|
+
if (name.length < 4 || name.length > 8) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
let lower = '';
|
|
61
|
+
for (let i = 0; i < name.length; i++) {
|
|
62
|
+
const code = name.charCodeAt(i);
|
|
63
|
+
lower += String.fromCharCode(code >= 0x41 && code <= 0x5a ? code + 0x20 : code);
|
|
64
|
+
}
|
|
65
|
+
return INDEX_OWNED_FIELDS.has(lower);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* The stanza without its index-owned fields: `Filename`, `Size`, `MD5sum`,
|
|
69
|
+
* `SHA1`, `SHA256` and `SHA512`, matched ASCII case-insensitively on the Go
|
|
70
|
+
* `TrimSpace` of the bytes before the line's first `:`, each with its
|
|
71
|
+
* continuation lines. The one line walk `renderDebianPackagesStanza` applies
|
|
72
|
+
* to a record's control text, on bytes:
|
|
73
|
+
* - a line starting with a space or tab follows the dropping state of its field;
|
|
74
|
+
* - otherwise the field is dropped exactly when its name is one of the six;
|
|
75
|
+
* - a line without a `:` is kept and ends dropping.
|
|
76
|
+
*
|
|
77
|
+
* Lines end at LF and keep it; a final line without LF is a line too. The
|
|
78
|
+
* result is a new array, the kept lines in order. Applied to a stanza that
|
|
79
|
+
* `readDebianPackagesIndex` returns, from Gitea or from the codec for the same
|
|
80
|
+
* control file, it yields the same bytes: the trimmed control text without
|
|
81
|
+
* the index-owned fields, plus a final LF. A non-`Uint8Array` is
|
|
82
|
+
* `invalid-input`.
|
|
83
|
+
*/
|
|
84
|
+
export function stripDebianIndexOwnedFields(stanzaArg) {
|
|
85
|
+
assertBytes(stanzaArg, 'stanza');
|
|
86
|
+
const kept = [];
|
|
87
|
+
let total = 0;
|
|
88
|
+
let dropping = false;
|
|
89
|
+
let start = 0;
|
|
90
|
+
while (start < stanzaArg.length) {
|
|
91
|
+
const lineFeed = stanzaArg.indexOf(LF, start);
|
|
92
|
+
const end = lineFeed < 0 ? stanzaArg.length : lineFeed + 1;
|
|
93
|
+
const first = stanzaArg[start];
|
|
94
|
+
if (first === 0x20 || first === 0x09) {
|
|
95
|
+
if (!dropping) {
|
|
96
|
+
kept.push(stanzaArg.subarray(start, end));
|
|
97
|
+
total += end - start;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
const lineEnd = lineFeed < 0 ? stanzaArg.length : lineFeed;
|
|
102
|
+
const colon = stanzaArg.subarray(start, lineEnd).indexOf(0x3a);
|
|
103
|
+
dropping = colon >= 0 && isIndexOwnedFieldName(stanzaArg.subarray(start, start + colon));
|
|
104
|
+
if (!dropping) {
|
|
105
|
+
kept.push(stanzaArg.subarray(start, end));
|
|
106
|
+
total += end - start;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
start = end;
|
|
110
|
+
}
|
|
111
|
+
const result = new Uint8Array(total);
|
|
112
|
+
let offset = 0;
|
|
113
|
+
for (const line of kept) {
|
|
114
|
+
result.set(line, offset);
|
|
115
|
+
offset += line.length;
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZWJpYW4vcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUMzRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTVDLDZHQUE2RztBQUM3RyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUV0RTs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FBQyxRQUFnQjtJQUM3QyxPQUFPLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFFBQWdCO0lBQ25ELE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLFFBQVEsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLEtBQUssUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzNILENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sOEJBQThCLEdBQUcsZ0JBQWdCLENBQUM7QUFFeEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0JBQStCLENBQUMsT0FBZTtJQUM3RCxPQUFPLDhCQUE4QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQXdCLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FB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
|
package/dist_ts/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { TLinuxPackageFormat, ILinuxPackageDigests, IAlpinePackageDigests, ILinuxPackageRecordBase, IAlpinePackageMetadata, IAlpinePackageRecord, IDebianPackageMetadata, IDebianPackageRecord, IRpmDependency, IRpmFile, IRpmChangelog, IRpmPackageMetadata, IRpmPackageRecord, IRpmUpdate, IRpmUpdateReference, IRpmUpdateCollection, IRpmUpdatePackage, IArchPackageMetadata, IArchPackageRecord, TLinuxPackageRecord, TLinuxIndexFileStage, ILinuxIndexFile, } from './shared/types.js';
|
|
1
|
+
export type { TLinuxPackageFormat, ILinuxPackageDigests, IAlpinePackageDigests, ILinuxPackageRecordBase, IAlpinePackageMetadata, IAlpinePackageRecord, IDebianPackageMetadata, IDebianPackageRecord, IRpmDependency, IRpmFile, IRpmChangelog, IRpmPackageMetadata, IRpmPackageRecord, IRpmUpdate, IRpmUpdateReference, IRpmUpdateCollection, IRpmUpdatePackage, IArchPackageMetadata, IArchPackageRecord, TLinuxPackageRecord, TLinuxIndexFileStage, ILinuxIndexFile, TLinuxCompression, } from './shared/types.js';
|
|
2
2
|
export { DEFAULT_LINUX_PACKAGE_LIMITS } from './shared/limits.js';
|
|
3
3
|
export type { ILinuxPackageLimits } from './shared/limits.js';
|
|
4
4
|
export { LinuxRepoError } from './shared/errors.js';
|
|
@@ -6,22 +6,32 @@ export type { TLinuxRepoErrorCode, ILinuxRepoErrorDetail } from './shared/errors
|
|
|
6
6
|
export { isIndexableArchitecture } from './shared/architecture.js';
|
|
7
7
|
export { createAlpineSigner, createOpenPgpSigner } from './signing/signers.js';
|
|
8
8
|
export type { IAlpineSigner, IOpenPgpSigner } from './signing/signers.js';
|
|
9
|
-
export { createOpenPgpVerifier } from './signing/verifiers.js';
|
|
10
|
-
export type { IOpenPgpCleartextVerification, IOpenPgpSignatureVerification, IOpenPgpVerifier, TOpenPgpHashAlgorithm, } from './signing/verifiers.js';
|
|
9
|
+
export { createAlpineVerifier, createOpenPgpVerifier } from './signing/verifiers.js';
|
|
10
|
+
export type { IAlpineSignatureVerification, IAlpineVerifier, IOpenPgpCleartextVerification, IOpenPgpSignatureVerification, IOpenPgpVerifier, TOpenPgpHashAlgorithm, } from './signing/verifiers.js';
|
|
11
11
|
export { generateAlpineKeyPair, generateOpenPgpKeyPair, giteaAlpineKeyName } from './signing/keys.js';
|
|
12
12
|
export type { IAlpineKeyPair, IOpenPgpKeyPair } from './signing/keys.js';
|
|
13
13
|
export { readDebianPackage } from './debian/reader.js';
|
|
14
14
|
export { buildDebianIndex } from './debian/indexbuilder.js';
|
|
15
15
|
export type { IDebianIndexEntry } from './debian/indexbuilder.js';
|
|
16
|
-
export { isDebianReleaseValue, isDebianSymbol } from './debian/rules.js';
|
|
16
|
+
export { isDebianReleaseValue, isDebianSymbol, stripDebianIndexOwnedFields } from './debian/rules.js';
|
|
17
|
+
export { readDebianPackagesIndex, readDebianRelease } from './debian/indexreader.js';
|
|
18
|
+
export type { IDebianPackagesIndex, IDebianPackagesStanza, IDebianRelease, IDebianReleaseField, IDebianReleaseFile, } from './debian/indexreader.js';
|
|
17
19
|
export { readRpmPackage } from './rpm/reader.js';
|
|
18
20
|
export { signRpmPackage } from './rpm/sign.js';
|
|
19
21
|
export { buildRpmIndex } from './rpm/builder.js';
|
|
20
22
|
export { mergeRpmUpdates } from './rpm/updates.js';
|
|
21
23
|
export { renderRpmRepoConfig } from './rpm/repoconfig.js';
|
|
24
|
+
export { isRpmPrimaryPath } from './rpm/repodata.js';
|
|
25
|
+
export { readRpmRepodata, readRpmRepomd, readRpmUpdateInfo } from './rpm/repodatareader.js';
|
|
26
|
+
export type { IRpmRepodata, IRpmRepodataFile, IRpmRepodataPackage, IRpmRepomd, IRpmRepomdChecksum, IRpmRepomdData, IRpmRepomdElement, IRpmUpdateInfo, IRpmUpdateInfoPackage, IRpmUpdateInfoUpdate, IRpmXmlAttribute, IRpmXmlFrame, TRpmRepodataDocument, } from './rpm/repodatareader.js';
|
|
22
27
|
export { readArchPackage } from './arch/reader.js';
|
|
23
28
|
export { buildArchIndex } from './arch/builder.js';
|
|
24
29
|
export type { IArchIndexEntry } from './arch/builder.js';
|
|
25
30
|
export { signArchPackage } from './arch/signer.js';
|
|
31
|
+
export { compareArchVersions } from './arch/vercmp.js';
|
|
32
|
+
export { readArchIndex } from './arch/indexreader.js';
|
|
33
|
+
export type { IArchIndex, IArchIndexMember } from './arch/indexreader.js';
|
|
26
34
|
export { readAlpinePackage } from './alpine/reader.js';
|
|
27
35
|
export { buildAlpineIndex } from './alpine/apkindex.js';
|
|
36
|
+
export { readAlpineIndex } from './alpine/apkindexreader.js';
|
|
37
|
+
export type { IAlpineIndex, IAlpineIndexBlock, IAlpineIndexMember, IAlpineIndexSignatureEntry, } from './alpine/apkindexreader.js';
|
package/dist_ts/index.js
CHANGED
|
@@ -2,19 +2,25 @@ export { DEFAULT_LINUX_PACKAGE_LIMITS } from './shared/limits.js';
|
|
|
2
2
|
export { LinuxRepoError } from './shared/errors.js';
|
|
3
3
|
export { isIndexableArchitecture } from './shared/architecture.js';
|
|
4
4
|
export { createAlpineSigner, createOpenPgpSigner } from './signing/signers.js';
|
|
5
|
-
export { createOpenPgpVerifier } from './signing/verifiers.js';
|
|
5
|
+
export { createAlpineVerifier, createOpenPgpVerifier } from './signing/verifiers.js';
|
|
6
6
|
export { generateAlpineKeyPair, generateOpenPgpKeyPair, giteaAlpineKeyName } from './signing/keys.js';
|
|
7
7
|
export { readDebianPackage } from './debian/reader.js';
|
|
8
8
|
export { buildDebianIndex } from './debian/indexbuilder.js';
|
|
9
|
-
export { isDebianReleaseValue, isDebianSymbol } from './debian/rules.js';
|
|
9
|
+
export { isDebianReleaseValue, isDebianSymbol, stripDebianIndexOwnedFields } from './debian/rules.js';
|
|
10
|
+
export { readDebianPackagesIndex, readDebianRelease } from './debian/indexreader.js';
|
|
10
11
|
export { readRpmPackage } from './rpm/reader.js';
|
|
11
12
|
export { signRpmPackage } from './rpm/sign.js';
|
|
12
13
|
export { buildRpmIndex } from './rpm/builder.js';
|
|
13
14
|
export { mergeRpmUpdates } from './rpm/updates.js';
|
|
14
15
|
export { renderRpmRepoConfig } from './rpm/repoconfig.js';
|
|
16
|
+
export { isRpmPrimaryPath } from './rpm/repodata.js';
|
|
17
|
+
export { readRpmRepodata, readRpmRepomd, readRpmUpdateInfo } from './rpm/repodatareader.js';
|
|
15
18
|
export { readArchPackage } from './arch/reader.js';
|
|
16
19
|
export { buildArchIndex } from './arch/builder.js';
|
|
17
20
|
export { signArchPackage } from './arch/signer.js';
|
|
21
|
+
export { compareArchVersions } from './arch/vercmp.js';
|
|
22
|
+
export { readArchIndex } from './arch/indexreader.js';
|
|
18
23
|
export { readAlpinePackage } from './alpine/reader.js';
|
|
19
24
|
export { buildAlpineIndex } from './alpine/apkindex.js';
|
|
20
|
-
|
|
25
|
+
export { readAlpineIndex } from './alpine/apkindexreader.js';
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF5QkEsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBU3JGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTVELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxjQUFjLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVFyRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFnQjVGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUMifQ==
|