@push.rocks/smartlinuxrepo 1.1.0 → 1.1.1
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/debian/control.d.ts +7 -1
- package/dist_ts/debian/control.js +26 -4
- package/dist_ts/debian/indexbuilder.js +8 -10
- package/dist_ts/debian/rules.d.ts +7 -0
- package/dist_ts/debian/rules.js +20 -1
- package/dist_ts/shared/architecture.d.ts +5 -1
- package/dist_ts/shared/architecture.js +6 -2
- package/package.json +1 -1
- package/readme.md +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/debian/control.ts +25 -3
- package/ts/debian/indexbuilder.ts +11 -9
- package/ts/debian/rules.ts +21 -0
- package/ts/shared/architecture.ts +5 -1
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartlinuxrepo',
|
|
6
|
-
version: '1.1.
|
|
6
|
+
version: '1.1.1',
|
|
7
7
|
description: 'A pure codec for Linux package repositories (Alpine apk, Debian apt, RPM dnf, Arch pacman): read packages into records, build index file sets and sign them.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSw0QkFBNEI7SUFDbEMsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLDhKQUE4SjtDQUM1SyxDQUFBIn0=
|
|
@@ -15,6 +15,12 @@ export interface IDebianControl {
|
|
|
15
15
|
* verbatim, and the Depends text split on `,` (`['']` when there is none).
|
|
16
16
|
*
|
|
17
17
|
* Gitea's scanner refuses lines over 64 KiB; the codec accepts lines up to
|
|
18
|
-
* `maxLineBytes` (`maxHeaderBytes`), which is at least that.
|
|
18
|
+
* `maxLineBytes` (`maxHeaderBytes`), which is at least that. A version that
|
|
19
|
+
* matches Gitea's pattern but holds `/` or `?` (both inside the revision's
|
|
20
|
+
* range) is refused with `invalid-field` (`Version`): no pool file name can
|
|
21
|
+
* hold it (`hasPoolFileNameRefusedCharacter`), where Gitea accepts the upload
|
|
22
|
+
* and then cannot serve it. An Architecture that fails `isIndexableArchitecture`
|
|
23
|
+
* or `hasPoolFileNameRefusedCharacter` (decoded) is refused with
|
|
24
|
+
* `invalid-field` (`Architecture`), where Gitea accepts any non-empty value.
|
|
19
25
|
*/
|
|
20
26
|
export declare function parseDebianControlFile(bytesArg: Uint8Array, maxLineBytesArg: number): IDebianControl;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { isIndexableArchitecture } from '../shared/architecture.js';
|
|
1
2
|
import { LinuxRepoError, limitExceeded } from '../shared/errors.js';
|
|
2
3
|
import { isValidUrl } from '../shared/url.js';
|
|
3
4
|
import { fromByteString, goTrimSpace, toByteString } from './gostring.js';
|
|
5
|
+
import { hasPoolFileNameRefusedCharacter } from './rules.js';
|
|
4
6
|
import { parseMailAddress } from './mailaddress.js';
|
|
5
7
|
/**
|
|
6
8
|
* Gitea 28.2.0 `modules/packages/debian/metadata.go` patterns. In both Go and
|
|
@@ -19,7 +21,13 @@ const VERSION_PATTERN = /^(?:(0|[1-9][0-9]*):)?[a-zA-Z0-9.+~]+(?:-[a-zA-Z0-9.+-~
|
|
|
19
21
|
* verbatim, and the Depends text split on `,` (`['']` when there is none).
|
|
20
22
|
*
|
|
21
23
|
* Gitea's scanner refuses lines over 64 KiB; the codec accepts lines up to
|
|
22
|
-
* `maxLineBytes` (`maxHeaderBytes`), which is at least that.
|
|
24
|
+
* `maxLineBytes` (`maxHeaderBytes`), which is at least that. A version that
|
|
25
|
+
* matches Gitea's pattern but holds `/` or `?` (both inside the revision's
|
|
26
|
+
* range) is refused with `invalid-field` (`Version`): no pool file name can
|
|
27
|
+
* hold it (`hasPoolFileNameRefusedCharacter`), where Gitea accepts the upload
|
|
28
|
+
* and then cannot serve it. An Architecture that fails `isIndexableArchitecture`
|
|
29
|
+
* or `hasPoolFileNameRefusedCharacter` (decoded) is refused with
|
|
30
|
+
* `invalid-field` (`Architecture`), where Gitea accepts any non-empty value.
|
|
23
31
|
*/
|
|
24
32
|
export function parseDebianControlFile(bytesArg, maxLineBytesArg) {
|
|
25
33
|
const text = toByteString(bytesArg);
|
|
@@ -108,7 +116,10 @@ export function parseDebianControlFile(bytesArg, maxLineBytesArg) {
|
|
|
108
116
|
if (version === '') {
|
|
109
117
|
throw new LinuxRepoError('missing-field', 'the control file has no Version field', { field: 'Version' });
|
|
110
118
|
}
|
|
111
|
-
|
|
119
|
+
// a departure from Gitea's version pattern: the revision range admits
|
|
120
|
+
// `/` and `?`, which the pool file name cannot hold, so the version is
|
|
121
|
+
// refused here rather than by buildDebianIndex
|
|
122
|
+
if (!VERSION_PATTERN.test(version) || hasPoolFileNameRefusedCharacter(version)) {
|
|
112
123
|
throw new LinuxRepoError('invalid-field', 'the package version is invalid', {
|
|
113
124
|
field: 'Version',
|
|
114
125
|
value: fromByteString(version),
|
|
@@ -119,10 +130,21 @@ export function parseDebianControlFile(bytesArg, maxLineBytesArg) {
|
|
|
119
130
|
field: 'Architecture',
|
|
120
131
|
});
|
|
121
132
|
}
|
|
133
|
+
// a departure from Gitea, which accepts any non-empty Architecture: the
|
|
134
|
+
// file name embeds it, so it must pass the builder's rules; checked on the
|
|
135
|
+
// decoded text the record carries (on the byte string, `\s` and `\p{Cc}`
|
|
136
|
+
// would match the UTF-8 continuation bytes 0x85 and 0xA0)
|
|
137
|
+
const decodedArchitecture = fromByteString(architecture);
|
|
138
|
+
if (!isIndexableArchitecture(decodedArchitecture) || hasPoolFileNameRefusedCharacter(decodedArchitecture)) {
|
|
139
|
+
throw new LinuxRepoError('invalid-field', 'the package architecture cannot name an index path or pool file', {
|
|
140
|
+
field: 'Architecture',
|
|
141
|
+
value: decodedArchitecture,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
122
144
|
return {
|
|
123
145
|
name,
|
|
124
146
|
version,
|
|
125
|
-
architecture:
|
|
147
|
+
architecture: decodedArchitecture,
|
|
126
148
|
metadata: {
|
|
127
149
|
control: fromByteString(goTrimSpace(control)),
|
|
128
150
|
maintainer: fromByteString(maintainer),
|
|
@@ -132,4 +154,4 @@ export function parseDebianControlFile(bytesArg, maxLineBytesArg) {
|
|
|
132
154
|
},
|
|
133
155
|
};
|
|
134
156
|
}
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
157
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL2RlYmlhbi9jb250cm9sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRTlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRSxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFcEQ7Ozs7R0FJRztBQUNILE1BQU0sWUFBWSxHQUFHLHdCQUF3QixDQUFDO0FBQzlDLE1BQU0sZUFBZSxHQUFHLDhEQUE4RCxDQUFDO0FBU3ZGOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxRQUFvQixFQUFFLGVBQXVCO0lBQ2xGLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwQyxJQUFJLElBQUksR0FBRyxFQUFFLENBQUM7SUFDZCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7SUFDakIsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNwQixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDcEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ2IsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ2pCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNqQixJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUM7SUFFckIsSUFBSSxNQUFNLEdBQUcsQ0FB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
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import * as plugins from '../plugins.js';
|
|
2
2
|
import { isIndexableArchitecture } from '../shared/architecture.js';
|
|
3
3
|
import { LinuxRepoError } from '../shared/errors.js';
|
|
4
|
-
import {
|
|
4
|
+
import { assertString, assertTimestamp } from '../shared/validation.js';
|
|
5
5
|
import { createCleartextSignedMessage, createDetachedArmoredSignature } from '../signing/openpgpframing.js';
|
|
6
6
|
import { compareUtf8, goTrimSpace, utf8ByteString } from './gostring.js';
|
|
7
|
-
import { DEBIAN_SYMBOL_PATTERN, isDebianReleaseValue, isDebianSymbol } from './rules.js';
|
|
7
|
+
import { DEBIAN_SYMBOL_PATTERN, hasPoolFileNameRefusedCharacter, isDebianReleaseValue, isDebianSymbol } from './rules.js';
|
|
8
8
|
/** The fields the `Packages` stanza writes itself; a control file's own copies are dropped. */
|
|
9
9
|
const INDEX_OWNED_FIELDS = new Set(['filename', 'size', 'md5sum', 'sha1', 'sha256', 'sha512']);
|
|
10
10
|
const PACKAGES_FILES = ['Packages', 'Packages.gz', 'Packages.xz'];
|
|
@@ -196,7 +196,8 @@ export function renderDebianPackagesStanza(input) {
|
|
|
196
196
|
}
|
|
197
197
|
/**
|
|
198
198
|
* Refuses a record the index cannot list: wrong format, an architecture that
|
|
199
|
-
* is not a path segment, a file name
|
|
199
|
+
* is not a path segment, a file name apt cannot fetch as one pool path
|
|
200
|
+
* segment (`hasPoolFileNameRefusedCharacter`), digests that are not
|
|
200
201
|
* hex of the right length, or a control text that is not one stanza (empty,
|
|
201
202
|
* or holding a blank line that would start another stanza).
|
|
202
203
|
*/
|
|
@@ -207,12 +208,9 @@ function assertRecord(recordArg) {
|
|
|
207
208
|
if (!isIndexableArchitecture(recordArg.architecture)) {
|
|
208
209
|
throw new LinuxRepoError('invalid-input', `${String(recordArg.fileName)}: architecture "${String(recordArg.architecture)}" cannot name an index path`, { field: 'record.architecture', value: String(recordArg.fileName) });
|
|
209
210
|
}
|
|
210
|
-
|
|
211
|
-
if (
|
|
212
|
-
throw new LinuxRepoError('invalid-input', 'record.fileName must
|
|
213
|
-
field: 'record.fileName',
|
|
214
|
-
value: recordArg.fileName,
|
|
215
|
-
});
|
|
211
|
+
assertString(recordArg.fileName, 'record.fileName');
|
|
212
|
+
if (recordArg.fileName === '' || hasPoolFileNameRefusedCharacter(recordArg.fileName)) {
|
|
213
|
+
throw new LinuxRepoError('invalid-input', 'record.fileName must be non-empty and contain no "/", "#", "?", whitespace or control characters', { field: 'record.fileName', value: recordArg.fileName });
|
|
216
214
|
}
|
|
217
215
|
const digests = recordArg.digests;
|
|
218
216
|
if (digests === null || typeof digests !== 'object' || !Number.isSafeInteger(digests.size) || digests.size < 0) {
|
|
@@ -296,4 +294,4 @@ function formatRfc1123Utc(timestampArg) {
|
|
|
296
294
|
`${timestampArg.getUTCFullYear()} ${pad(timestampArg.getUTCHours())}:${pad(timestampArg.getUTCMinutes())}:` +
|
|
297
295
|
`${pad(timestampArg.getUTCSeconds())} UTC`);
|
|
298
296
|
}
|
|
299
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhidWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGViaWFuL2luZGV4YnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUzRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV6RiwrRkFBK0Y7QUFDL0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUUvRixNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFVLENBQUM7QUFFM0UsTUFBTSxXQUFXLEdBQTJCO0lBQzFDLFFBQVEsRUFBRSwyQkFBMkI7SUFDckMsYUFBYSxFQUFFLGtCQUFrQjtJQUNqQyxhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLE9BQU8sRUFBRSwyQkFBMkI7SUFDcEMsYUFBYSxFQUFFLDJCQUEyQjtJQUMxQyxTQUFTLEVBQUUsMkJBQTJCO0NBQ3ZDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRztJQUNwQixHQUFHLEVBQUUsZ0JBQWdCO0lBQ3JC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
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhidWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvZGViaWFuL2luZGV4YnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFckQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV4RSxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLCtCQUErQixFQUFFLG9CQUFvQixFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUUxSCwrRkFBK0Y7QUFDL0YsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUUvRixNQUFNLGNBQWMsR0FBRyxDQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUUsYUFBYSxDQUFVLENBQUM7QUFFM0UsTUFBTSxXQUFXLEdBQTJCO0lBQzFDLFFBQVEsRUFBRSwyQkFBMkI7SUFDckMsYUFBYSxFQUFFLGtCQUFrQjtJQUNqQyxhQUFhLEVBQUUsa0JBQWtCO0lBQ2pDLE9BQU8sRUFBRSwyQkFBMkI7SUFDcEMsYUFBYSxFQUFFLDJCQUEyQjtJQUMxQyxTQUFTLEVBQUUsMkJBQTJCO0NBQ3ZDLENBQUM7QUFFRixNQUFNLGFBQWEsR0FBRztJQUNwQixHQUFHLEVBQUUsZ0JBQWdCO0lBQ3JC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
|
|
@@ -13,3 +13,10 @@ export declare function isDebianSymbol(valueArg: string): boolean;
|
|
|
13
13
|
* is not one.
|
|
14
14
|
*/
|
|
15
15
|
export declare function isDebianReleaseValue(valueArg: string): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Whether a text holds a character a pool file name must not hold. The one
|
|
18
|
+
* rule both `buildDebianIndex` (on `record.fileName`) and `readDebianPackage`
|
|
19
|
+
* (on the version and the decoded architecture) apply, so the reader never
|
|
20
|
+
* returns a record the builder refuses for its file name.
|
|
21
|
+
*/
|
|
22
|
+
export declare function hasPoolFileNameRefusedCharacter(textArg: string): boolean;
|
package/dist_ts/debian/rules.js
CHANGED
|
@@ -18,4 +18,23 @@ export function isDebianSymbol(valueArg) {
|
|
|
18
18
|
export function isDebianReleaseValue(valueArg) {
|
|
19
19
|
return typeof valueArg === 'string' && valueArg !== '' && !hasControlCharacter(valueArg) && valueArg === valueArg.trim();
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* The characters a pool file name (`<name>_<version>_<architecture>.deb`,
|
|
23
|
+
* written as a `Packages` `Filename`) must not hold: `/`, which would make it
|
|
24
|
+
* more than one path segment; whitespace and control characters, which split
|
|
25
|
+
* or end the field; and `#` and `?`, which apt sends unescaped in the request
|
|
26
|
+
* path (apt 2.6.1 `pkgAcquire::URIEncode` escapes only `%`, `+`, `~`, space,
|
|
27
|
+
* control and non-ASCII bytes), so a server reads the rest as a fragment or a
|
|
28
|
+
* query and apt cannot fetch the file.
|
|
29
|
+
*/
|
|
30
|
+
const POOL_FILE_NAME_REFUSED_PATTERN = /[/#?\s\p{Cc}]/u;
|
|
31
|
+
/**
|
|
32
|
+
* Whether a text holds a character a pool file name must not hold. The one
|
|
33
|
+
* rule both `buildDebianIndex` (on `record.fileName`) and `readDebianPackage`
|
|
34
|
+
* (on the version and the decoded architecture) apply, so the reader never
|
|
35
|
+
* returns a record the builder refuses for its file name.
|
|
36
|
+
*/
|
|
37
|
+
export function hasPoolFileNameRefusedCharacter(textArg) {
|
|
38
|
+
return POOL_FILE_NAME_REFUSED_PATTERN.test(textArg);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9kZWJpYW4vcnVsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFOUQsNkdBQTZHO0FBQzdHLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLGdDQUFnQyxDQUFDO0FBRXRFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzdDLE9BQU8sT0FBTyxRQUFRLEtBQUssUUFBUSxJQUFJLHFCQUFxQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsUUFBZ0I7SUFDbkQsT0FBTyxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksUUFBUSxLQUFLLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDM0gsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSw4QkFBOEIsR0FBRyxnQkFBZ0IsQ0FBQztBQUV4RDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwrQkFBK0IsQ0FBQyxPQUFlO0lBQzdELE9BQU8sOEJBQThCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUMifQ==
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
* Whether an architecture can name an index path segment. Readers record any
|
|
3
3
|
* architecture a package states (Gitea accepts them); builders refuse an entry
|
|
4
4
|
* whose architecture fails this rule with `invalid-input`, and never skip it
|
|
5
|
-
* silently.
|
|
5
|
+
* silently. The exception is `readDebianPackage`: the record's file name
|
|
6
|
+
* (`<name>_<version>_<architecture>.deb`) embeds the architecture, so it
|
|
7
|
+
* refuses one that fails this rule or the pool file name rule with
|
|
8
|
+
* `invalid-field` (`Architecture`), and never returns a record
|
|
9
|
+
* `buildDebianIndex` refuses. Refused: the empty string, `.` and `..`, and any value containing
|
|
6
10
|
* `/`, whitespace or a control character.
|
|
7
11
|
*/
|
|
8
12
|
export declare function isIndexableArchitecture(architectureArg: string): boolean;
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
* Whether an architecture can name an index path segment. Readers record any
|
|
3
3
|
* architecture a package states (Gitea accepts them); builders refuse an entry
|
|
4
4
|
* whose architecture fails this rule with `invalid-input`, and never skip it
|
|
5
|
-
* silently.
|
|
5
|
+
* silently. The exception is `readDebianPackage`: the record's file name
|
|
6
|
+
* (`<name>_<version>_<architecture>.deb`) embeds the architecture, so it
|
|
7
|
+
* refuses one that fails this rule or the pool file name rule with
|
|
8
|
+
* `invalid-field` (`Architecture`), and never returns a record
|
|
9
|
+
* `buildDebianIndex` refuses. Refused: the empty string, `.` and `..`, and any value containing
|
|
6
10
|
* `/`, whitespace or a control character.
|
|
7
11
|
*/
|
|
8
12
|
export function isIndexableArchitecture(architectureArg) {
|
|
@@ -14,4 +18,4 @@ export function isIndexableArchitecture(architectureArg) {
|
|
|
14
18
|
}
|
|
15
19
|
return !/[/\s\p{Cc}]/u.test(architectureArg);
|
|
16
20
|
}
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
21
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl0ZWN0dXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvc2hhcmVkL2FyY2hpdGVjdHVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLGVBQXVCO0lBQzdELElBQUksT0FBTyxlQUFlLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxlQUFlLEtBQUssRUFBRSxJQUFJLGVBQWUsS0FBSyxHQUFHLElBQUksZUFBZSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2xGLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQy9DLENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartlinuxrepo",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A pure codec for Linux package repositories (Alpine apk, Debian apt, RPM dnf, Arch pacman): read packages into records, build index file sets and sign them.",
|
|
6
6
|
"main": "dist_ts/index.js",
|
package/readme.md
CHANGED
|
@@ -138,7 +138,7 @@ const files = await buildDebianIndex({
|
|
|
138
138
|
});
|
|
139
139
|
```
|
|
140
140
|
|
|
141
|
-
`readDebianPackage` reads the `control.tar` member (plain, `.gz`, `.xz` or `.zst`) and hashes the rest of the file without decompressing it. The record keeps Gitea's derived values exactly, and its `fileName` is `<name>_<version>_<architecture>.deb`.
|
|
141
|
+
`readDebianPackage` reads the `control.tar` member (plain, `.gz`, `.xz` or `.zst`) and hashes the rest of the file without decompressing it. The record keeps Gitea's derived values exactly, and its `fileName` is `<name>_<version>_<architecture>.deb`. Two departures from Gitea's control checks keep every record indexable. The version: a version that holds `/` or `?` is refused with `invalid-field` (`detail.field` `Version`), a departure from Gitea's version pattern, which admits both in the revision (its `+-~` class is the range 0x2B-0x7E); no pool file name can hold them, because `/` splits the path and apt sends `?` unescaped, so the server would read the rest as a query. The architecture: Gitea accepts any non-empty Architecture; the reader refuses one that is `.` or `..` or holds `/`, `#`, `?`, whitespace or a control character (`invalid-field`, `detail.field` `Architecture`), because the file name embeds it. `buildDebianIndex` applies the same rules to `record.architecture` and `record.fileName` (`invalid-input`), so every record the reader returns can be indexed.
|
|
142
142
|
|
|
143
143
|
`buildDebianIndex` returns the complete set for one distribution. For every component and architecture with packages it writes `dists/<distribution>/<component>/binary-<architecture>/Packages`, `Packages.gz` and `Packages.xz` (`content` files). Packages of architecture `all` are listed only under `binary-all`, as in Gitea. Then it writes `dists/<distribution>/Release`, its armored detached signature `Release.gpg` and the cleartext-signed `InRelease` (`pointer` files). `distribution` and `component` must match `^[a-zA-Z0-9][a-zA-Z0-9.~+_-]*$` (`isDebianSymbol`); `origin` and `label` are each one non-empty line without surrounding whitespace (`isDebianReleaseValue`). Both predicates are the builder's own rules, for checking configuration before a build. Entries are `IDebianIndexEntry` objects (`{ component, record }`). Your route serves:
|
|
144
144
|
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartlinuxrepo',
|
|
6
|
-
version: '1.1.
|
|
6
|
+
version: '1.1.1',
|
|
7
7
|
description: 'A pure codec for Linux package repositories (Alpine apk, Debian apt, RPM dnf, Arch pacman): read packages into records, build index file sets and sign them.'
|
|
8
8
|
}
|
package/ts/debian/control.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { isIndexableArchitecture } from '../shared/architecture.js';
|
|
1
2
|
import { LinuxRepoError, limitExceeded } from '../shared/errors.js';
|
|
2
3
|
import { isValidUrl } from '../shared/url.js';
|
|
3
4
|
import type { IDebianPackageMetadata } from '../shared/types.js';
|
|
4
5
|
import { fromByteString, goTrimSpace, toByteString } from './gostring.js';
|
|
6
|
+
import { hasPoolFileNameRefusedCharacter } from './rules.js';
|
|
5
7
|
import { parseMailAddress } from './mailaddress.js';
|
|
6
8
|
|
|
7
9
|
/**
|
|
@@ -29,7 +31,13 @@ export interface IDebianControl {
|
|
|
29
31
|
* verbatim, and the Depends text split on `,` (`['']` when there is none).
|
|
30
32
|
*
|
|
31
33
|
* Gitea's scanner refuses lines over 64 KiB; the codec accepts lines up to
|
|
32
|
-
* `maxLineBytes` (`maxHeaderBytes`), which is at least that.
|
|
34
|
+
* `maxLineBytes` (`maxHeaderBytes`), which is at least that. A version that
|
|
35
|
+
* matches Gitea's pattern but holds `/` or `?` (both inside the revision's
|
|
36
|
+
* range) is refused with `invalid-field` (`Version`): no pool file name can
|
|
37
|
+
* hold it (`hasPoolFileNameRefusedCharacter`), where Gitea accepts the upload
|
|
38
|
+
* and then cannot serve it. An Architecture that fails `isIndexableArchitecture`
|
|
39
|
+
* or `hasPoolFileNameRefusedCharacter` (decoded) is refused with
|
|
40
|
+
* `invalid-field` (`Architecture`), where Gitea accepts any non-empty value.
|
|
33
41
|
*/
|
|
34
42
|
export function parseDebianControlFile(bytesArg: Uint8Array, maxLineBytesArg: number): IDebianControl {
|
|
35
43
|
const text = toByteString(bytesArg);
|
|
@@ -121,7 +129,10 @@ export function parseDebianControlFile(bytesArg: Uint8Array, maxLineBytesArg: nu
|
|
|
121
129
|
if (version === '') {
|
|
122
130
|
throw new LinuxRepoError('missing-field', 'the control file has no Version field', { field: 'Version' });
|
|
123
131
|
}
|
|
124
|
-
|
|
132
|
+
// a departure from Gitea's version pattern: the revision range admits
|
|
133
|
+
// `/` and `?`, which the pool file name cannot hold, so the version is
|
|
134
|
+
// refused here rather than by buildDebianIndex
|
|
135
|
+
if (!VERSION_PATTERN.test(version) || hasPoolFileNameRefusedCharacter(version)) {
|
|
125
136
|
throw new LinuxRepoError('invalid-field', 'the package version is invalid', {
|
|
126
137
|
field: 'Version',
|
|
127
138
|
value: fromByteString(version),
|
|
@@ -132,11 +143,22 @@ export function parseDebianControlFile(bytesArg: Uint8Array, maxLineBytesArg: nu
|
|
|
132
143
|
field: 'Architecture',
|
|
133
144
|
});
|
|
134
145
|
}
|
|
146
|
+
// a departure from Gitea, which accepts any non-empty Architecture: the
|
|
147
|
+
// file name embeds it, so it must pass the builder's rules; checked on the
|
|
148
|
+
// decoded text the record carries (on the byte string, `\s` and `\p{Cc}`
|
|
149
|
+
// would match the UTF-8 continuation bytes 0x85 and 0xA0)
|
|
150
|
+
const decodedArchitecture = fromByteString(architecture);
|
|
151
|
+
if (!isIndexableArchitecture(decodedArchitecture) || hasPoolFileNameRefusedCharacter(decodedArchitecture)) {
|
|
152
|
+
throw new LinuxRepoError('invalid-field', 'the package architecture cannot name an index path or pool file', {
|
|
153
|
+
field: 'Architecture',
|
|
154
|
+
value: decodedArchitecture,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
135
157
|
|
|
136
158
|
return {
|
|
137
159
|
name,
|
|
138
160
|
version,
|
|
139
|
-
architecture:
|
|
161
|
+
architecture: decodedArchitecture,
|
|
140
162
|
metadata: {
|
|
141
163
|
control: fromByteString(goTrimSpace(control)),
|
|
142
164
|
maintainer: fromByteString(maintainer),
|
|
@@ -2,11 +2,11 @@ import * as plugins from '../plugins.js';
|
|
|
2
2
|
import { isIndexableArchitecture } from '../shared/architecture.js';
|
|
3
3
|
import { LinuxRepoError } from '../shared/errors.js';
|
|
4
4
|
import type { IDebianPackageRecord, ILinuxIndexFile } from '../shared/types.js';
|
|
5
|
-
import {
|
|
5
|
+
import { assertString, assertTimestamp } from '../shared/validation.js';
|
|
6
6
|
import type { IOpenPgpSigner } from '../signing/signers.js';
|
|
7
7
|
import { createCleartextSignedMessage, createDetachedArmoredSignature } from '../signing/openpgpframing.js';
|
|
8
8
|
import { compareUtf8, goTrimSpace, utf8ByteString } from './gostring.js';
|
|
9
|
-
import { DEBIAN_SYMBOL_PATTERN, isDebianReleaseValue, isDebianSymbol } from './rules.js';
|
|
9
|
+
import { DEBIAN_SYMBOL_PATTERN, hasPoolFileNameRefusedCharacter, isDebianReleaseValue, isDebianSymbol } from './rules.js';
|
|
10
10
|
|
|
11
11
|
/** The fields the `Packages` stanza writes itself; a control file's own copies are dropped. */
|
|
12
12
|
const INDEX_OWNED_FIELDS = new Set(['filename', 'size', 'md5sum', 'sha1', 'sha256', 'sha512']);
|
|
@@ -234,7 +234,8 @@ export function renderDebianPackagesStanza(input: {
|
|
|
234
234
|
|
|
235
235
|
/**
|
|
236
236
|
* Refuses a record the index cannot list: wrong format, an architecture that
|
|
237
|
-
* is not a path segment, a file name
|
|
237
|
+
* is not a path segment, a file name apt cannot fetch as one pool path
|
|
238
|
+
* segment (`hasPoolFileNameRefusedCharacter`), digests that are not
|
|
238
239
|
* hex of the right length, or a control text that is not one stanza (empty,
|
|
239
240
|
* or holding a blank line that would start another stanza).
|
|
240
241
|
*/
|
|
@@ -249,12 +250,13 @@ function assertRecord(recordArg: IDebianPackageRecord): void {
|
|
|
249
250
|
{ field: 'record.architecture', value: String(recordArg.fileName) },
|
|
250
251
|
);
|
|
251
252
|
}
|
|
252
|
-
|
|
253
|
-
if (
|
|
254
|
-
throw new LinuxRepoError(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
253
|
+
assertString(recordArg.fileName, 'record.fileName');
|
|
254
|
+
if (recordArg.fileName === '' || hasPoolFileNameRefusedCharacter(recordArg.fileName)) {
|
|
255
|
+
throw new LinuxRepoError(
|
|
256
|
+
'invalid-input',
|
|
257
|
+
'record.fileName must be non-empty and contain no "/", "#", "?", whitespace or control characters',
|
|
258
|
+
{ field: 'record.fileName', value: recordArg.fileName },
|
|
259
|
+
);
|
|
258
260
|
}
|
|
259
261
|
const digests = recordArg.digests;
|
|
260
262
|
if (digests === null || typeof digests !== 'object' || !Number.isSafeInteger(digests.size) || digests.size < 0) {
|
package/ts/debian/rules.ts
CHANGED
|
@@ -21,3 +21,24 @@ export function isDebianSymbol(valueArg: string): boolean {
|
|
|
21
21
|
export function isDebianReleaseValue(valueArg: string): boolean {
|
|
22
22
|
return typeof valueArg === 'string' && valueArg !== '' && !hasControlCharacter(valueArg) && valueArg === valueArg.trim();
|
|
23
23
|
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* The characters a pool file name (`<name>_<version>_<architecture>.deb`,
|
|
27
|
+
* written as a `Packages` `Filename`) must not hold: `/`, which would make it
|
|
28
|
+
* more than one path segment; whitespace and control characters, which split
|
|
29
|
+
* or end the field; and `#` and `?`, which apt sends unescaped in the request
|
|
30
|
+
* path (apt 2.6.1 `pkgAcquire::URIEncode` escapes only `%`, `+`, `~`, space,
|
|
31
|
+
* control and non-ASCII bytes), so a server reads the rest as a fragment or a
|
|
32
|
+
* query and apt cannot fetch the file.
|
|
33
|
+
*/
|
|
34
|
+
const POOL_FILE_NAME_REFUSED_PATTERN = /[/#?\s\p{Cc}]/u;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Whether a text holds a character a pool file name must not hold. The one
|
|
38
|
+
* rule both `buildDebianIndex` (on `record.fileName`) and `readDebianPackage`
|
|
39
|
+
* (on the version and the decoded architecture) apply, so the reader never
|
|
40
|
+
* returns a record the builder refuses for its file name.
|
|
41
|
+
*/
|
|
42
|
+
export function hasPoolFileNameRefusedCharacter(textArg: string): boolean {
|
|
43
|
+
return POOL_FILE_NAME_REFUSED_PATTERN.test(textArg);
|
|
44
|
+
}
|
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
* Whether an architecture can name an index path segment. Readers record any
|
|
3
3
|
* architecture a package states (Gitea accepts them); builders refuse an entry
|
|
4
4
|
* whose architecture fails this rule with `invalid-input`, and never skip it
|
|
5
|
-
* silently.
|
|
5
|
+
* silently. The exception is `readDebianPackage`: the record's file name
|
|
6
|
+
* (`<name>_<version>_<architecture>.deb`) embeds the architecture, so it
|
|
7
|
+
* refuses one that fails this rule or the pool file name rule with
|
|
8
|
+
* `invalid-field` (`Architecture`), and never returns a record
|
|
9
|
+
* `buildDebianIndex` refuses. Refused: the empty string, `.` and `..`, and any value containing
|
|
6
10
|
* `/`, whitespace or a control character.
|
|
7
11
|
*/
|
|
8
12
|
export function isIndexableArchitecture(architectureArg: string): boolean {
|