@dsh-enhanced/plugin-control-plane 0.1.31 → 0.1.34
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/README.md +352 -4
- package/bin/dsh-local-release-adapter.js +80 -16
- package/bin/dsh-npm-registry-adapter.js +613 -0
- package/bin/dsh-source-adoption-authority.js +12 -0
- package/bin/dsh-source-approval-authority.js +16 -0
- package/bin/dsh-source-release-authority.js +12 -0
- package/bin/dsh-systemd-host-attestor.js +707 -0
- package/bin/dsh-task-observation-authority.js +15 -0
- package/lib/adapter-process.d.ts +23 -0
- package/lib/adapter-process.d.ts.map +1 -0
- package/lib/adapter-process.js +305 -0
- package/lib/adapter-process.js.map +1 -0
- package/lib/adoption-coordinator.d.ts +63 -0
- package/lib/adoption-coordinator.d.ts.map +1 -0
- package/lib/adoption-coordinator.js +241 -0
- package/lib/adoption-coordinator.js.map +1 -0
- package/lib/adoption-handoff.d.ts +16 -0
- package/lib/adoption-handoff.d.ts.map +1 -0
- package/lib/adoption-handoff.js +11 -0
- package/lib/adoption-handoff.js.map +1 -0
- package/lib/attestation.d.ts.map +1 -1
- package/lib/attestation.js +49 -1
- package/lib/attestation.js.map +1 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +29 -2
- package/lib/catalog.js.map +1 -1
- package/lib/cli.d.ts +33 -9
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +624 -178
- package/lib/cli.js.map +1 -1
- package/lib/deployment-readiness.d.ts +38 -0
- package/lib/deployment-readiness.d.ts.map +1 -0
- package/lib/deployment-readiness.js +154 -0
- package/lib/deployment-readiness.js.map +1 -0
- package/lib/effect-blocked-replay.d.ts +81 -0
- package/lib/effect-blocked-replay.d.ts.map +1 -0
- package/lib/effect-blocked-replay.js +259 -0
- package/lib/effect-blocked-replay.js.map +1 -0
- package/lib/errors.d.ts +6 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +9 -0
- package/lib/errors.js.map +1 -0
- package/lib/foreground-deployment-runtime.d.ts +20 -0
- package/lib/foreground-deployment-runtime.d.ts.map +1 -0
- package/lib/foreground-deployment-runtime.js +79 -0
- package/lib/foreground-deployment-runtime.js.map +1 -0
- package/lib/foreground-deployment.d.ts +17 -0
- package/lib/foreground-deployment.d.ts.map +1 -0
- package/lib/foreground-deployment.js +43 -0
- package/lib/foreground-deployment.js.map +1 -0
- package/lib/host-attestor.d.ts +1 -1
- package/lib/host-attestor.d.ts.map +1 -1
- package/lib/host-attestor.js +51 -57
- package/lib/host-attestor.js.map +1 -1
- package/lib/index.d.ts +25 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +11 -2
- package/lib/index.js.map +1 -1
- package/lib/npm-publish.d.ts +25 -0
- package/lib/npm-publish.d.ts.map +1 -0
- package/lib/npm-publish.js +280 -0
- package/lib/npm-publish.js.map +1 -0
- package/lib/owner-task-gap-types.d.ts +21 -0
- package/lib/owner-task-gap-types.d.ts.map +1 -0
- package/lib/owner-task-gap-types.js +2 -0
- package/lib/owner-task-gap-types.js.map +1 -0
- package/lib/owner-task-gaps.d.ts +24 -0
- package/lib/owner-task-gaps.d.ts.map +1 -0
- package/lib/owner-task-gaps.js +74 -0
- package/lib/owner-task-gaps.js.map +1 -0
- package/lib/post-activation.d.ts +33 -0
- package/lib/post-activation.d.ts.map +1 -0
- package/lib/post-activation.js +219 -0
- package/lib/post-activation.js.map +1 -0
- package/lib/registry-fetch.d.ts +50 -0
- package/lib/registry-fetch.d.ts.map +1 -0
- package/lib/registry-fetch.js +267 -0
- package/lib/registry-fetch.js.map +1 -0
- package/lib/release.d.ts +4 -4
- package/lib/release.d.ts.map +1 -1
- package/lib/release.js +142 -56
- package/lib/release.js.map +1 -1
- package/lib/replay-endpoint-protocol.d.ts +65 -0
- package/lib/replay-endpoint-protocol.d.ts.map +1 -0
- package/lib/replay-endpoint-protocol.js +183 -0
- package/lib/replay-endpoint-protocol.js.map +1 -0
- package/lib/replay-endpoint.d.ts +7 -0
- package/lib/replay-endpoint.d.ts.map +1 -0
- package/lib/replay-endpoint.js +193 -0
- package/lib/replay-endpoint.js.map +1 -0
- package/lib/replay-grant.d.ts +62 -0
- package/lib/replay-grant.d.ts.map +1 -0
- package/lib/replay-grant.js +208 -0
- package/lib/replay-grant.js.map +1 -0
- package/lib/replay-journal.d.ts +25 -0
- package/lib/replay-journal.d.ts.map +1 -0
- package/lib/replay-journal.js +275 -0
- package/lib/replay-journal.js.map +1 -0
- package/lib/runtime-observer-protocol.d.ts +63 -0
- package/lib/runtime-observer-protocol.d.ts.map +1 -0
- package/lib/runtime-observer-protocol.js +280 -0
- package/lib/runtime-observer-protocol.js.map +1 -0
- package/lib/runtime-observer.d.ts +8 -0
- package/lib/runtime-observer.d.ts.map +1 -0
- package/lib/runtime-observer.js +182 -0
- package/lib/runtime-observer.js.map +1 -0
- package/lib/service.d.ts +145 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +734 -6
- package/lib/service.js.map +1 -1
- package/lib/source-adoption-authority.d.ts +65 -0
- package/lib/source-adoption-authority.d.ts.map +1 -0
- package/lib/source-adoption-authority.js +271 -0
- package/lib/source-adoption-authority.js.map +1 -0
- package/lib/source-adoption-runner.d.ts +28 -0
- package/lib/source-adoption-runner.d.ts.map +1 -0
- package/lib/source-adoption-runner.js +197 -0
- package/lib/source-adoption-runner.js.map +1 -0
- package/lib/source-approval-authority.d.ts +50 -0
- package/lib/source-approval-authority.d.ts.map +1 -0
- package/lib/source-approval-authority.js +412 -0
- package/lib/source-approval-authority.js.map +1 -0
- package/lib/source-approval-client.d.ts +32 -0
- package/lib/source-approval-client.d.ts.map +1 -0
- package/lib/source-approval-client.js +175 -0
- package/lib/source-approval-client.js.map +1 -0
- package/lib/source-build.d.ts +60 -0
- package/lib/source-build.d.ts.map +1 -0
- package/lib/source-build.js +311 -0
- package/lib/source-build.js.map +1 -0
- package/lib/source-context.d.ts +24 -0
- package/lib/source-context.d.ts.map +1 -0
- package/lib/source-context.js +99 -0
- package/lib/source-context.js.map +1 -0
- package/lib/source-job-types.d.ts +87 -0
- package/lib/source-job-types.d.ts.map +1 -0
- package/lib/source-job-types.js +2 -0
- package/lib/source-job-types.js.map +1 -0
- package/lib/source-jobs.d.ts +113 -0
- package/lib/source-jobs.d.ts.map +1 -0
- package/lib/source-jobs.js +535 -0
- package/lib/source-jobs.js.map +1 -0
- package/lib/source-release-authority.d.ts +35 -0
- package/lib/source-release-authority.d.ts.map +1 -0
- package/lib/source-release-authority.js +271 -0
- package/lib/source-release-authority.js.map +1 -0
- package/lib/source-release-client.d.ts +10 -0
- package/lib/source-release-client.d.ts.map +1 -0
- package/lib/source-release-client.js +24 -0
- package/lib/source-release-client.js.map +1 -0
- package/lib/source-release-runner.d.ts +31 -0
- package/lib/source-release-runner.d.ts.map +1 -0
- package/lib/source-release-runner.js +125 -0
- package/lib/source-release-runner.js.map +1 -0
- package/lib/source-versioning.d.ts +24 -0
- package/lib/source-versioning.d.ts.map +1 -0
- package/lib/source-versioning.js +213 -0
- package/lib/source-versioning.js.map +1 -0
- package/lib/source-workspace.d.ts +117 -0
- package/lib/source-workspace.d.ts.map +1 -0
- package/lib/source-workspace.js +458 -0
- package/lib/source-workspace.js.map +1 -0
- package/lib/sqlite.d.ts +1 -1
- package/lib/sqlite.d.ts.map +1 -1
- package/lib/sqlite.js +509 -7
- package/lib/sqlite.js.map +1 -1
- package/lib/store.d.ts +229 -6
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +2431 -383
- package/lib/store.js.map +1 -1
- package/lib/task-observation-authority.d.ts +29 -0
- package/lib/task-observation-authority.d.ts.map +1 -0
- package/lib/task-observation-authority.js +370 -0
- package/lib/task-observation-authority.js.map +1 -0
- package/lib/task-observation-client.d.ts +4 -0
- package/lib/task-observation-client.d.ts.map +1 -0
- package/lib/task-observation-client.js +20 -0
- package/lib/task-observation-client.js.map +1 -0
- package/lib/task-observation-runtime.d.ts +59 -0
- package/lib/task-observation-runtime.d.ts.map +1 -0
- package/lib/task-observation-runtime.js +331 -0
- package/lib/task-observation-runtime.js.map +1 -0
- package/lib/task-observation-store.d.ts +17 -0
- package/lib/task-observation-store.d.ts.map +1 -0
- package/lib/task-observation-store.js +115 -0
- package/lib/task-observation-store.js.map +1 -0
- package/lib/task-observation-types.d.ts +67 -0
- package/lib/task-observation-types.d.ts.map +1 -0
- package/lib/task-observation-types.js +2 -0
- package/lib/task-observation-types.js.map +1 -0
- package/lib/trust.d.ts +3 -0
- package/lib/trust.d.ts.map +1 -1
- package/lib/trust.js +0 -0
- package/lib/trust.js.map +1 -1
- package/lib/types.d.ts +275 -8
- package/lib/types.d.ts.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +40 -5
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Owner-operated, finite source-approval boundary.
|
|
3
|
+
*
|
|
4
|
+
* This module has no Cordis service and never executes a candidate. It can
|
|
5
|
+
* only sign one pending, owner-bound prepared source plan after independently
|
|
6
|
+
* re-reading the control database and the checked Git worktree.
|
|
7
|
+
*/
|
|
8
|
+
import { createHash, createPrivateKey, sign } from 'node:crypto';
|
|
9
|
+
import { constants as fsConstants, closeSync, fstatSync, lstatSync, openSync, readFileSync, realpathSync } from 'node:fs';
|
|
10
|
+
import { dirname, isAbsolute, relative, resolve, sep } from 'node:path';
|
|
11
|
+
import { DatabaseSync } from 'node:sqlite';
|
|
12
|
+
import { approvalSigningPayload, parseApprovalReceipt } from './approval.js';
|
|
13
|
+
import { PREPARED_SOURCE_BUILD_SCRIPT } from './source-build.js';
|
|
14
|
+
import { controlPlaneDigest, readOwnerPreparedSourcePlan } from './store.js';
|
|
15
|
+
import { PROTECTED_PLUGIN_DENYLIST, changedSourcePaths, checkedSourceSnapshot, runLocalCommand } from './source-workspace.js';
|
|
16
|
+
import { verifyManagedPatchVersion } from './source-versioning.js';
|
|
17
|
+
const ID = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,159}$/u;
|
|
18
|
+
const DIGEST = /^[a-f0-9]{64}$/u;
|
|
19
|
+
const COMMIT = /^[a-f0-9]{40}$/u;
|
|
20
|
+
const SOURCE_FILE = /^plugins\/([a-z][a-z0-9]*(?:-[a-z0-9]+)*)\/src\/.+\.(?:ts|js|mts|mjs)$/u;
|
|
21
|
+
const SOURCE_TEST_PATH = /(?:^|\/)(?:__tests__|test|tests)(?:\/|$)|\.(?:spec|test)\.(?:ts|js|mts|mjs)$/u;
|
|
22
|
+
const MAX_CONFIG_BYTES = 32_768;
|
|
23
|
+
const MAX_REQUEST_BYTES = 8_192;
|
|
24
|
+
const MAX_KEY_BYTES = 32_768;
|
|
25
|
+
class SourceApprovalAuthorityError extends Error {
|
|
26
|
+
constructor(message = 'source approval authority refused the request') { super(message); this.name = 'SourceApprovalAuthorityError'; }
|
|
27
|
+
}
|
|
28
|
+
function fail() { throw new SourceApprovalAuthorityError(); }
|
|
29
|
+
function record(value) {
|
|
30
|
+
if (typeof value !== 'object' || value === null || Array.isArray(value))
|
|
31
|
+
fail();
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function exactKeys(value, expected) {
|
|
35
|
+
if (Object.keys(value).sort().join('\0') !== [...expected].sort().join('\0'))
|
|
36
|
+
fail();
|
|
37
|
+
}
|
|
38
|
+
function text(value, pattern = ID, maximum = 160) {
|
|
39
|
+
if (typeof value !== 'string' || value.normalize('NFC').trim() !== value || !pattern.test(value)
|
|
40
|
+
|| Buffer.byteLength(value) > maximum || /[\p{Cc}]/u.test(value))
|
|
41
|
+
fail();
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
function pathText(value) {
|
|
45
|
+
const path = text(value, /^[\s\S]+$/u, 4_096);
|
|
46
|
+
if (!isAbsolute(path) || path === '/' || resolve(path) !== path)
|
|
47
|
+
fail();
|
|
48
|
+
return path;
|
|
49
|
+
}
|
|
50
|
+
function integer(value, minimum, maximum = Number.MAX_SAFE_INTEGER) {
|
|
51
|
+
if (!Number.isSafeInteger(value) || value < minimum || value > maximum)
|
|
52
|
+
fail();
|
|
53
|
+
return value;
|
|
54
|
+
}
|
|
55
|
+
export function sourceAuthorityCanonicalSafePath(path, kind, createFile = false) {
|
|
56
|
+
const uid = process.getuid?.();
|
|
57
|
+
const parent = dirname(path);
|
|
58
|
+
let parentStat;
|
|
59
|
+
try {
|
|
60
|
+
parentStat = lstatSync(parent);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
fail();
|
|
64
|
+
}
|
|
65
|
+
if (!parentStat.isDirectory() || parentStat.isSymbolicLink()
|
|
66
|
+
|| (kind === 'file' && ((parentStat.mode & 0o077) !== 0 || (uid !== undefined && parentStat.uid !== uid))))
|
|
67
|
+
fail();
|
|
68
|
+
if (createFile) {
|
|
69
|
+
try {
|
|
70
|
+
const created = openSync(path, fsConstants.O_CREAT | fsConstants.O_EXCL | fsConstants.O_RDWR, 0o600);
|
|
71
|
+
closeSync(created);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (!(error instanceof Error) || !('code' in error) || error.code !== 'EEXIST')
|
|
75
|
+
fail();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
let stat;
|
|
79
|
+
try {
|
|
80
|
+
stat = lstatSync(path);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
fail();
|
|
84
|
+
}
|
|
85
|
+
if ((kind === 'file' ? !stat.isFile() : !stat.isDirectory()) || stat.isSymbolicLink() || (kind === 'file' && stat.nlink !== 1)
|
|
86
|
+
|| (stat.mode & 0o077) !== 0 || (uid !== undefined && stat.uid !== uid) || realpathSync(path) !== path)
|
|
87
|
+
fail();
|
|
88
|
+
return path;
|
|
89
|
+
}
|
|
90
|
+
export function sourceAuthorityCanonicalRepository(path) {
|
|
91
|
+
const uid = process.getuid?.();
|
|
92
|
+
let stat;
|
|
93
|
+
try {
|
|
94
|
+
stat = lstatSync(path);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
fail();
|
|
98
|
+
}
|
|
99
|
+
if (!stat.isDirectory() || stat.isSymbolicLink() || (stat.mode & 0o022) !== 0
|
|
100
|
+
|| (uid !== undefined && stat.uid !== uid) || realpathSync(path) !== path)
|
|
101
|
+
fail();
|
|
102
|
+
return path;
|
|
103
|
+
}
|
|
104
|
+
export function sourceAuthorityReadSafeFile(path, maximum) {
|
|
105
|
+
sourceAuthorityCanonicalSafePath(path, 'file');
|
|
106
|
+
const fd = openSync(path, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);
|
|
107
|
+
try {
|
|
108
|
+
const before = fstatSync(fd, { bigint: true });
|
|
109
|
+
const named = lstatSync(path, { bigint: true });
|
|
110
|
+
if (!before.isFile() || before.nlink !== 1n || before.size > BigInt(maximum) || before.dev !== named.dev || before.ino !== named.ino)
|
|
111
|
+
fail();
|
|
112
|
+
const bytes = readFileSync(fd);
|
|
113
|
+
const after = fstatSync(fd, { bigint: true });
|
|
114
|
+
const namedAfter = lstatSync(path, { bigint: true });
|
|
115
|
+
if (bytes.length > maximum || before.dev !== after.dev || before.ino !== after.ino || after.dev !== namedAfter.dev || after.ino !== namedAfter.ino)
|
|
116
|
+
fail();
|
|
117
|
+
return bytes;
|
|
118
|
+
}
|
|
119
|
+
finally {
|
|
120
|
+
closeSync(fd);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function equivalentOwner(left, right) {
|
|
124
|
+
return left.authorityId === right.authorityId && left.authorityHash === right.authorityHash
|
|
125
|
+
&& left.principalId === right.principalId && left.principalRecordId === right.principalRecordId
|
|
126
|
+
&& left.principalVersion === right.principalVersion && left.workspace === right.workspace && left.agentPreset === right.agentPreset;
|
|
127
|
+
}
|
|
128
|
+
export function sourceAuthorityEnvironment() {
|
|
129
|
+
const path = process.env.PATH;
|
|
130
|
+
if (path === undefined || path === '')
|
|
131
|
+
fail();
|
|
132
|
+
return Object.freeze({ PATH: path, LANG: 'C', LC_ALL: 'C', GIT_CONFIG_NOSYSTEM: '1', GIT_CONFIG_GLOBAL: '/dev/null',
|
|
133
|
+
GIT_OPTIONAL_LOCKS: '0', GIT_TERMINAL_PROMPT: '0', HOME: '/nonexistent' });
|
|
134
|
+
}
|
|
135
|
+
function validateRequest(value) {
|
|
136
|
+
const item = record(value);
|
|
137
|
+
exactKeys(item, ['protocol', 'planId', 'planDigest', 'sourceReferenceDigest']);
|
|
138
|
+
if (item.protocol !== 'dsh-source-approval/v1')
|
|
139
|
+
fail();
|
|
140
|
+
const planId = text(item.planId);
|
|
141
|
+
const planDigest = text(item.planDigest, DIGEST, 64);
|
|
142
|
+
const sourceReferenceDigest = text(item.sourceReferenceDigest, DIGEST, 64);
|
|
143
|
+
return Object.freeze({ protocol: 'dsh-source-approval/v1', planId, planDigest, sourceReferenceDigest });
|
|
144
|
+
}
|
|
145
|
+
export function validateSourceApprovalAuthorityConfig(value) {
|
|
146
|
+
const item = record(value);
|
|
147
|
+
exactKeys(item, ['schemaVersion', 'authority', 'keyId', 'keyPath', 'statePath', 'controlDatabasePath', 'grant']);
|
|
148
|
+
if (item.schemaVersion !== 1)
|
|
149
|
+
fail();
|
|
150
|
+
const grant = record(item.grant);
|
|
151
|
+
exactKeys(grant, ['id', 'expiresAt', 'maxApprovals', 'repository', 'worktreeRoot', 'owner', 'plugins', 'maxChangedFiles', 'maxChangedBytes', 'receiptTtlMs',
|
|
152
|
+
...(Object.hasOwn(grant, 'versioning') ? ['versioning'] : [])]);
|
|
153
|
+
if (Object.hasOwn(grant, 'versioning') && grant.versioning !== 'patch')
|
|
154
|
+
fail();
|
|
155
|
+
text(item.authority);
|
|
156
|
+
text(item.keyId);
|
|
157
|
+
const keyPath = pathText(item.keyPath);
|
|
158
|
+
const statePath = pathText(item.statePath);
|
|
159
|
+
const controlDatabasePath = pathText(item.controlDatabasePath);
|
|
160
|
+
if (new Set([keyPath, statePath, controlDatabasePath]).size !== 3)
|
|
161
|
+
fail();
|
|
162
|
+
text(grant.id);
|
|
163
|
+
integer(grant.expiresAt, 1);
|
|
164
|
+
integer(grant.maxApprovals, 1, 10_000);
|
|
165
|
+
pathText(grant.repository);
|
|
166
|
+
pathText(grant.worktreeRoot);
|
|
167
|
+
const owner = record(grant.owner);
|
|
168
|
+
exactKeys(owner, ['authorityId', 'authorityHash', 'principalId', 'principalRecordId', 'principalVersion', 'workspace', 'agentPreset']);
|
|
169
|
+
text(owner.authorityId);
|
|
170
|
+
text(owner.authorityHash, DIGEST, 64);
|
|
171
|
+
text(owner.principalId, /^[\s\S]+$/u, 512);
|
|
172
|
+
text(owner.principalRecordId, /^[\s\S]+$/u, 512);
|
|
173
|
+
integer(owner.principalVersion, 1);
|
|
174
|
+
pathText(owner.workspace);
|
|
175
|
+
text(owner.agentPreset);
|
|
176
|
+
if (!Array.isArray(grant.plugins) || grant.plugins.length === 0 || grant.plugins.length > 32)
|
|
177
|
+
fail();
|
|
178
|
+
const plugins = grant.plugins.map(plugin => text(plugin, /^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/u, 64));
|
|
179
|
+
if (new Set(plugins).size !== plugins.length || plugins.some(plugin => PROTECTED_PLUGIN_DENYLIST.has(plugin)))
|
|
180
|
+
fail();
|
|
181
|
+
integer(grant.maxChangedFiles, 1, 256);
|
|
182
|
+
integer(grant.maxChangedBytes, 1, 16 * 1024 * 1024);
|
|
183
|
+
integer(grant.receiptTtlMs, 1_000, 86_400_000);
|
|
184
|
+
}
|
|
185
|
+
export function sourceAuthorityValidatePrepared(plan, now, status = 'pending-approval') {
|
|
186
|
+
if (plan.status !== status || plan.mode !== 'modify' || plan.sourceCheck === undefined || plan.preparedEvidence === undefined
|
|
187
|
+
|| now > plan.expiresAt || plan.preparedEvidence.preparedAt > plan.sourceCheck.checkedAt || plan.sourceCheck.checkedAt > plan.createdAt
|
|
188
|
+
|| plan.preparedEvidence.preparedAt > now || plan.preparedEvidence.environment.npmConfigIgnoreScripts !== true
|
|
189
|
+
|| plan.preparedEvidence.environment.frozenLockfile !== true || plan.preparedEvidence.environment.offline !== true
|
|
190
|
+
|| plan.preparedEvidence.commands.length !== 1)
|
|
191
|
+
fail();
|
|
192
|
+
const command = plan.preparedEvidence.commands[0];
|
|
193
|
+
const pairs = (left, right) => command.args.some((value, index) => value === left && command.args[index + 1] === right);
|
|
194
|
+
if (command.command !== 'docker' || command.args[0] !== 'run' || command.args[1] !== '-i' || command.args[2] !== '--pull'
|
|
195
|
+
|| command.args[3] !== 'never' || !pairs('--network', 'none') || !command.args.includes('--read-only')
|
|
196
|
+
|| !pairs('--cap-drop', 'ALL') || !pairs('--user', '65534:65534') || !pairs('--entrypoint', '/bin/sh')
|
|
197
|
+
|| !pairs('--env', `PLUGIN_ROOT=plugins/${plan.name}`) || command.args.at(-2) !== '-ceu'
|
|
198
|
+
|| command.args.at(-1) !== PREPARED_SOURCE_BUILD_SCRIPT)
|
|
199
|
+
fail();
|
|
200
|
+
}
|
|
201
|
+
export async function sourceAuthorityValidateWorktree(plan, grant) {
|
|
202
|
+
if (!COMMIT.test(plan.baseCommit) || PROTECTED_PLUGIN_DENYLIST.has(plan.name) || !grant.plugins.includes(plan.name))
|
|
203
|
+
fail();
|
|
204
|
+
const repository = sourceAuthorityCanonicalRepository(grant.repository);
|
|
205
|
+
const worktreeRoot = sourceAuthorityCanonicalSafePath(grant.worktreeRoot, 'directory');
|
|
206
|
+
const worktree = sourceAuthorityCanonicalSafePath(plan.worktree, 'directory');
|
|
207
|
+
const worktreeRelative = relative(worktreeRoot, worktree);
|
|
208
|
+
if (plan.repository !== repository || worktreeRelative === '' || worktreeRelative === '..' || worktreeRelative.startsWith(`..${sep}`) || isAbsolute(worktreeRelative))
|
|
209
|
+
fail();
|
|
210
|
+
const environment = sourceAuthorityEnvironment();
|
|
211
|
+
const head = (await runLocalCommand('git', ['rev-parse', '--verify', 'HEAD^{commit}'], worktree, environment, { capture: true })).trim();
|
|
212
|
+
if (head !== plan.baseCommit)
|
|
213
|
+
fail();
|
|
214
|
+
const repositoryCommon = (await runLocalCommand('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], repository, environment, { capture: true })).trim();
|
|
215
|
+
const worktreeCommon = (await runLocalCommand('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], worktree, environment, { capture: true })).trim();
|
|
216
|
+
if (!isAbsolute(repositoryCommon) || !isAbsolute(worktreeCommon) || realpathSync(repositoryCommon) !== realpathSync(worktreeCommon))
|
|
217
|
+
fail();
|
|
218
|
+
const paths = await changedSourcePaths(worktree, plan.baseCommit, environment);
|
|
219
|
+
if (paths.length === 0 || paths.length > grant.maxChangedFiles)
|
|
220
|
+
fail();
|
|
221
|
+
const manifestPath = `plugins/${plan.name}/package.json`;
|
|
222
|
+
if (grant.versioning === 'patch') {
|
|
223
|
+
if (!paths.includes(manifestPath) || !paths.includes(`plugins/${plan.name}/src/version.ts`))
|
|
224
|
+
fail();
|
|
225
|
+
const managed = await verifyManagedPatchVersion({ worktree, baseCommit: plan.baseCommit, name: plan.name, environment });
|
|
226
|
+
if (plan.preparedEvidence?.pack.version !== managed.version)
|
|
227
|
+
fail();
|
|
228
|
+
}
|
|
229
|
+
let bytes = 0;
|
|
230
|
+
for (const path of paths) {
|
|
231
|
+
const match = SOURCE_FILE.exec(path);
|
|
232
|
+
const managedManifest = grant.versioning === 'patch' && path === manifestPath;
|
|
233
|
+
if (!managedManifest && (!match || match[1] !== plan.name || SOURCE_TEST_PATH.test(path)))
|
|
234
|
+
fail();
|
|
235
|
+
const target = resolve(worktree, path);
|
|
236
|
+
if (relative(worktree, target).startsWith(`..${sep}`) || target === worktree)
|
|
237
|
+
fail();
|
|
238
|
+
let stat;
|
|
239
|
+
try {
|
|
240
|
+
stat = lstatSync(target);
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
fail();
|
|
244
|
+
}
|
|
245
|
+
if (!stat.isFile() || stat.isSymbolicLink() || realpathSync(target) !== target)
|
|
246
|
+
fail();
|
|
247
|
+
bytes += stat.size;
|
|
248
|
+
if (bytes > grant.maxChangedBytes)
|
|
249
|
+
fail();
|
|
250
|
+
}
|
|
251
|
+
const checked = await checkedSourceSnapshot(worktree, plan.baseCommit, plan.scope, environment);
|
|
252
|
+
if (checked.checkedTreeDigest !== plan.sourceCheck.treeDigest || checked.checkedPatchDigest !== plan.sourceCheck.patchDigest)
|
|
253
|
+
fail();
|
|
254
|
+
}
|
|
255
|
+
function openLedger(path) {
|
|
256
|
+
sourceAuthorityCanonicalSafePath(path, 'file', true);
|
|
257
|
+
const database = new DatabaseSync(path);
|
|
258
|
+
database.exec(`PRAGMA busy_timeout = 5000; PRAGMA journal_mode = WAL; PRAGMA synchronous = FULL;
|
|
259
|
+
CREATE TABLE IF NOT EXISTS source_approval_grants (
|
|
260
|
+
grant_id TEXT PRIMARY KEY, config_digest TEXT NOT NULL, key_fingerprint TEXT NOT NULL, created_at INTEGER NOT NULL
|
|
261
|
+
) STRICT;
|
|
262
|
+
CREATE TABLE IF NOT EXISTS source_approval_receipts (
|
|
263
|
+
request_digest TEXT PRIMARY KEY, grant_id TEXT NOT NULL, config_digest TEXT NOT NULL, plan_id TEXT NOT NULL UNIQUE, plan_digest TEXT NOT NULL,
|
|
264
|
+
receipt_json TEXT NOT NULL, receipt_digest TEXT NOT NULL, created_at INTEGER NOT NULL
|
|
265
|
+
) STRICT;`);
|
|
266
|
+
return database;
|
|
267
|
+
}
|
|
268
|
+
function receiptFor(config, request, privateKey, now, expiresAt) {
|
|
269
|
+
const unsigned = { schemaVersion: 1,
|
|
270
|
+
approvalId: `source-approval-${controlPlaneDigest({ grant: config.grant.id, request }).slice(0, 40)}`,
|
|
271
|
+
authority: config.authority, keyId: config.keyId, planId: request.planId, planDigest: request.planDigest,
|
|
272
|
+
decision: 'approved', principal: config.grant.owner.principalId, decidedAt: now, expiresAt };
|
|
273
|
+
return Object.freeze({ ...unsigned, signature: sign(null, Buffer.from(approvalSigningPayload(unsigned)), privateKey).toString('base64') });
|
|
274
|
+
}
|
|
275
|
+
/** Sign a finite, freshly rechecked source approval. It cannot approve a release or activation. */
|
|
276
|
+
export async function authorizePreparedSource(configInput, requestInput) {
|
|
277
|
+
try {
|
|
278
|
+
validateSourceApprovalAuthorityConfig(configInput);
|
|
279
|
+
const config = configInput;
|
|
280
|
+
const request = validateRequest(requestInput);
|
|
281
|
+
if (Date.now() >= config.grant.expiresAt)
|
|
282
|
+
fail();
|
|
283
|
+
const sourcePath = sourceAuthorityCanonicalSafePath(config.controlDatabasePath, 'file');
|
|
284
|
+
const keyBytes = sourceAuthorityReadSafeFile(config.keyPath, MAX_KEY_BYTES);
|
|
285
|
+
let privateKey;
|
|
286
|
+
try {
|
|
287
|
+
privateKey = createPrivateKey(keyBytes);
|
|
288
|
+
}
|
|
289
|
+
catch {
|
|
290
|
+
fail();
|
|
291
|
+
}
|
|
292
|
+
if (privateKey.asymmetricKeyType !== 'ed25519')
|
|
293
|
+
fail();
|
|
294
|
+
const keyFingerprint = createHash('sha256').update(keyBytes).digest('hex');
|
|
295
|
+
const configDigest = controlPlaneDigest(config);
|
|
296
|
+
const database = new DatabaseSync(sourcePath, { readOnly: true });
|
|
297
|
+
let source;
|
|
298
|
+
try {
|
|
299
|
+
database.exec('PRAGMA query_only = ON;');
|
|
300
|
+
source = readOwnerPreparedSourcePlan(database, request.planId);
|
|
301
|
+
if (source.plan.digest !== request.planDigest || controlPlaneDigest(source.source) !== request.sourceReferenceDigest
|
|
302
|
+
|| !equivalentOwner(source.source.owner, config.grant.owner))
|
|
303
|
+
fail();
|
|
304
|
+
sourceAuthorityValidatePrepared(source.plan, Date.now());
|
|
305
|
+
await sourceAuthorityValidateWorktree(source.plan, config.grant);
|
|
306
|
+
const final = readOwnerPreparedSourcePlan(database, request.planId);
|
|
307
|
+
if (final.plan.digest !== source.plan.digest || controlPlaneDigest(final.source) !== controlPlaneDigest(source.source) || final.plan.status !== 'pending-approval')
|
|
308
|
+
fail();
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
database.close();
|
|
312
|
+
}
|
|
313
|
+
const requestDigest = controlPlaneDigest(request);
|
|
314
|
+
const ledger = openLedger(config.statePath);
|
|
315
|
+
try {
|
|
316
|
+
ledger.exec('BEGIN IMMEDIATE');
|
|
317
|
+
try {
|
|
318
|
+
const now = Date.now();
|
|
319
|
+
if (now >= config.grant.expiresAt)
|
|
320
|
+
fail();
|
|
321
|
+
sourceAuthorityValidatePrepared(source.plan, now);
|
|
322
|
+
const receiptExpiry = Math.min(now + config.grant.receiptTtlMs, config.grant.expiresAt, source.plan.expiresAt);
|
|
323
|
+
if (receiptExpiry <= now)
|
|
324
|
+
fail();
|
|
325
|
+
const grant = ledger.prepare('SELECT config_digest, key_fingerprint FROM source_approval_grants WHERE grant_id = ?').get(config.grant.id);
|
|
326
|
+
if (grant === undefined)
|
|
327
|
+
ledger.prepare('INSERT INTO source_approval_grants (grant_id, config_digest, key_fingerprint, created_at) VALUES (?, ?, ?, ?)')
|
|
328
|
+
.run(config.grant.id, configDigest, keyFingerprint, now);
|
|
329
|
+
else if (grant.config_digest !== configDigest || grant.key_fingerprint !== keyFingerprint)
|
|
330
|
+
fail();
|
|
331
|
+
const existing = ledger.prepare('SELECT request_digest, grant_id, config_digest, plan_id, plan_digest, receipt_json, receipt_digest FROM source_approval_receipts WHERE request_digest = ?')
|
|
332
|
+
.get(requestDigest);
|
|
333
|
+
if (existing !== undefined) {
|
|
334
|
+
if (existing.grant_id !== config.grant.id || existing.config_digest !== configDigest || existing.plan_id !== request.planId
|
|
335
|
+
|| existing.plan_digest !== request.planDigest || existing.receipt_digest !== controlPlaneDigest(existing.receipt_json))
|
|
336
|
+
fail();
|
|
337
|
+
const receipt = parseApprovalReceipt(JSON.parse(existing.receipt_json));
|
|
338
|
+
if (receipt.expiresAt <= now || receipt.authority !== config.authority || receipt.keyId !== config.keyId)
|
|
339
|
+
fail();
|
|
340
|
+
ledger.exec('COMMIT');
|
|
341
|
+
return receipt;
|
|
342
|
+
}
|
|
343
|
+
if (ledger.prepare('SELECT request_digest FROM source_approval_receipts WHERE plan_id = ?').get(request.planId) !== undefined)
|
|
344
|
+
fail();
|
|
345
|
+
const used = ledger.prepare('SELECT COUNT(*) AS count FROM source_approval_receipts WHERE grant_id = ?').get(config.grant.id);
|
|
346
|
+
if (used.count >= config.grant.maxApprovals)
|
|
347
|
+
fail();
|
|
348
|
+
const receipt = receiptFor(config, request, privateKey, now, receiptExpiry);
|
|
349
|
+
const receiptJson = JSON.stringify(receipt);
|
|
350
|
+
ledger.prepare('INSERT INTO source_approval_receipts (request_digest, grant_id, config_digest, plan_id, plan_digest, receipt_json, receipt_digest, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)')
|
|
351
|
+
.run(requestDigest, config.grant.id, configDigest, request.planId, request.planDigest, receiptJson, controlPlaneDigest(receiptJson), now);
|
|
352
|
+
ledger.exec('COMMIT');
|
|
353
|
+
return receipt;
|
|
354
|
+
}
|
|
355
|
+
catch (error) {
|
|
356
|
+
try {
|
|
357
|
+
ledger.exec('ROLLBACK');
|
|
358
|
+
}
|
|
359
|
+
catch { /* no transaction after a failed commit */ }
|
|
360
|
+
throw error;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
finally {
|
|
364
|
+
ledger.close();
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch (error) {
|
|
368
|
+
if (error instanceof SourceApprovalAuthorityError)
|
|
369
|
+
throw error;
|
|
370
|
+
throw new SourceApprovalAuthorityError();
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async function readOneRequest() {
|
|
374
|
+
const chunks = [];
|
|
375
|
+
let size = 0;
|
|
376
|
+
for await (const chunk of process.stdin) {
|
|
377
|
+
const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
378
|
+
size += bytes.length;
|
|
379
|
+
if (size > MAX_REQUEST_BYTES)
|
|
380
|
+
fail();
|
|
381
|
+
chunks.push(bytes);
|
|
382
|
+
}
|
|
383
|
+
try {
|
|
384
|
+
return JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
fail();
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
/** CLI entrypoint: exactly --config <absolute-path>, one bounded JSON request on stdin, one receipt on stdout. */
|
|
391
|
+
export async function runSourceApprovalAuthority(argv = process.argv.slice(2)) {
|
|
392
|
+
try {
|
|
393
|
+
if (argv.length !== 2 || argv[0] !== '--config')
|
|
394
|
+
fail();
|
|
395
|
+
const configPath = pathText(argv[1]);
|
|
396
|
+
const configBytes = sourceAuthorityReadSafeFile(configPath, MAX_CONFIG_BYTES);
|
|
397
|
+
let config;
|
|
398
|
+
try {
|
|
399
|
+
config = JSON.parse(configBytes.toString('utf8'));
|
|
400
|
+
}
|
|
401
|
+
catch {
|
|
402
|
+
fail();
|
|
403
|
+
}
|
|
404
|
+
const request = await readOneRequest();
|
|
405
|
+
const receipt = await authorizePreparedSource(config, request);
|
|
406
|
+
process.stdout.write(`${JSON.stringify(receipt)}\n`);
|
|
407
|
+
}
|
|
408
|
+
catch {
|
|
409
|
+
throw new SourceApprovalAuthorityError();
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=source-approval-authority.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-approval-authority.js","sourceRoot":"","sources":["../src/source-approval-authority.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ApprovalReceipt } from './types.js';
|
|
2
|
+
export interface SourceApprovalClientConfig {
|
|
3
|
+
executable: {
|
|
4
|
+
path: string;
|
|
5
|
+
sha256: string;
|
|
6
|
+
};
|
|
7
|
+
interpreter?: {
|
|
8
|
+
path: string;
|
|
9
|
+
sha256: string;
|
|
10
|
+
};
|
|
11
|
+
configPath: string;
|
|
12
|
+
timeoutMs: number;
|
|
13
|
+
}
|
|
14
|
+
export interface SourceApprovalRequest {
|
|
15
|
+
protocol: 'dsh-source-approval/v1';
|
|
16
|
+
planId: string;
|
|
17
|
+
planDigest: string;
|
|
18
|
+
sourceReferenceDigest: string;
|
|
19
|
+
}
|
|
20
|
+
export type SourceApprovalClientErrorCode = 'ABORTED' | 'EXECUTABLE_CHANGED' | 'FAILED' | 'INVALID_CONFIG' | 'OUTPUT_LIMIT' | 'TIMEOUT';
|
|
21
|
+
export declare class SourceApprovalClientError extends Error {
|
|
22
|
+
readonly code: SourceApprovalClientErrorCode;
|
|
23
|
+
constructor(code: SourceApprovalClientErrorCode, message: string);
|
|
24
|
+
}
|
|
25
|
+
export declare function validateSourceApprovalClientConfig(value: unknown): asserts value is SourceApprovalClientConfig;
|
|
26
|
+
export interface SourceAuthorityRequest extends Omit<SourceApprovalRequest, 'protocol'> {
|
|
27
|
+
protocol: 'dsh-source-approval/v1' | 'dsh-source-release-authorization/v1' | 'dsh-source-adoption/v1';
|
|
28
|
+
}
|
|
29
|
+
export declare function requestSourceAuthorityReceipt<T>(config: SourceApprovalClientConfig, request: SourceAuthorityRequest, parseReceipt: (value: unknown) => T, signal?: AbortSignal): Promise<T>;
|
|
30
|
+
export declare function requestPinnedAuthorityReceipt<T>(config: SourceApprovalClientConfig, request: unknown, parseReceipt: (value: unknown) => T, signal?: AbortSignal): Promise<T>;
|
|
31
|
+
export declare function requestSourceApproval(config: SourceApprovalClientConfig, request: SourceApprovalRequest, signal?: AbortSignal): Promise<ApprovalReceipt>;
|
|
32
|
+
//# sourceMappingURL=source-approval-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-approval-client.d.ts","sourceRoot":"","sources":["../src/source-approval-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAOjD,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC5C,WAAW,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,wBAAwB,CAAA;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,MAAM,6BAA6B,GAAG,SAAS,GAAG,oBAAoB,GAAG,QAAQ,GAAG,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAA;AAEvI,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,6BAA6B;gBAAnC,IAAI,EAAE,6BAA6B,EAAE,OAAO,EAAE,MAAM;CAI1E;AAmCD,wBAAgB,kCAAkC,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,0BAA0B,CAY9G;AAED,MAAM,WAAW,sBAAuB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,UAAU,CAAC;IACrF,QAAQ,EAAE,wBAAwB,GAAG,qCAAqC,GAAG,wBAAwB,CAAA;CACtG;AA8CD,wBAAsB,6BAA6B,CAAC,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,sBAAsB,EACxH,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAGvE;AAED,wBAAsB,6BAA6B,CAAC,CAAC,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,OAAO,EACzG,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CA4BvE;AAGD,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,qBAAqB,EAC5G,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,CAAC,CAYhD"}
|