@foss.global/gitmanager 0.5.0 → 0.7.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/changelog.md +18 -0
- package/dist_rust/rustgitmanager_linux_amd64 +0 -0
- package/dist_rust/rustgitmanager_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.gitmanager.js +15 -1
- package/dist_ts/models.d.ts +20 -0
- package/package.json +1 -1
- package/readme.md +18 -7
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.gitmanager.ts +17 -0
- package/ts/models.ts +24 -0
package/changelog.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-07-20 - 0.7.0
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- support trusted private reads through smart HTTP (smart-http)
|
|
8
|
+
- Add optional `privateRead` configuration with a constant-time trusted ingress token check.
|
|
9
|
+
- Preserve default-deny public visibility while allowing an authenticated loopback ingress to clone and fetch private repositories.
|
|
10
|
+
- Cover trusted and rejected private Git protocol v2 reads in the real transport integration test.
|
|
11
|
+
|
|
12
|
+
## 2026-07-20 - 0.6.0
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
- add trusted receive-pack support to smart HTTP (smart-http)
|
|
17
|
+
- Adds optional receivePack configuration with a trusted ingress token and request body limit.
|
|
18
|
+
- Enables bounded git-receive-pack advertisement and push handling through the Rust Smart HTTP server.
|
|
19
|
+
- Expands tests and documentation for trusted ingress receive-pack behavior.
|
|
20
|
+
|
|
3
21
|
## 2026-07-20 - 0.5.0
|
|
4
22
|
|
|
5
23
|
### Features
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@foss.global/gitmanager',
|
|
6
|
-
version: '0.
|
|
6
|
+
version: '0.7.0',
|
|
7
7
|
description: 'Headless Git manager for the foss.global Git platform, with a TypeScript API and Rust engine.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx5QkFBeUI7SUFDL0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLCtGQUErRjtDQUM3RyxDQUFBIn0=
|
|
@@ -31,6 +31,20 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
31
31
|
processTimeoutMs: smartHttpOptions.processTimeoutMs ?? 30 * 60 * 1000,
|
|
32
32
|
idleTimeoutSeconds: smartHttpOptions.idleTimeoutSeconds ?? 300,
|
|
33
33
|
gracefulShutdownMs: smartHttpOptions.gracefulShutdownMs ?? 10_000,
|
|
34
|
+
privateRead: smartHttpOptions.privateRead
|
|
35
|
+
&& smartHttpOptions.privateRead.enabled !== false
|
|
36
|
+
? {
|
|
37
|
+
trustedIngressToken: smartHttpOptions.privateRead.trustedIngressToken,
|
|
38
|
+
}
|
|
39
|
+
: undefined,
|
|
40
|
+
receivePack: smartHttpOptions.receivePack
|
|
41
|
+
&& smartHttpOptions.receivePack.enabled !== false
|
|
42
|
+
? {
|
|
43
|
+
trustedIngressToken: smartHttpOptions.receivePack.trustedIngressToken,
|
|
44
|
+
maxRequestBodyBytes: smartHttpOptions.receivePack.maxRequestBodyBytes
|
|
45
|
+
?? 4 * 1024 * 1024 * 1024,
|
|
46
|
+
}
|
|
47
|
+
: undefined,
|
|
34
48
|
}
|
|
35
49
|
: undefined,
|
|
36
50
|
};
|
|
@@ -202,4 +216,4 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
202
216
|
}
|
|
203
217
|
}
|
|
204
218
|
}
|
|
205
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
219
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRtYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5naXRtYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBNkJ4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVuRSxNQUFNLE9BQU8sVUFBVyxTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBT2xELFlBQVksYUFBaUMsRUFBRTtRQUM3QyxLQUFLLEVBQUUsQ0FBQztRQVBGLFdBQU0sR0FBRyxJQUFJLG9CQUFvQixFQUFFLENBQUM7UUFDcEMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixpQkFBWSxHQUF5QixJQUFJLENBQUM7UUFDMUMsa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFLNUIsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE9BQU87ZUFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNaLE9BQU87WUFDUCxXQUFXLEVBQUUsVUFBVSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDO1lBQzlFLGNBQWMsRUFBRSxVQUFVLENBQUMsY0FBYyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUk7WUFDbkUsU0FBUyxFQUFFLGdCQUFnQixJQUFJLGdCQUFnQixDQUFDLE9BQU8sS0FBSyxLQUFLO2dCQUMvRCxDQUFDLENBQUM7b0JBQ0UsV0FBVyxFQUFFLGdCQUFnQixDQUFDLFdBQVcsSUFBSSxXQUFXO29CQUN4RCxJQUFJLEVBQUUsZ0JB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
|
package/dist_ts/models.d.ts
CHANGED
|
@@ -13,6 +13,17 @@ export interface IGitManagerSmartHttpOptions {
|
|
|
13
13
|
processTimeoutMs?: number;
|
|
14
14
|
idleTimeoutSeconds?: number;
|
|
15
15
|
gracefulShutdownMs?: number;
|
|
16
|
+
privateRead?: IGitManagerSmartHttpPrivateReadOptions;
|
|
17
|
+
receivePack?: IGitManagerSmartHttpReceivePackOptions;
|
|
18
|
+
}
|
|
19
|
+
export interface IGitManagerSmartHttpPrivateReadOptions {
|
|
20
|
+
enabled?: boolean;
|
|
21
|
+
trustedIngressToken: string;
|
|
22
|
+
}
|
|
23
|
+
export interface IGitManagerSmartHttpReceivePackOptions {
|
|
24
|
+
enabled?: boolean;
|
|
25
|
+
trustedIngressToken: string;
|
|
26
|
+
maxRequestBodyBytes?: number;
|
|
16
27
|
}
|
|
17
28
|
export interface IGitManagerSmartHttpRepositoryAccess {
|
|
18
29
|
allowAllRepositories: boolean;
|
|
@@ -49,6 +60,15 @@ export interface IRustGitManagerSmartHttpConfig {
|
|
|
49
60
|
processTimeoutMs: number;
|
|
50
61
|
idleTimeoutSeconds: number;
|
|
51
62
|
gracefulShutdownMs: number;
|
|
63
|
+
privateRead?: IRustGitManagerSmartHttpPrivateReadConfig;
|
|
64
|
+
receivePack?: IRustGitManagerSmartHttpReceivePackConfig;
|
|
65
|
+
}
|
|
66
|
+
export interface IRustGitManagerSmartHttpPrivateReadConfig {
|
|
67
|
+
trustedIngressToken: string;
|
|
68
|
+
}
|
|
69
|
+
export interface IRustGitManagerSmartHttpReceivePackConfig {
|
|
70
|
+
trustedIngressToken: string;
|
|
71
|
+
maxRequestBodyBytes: number;
|
|
52
72
|
}
|
|
53
73
|
export interface IRustGitManagerConfig {
|
|
54
74
|
dataDir: string;
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -4,7 +4,7 @@ Headless Git manager for the foss.global Git platform.
|
|
|
4
4
|
|
|
5
5
|
This package follows the push.rocks Rust-backed package pattern: TypeScript owns the public package API and lifecycle, while Rust owns the Git/storage/protocol engine. TypeScript controls the Rust binary through `@push.rocks/smartrust`, and builds use `@git.zone/tsrust`.
|
|
6
6
|
|
|
7
|
-
The current implementation provides lifecycle IPC, local bare repository and mirror management, bounded read APIs, durable repository bundle transfer, and
|
|
7
|
+
The current implementation provides lifecycle IPC, local bare repository and mirror management, bounded read APIs, durable repository bundle transfer, public and trusted-ingress private clone/fetch, and trusted-ingress receive-pack. User identity, permissions, TLS, and durable post-push storage remain the embedding service's responsibility.
|
|
8
8
|
|
|
9
9
|
## Issue Reporting and Security
|
|
10
10
|
|
|
@@ -76,7 +76,7 @@ await gitManager.restoreRepositoryBundle({
|
|
|
76
76
|
|
|
77
77
|
The transfer directory is disposable staging, not persistence. The caller owns upload/download completion and removal of finished transfer files. Durable repository bytes belong in managed object storage.
|
|
78
78
|
|
|
79
|
-
##
|
|
79
|
+
## Git Smart HTTP
|
|
80
80
|
|
|
81
81
|
Smart HTTP is disabled unless a `smartHttp` options object is provided. The safe defaults bind to loopback on an operating-system-assigned port and expose no repositories:
|
|
82
82
|
|
|
@@ -87,6 +87,12 @@ const gitManager = new GitManager({
|
|
|
87
87
|
allowedRepositories: [
|
|
88
88
|
{ org: 'foss.global', repo: 'interfaces' },
|
|
89
89
|
],
|
|
90
|
+
privateRead: {
|
|
91
|
+
trustedIngressToken: process.env.GITMANAGER_INGRESS_TOKEN!,
|
|
92
|
+
},
|
|
93
|
+
receivePack: {
|
|
94
|
+
trustedIngressToken: process.env.GITMANAGER_INGRESS_TOKEN!,
|
|
95
|
+
},
|
|
90
96
|
},
|
|
91
97
|
});
|
|
92
98
|
|
|
@@ -95,9 +101,11 @@ const status = await gitManager.getStatus();
|
|
|
95
101
|
console.log(status.smartHttp?.baseUrl);
|
|
96
102
|
```
|
|
97
103
|
|
|
98
|
-
The server implements `git-upload-pack` for clone and fetch with Git protocol versions 0, 1, and 2. `
|
|
104
|
+
The server implements `git-upload-pack` for clone and fetch with Git protocol versions 0, 1, and 2. Missing and inaccessible read repositories both return the same not-found response. Configuring `privateRead` lets an authenticated loopback ingress grant repository-scoped access by injecting the exact `X-GitManager-Ingress-Token` value after removing any client-supplied copy. Direct private requests still receive the same not-found response.
|
|
99
105
|
|
|
100
|
-
|
|
106
|
+
Configuring `receivePack` enables streamed push only for requests carrying the trusted ingress token. Private reads and receive-pack require a loopback bind even when `allowUnsafeNonLoopback` is set. The trusted ingress must authorize the user and repository; for pushes it must also serialize writes, persist the updated repository, and withhold success if persistence fails.
|
|
107
|
+
|
|
108
|
+
The transport does not terminate TLS or implement user identity. Keep it behind a bounded ingress. Read-only binding to a non-loopback IP is rejected unless `allowUnsafeNonLoopback: true` is set explicitly.
|
|
101
109
|
|
|
102
110
|
Smart HTTP option defaults and accepted ranges:
|
|
103
111
|
|
|
@@ -116,6 +124,9 @@ All numeric options must be integers.
|
|
|
116
124
|
- `processTimeoutMs`: 1,800,000; accepted range 1,000–86,400,000.
|
|
117
125
|
- `idleTimeoutSeconds`: `300`; accepted range 1–3,600.
|
|
118
126
|
- `gracefulShutdownMs`: `10,000`; accepted range 100–60,000.
|
|
127
|
+
- `privateRead.trustedIngressToken`: required when trusted private reads are enabled; 32–512 non-whitespace characters.
|
|
128
|
+
- `receivePack.trustedIngressToken`: required when receive-pack is enabled; 32–512 non-whitespace characters.
|
|
129
|
+
- `receivePack.maxRequestBodyBytes`: 4 GiB; accepted range 1 KiB–16 TiB. Request bodies are streamed and counted.
|
|
119
130
|
|
|
120
131
|
While the service is running, access can be replaced atomically:
|
|
121
132
|
|
|
@@ -173,9 +184,9 @@ When enabled, `getStatus().smartHttp` reports `{ running, bindAddress, port, bas
|
|
|
173
184
|
|
|
174
185
|
Repository/read DTO contracts are re-exported from the published `@foss.global/interfaces` package.
|
|
175
186
|
|
|
176
|
-
Read/list APIs go through JSON IPC. Git packfile streaming
|
|
187
|
+
Read/list APIs go through JSON IPC. Git packfile streaming is served directly by the Rust engine through controlled `git upload-pack` and `git receive-pack` subprocesses; packfiles do not pass through JSON IPC.
|
|
177
188
|
|
|
178
|
-
Read APIs and Smart HTTP use the system `git` CLI with explicit arguments, non-interactive environment variables, command timeouts, ref-to-object-id resolution, path validation, bounded stdout/stderr capture, ref/tree result caps, and a 1 MiB file read cap.
|
|
189
|
+
Read APIs and Smart HTTP use the system `git` CLI with explicit arguments, non-interactive environment variables, command timeouts, ref-to-object-id resolution, path validation, bounded stdout/stderr capture, ref/tree result caps, and a 1 MiB file read cap. Receive-pack streams bounded requests, disables repository hooks, and enables incoming object fsck.
|
|
179
190
|
|
|
180
191
|
## Rust Build
|
|
181
192
|
|
|
@@ -196,7 +207,7 @@ pnpm run test:rust
|
|
|
196
207
|
pnpm run build
|
|
197
208
|
```
|
|
198
209
|
|
|
199
|
-
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, local mirror/read API,
|
|
210
|
+
`pnpm test` runs the `pretest` hook first, which builds the Rust binaries with `tsrust`, and then runs lifecycle, local mirror/read API, clone/fetch denial, trusted receive-pack denial, and real push tests through `smartrust`.
|
|
200
211
|
|
|
201
212
|
## License and Legal Information
|
|
202
213
|
|
package/ts/00_commitinfo_data.ts
CHANGED
package/ts/classes.gitmanager.ts
CHANGED
|
@@ -62,6 +62,23 @@ export class GitManager extends plugins.EventEmitter {
|
|
|
62
62
|
processTimeoutMs: smartHttpOptions.processTimeoutMs ?? 30 * 60 * 1000,
|
|
63
63
|
idleTimeoutSeconds: smartHttpOptions.idleTimeoutSeconds ?? 300,
|
|
64
64
|
gracefulShutdownMs: smartHttpOptions.gracefulShutdownMs ?? 10_000,
|
|
65
|
+
privateRead: smartHttpOptions.privateRead
|
|
66
|
+
&& smartHttpOptions.privateRead.enabled !== false
|
|
67
|
+
? {
|
|
68
|
+
trustedIngressToken:
|
|
69
|
+
smartHttpOptions.privateRead.trustedIngressToken,
|
|
70
|
+
}
|
|
71
|
+
: undefined,
|
|
72
|
+
receivePack: smartHttpOptions.receivePack
|
|
73
|
+
&& smartHttpOptions.receivePack.enabled !== false
|
|
74
|
+
? {
|
|
75
|
+
trustedIngressToken:
|
|
76
|
+
smartHttpOptions.receivePack.trustedIngressToken,
|
|
77
|
+
maxRequestBodyBytes:
|
|
78
|
+
smartHttpOptions.receivePack.maxRequestBodyBytes
|
|
79
|
+
?? 4 * 1024 * 1024 * 1024,
|
|
80
|
+
}
|
|
81
|
+
: undefined,
|
|
65
82
|
}
|
|
66
83
|
: undefined,
|
|
67
84
|
};
|
package/ts/models.ts
CHANGED
|
@@ -14,6 +14,19 @@ export interface IGitManagerSmartHttpOptions {
|
|
|
14
14
|
processTimeoutMs?: number;
|
|
15
15
|
idleTimeoutSeconds?: number;
|
|
16
16
|
gracefulShutdownMs?: number;
|
|
17
|
+
privateRead?: IGitManagerSmartHttpPrivateReadOptions;
|
|
18
|
+
receivePack?: IGitManagerSmartHttpReceivePackOptions;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface IGitManagerSmartHttpPrivateReadOptions {
|
|
22
|
+
enabled?: boolean;
|
|
23
|
+
trustedIngressToken: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface IGitManagerSmartHttpReceivePackOptions {
|
|
27
|
+
enabled?: boolean;
|
|
28
|
+
trustedIngressToken: string;
|
|
29
|
+
maxRequestBodyBytes?: number;
|
|
17
30
|
}
|
|
18
31
|
|
|
19
32
|
export interface IGitManagerSmartHttpRepositoryAccess {
|
|
@@ -59,6 +72,17 @@ export interface IRustGitManagerSmartHttpConfig {
|
|
|
59
72
|
processTimeoutMs: number;
|
|
60
73
|
idleTimeoutSeconds: number;
|
|
61
74
|
gracefulShutdownMs: number;
|
|
75
|
+
privateRead?: IRustGitManagerSmartHttpPrivateReadConfig;
|
|
76
|
+
receivePack?: IRustGitManagerSmartHttpReceivePackConfig;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface IRustGitManagerSmartHttpPrivateReadConfig {
|
|
80
|
+
trustedIngressToken: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export interface IRustGitManagerSmartHttpReceivePackConfig {
|
|
84
|
+
trustedIngressToken: string;
|
|
85
|
+
maxRequestBodyBytes: number;
|
|
62
86
|
}
|
|
63
87
|
|
|
64
88
|
export interface IRustGitManagerConfig {
|