@cotal-ai/cli 0.27.0 → 0.28.0-hack-20260823204333
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/commands/meshes-add.d.ts +76 -10
- package/dist/commands/meshes-add.d.ts.map +1 -1
- package/dist/commands/meshes-add.js +214 -49
- package/dist/commands/meshes-add.js.map +1 -1
- package/dist/commands/meshes-wizard.d.ts.map +1 -1
- package/dist/commands/meshes-wizard.js +67 -7
- package/dist/commands/meshes-wizard.js.map +1 -1
- package/dist/commands/meshes.d.ts +16 -2
- package/dist/commands/meshes.d.ts.map +1 -1
- package/dist/commands/meshes.js +170 -8
- package/dist/commands/meshes.js.map +1 -1
- package/dist/commands/personas.d.ts.map +1 -1
- package/dist/commands/personas.js +12 -2
- package/dist/commands/personas.js.map +1 -1
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +37 -5
- package/dist/commands/up.js.map +1 -1
- package/dist/lib/auth-proc.d.ts +4 -0
- package/dist/lib/auth-proc.d.ts.map +1 -1
- package/dist/lib/auth-proc.js +3 -3
- package/dist/lib/auth-proc.js.map +1 -1
- package/dist/lib/join-target.d.ts +79 -18
- package/dist/lib/join-target.d.ts.map +1 -1
- package/dist/lib/join-target.js +226 -21
- package/dist/lib/join-target.js.map +1 -1
- package/dist/seed/store.d.ts.map +1 -1
- package/dist/seed/store.js +23 -2
- package/dist/seed/store.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type SpaceAuth } from "@cotal-ai/core";
|
|
2
|
-
import { type JoinTarget } from "../lib/join-target.js";
|
|
3
|
-
import { type MeshEntry, type MeshTarget, type PreflightFailure } from "@cotal-ai/workspace";
|
|
2
|
+
import { type DialPolicy, type JoinTarget } from "../lib/join-target.js";
|
|
3
|
+
import { type MeshEntry, type MeshTarget, type PreflightFailure, type UserAuthInfo } from "@cotal-ai/workspace";
|
|
4
4
|
/**
|
|
5
5
|
* The rules behind `cotal meshes add`, as decisions rather than side effects.
|
|
6
6
|
*
|
|
@@ -38,24 +38,38 @@ export declare function checkServer(raw: string): Check<string>;
|
|
|
38
38
|
* Registering a mesh is how a machine joins a broker it does not run, and every later command then
|
|
39
39
|
* dials that address with an agent credential in the CONNECT line. NATS sends the initial INFO in
|
|
40
40
|
* plaintext and unauthenticated, so an on-path attacker forges one that does not set
|
|
41
|
-
* `tls_required` and reads the credential; the client side is the only fence
|
|
42
|
-
*
|
|
43
|
-
*
|
|
41
|
+
* `tls_required` and reads the credential; the client side is the only fence. The address class
|
|
42
|
+
* and the RECORDED TLS INTENT together are the gate: see {@link classifyJoinTarget} for the
|
|
43
|
+
* ranges, why hostnames need required TLS, and why RFC1918 is refused in both modes.
|
|
44
|
+
*
|
|
45
|
+
* `policy.tlsRequired` is the strictness this registration will record — sourced from `--tls` or
|
|
46
|
+
* a `tls://` scheme ({@link tlsIntent}) — and it is what the dial will ENFORCE, because the
|
|
47
|
+
* candidate target and the written record carry the same value and preflight requires the
|
|
48
|
+
* handshake off it.
|
|
44
49
|
*
|
|
45
50
|
* This is a SAFETY rule, not a liveness check, which is why it sits with {@link checkServer} above
|
|
46
51
|
* the `--force` branch rather than inside it. `--force` exists to register a mesh that is *down*
|
|
47
52
|
* right now; it must not double as permission to ship credentials across an untrusted network,
|
|
48
53
|
* where there is nothing to verify later and no error to come back and fix.
|
|
49
54
|
*/
|
|
50
|
-
export declare function checkDialPolicy(server: string,
|
|
55
|
+
export declare function checkDialPolicy(server: string, policy: DialPolicy): Check<JoinTarget>;
|
|
56
|
+
/** The TLS intent this registration records, from its two sources: the explicit `--tls` flag, or
|
|
57
|
+
* a `tls://` scheme. The scheme is typed intent — and today nats.js connects PLAINTEXT to
|
|
58
|
+
* `tls://host` with empty options, so honoring it here is what converts typed-but-unenforced
|
|
59
|
+
* intent into enforcement: the record carries `tlsRequired: true`, and every dial resolved
|
|
60
|
+
* through it requires the handshake rather than tolerating plaintext. */
|
|
61
|
+
export declare function tlsIntent(server: string, tlsFlag: boolean): boolean;
|
|
51
62
|
/** Where this mesh's local trust + personas live. An explicit path must be an existing directory
|
|
52
63
|
* (the record's whole job is to point at `.cotal/auth` and `.cotal/agents` under it). With no
|
|
53
64
|
* flag, the nearest genuine project up-tree — and `findCotalRoot` returns its STARTING directory
|
|
54
65
|
* when it finds none, so the inferred case must prove the `.cotal` is really there. */
|
|
55
66
|
export declare function checkRoot(flag: string | undefined, cwd: string): Check<string>;
|
|
56
67
|
/** The recorded auth mode: what the operator said, or what `--root` proves. A root holding this
|
|
57
|
-
* space's account record means auth; anything else is an open broker.
|
|
58
|
-
|
|
68
|
+
* space's account record means auth; anything else is an open broker. `--mode user` is permitted
|
|
69
|
+
* IFF the pinned trust was SUPPLIED (`userTrustSupplied`) — the old blanket refusal reasoned
|
|
70
|
+
* that IdP pins must be established, never guessed, and supplying them (a bundle exported where
|
|
71
|
+
* the mesh runs, or a confirmed HTTPS discovery document) satisfies exactly that reasoning. */
|
|
72
|
+
export declare function checkMode(space: string, root: string, accounts: string[], flag: string | undefined, userTrustSupplied?: boolean): Check<MeshEntry["mode"]>;
|
|
59
73
|
/** For an AUTH registration the root must yield trust that actually COMPOSES. An account record on
|
|
60
74
|
* disk only proves the space was known here: `loadSpaceAuth` still returns undefined when the
|
|
61
75
|
* broker record or the signing material is missing, and recording that as `auth` produces a record
|
|
@@ -68,11 +82,63 @@ export declare function checkTrust(mode: MeshEntry["mode"], root: string, space:
|
|
|
68
82
|
* promises JWT/ACL protection that is not there. An auth broker refuses a bare connect; an open
|
|
69
83
|
* one lets us straight in. */
|
|
70
84
|
export declare function probeEnforcement(server: string): Promise<"auth" | "open" | "unreachable">;
|
|
71
|
-
/** The claimed mode must match what the broker actually enforces, in both directions.
|
|
85
|
+
/** The claimed mode must match what the broker actually enforces, in both directions. The USER
|
|
86
|
+
* arm reads the refusal as the evidence: a user-mode target has no probe credential by design,
|
|
87
|
+
* so a credless probe against a user-auth broker reporting auth-required IS the pass — the one
|
|
88
|
+
* fact a bare connect can prove about a broker whose admission runs through the callout. */
|
|
72
89
|
export declare function checkEnforcement(mode: MeshEntry["mode"], enforces: "auth" | "open" | "unreachable", server: string, space: string, root: string): Check<void>;
|
|
90
|
+
/** What a remote user-auth registration supplies: the pins nothing on this machine could derive.
|
|
91
|
+
* Exported where the mesh runs; carried by `--user-auth-file`, or served at the space's
|
|
92
|
+
* `/.well-known/cotal-mesh` for `--from`. */
|
|
93
|
+
export interface UserBundle {
|
|
94
|
+
space: string;
|
|
95
|
+
server: string;
|
|
96
|
+
tlsRequired: boolean;
|
|
97
|
+
userAuth: UserAuthInfo;
|
|
98
|
+
/** The sentinel creds blob. IN THE BUNDLE ONLY — registration lands it in a 0600 file under
|
|
99
|
+
* the entry's root and records the PATH; the registry document never carries the blob. */
|
|
100
|
+
sentinelCreds: string;
|
|
101
|
+
}
|
|
102
|
+
/** Validate a user-auth bundle, fail-loud on every missing pin. The `userAuth` arm goes through
|
|
103
|
+
* {@link assertUserAuthInfo} — the same boundary every provider blob crosses — and additionally
|
|
104
|
+
* requires the pinned exchange URL: for a remote entry the endpoints are a trust position, not a
|
|
105
|
+
* convenience, because no local `up` exists to re-derive them. */
|
|
106
|
+
export declare function checkUserBundle(raw: string): Check<UserBundle>;
|
|
107
|
+
/**
|
|
108
|
+
* Fetch that CANNOT be walked off HTTPS.
|
|
109
|
+
*
|
|
110
|
+
* `fetch` follows redirects by default and will happily follow `https://` → `http://`, so a
|
|
111
|
+
* 302 from anyone on the path turns a pinned, encrypted fetch into a plaintext one — and the
|
|
112
|
+
* document being fetched IS the trust being adopted. `redirect: "manual"` stops the hop here;
|
|
113
|
+
* a redirect is then reported as the refusal it is, rather than silently followed.
|
|
114
|
+
*
|
|
115
|
+
* Loopback `http://` stays usable for tests and for an exchange on this machine (nothing leaves
|
|
116
|
+
* the box), which is also what keeps the suites honest without a TLS fixture. Everything else
|
|
117
|
+
* must be `https:`.
|
|
118
|
+
*/
|
|
119
|
+
export declare function assertPinnedFetchUrl(u: URL, what: string): string | undefined;
|
|
120
|
+
/** The pinned-fetch policy's verdict for ONE url, as data — so a suite can assert WHY a fetch was
|
|
121
|
+
* refused rather than only that something failed. A cert error, a timeout and a refused redirect
|
|
122
|
+
* are all "it did not work"; only this distinguishes them. Test seam, no production caller. */
|
|
123
|
+
export declare function pinnedFetchProbe(target: string): Promise<{
|
|
124
|
+
refused: boolean;
|
|
125
|
+
message: string;
|
|
126
|
+
}>;
|
|
127
|
+
/** The user arm of trust composition: the pinned exchange must ANSWER, and answer as itself.
|
|
128
|
+
* `/health` must report the pinned issuer (a base that answers with a foreign issuer is a
|
|
129
|
+
* different authority, however reachable) and `/jwks` must serve a non-empty key set (the
|
|
130
|
+
* verification material the pins promise). Nothing here trusts the response beyond consistency
|
|
131
|
+
* with the pins the operator supplied. */
|
|
132
|
+
export declare function verifyUserExchange(base: string, issuer: string): Promise<Check<void>>;
|
|
133
|
+
/** Land the sentinel and write the remote user entry — ONE writer for both front ends, so the
|
|
134
|
+
* wizard cannot drift from the flag form on what a remote record looks like. The sentinel blob
|
|
135
|
+
* goes into a 0600 file under the entry's own root (its space-scoped user-auth state dir) and
|
|
136
|
+
* the record carries the PATH: the registry document is echoed by `cotal meshes` and `status`,
|
|
137
|
+
* and secret material must never ride a file that gets printed. */
|
|
138
|
+
export declare function persistRemoteUserEntry(space: string, server: string, root: string, bundle: UserBundle, tlsRequired: boolean, overlayConsent: boolean): ReturnType<typeof writeRecord>;
|
|
73
139
|
/** The target this registration would resolve to. `flag-server` is the source that can never
|
|
74
140
|
* classify as a prune — nothing is recorded yet, so no entry may be blamed for a failure. */
|
|
75
|
-
export declare function candidateTarget(space: string, server: string, root: string, mode: MeshEntry["mode"], auth: SpaceAuth | undefined): MeshTarget;
|
|
141
|
+
export declare function candidateTarget(space: string, server: string, root: string, mode: MeshEntry["mode"], auth: SpaceAuth | undefined, tlsRequired: boolean): MeshTarget;
|
|
76
142
|
/** The registration-time wording for a failed probe. Deliberately NOT the shared preflight copy:
|
|
77
143
|
* that speaks to a mesh already in the registry ("stale entry", "re-run `cotal up`"), and here
|
|
78
144
|
* nothing is recorded yet — the operator is being told what to fix in the command they just ran. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshes-add.d.ts","sourceRoot":"","sources":["../../src/commands/meshes-add.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"meshes-add.d.ts","sourceRoot":"","sources":["../../src/commands/meshes-add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { statSync } from "node:fs";
|
|
2
2
|
import { join, resolve } from "node:path";
|
|
3
|
-
import { probeConnect } from "@cotal-ai/core";
|
|
4
|
-
import { classifyJoinTarget } from "../lib/join-target.js";
|
|
5
|
-
import { authDir, findCotalRoot, findMesh, getCurrent, homeCotalDir, listSpaceAccounts, loadSpaceAuth, personaDir, preflightTarget, recordMesh, setCurrent, } from "@cotal-ai/workspace";
|
|
3
|
+
import { mkSecretDir, probeConnect, writeSecretFileAtomic } from "@cotal-ai/core";
|
|
4
|
+
import { classifyJoinTarget, isLoopbackHost } from "../lib/join-target.js";
|
|
5
|
+
import { authDir, findCotalRoot, findMesh, getCurrent, homeCotalDir, listSpaceAccounts, loadSpaceAuth, assertUserAuthInfo, personaDir, preflightTarget, recordMesh, setCurrent, userAuthStateDir, } from "@cotal-ai/workspace";
|
|
6
6
|
const bad = (message) => ({ ok: false, message });
|
|
7
7
|
/** The cost of the copy every "copy the mesh's auth here" recovery asks the operator to make.
|
|
8
8
|
*
|
|
@@ -60,34 +60,46 @@ export function checkServer(raw) {
|
|
|
60
60
|
* Registering a mesh is how a machine joins a broker it does not run, and every later command then
|
|
61
61
|
* dials that address with an agent credential in the CONNECT line. NATS sends the initial INFO in
|
|
62
62
|
* plaintext and unauthenticated, so an on-path attacker forges one that does not set
|
|
63
|
-
* `tls_required` and reads the credential; the client side is the only fence
|
|
64
|
-
*
|
|
65
|
-
*
|
|
63
|
+
* `tls_required` and reads the credential; the client side is the only fence. The address class
|
|
64
|
+
* and the RECORDED TLS INTENT together are the gate: see {@link classifyJoinTarget} for the
|
|
65
|
+
* ranges, why hostnames need required TLS, and why RFC1918 is refused in both modes.
|
|
66
|
+
*
|
|
67
|
+
* `policy.tlsRequired` is the strictness this registration will record — sourced from `--tls` or
|
|
68
|
+
* a `tls://` scheme ({@link tlsIntent}) — and it is what the dial will ENFORCE, because the
|
|
69
|
+
* candidate target and the written record carry the same value and preflight requires the
|
|
70
|
+
* handshake off it.
|
|
66
71
|
*
|
|
67
72
|
* This is a SAFETY rule, not a liveness check, which is why it sits with {@link checkServer} above
|
|
68
73
|
* the `--force` branch rather than inside it. `--force` exists to register a mesh that is *down*
|
|
69
74
|
* right now; it must not double as permission to ship credentials across an untrusted network,
|
|
70
75
|
* where there is nothing to verify later and no error to come back and fix.
|
|
71
76
|
*/
|
|
72
|
-
export function checkDialPolicy(server,
|
|
77
|
+
export function checkDialPolicy(server, policy) {
|
|
73
78
|
try {
|
|
74
|
-
|
|
75
|
-
// `tlsRequired` is a property of the connection this registration will produce, and no field
|
|
76
|
-
// records it yet; it arrives with the work that teaches the broker to serve TLS. Passing a
|
|
77
|
-
// hardcoded `false` is honest rather than lazy: today no dial can require TLS.
|
|
78
|
-
//
|
|
79
|
-
// What that means CONCRETELY: public addresses, ordinary private ranges and hostnames are
|
|
80
|
-
// refused outright. An overlay literal is refused TOO unless the operator passed the explicit
|
|
81
|
-
// opt-in, because a printed warning is not a fence — stderr is not read by scripts, and the
|
|
82
|
-
// warning was never persisted, so nothing repeated it at the dials that followed. With the
|
|
83
|
-
// opt-in it is permitted and returns a residual, which the caller both prints AND records as
|
|
84
|
-
// consent. When the TLS field exists this passes the record's real intent and the opt-in goes.
|
|
85
|
-
return good(classifyJoinTarget(server, { tlsRequired: false, allowUnencryptedOverlay }));
|
|
79
|
+
return good(classifyJoinTarget(server, policy));
|
|
86
80
|
}
|
|
87
81
|
catch (e) {
|
|
88
82
|
return bad(`✗ ${e.message}`);
|
|
89
83
|
}
|
|
90
84
|
}
|
|
85
|
+
/** The TLS intent this registration records, from its two sources: the explicit `--tls` flag, or
|
|
86
|
+
* a `tls://` scheme. The scheme is typed intent — and today nats.js connects PLAINTEXT to
|
|
87
|
+
* `tls://host` with empty options, so honoring it here is what converts typed-but-unenforced
|
|
88
|
+
* intent into enforcement: the record carries `tlsRequired: true`, and every dial resolved
|
|
89
|
+
* through it requires the handshake rather than tolerating plaintext. */
|
|
90
|
+
export function tlsIntent(server, tlsFlag) {
|
|
91
|
+
if (tlsFlag)
|
|
92
|
+
return true;
|
|
93
|
+
try {
|
|
94
|
+
const p = new URL(server).protocol;
|
|
95
|
+
// `wss:` is typed intent the same way `tls:` is - the websocket transport performs the TLS
|
|
96
|
+
// handshake itself, so recording it strict is stating what the dial already enforces.
|
|
97
|
+
return p === "tls:" || p === "wss:";
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return false; // checkServer refuses the malformed URL; this never decides anything for it
|
|
101
|
+
}
|
|
102
|
+
}
|
|
91
103
|
/** Where this mesh's local trust + personas live. An explicit path must be an existing directory
|
|
92
104
|
* (the record's whole job is to point at `.cotal/auth` and `.cotal/agents` under it). With no
|
|
93
105
|
* flag, the nearest genuine project up-tree — and `findCotalRoot` returns its STARTING directory
|
|
@@ -105,15 +117,17 @@ export function checkRoot(flag, cwd) {
|
|
|
105
117
|
return good(root);
|
|
106
118
|
}
|
|
107
119
|
/** The recorded auth mode: what the operator said, or what `--root` proves. A root holding this
|
|
108
|
-
* space's account record means auth; anything else is an open broker.
|
|
109
|
-
|
|
120
|
+
* space's account record means auth; anything else is an open broker. `--mode user` is permitted
|
|
121
|
+
* IFF the pinned trust was SUPPLIED (`userTrustSupplied`) — the old blanket refusal reasoned
|
|
122
|
+
* that IdP pins must be established, never guessed, and supplying them (a bundle exported where
|
|
123
|
+
* the mesh runs, or a confirmed HTTPS discovery document) satisfies exactly that reasoning. */
|
|
124
|
+
export function checkMode(space, root, accounts, flag, userTrustSupplied = false) {
|
|
110
125
|
if (flag !== undefined && flag !== "auth" && flag !== "open" && flag !== "user")
|
|
111
|
-
return bad(`✗ --mode must be auth or
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
// Guessing them would be inventing trust.
|
|
126
|
+
return bad(`✗ --mode must be auth, open or user (got "${flag}")`);
|
|
127
|
+
if (flag === "user" && !userTrustSupplied)
|
|
128
|
+
return bad(`✗ --mode user needs its pinned trust SUPPLIED, never guessed - a user-auth space carries IdP pins (issuer, audience, login URL) established where the mesh runs. Pass --user-auth-file <bundle.json> exported there, or --from <https://…/.well-known/cotal-mesh> to fetch, review and confirm them`);
|
|
115
129
|
if (flag === "user")
|
|
116
|
-
return
|
|
130
|
+
return good("user");
|
|
117
131
|
const mode = flag ?? (accounts.includes(space) ? "auth" : "open");
|
|
118
132
|
if (mode === "auth" && !accounts.includes(space))
|
|
119
133
|
return bad(`✗ --mode auth needs "${space}"'s trust material under ${authDir(root)}${accounts.length ? ` (it holds "${accounts.join('", "')}")` : " (it holds none)"} - copy the mesh's account + creds there, point --root at where they already are, or register it --mode open` + CA_COST);
|
|
@@ -147,43 +161,194 @@ export async function probeEnforcement(server) {
|
|
|
147
161
|
return "open";
|
|
148
162
|
return bare.reason === "auth-required" ? "auth" : "unreachable";
|
|
149
163
|
}
|
|
150
|
-
/** The claimed mode must match what the broker actually enforces, in both directions.
|
|
164
|
+
/** The claimed mode must match what the broker actually enforces, in both directions. The USER
|
|
165
|
+
* arm reads the refusal as the evidence: a user-mode target has no probe credential by design,
|
|
166
|
+
* so a credless probe against a user-auth broker reporting auth-required IS the pass — the one
|
|
167
|
+
* fact a bare connect can prove about a broker whose admission runs through the callout. */
|
|
151
168
|
export function checkEnforcement(mode, enforces, server, space, root) {
|
|
152
169
|
if (mode === "auth" && enforces === "open")
|
|
153
170
|
return bad(`✗ the broker at ${server} accepts unauthenticated connections, so it cannot be registered as an auth mesh - it enforces no credentials; register it \`--mode open\`, or point --server at the authenticated broker for "${space}"`);
|
|
154
171
|
if (mode === "open" && enforces === "auth")
|
|
155
172
|
return bad(`✗ the broker at ${server} requires auth, so it cannot be registered as an open mesh - copy that mesh's account + creds under ${authDir(root)} and re-run with --mode auth` + CA_COST);
|
|
173
|
+
if (mode === "user" && enforces === "open")
|
|
174
|
+
return bad(`✗ the broker at ${server} accepts unauthenticated connections, so it cannot be registered as a user-auth mesh - user auth means the broker REFUSES a bare connect and admits only exchanged bearers; check that the bundle's server points at the user-auth broker for "${space}"`);
|
|
175
|
+
if (mode === "user" && enforces === "unreachable")
|
|
176
|
+
return bad(`✗ no broker answered at ${server} - a user-auth registration is verified by the broker's own auth-required refusal, so it cannot be recorded while the broker is unreachable`);
|
|
177
|
+
return good(undefined);
|
|
178
|
+
}
|
|
179
|
+
/** Validate a user-auth bundle, fail-loud on every missing pin. The `userAuth` arm goes through
|
|
180
|
+
* {@link assertUserAuthInfo} — the same boundary every provider blob crosses — and additionally
|
|
181
|
+
* requires the pinned exchange URL: for a remote entry the endpoints are a trust position, not a
|
|
182
|
+
* convenience, because no local `up` exists to re-derive them. */
|
|
183
|
+
export function checkUserBundle(raw) {
|
|
184
|
+
let doc;
|
|
185
|
+
try {
|
|
186
|
+
doc = JSON.parse(raw);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
return bad("✗ the user-auth bundle is not JSON - export it where the mesh runs and pass the file unmodified");
|
|
190
|
+
}
|
|
191
|
+
if (doc === null || typeof doc !== "object")
|
|
192
|
+
return bad("✗ the user-auth bundle must be a JSON object");
|
|
193
|
+
if (typeof doc.space !== "string" || !doc.space)
|
|
194
|
+
return bad("✗ the user-auth bundle names no space");
|
|
195
|
+
if (typeof doc.server !== "string" || !doc.server)
|
|
196
|
+
return bad("✗ the user-auth bundle names no broker server");
|
|
197
|
+
if (typeof doc.tlsRequired !== "boolean")
|
|
198
|
+
return bad("✗ the user-auth bundle must state tlsRequired explicitly (true or false) - transport strictness is part of what the export pins");
|
|
199
|
+
let userAuth;
|
|
200
|
+
try {
|
|
201
|
+
userAuth = assertUserAuthInfo(doc.userAuth);
|
|
202
|
+
}
|
|
203
|
+
catch (e) {
|
|
204
|
+
return bad(`✗ user-auth bundle: ${e.message}`);
|
|
205
|
+
}
|
|
206
|
+
if (!userAuth.endpoints?.url)
|
|
207
|
+
return bad("✗ the user-auth bundle pins no exchange endpoint (userAuth.endpoints.url) - for a remote registration that URL is trust, and it must come from the export, never be guessed");
|
|
208
|
+
if (typeof doc.sentinelCreds !== "string" || !doc.sentinelCreds)
|
|
209
|
+
return bad("✗ the user-auth bundle carries no sentinelCreds - the sentinel identity is part of the export");
|
|
210
|
+
return good({ space: doc.space, server: doc.server, tlsRequired: doc.tlsRequired, userAuth, sentinelCreds: doc.sentinelCreds });
|
|
211
|
+
}
|
|
212
|
+
/** Budget for the exchange trust probe — same posture as the mode probe above: run once, at
|
|
213
|
+
* registration, where patience is cheaper than a wrong record. */
|
|
214
|
+
const EXCHANGE_PROBE_TIMEOUT_MS = 5_000;
|
|
215
|
+
/**
|
|
216
|
+
* Fetch that CANNOT be walked off HTTPS.
|
|
217
|
+
*
|
|
218
|
+
* `fetch` follows redirects by default and will happily follow `https://` → `http://`, so a
|
|
219
|
+
* 302 from anyone on the path turns a pinned, encrypted fetch into a plaintext one — and the
|
|
220
|
+
* document being fetched IS the trust being adopted. `redirect: "manual"` stops the hop here;
|
|
221
|
+
* a redirect is then reported as the refusal it is, rather than silently followed.
|
|
222
|
+
*
|
|
223
|
+
* Loopback `http://` stays usable for tests and for an exchange on this machine (nothing leaves
|
|
224
|
+
* the box), which is also what keeps the suites honest without a TLS fixture. Everything else
|
|
225
|
+
* must be `https:`.
|
|
226
|
+
*/
|
|
227
|
+
export function assertPinnedFetchUrl(u, what) {
|
|
228
|
+
if (u.protocol === "https:")
|
|
229
|
+
return undefined;
|
|
230
|
+
// The loopback exception is decided by PARSING the host as an address, never by how the text
|
|
231
|
+
// begins: `/^127\./` also matched `127.evil.com`, `127.0.0.1.nip.io` and `127.com`, which anyone
|
|
232
|
+
// can register, and it missed real spellings like `0177.0.0.1`. `isLoopbackHost` is the one
|
|
233
|
+
// authority for the question, canonicalization included. A name that does not parse as an IP is
|
|
234
|
+
// a NAME and gets no exception, however it starts — `localhost` included, since a hosts entry or
|
|
235
|
+
// a poisoned lookup can point it anywhere.
|
|
236
|
+
if (u.protocol === "http:" && isLoopbackHost(u.hostname))
|
|
237
|
+
return undefined;
|
|
238
|
+
// Name the ACTUAL rule. "must be https://" alone misleads the developer whose local flow used
|
|
239
|
+
// http://localhost: it blames the scheme, when the same scheme on 127.0.0.1 would have passed.
|
|
240
|
+
return (`✗ ${what} must be https:// (got ${u.protocol}//) - the pins this registration adopts cannot be fetched over a channel the network can rewrite` +
|
|
241
|
+
(u.protocol === "http:"
|
|
242
|
+
? `. Plain http is accepted only for a loopback LITERAL (127.0.0.1, ::1), where nothing leaves this machine - "${u.hostname}" is a name, and a hosts entry or a poisoned lookup could point it anywhere, so use the literal`
|
|
243
|
+
: ""));
|
|
244
|
+
}
|
|
245
|
+
/** The pinned-fetch policy's verdict for ONE url, as data — so a suite can assert WHY a fetch was
|
|
246
|
+
* refused rather than only that something failed. A cert error, a timeout and a refused redirect
|
|
247
|
+
* are all "it did not work"; only this distinguishes them. Test seam, no production caller. */
|
|
248
|
+
export async function pinnedFetchProbe(target) {
|
|
249
|
+
try {
|
|
250
|
+
await pinnedFetch(target, "the pinned exchange");
|
|
251
|
+
return { refused: false, message: "" };
|
|
252
|
+
}
|
|
253
|
+
catch (e) {
|
|
254
|
+
return { refused: true, message: e.message };
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
/** One hop, no downgrade, no redirect-following. */
|
|
258
|
+
async function pinnedFetch(target, what) {
|
|
259
|
+
const u = new URL(target);
|
|
260
|
+
const bad = assertPinnedFetchUrl(u, what);
|
|
261
|
+
if (bad)
|
|
262
|
+
throw new Error(bad);
|
|
263
|
+
const res = await fetch(u, { redirect: "manual", signal: AbortSignal.timeout(EXCHANGE_PROBE_TIMEOUT_MS) });
|
|
264
|
+
if (res.status >= 300 && res.status < 400)
|
|
265
|
+
throw new Error(`✗ ${what} answered ${res.status} (a redirect to ${JSON.stringify(res.headers.get("location") ?? "")}) - a redirect can move a pinned fetch onto plaintext or onto another host, so it is refused rather than followed; publish the document at the pinned URL itself`);
|
|
266
|
+
return res;
|
|
267
|
+
}
|
|
268
|
+
/** The user arm of trust composition: the pinned exchange must ANSWER, and answer as itself.
|
|
269
|
+
* `/health` must report the pinned issuer (a base that answers with a foreign issuer is a
|
|
270
|
+
* different authority, however reachable) and `/jwks` must serve a non-empty key set (the
|
|
271
|
+
* verification material the pins promise). Nothing here trusts the response beyond consistency
|
|
272
|
+
* with the pins the operator supplied. */
|
|
273
|
+
export async function verifyUserExchange(base, issuer) {
|
|
274
|
+
const url = (p) => new URL(p, base.endsWith("/") ? base : `${base}/`).toString();
|
|
275
|
+
// The exchange base is a PIN. It must be an https URL (or loopback), and neither probe below
|
|
276
|
+
// may be redirected off it — otherwise the "pinned" exchange is whatever a 302 chooses.
|
|
277
|
+
try {
|
|
278
|
+
const badBase = assertPinnedFetchUrl(new URL(base), `the pinned exchange at ${base}`);
|
|
279
|
+
if (badBase)
|
|
280
|
+
return bad(badBase);
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return bad(`✗ the bundle's pinned exchange endpoint ${JSON.stringify(base)} is not a URL`);
|
|
284
|
+
}
|
|
285
|
+
let health;
|
|
286
|
+
try {
|
|
287
|
+
const res = await pinnedFetch(url("health"), `the pinned exchange at ${base}`);
|
|
288
|
+
if (!res.ok)
|
|
289
|
+
return bad(`✗ the pinned exchange at ${base} answered /health with ${res.status} - it is not serving as the bundle promises`);
|
|
290
|
+
health = (await res.json());
|
|
291
|
+
}
|
|
292
|
+
catch (e) {
|
|
293
|
+
const m = e.message;
|
|
294
|
+
if (m.startsWith("✗"))
|
|
295
|
+
return bad(m);
|
|
296
|
+
return bad(`✗ the pinned exchange at ${base} did not answer /health (${m}) - the bundle's endpoint must be reachable to register against it`);
|
|
297
|
+
}
|
|
298
|
+
if (health.issuer !== issuer)
|
|
299
|
+
return bad(`✗ the exchange at ${base} answers for issuer ${JSON.stringify(health.issuer)} but the bundle pins ${JSON.stringify(issuer)} - a different issuer is a different authority; nothing was registered`);
|
|
300
|
+
try {
|
|
301
|
+
const res = await pinnedFetch(url("jwks"), `the pinned exchange at ${base}`);
|
|
302
|
+
if (!res.ok)
|
|
303
|
+
return bad(`✗ the pinned exchange at ${base} answered /jwks with ${res.status}`);
|
|
304
|
+
const jwks = (await res.json());
|
|
305
|
+
if (!Array.isArray(jwks.keys) || jwks.keys.length === 0)
|
|
306
|
+
return bad(`✗ the pinned exchange at ${base} serves an empty /jwks - it holds no verification keys for the trust the bundle pins`);
|
|
307
|
+
}
|
|
308
|
+
catch (e) {
|
|
309
|
+
const m = e.message;
|
|
310
|
+
if (m.startsWith("✗"))
|
|
311
|
+
return bad(m);
|
|
312
|
+
return bad(`✗ the pinned exchange at ${base} did not answer /jwks (${m})`);
|
|
313
|
+
}
|
|
156
314
|
return good(undefined);
|
|
157
315
|
}
|
|
316
|
+
/** Land the sentinel and write the remote user entry — ONE writer for both front ends, so the
|
|
317
|
+
* wizard cannot drift from the flag form on what a remote record looks like. The sentinel blob
|
|
318
|
+
* goes into a 0600 file under the entry's own root (its space-scoped user-auth state dir) and
|
|
319
|
+
* the record carries the PATH: the registry document is echoed by `cotal meshes` and `status`,
|
|
320
|
+
* and secret material must never ride a file that gets printed. */
|
|
321
|
+
export function persistRemoteUserEntry(space, server, root, bundle, tlsRequired, overlayConsent) {
|
|
322
|
+
const dir = userAuthStateDir(root, space);
|
|
323
|
+
mkSecretDir(dir);
|
|
324
|
+
const sentinelCredsPath = join(dir, "sentinel.creds");
|
|
325
|
+
writeSecretFileAtomic(sentinelCredsPath, bundle.sentinelCreds);
|
|
326
|
+
return writeRecord({
|
|
327
|
+
space,
|
|
328
|
+
server,
|
|
329
|
+
root,
|
|
330
|
+
mode: "user",
|
|
331
|
+
origin: "manual",
|
|
332
|
+
...(tlsRequired ? { tlsRequired: true } : {}),
|
|
333
|
+
...(overlayConsent ? { unencryptedOverlay: true } : {}),
|
|
334
|
+
userAuth: { ...bundle.userAuth, remote: true, sentinelCredsPath },
|
|
335
|
+
ts: new Date().toISOString(),
|
|
336
|
+
});
|
|
337
|
+
}
|
|
158
338
|
/** The target this registration would resolve to. `flag-server` is the source that can never
|
|
159
339
|
* classify as a prune — nothing is recorded yet, so no entry may be blamed for a failure. */
|
|
160
|
-
export function candidateTarget(space, server, root, mode, auth) {
|
|
340
|
+
export function candidateTarget(space, server, root, mode, auth, tlsRequired) {
|
|
161
341
|
return {
|
|
162
342
|
root,
|
|
163
343
|
server,
|
|
164
344
|
space,
|
|
165
345
|
mode,
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
//
|
|
169
|
-
//
|
|
170
|
-
//
|
|
171
|
-
|
|
172
|
-
// persist the intent" — a constraint removed three commits earlier by adding
|
|
173
|
-
// `MeshEntry.tlsRequired`. A dead premise was holding a live decision in place, and it is
|
|
174
|
-
// exactly why that field had no writers.
|
|
175
|
-
//
|
|
176
|
-
// The open question is now genuinely open: `tls://` is COSMETIC at the client (nats.js connects
|
|
177
|
-
// plaintext to `tls://host` with empty options; only the explicit `tls` option refuses), so an
|
|
178
|
-
// operator who types `tls://` today gets a record that resolves to a plaintext-tolerant client.
|
|
179
|
-
// Deriving `tlsRequired` from the scheme would make that typed intent real.
|
|
180
|
-
//
|
|
181
|
-
// It is deliberately NOT done in this change, for a reason that is true: it converts `meshes
|
|
182
|
-
// add tls://…` against a plaintext broker from a successful registration into a refusal. That
|
|
183
|
-
// is a behaviour change to this command's accept/refuse contract, it belongs with the dial-policy
|
|
184
|
-
// work being done in this file by another lane, and it is not one of the downgrades this branch
|
|
185
|
-
// exists to close. Tracked, owned, and not smuggled in beside them.
|
|
186
|
-
tlsRequired: false,
|
|
346
|
+
// The SAME source the dial policy read ({@link tlsIntent}) — the decision the old comment here
|
|
347
|
+
// reserved for the dial-policy work, now taken. A candidate that probed non-strict while the
|
|
348
|
+
// record it vouched for said strict would verify a connection the record's own dials refuse;
|
|
349
|
+
// carrying the real intent means `meshes add tls://…` against a plaintext broker is a REFUSAL
|
|
350
|
+
// at registration, not a surprise at the first spawn.
|
|
351
|
+
tlsRequired,
|
|
187
352
|
...(auth ? { auth } : {}),
|
|
188
353
|
personaRoot: personaDir(root),
|
|
189
354
|
source: "flag-server",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshes-add.js","sourceRoot":"","sources":["../../src/commands/meshes-add.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"meshes-add.js","sourceRoot":"","sources":["../../src/commands/meshes-add.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"meshes-wizard.d.ts","sourceRoot":"","sources":["../../src/commands/meshes-wizard.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"meshes-wizard.d.ts","sourceRoot":"","sources":["../../src/commands/meshes-wizard.ts"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;GAcG;AAEH;;;;;;;;;GASG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,GAAG,EAAE;QAAE,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC9E,OAAO,IAAI;QAAE,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC7D,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjI,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE;YAAE,KAAK,EAAE,CAAC,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,CAAC,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxG,OAAO,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC9E;AAED;0EAC0E;AAC1E,wBAAgB,OAAO,IAAI,QAAQ,CAmBlC;AAED;;kCAEkC;AAClC,wBAAgB,SAAS,IAAI,OAAO,CAEnC;AAED;wCACwC;AACxC,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,8FAA8F;IAC9F,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAED;oCACoC;AACpC,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,GAAE,QAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkVzG"}
|