@koda-sl/baker-bridge 0.119.0 → 0.121.0-dev.ba3f112da
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 +1 -19
- package/dist/hono/agent-session.d.ts +0 -3
- package/dist/hono/agent-session.d.ts.map +1 -1
- package/dist/hono/agent-session.js +0 -15
- package/dist/hono/agent-session.js.map +1 -1
- package/dist/hono/agent.d.ts +0 -2
- package/dist/hono/agent.d.ts.map +1 -1
- package/dist/hono/agent.js +2 -10
- package/dist/hono/agent.js.map +1 -1
- package/dist/hono/baker-ui-tool-schemas.test.js +0 -6
- package/dist/hono/baker-ui-tool-schemas.test.js.map +1 -1
- package/dist/hono/bridge-job.d.ts +1 -13
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +5 -69
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/bridge-job.test.js +1 -113
- package/dist/hono/bridge-job.test.js.map +1 -1
- package/dist/hono/connection-input.d.ts +1 -8
- package/dist/hono/connection-input.d.ts.map +1 -1
- package/dist/hono/connection-input.js +1 -2
- package/dist/hono/connection-input.js.map +1 -1
- package/dist/hono/connection-input.test.js +8 -17
- package/dist/hono/connection-input.test.js.map +1 -1
- package/dist/hono/convex.d.ts +0 -8
- package/dist/hono/convex.d.ts.map +1 -1
- package/dist/hono/convex.js +0 -8
- package/dist/hono/convex.js.map +1 -1
- package/dist/hono/latitude-telemetry.d.ts.map +1 -1
- package/dist/hono/latitude-telemetry.js +2 -8
- package/dist/hono/latitude-telemetry.js.map +1 -1
- package/dist/hono/prompt-context.d.ts +1 -8
- package/dist/hono/prompt-context.d.ts.map +1 -1
- package/dist/hono/prompt-context.js +7 -45
- package/dist/hono/prompt-context.js.map +1 -1
- package/dist/hono/prompt-context.test.js +1 -35
- package/dist/hono/prompt-context.test.js.map +1 -1
- package/dist/hono/relay.d.ts +1 -10
- package/dist/hono/relay.d.ts.map +1 -1
- package/dist/hono/relay.js +0 -6
- package/dist/hono/relay.js.map +1 -1
- package/dist/hono/server.d.ts.map +1 -1
- package/dist/hono/server.js +0 -22
- package/dist/hono/server.js.map +1 -1
- package/dist/hono/tag-input.d.ts +3 -105
- package/dist/hono/tag-input.d.ts.map +1 -1
- package/dist/hono/tag-input.js +9 -20
- package/dist/hono/tag-input.js.map +1 -1
- package/dist/hono/tag-input.test.js +1 -19
- package/dist/hono/tag-input.test.js.map +1 -1
- package/dist/hono/types.d.ts +0 -8
- package/dist/hono/types.d.ts.map +1 -1
- package/package.json +2 -5
- package/dist/broker/baker-api.d.ts +0 -23
- package/dist/broker/baker-api.d.ts.map +0 -1
- package/dist/broker/baker-api.js +0 -55
- package/dist/broker/baker-api.js.map +0 -1
- package/dist/broker/broker-client.d.ts +0 -10
- package/dist/broker/broker-client.d.ts.map +0 -1
- package/dist/broker/broker-client.js +0 -60
- package/dist/broker/broker-client.js.map +0 -1
- package/dist/broker/ca.d.ts +0 -38
- package/dist/broker/ca.d.ts.map +0 -1
- package/dist/broker/ca.js +0 -80
- package/dist/broker/ca.js.map +0 -1
- package/dist/broker/ca.test.d.ts +0 -2
- package/dist/broker/ca.test.d.ts.map +0 -1
- package/dist/broker/ca.test.js +0 -58
- package/dist/broker/ca.test.js.map +0 -1
- package/dist/broker/credential-cache.d.ts +0 -24
- package/dist/broker/credential-cache.d.ts.map +0 -1
- package/dist/broker/credential-cache.js +0 -69
- package/dist/broker/credential-cache.js.map +0 -1
- package/dist/broker/credential-cache.test.d.ts +0 -2
- package/dist/broker/credential-cache.test.d.ts.map +0 -1
- package/dist/broker/credential-cache.test.js +0 -120
- package/dist/broker/credential-cache.test.js.map +0 -1
- package/dist/broker/credential-text.d.ts +0 -45
- package/dist/broker/credential-text.d.ts.map +0 -1
- package/dist/broker/credential-text.js +0 -103
- package/dist/broker/credential-text.js.map +0 -1
- package/dist/broker/credential-text.test.d.ts +0 -2
- package/dist/broker/credential-text.test.d.ts.map +0 -1
- package/dist/broker/credential-text.test.js +0 -54
- package/dist/broker/credential-text.test.js.map +0 -1
- package/dist/broker/env.d.ts +0 -19
- package/dist/broker/env.d.ts.map +0 -1
- package/dist/broker/env.js +0 -16
- package/dist/broker/env.js.map +0 -1
- package/dist/broker/main.d.ts +0 -3
- package/dist/broker/main.d.ts.map +0 -1
- package/dist/broker/main.js +0 -51
- package/dist/broker/main.js.map +0 -1
- package/dist/broker/proxy.d.ts +0 -24
- package/dist/broker/proxy.d.ts.map +0 -1
- package/dist/broker/proxy.integration.test.d.ts +0 -2
- package/dist/broker/proxy.integration.test.d.ts.map +0 -1
- package/dist/broker/proxy.integration.test.js +0 -201
- package/dist/broker/proxy.integration.test.js.map +0 -1
- package/dist/broker/proxy.js +0 -147
- package/dist/broker/proxy.js.map +0 -1
- package/dist/broker/rewrite.d.ts +0 -44
- package/dist/broker/rewrite.d.ts.map +0 -1
- package/dist/broker/rewrite.js +0 -291
- package/dist/broker/rewrite.js.map +0 -1
- package/dist/broker/rewrite.test.d.ts +0 -2
- package/dist/broker/rewrite.test.d.ts.map +0 -1
- package/dist/broker/rewrite.test.js +0 -171
- package/dist/broker/rewrite.test.js.map +0 -1
- package/dist/broker/socket-service.d.ts +0 -18
- package/dist/broker/socket-service.d.ts.map +0 -1
- package/dist/broker/socket-service.js +0 -103
- package/dist/broker/socket-service.js.map +0 -1
- package/dist/broker/socket-service.test.d.ts +0 -2
- package/dist/broker/socket-service.test.d.ts.map +0 -1
- package/dist/broker/socket-service.test.js +0 -73
- package/dist/broker/socket-service.test.js.map +0 -1
- package/dist/broker/token-bucket.d.ts +0 -9
- package/dist/broker/token-bucket.d.ts.map +0 -1
- package/dist/broker/token-bucket.js +0 -18
- package/dist/broker/token-bucket.js.map +0 -1
- package/dist/broker/usage-reporter.d.ts +0 -18
- package/dist/broker/usage-reporter.d.ts.map +0 -1
- package/dist/broker/usage-reporter.js +0 -31
- package/dist/broker/usage-reporter.js.map +0 -1
- package/dist/broker/usage-reporter.test.d.ts +0 -2
- package/dist/broker/usage-reporter.test.d.ts.map +0 -1
- package/dist/broker/usage-reporter.test.js +0 -20
- package/dist/broker/usage-reporter.test.js.map +0 -1
- package/dist/hono/credential-input.d.ts +0 -39
- package/dist/hono/credential-input.d.ts.map +0 -1
- package/dist/hono/credential-input.js +0 -78
- package/dist/hono/credential-input.js.map +0 -1
- package/dist/hono/credential-scrub.d.ts +0 -41
- package/dist/hono/credential-scrub.d.ts.map +0 -1
- package/dist/hono/credential-scrub.js +0 -152
- package/dist/hono/credential-scrub.js.map +0 -1
- package/dist/hono/credential-scrub.test.d.ts +0 -2
- package/dist/hono/credential-scrub.test.d.ts.map +0 -1
- package/dist/hono/credential-scrub.test.js +0 -105
- package/dist/hono/credential-scrub.test.js.map +0 -1
package/dist/broker/proxy.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The credential broker: an explicit HTTP(S) proxy (mockttp, TLS intercepted
|
|
3
|
-
* with the broker's own CA) that swaps `{{credential:NAME}}` for the value on
|
|
4
|
-
* the way out and swaps the value back to the placeholder on the way in.
|
|
5
|
-
*
|
|
6
|
-
* Two rules, in order:
|
|
7
|
-
* - A request carrying a placeholder is rewritten by `rewriteRequest` and its
|
|
8
|
-
* response is scrubbed. mockttp's `beforeResponse` buffers the whole
|
|
9
|
-
* response, so these responses — event streams included — arrive in one
|
|
10
|
-
* piece. Headers are always scrubbed; a UTF-8 body, whatever its content
|
|
11
|
-
* type, is scrubbed up to 10 MB, and anything larger or binary passes through as-is.
|
|
12
|
-
* - Every other request passes straight through, streamed and untouched: no
|
|
13
|
-
* value was put into it, so there is nothing of ours to take out.
|
|
14
|
-
*
|
|
15
|
-
* Memory: the placeholder check reads each request body in full, and a
|
|
16
|
-
* credential-carrying request's response is buffered in full by mockttp
|
|
17
|
-
* before it is scrubbed (over 10 MB it then passes through unscrubbed).
|
|
18
|
-
* mockttp's `maxBodySize` cannot bound this: in 4.6.3 a body over the limit
|
|
19
|
-
* that a callback matcher has read is forwarded empty, so a large upload would
|
|
20
|
-
* hang or arrive truncated (see the upload test in `proxy.integration.test.ts`).
|
|
21
|
-
*/
|
|
22
|
-
import { getLocal } from "mockttp";
|
|
23
|
-
import { createCredentialCache } from "./credential-cache.js";
|
|
24
|
-
import { scrub } from "./credential-text.js";
|
|
25
|
-
import { carriesPlaceholder, MAX_REWRITE_BODY_BYTES, rewriteRequest, sentBasicPairs, } from "./rewrite.js";
|
|
26
|
-
import { createUsageReporter } from "./usage-reporter.js";
|
|
27
|
-
export const DEFAULT_PROXY_PORT = 8877;
|
|
28
|
-
const LOOPBACK_ADDRESSES = new Set(["127.0.0.1", "::1", "::ffff:127.0.0.1"]);
|
|
29
|
-
/** Anyone but this machine: the sandbox's ports are reachable from outside it. */
|
|
30
|
-
function fromElsewhere(req) {
|
|
31
|
-
return !LOOPBACK_ADDRESSES.has(req.remoteIpAddress ?? "");
|
|
32
|
-
}
|
|
33
|
-
async function outgoing(req) {
|
|
34
|
-
return { url: req.url, headers: req.headers, body: (await req.body.getDecodedBuffer()) ?? null };
|
|
35
|
-
}
|
|
36
|
-
function scrubHeaders(headers, credentials) {
|
|
37
|
-
let changed = false;
|
|
38
|
-
const out = {};
|
|
39
|
-
for (const [name, value] of Object.entries(headers)) {
|
|
40
|
-
const scrubbed = Array.isArray(value)
|
|
41
|
-
? value.map((item) => scrub(item, credentials))
|
|
42
|
-
: value === undefined
|
|
43
|
-
? undefined
|
|
44
|
-
: scrub(value, credentials);
|
|
45
|
-
if (JSON.stringify(scrubbed) !== JSON.stringify(value))
|
|
46
|
-
changed = true;
|
|
47
|
-
out[name] = scrubbed;
|
|
48
|
-
}
|
|
49
|
-
return changed ? out : undefined;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* The scrubbed body, or undefined when it is not UTF-8 text, over 10 MB, or
|
|
53
|
-
* holds no value. Any content type: a value echoed as NDJSON, YAML or JSON sent
|
|
54
|
-
* as `application/octet-stream` reaches the agent all the same.
|
|
55
|
-
*/
|
|
56
|
-
function scrubBody(raw, credentials) {
|
|
57
|
-
if (raw === undefined || raw.byteLength > MAX_REWRITE_BODY_BYTES)
|
|
58
|
-
return undefined;
|
|
59
|
-
let text;
|
|
60
|
-
try {
|
|
61
|
-
text = new TextDecoder("utf-8", { fatal: true }).decode(raw);
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
const scrubbed = scrub(text, credentials);
|
|
67
|
-
return scrubbed === text ? undefined : scrubbed;
|
|
68
|
-
}
|
|
69
|
-
export function createBroker(options) {
|
|
70
|
-
const log = options.log ?? (() => undefined);
|
|
71
|
-
const cache = createCredentialCache({ fetchCredentials: options.fetchCredentials, log });
|
|
72
|
-
const usage = createUsageReporter({ reportUsage: options.reportUsage, log });
|
|
73
|
-
const server = getLocal({
|
|
74
|
-
https: { key: options.ca.key, cert: options.ca.cert },
|
|
75
|
-
recordTraffic: false,
|
|
76
|
-
});
|
|
77
|
-
const upstreamTrust = { additionalTrustedCAs: (options.upstreamCAs ?? []).map((cert) => ({ cert })) };
|
|
78
|
-
let stopUsage = () => undefined;
|
|
79
|
-
async function decide(req) {
|
|
80
|
-
const request = await outgoing(req);
|
|
81
|
-
let decision = rewriteRequest(request, await cache.get());
|
|
82
|
-
if (decision.kind === "reject" && decision.stale && cache.refresh()) {
|
|
83
|
-
decision = rewriteRequest(request, await cache.get());
|
|
84
|
-
}
|
|
85
|
-
return decision;
|
|
86
|
-
}
|
|
87
|
-
async function beforeRequest(req) {
|
|
88
|
-
const decision = await decide(req);
|
|
89
|
-
const host = new URL(req.url).hostname;
|
|
90
|
-
if (decision.kind === "pass")
|
|
91
|
-
return undefined;
|
|
92
|
-
if (decision.kind === "reject") {
|
|
93
|
-
log(`refused ${decision.status} for ${host}`);
|
|
94
|
-
return {
|
|
95
|
-
response: {
|
|
96
|
-
statusCode: decision.status,
|
|
97
|
-
headers: { "content-type": "text/plain; charset=utf-8", "x-baker-credential-broker": "refused" },
|
|
98
|
-
body: decision.message,
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
for (const name of decision.used)
|
|
103
|
-
usage.record(name, host);
|
|
104
|
-
log(`sent ${decision.used.join(", ")} to ${host}`);
|
|
105
|
-
return {
|
|
106
|
-
url: decision.url,
|
|
107
|
-
headers: decision.headers,
|
|
108
|
-
...(decision.body === undefined ? {} : { body: decision.body }),
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
async function beforeResponse(res, req) {
|
|
112
|
-
const resolved = await cache.scrubbable();
|
|
113
|
-
const credentials = [...resolved, ...sentBasicPairs(req.headers, resolved)];
|
|
114
|
-
const headers = scrubHeaders(res.headers, credentials);
|
|
115
|
-
const body = scrubBody(await res.body.getDecodedBuffer(), credentials);
|
|
116
|
-
if (headers === undefined && body === undefined)
|
|
117
|
-
return undefined;
|
|
118
|
-
return { ...(headers === undefined ? {} : { headers }), ...(body === undefined ? {} : { body }) };
|
|
119
|
-
}
|
|
120
|
-
async function registerRules() {
|
|
121
|
-
await server.forAnyRequest().matching(fromElsewhere).always().thenCloseConnection();
|
|
122
|
-
// mockttp listens on every interface, and WebSocket upgrades take their own rule set.
|
|
123
|
-
await server.forAnyWebSocket().matching(fromElsewhere).always().thenCloseConnection();
|
|
124
|
-
await server
|
|
125
|
-
.forAnyRequest()
|
|
126
|
-
.matching(async (req) => carriesPlaceholder(await outgoing(req)))
|
|
127
|
-
.always()
|
|
128
|
-
.thenPassThrough({ ...upstreamTrust, beforeRequest, beforeResponse });
|
|
129
|
-
await server.forAnyRequest().always().thenPassThrough(upstreamTrust);
|
|
130
|
-
await server.forAnyWebSocket().always().thenPassThrough(upstreamTrust);
|
|
131
|
-
}
|
|
132
|
-
return {
|
|
133
|
-
cache,
|
|
134
|
-
async start() {
|
|
135
|
-
await server.start(options.port ?? DEFAULT_PROXY_PORT);
|
|
136
|
-
await registerRules();
|
|
137
|
-
stopUsage = usage.start();
|
|
138
|
-
return server.port;
|
|
139
|
-
},
|
|
140
|
-
async stop() {
|
|
141
|
-
stopUsage();
|
|
142
|
-
await usage.flush();
|
|
143
|
-
await server.stop();
|
|
144
|
-
},
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
//# sourceMappingURL=proxy.js.map
|
package/dist/broker/proxy.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/broker/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/broker/rewrite.d.ts
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { type ResolvedCredential, type ScrubbableCredential } from "./credential-text.ts";
|
|
2
|
-
export type RequestHeaders = Record<string, string | string[] | undefined>;
|
|
3
|
-
export type OutgoingRequest = {
|
|
4
|
-
url: string;
|
|
5
|
-
headers: RequestHeaders;
|
|
6
|
-
/** The decoded (content-encoding removed) body, or null when there is none. */
|
|
7
|
-
body: Uint8Array | null;
|
|
8
|
-
};
|
|
9
|
-
export type RewriteDecision = {
|
|
10
|
-
kind: "pass";
|
|
11
|
-
} | {
|
|
12
|
-
kind: "rewrite";
|
|
13
|
-
url: string;
|
|
14
|
-
headers: RequestHeaders;
|
|
15
|
-
body?: string;
|
|
16
|
-
used: string[];
|
|
17
|
-
} | {
|
|
18
|
-
kind: "reject";
|
|
19
|
-
status: 403 | 404 | 413 | 503;
|
|
20
|
-
message: string;
|
|
21
|
-
/** Set when a fresher credential table could change the answer (a name or website added since the last fetch). */
|
|
22
|
-
stale?: true;
|
|
23
|
-
};
|
|
24
|
-
/** The largest body the broker reads for placeholders or scrubs values out of. */
|
|
25
|
-
export declare const MAX_REWRITE_BODY_BYTES: number;
|
|
26
|
-
/**
|
|
27
|
-
* The `user:value` pairs a request's Basic auth headers carry, as sent. A
|
|
28
|
-
* response that echoes the header holds the pair's base64, which is not the
|
|
29
|
-
* base64 of the value alone, so each is scrubbed as a credential of its own.
|
|
30
|
-
*/
|
|
31
|
-
export declare function sentBasicPairs(headers: RequestHeaders, credentials: readonly ScrubbableCredential[]): ScrubbableCredential[];
|
|
32
|
-
/** Whether a body is text the broker may read and rewrite (by content type, or valid UTF-8 when there is none). */
|
|
33
|
-
export declare function isTextBody(contentType: string | undefined, body: Uint8Array): boolean;
|
|
34
|
-
/** Whether a placeholder appears anywhere the broker looks — the URL, a header or the body. */
|
|
35
|
-
export declare function carriesPlaceholder(request: OutgoingRequest): boolean;
|
|
36
|
-
/**
|
|
37
|
-
* `credentials` is null when the table could not be fetched. Only a
|
|
38
|
-
* placeholder in the URL or a header — where the agent clearly meant to
|
|
39
|
-
* authenticate — is ever refused; one that appears only in the body is text
|
|
40
|
-
* (a chat message, a prompt) and passes through unless it names a credential
|
|
41
|
-
* this host may receive.
|
|
42
|
-
*/
|
|
43
|
-
export declare function rewriteRequest(request: OutgoingRequest, credentials: readonly ResolvedCredential[] | null): RewriteDecision;
|
|
44
|
-
//# sourceMappingURL=rewrite.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rewrite.d.ts","sourceRoot":"","sources":["../../src/broker/rewrite.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,oBAAoB,EAAc,MAAM,sBAAsB,CAAC;AAEtG,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAE3E,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,cAAc,CAAC;IACxB,+EAA+E;IAC/E,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GACxF;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,kHAAkH;IAClH,KAAK,CAAC,EAAE,IAAI,CAAC;CACd,CAAC;AAEN,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,QAAmB,CAAC;AAoDvD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,WAAW,EAAE,SAAS,oBAAoB,EAAE,GAC3C,oBAAoB,EAAE,CAUxB;AAwDD,mHAAmH;AACnH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAErF;AA0GD,+FAA+F;AAC/F,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEpE;AAsCD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,SAAS,kBAAkB,EAAE,GAAG,IAAI,GAChD,eAAe,CA4BjB"}
|
package/dist/broker/rewrite.js
DELETED
|
@@ -1,291 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The decision the credential broker makes for one outgoing request: send it
|
|
3
|
-
* as-is, send it with placeholders swapped for values, or answer it itself
|
|
4
|
-
* with a refusal the agent can act on. Pure — the proxy wiring lives in
|
|
5
|
-
* `proxy.ts`.
|
|
6
|
-
*/
|
|
7
|
-
import { parse as legacyParseUrl } from "node:url";
|
|
8
|
-
import { substitute } from "./credential-text.js";
|
|
9
|
-
/** The largest body the broker reads for placeholders or scrubs values out of. */
|
|
10
|
-
export const MAX_REWRITE_BODY_BYTES = 10 * 1024 * 1024;
|
|
11
|
-
const PLACEHOLDER_MARKER = "{{credential:";
|
|
12
|
-
const ENCODED_PLACEHOLDER = /%7B%7Bcredential%3A([a-z0-9_-]{1,64})%7D%7D/gi;
|
|
13
|
-
/** `%7B%7Bcredential%3Aname%7D%7D` — what an HTTP client makes of a placeholder in a URL — back to `{{credential:name}}`. */
|
|
14
|
-
function decodePlaceholders(text) {
|
|
15
|
-
return text.replace(ENCODED_PLACEHOLDER, (_match, name) => `{{credential:${name}}}`);
|
|
16
|
-
}
|
|
17
|
-
/** Collects what every substitution in one request used, was refused, or could not find. */
|
|
18
|
-
function createSubstituter(credentials, host) {
|
|
19
|
-
const used = new Set();
|
|
20
|
-
const denied = new Map();
|
|
21
|
-
const unknown = new Set();
|
|
22
|
-
return {
|
|
23
|
-
used,
|
|
24
|
-
denied,
|
|
25
|
-
unknown,
|
|
26
|
-
apply(text, encode = (value) => value) {
|
|
27
|
-
const encoded = credentials.map((credential) => ({ ...credential, value: encode(credential.value) }));
|
|
28
|
-
const result = substitute(text, encoded, host);
|
|
29
|
-
for (const name of result.used)
|
|
30
|
-
used.add(name);
|
|
31
|
-
for (const { name, allowedHosts } of result.denied)
|
|
32
|
-
denied.set(name, allowedHosts);
|
|
33
|
-
for (const name of result.unknown)
|
|
34
|
-
unknown.add(name);
|
|
35
|
-
return result.out;
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
const BASIC_AUTH = /^(Basic\s+)([A-Za-z0-9+/=_-]+)\s*$/i;
|
|
40
|
-
/** The `user:password` a Basic auth header carries. */
|
|
41
|
-
function basicCredentials(value) {
|
|
42
|
-
const match = BASIC_AUTH.exec(value);
|
|
43
|
-
return match === null ? null : Buffer.from(match[2] ?? "", "base64").toString("utf8");
|
|
44
|
-
}
|
|
45
|
-
/** The `user:password` inside a Basic auth header, when it carries a placeholder. */
|
|
46
|
-
function basicPair(value) {
|
|
47
|
-
const pair = basicCredentials(value);
|
|
48
|
-
return pair?.includes(PLACEHOLDER_MARKER) ? { scheme: BASIC_AUTH.exec(value)?.[1] ?? "Basic ", pair } : null;
|
|
49
|
-
}
|
|
50
|
-
function rewriteHeaderValue(value, substituter) {
|
|
51
|
-
const basic = basicPair(value);
|
|
52
|
-
if (basic === null)
|
|
53
|
-
return substituter.apply(value);
|
|
54
|
-
return basic.scheme + Buffer.from(substituter.apply(basic.pair), "utf8").toString("base64");
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* The `user:value` pairs a request's Basic auth headers carry, as sent. A
|
|
58
|
-
* response that echoes the header holds the pair's base64, which is not the
|
|
59
|
-
* base64 of the value alone, so each is scrubbed as a credential of its own.
|
|
60
|
-
*/
|
|
61
|
-
export function sentBasicPairs(headers, credentials) {
|
|
62
|
-
return Object.entries(headers).flatMap(([name, values]) => name.startsWith(":")
|
|
63
|
-
? []
|
|
64
|
-
: [values ?? []].flat().flatMap((value) => {
|
|
65
|
-
const pair = basicCredentials(value);
|
|
66
|
-
const credential = pair === null ? undefined : credentials.find((c) => pair.includes(c.value));
|
|
67
|
-
return pair === null || credential === undefined ? [] : [{ name: credential.name, value: pair }];
|
|
68
|
-
}));
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* HTTP/2 pseudo-headers (`:path`, `:authority`) are returned as they came:
|
|
72
|
-
* mockttp regenerates them from the URL, which is rewritten on its own, and
|
|
73
|
-
* refuses a request whose `:path` was changed.
|
|
74
|
-
*/
|
|
75
|
-
function rewriteHeaders(headers, substituter) {
|
|
76
|
-
const out = {};
|
|
77
|
-
for (const [name, value] of Object.entries(headers)) {
|
|
78
|
-
if (value === undefined)
|
|
79
|
-
continue;
|
|
80
|
-
if (name.startsWith(":")) {
|
|
81
|
-
out[name] = value;
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
out[name] = Array.isArray(value)
|
|
85
|
-
? value.map((item) => rewriteHeaderValue(item, substituter))
|
|
86
|
-
: rewriteHeaderValue(value, substituter);
|
|
87
|
-
}
|
|
88
|
-
return out;
|
|
89
|
-
}
|
|
90
|
-
function headerValue(headers, name) {
|
|
91
|
-
const value = headers[name];
|
|
92
|
-
return Array.isArray(value) ? value[0] : value;
|
|
93
|
-
}
|
|
94
|
-
function isUtf8(bytes) {
|
|
95
|
-
try {
|
|
96
|
-
new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
97
|
-
return true;
|
|
98
|
-
}
|
|
99
|
-
catch {
|
|
100
|
-
return false;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
/** How a value must be escaped to sit inside this body, or null when the body is not text. */
|
|
104
|
-
function bodyFormat(contentType, body) {
|
|
105
|
-
const type = contentType?.split(";")[0]?.trim().toLowerCase();
|
|
106
|
-
if (type === undefined || type === "")
|
|
107
|
-
return isUtf8(body) ? "text" : null;
|
|
108
|
-
if (type === "application/json" || type.endsWith("+json"))
|
|
109
|
-
return "json";
|
|
110
|
-
if (type === "application/x-www-form-urlencoded")
|
|
111
|
-
return "form";
|
|
112
|
-
if (type.startsWith("text/") ||
|
|
113
|
-
type.endsWith("/xml") ||
|
|
114
|
-
type.endsWith("+xml") ||
|
|
115
|
-
type === "application/graphql" ||
|
|
116
|
-
type === "application/javascript") {
|
|
117
|
-
return "text";
|
|
118
|
-
}
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
/** Whether a body is text the broker may read and rewrite (by content type, or valid UTF-8 when there is none). */
|
|
122
|
-
export function isTextBody(contentType, body) {
|
|
123
|
-
return bodyFormat(contentType, body) !== null;
|
|
124
|
-
}
|
|
125
|
-
const ENCODE_FOR = {
|
|
126
|
-
json: (value) => JSON.stringify(value).slice(1, -1),
|
|
127
|
-
form: encodeURIComponent,
|
|
128
|
-
text: (value) => value,
|
|
129
|
-
};
|
|
130
|
-
function headerText(headers) {
|
|
131
|
-
return Object.values(headers)
|
|
132
|
-
.flat()
|
|
133
|
-
.map((value) => (value === undefined ? "" : (basicPair(value)?.pair ?? value)))
|
|
134
|
-
.join("\n");
|
|
135
|
-
}
|
|
136
|
-
const BODY_TOO_LARGE = {
|
|
137
|
-
kind: "reject",
|
|
138
|
-
status: 413,
|
|
139
|
-
message: "Baker credentials can only be placed in text request bodies (JSON, form, text, XML or GraphQL) up to 10 MB. Put the placeholder in a header or the URL instead.",
|
|
140
|
-
};
|
|
141
|
-
function hasPlaceholder(text) {
|
|
142
|
-
return text.includes(PLACEHOLDER_MARKER) || decodePlaceholders(text) !== text;
|
|
143
|
-
}
|
|
144
|
-
const UNAVAILABLE = {
|
|
145
|
-
kind: "reject",
|
|
146
|
-
status: 503,
|
|
147
|
-
message: "Baker credentials are unavailable right now — try again in a minute.",
|
|
148
|
-
};
|
|
149
|
-
const LOOPBACK_HOSTS = new Set(["localhost", "127.0.0.1", "[::1]"]);
|
|
150
|
-
/** A DNS name as the WHATWG parser emits it (IDNs arrive as `xn--`). Anything else could parse differently elsewhere. */
|
|
151
|
-
const PLAIN_HOSTNAME = /^[a-z0-9.-]+$/;
|
|
152
|
-
/**
|
|
153
|
-
* mockttp connects to `url.parse(<returned url>).hostname`, not to the name
|
|
154
|
-
* the check read. The two parsers disagree on unusual characters, so a
|
|
155
|
-
* credential is only substituted when both see the same host.
|
|
156
|
-
*/
|
|
157
|
-
function upstreamHostMatches(url, host) {
|
|
158
|
-
return PLAIN_HOSTNAME.test(host) && legacyParseUrl(url).hostname === host;
|
|
159
|
-
}
|
|
160
|
-
const HOST_MISMATCH = {
|
|
161
|
-
kind: "reject",
|
|
162
|
-
status: 403,
|
|
163
|
-
message: "Baker credentials are only sent to a plain website address, and never inside the address itself. Put the credential in a header, the query string or the body.",
|
|
164
|
-
};
|
|
165
|
-
/** The host a `Host` / `:authority` value names, port stripped and lower-cased; null when it is not a host. */
|
|
166
|
-
function authorityHost(value) {
|
|
167
|
-
const candidate = `http://${value.trim()}`;
|
|
168
|
-
return URL.canParse(candidate) ? new URL(candidate).hostname.toLowerCase() : null;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* The value goes to the site the check read, not to whatever site the agent's
|
|
172
|
-
* own `Host` or `:authority` names — on a shared CDN those can differ, and
|
|
173
|
-
* both headers are forwarded unchanged.
|
|
174
|
-
*/
|
|
175
|
-
function hostHeadersMatch(headers, host) {
|
|
176
|
-
return ["host", ":authority"].every((name) => {
|
|
177
|
-
const values = headers[name];
|
|
178
|
-
if (values === undefined)
|
|
179
|
-
return true;
|
|
180
|
-
return [values].flat().every((value) => authorityHost(value) === host.toLowerCase());
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
function hostHeaderRefusal(headers, host, used) {
|
|
184
|
-
if (used.size === 0 || hostHeadersMatch(headers, host))
|
|
185
|
-
return null;
|
|
186
|
-
return {
|
|
187
|
-
kind: "reject",
|
|
188
|
-
status: 403,
|
|
189
|
-
message: `This request goes to "${host}" but its Host header names another website, so Baker did not send the credential. Remove the Host header.`,
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
const SETTINGS = "Settings → Credentials";
|
|
193
|
-
function refuse(substituter, host) {
|
|
194
|
-
const [unknown] = substituter.unknown;
|
|
195
|
-
if (unknown !== undefined) {
|
|
196
|
-
return {
|
|
197
|
-
kind: "reject",
|
|
198
|
-
status: 404,
|
|
199
|
-
message: `No Baker credential named "${unknown}". Run \`baker credentials list\` to see the names you can use.`,
|
|
200
|
-
stale: true,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
203
|
-
const [denied] = substituter.denied;
|
|
204
|
-
if (denied === undefined)
|
|
205
|
-
return null;
|
|
206
|
-
const [name, allowedHosts] = denied;
|
|
207
|
-
const message = allowedHosts.length === 0
|
|
208
|
-
? `Baker credential "${name}" has no websites it may be sent to yet. Ask the user to choose them in ${SETTINGS}.`
|
|
209
|
-
: `Baker credential "${name}" is not allowed for host "${host}". Allowed: ${allowedHosts.join(", ")}. Ask the user to add this website to the credential in ${SETTINGS}.`;
|
|
210
|
-
return { kind: "reject", status: 403, message, stale: true };
|
|
211
|
-
}
|
|
212
|
-
function bodyText(body) {
|
|
213
|
-
return body === null ? "" : Buffer.from(body).toString("latin1");
|
|
214
|
-
}
|
|
215
|
-
/** Whether a placeholder appears anywhere the broker looks — the URL, a header or the body. */
|
|
216
|
-
export function carriesPlaceholder(request) {
|
|
217
|
-
return [request.url, headerText(request.headers), bodyText(request.body)].some(hasPlaceholder);
|
|
218
|
-
}
|
|
219
|
-
/** Whether any placeholder in the body names a credential this host may receive — only then is the body rewritten. */
|
|
220
|
-
function bodyUsesCredential(body, credentials, host) {
|
|
221
|
-
if (body === null)
|
|
222
|
-
return false;
|
|
223
|
-
const text = decodePlaceholders(bodyText(body));
|
|
224
|
-
return hasPlaceholder(text) && substitute(text, credentials, host).used.length > 0;
|
|
225
|
-
}
|
|
226
|
-
/** The body with every placeholder for a credential this host may receive swapped in, escaped for its format. */
|
|
227
|
-
function rewriteBody(request, credentials, host) {
|
|
228
|
-
const raw = request.body ?? new Uint8Array();
|
|
229
|
-
const format = bodyFormat(headerValue(request.headers, "content-type"), raw);
|
|
230
|
-
if (format === null || raw.byteLength > MAX_REWRITE_BODY_BYTES)
|
|
231
|
-
return BODY_TOO_LARGE;
|
|
232
|
-
const substituter = createSubstituter(credentials, host);
|
|
233
|
-
const decoded = Buffer.from(raw).toString("utf8");
|
|
234
|
-
const text = substituter.apply(format === "form" ? decodePlaceholders(decoded) : decoded, ENCODE_FOR[format]);
|
|
235
|
-
return { kind: "body", text, used: substituter.used };
|
|
236
|
-
}
|
|
237
|
-
/** A refusal for plain http to anything but this machine. */
|
|
238
|
-
function insecureRefusal(target) {
|
|
239
|
-
if (target.protocol === "https:" || LOOPBACK_HOSTS.has(target.hostname))
|
|
240
|
-
return null;
|
|
241
|
-
return {
|
|
242
|
-
kind: "reject",
|
|
243
|
-
status: 403,
|
|
244
|
-
message: `Baker credentials are only sent over https. Use https://${target.host}${target.pathname} instead.`,
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* `credentials` is null when the table could not be fetched. Only a
|
|
249
|
-
* placeholder in the URL or a header — where the agent clearly meant to
|
|
250
|
-
* authenticate — is ever refused; one that appears only in the body is text
|
|
251
|
-
* (a chat message, a prompt) and passes through unless it names a credential
|
|
252
|
-
* this host may receive.
|
|
253
|
-
*/
|
|
254
|
-
export function rewriteRequest(request, credentials) {
|
|
255
|
-
if (!carriesPlaceholder(request))
|
|
256
|
-
return { kind: "pass" };
|
|
257
|
-
const url = decodePlaceholders(request.url);
|
|
258
|
-
if (!URL.canParse(request.url))
|
|
259
|
-
return HOST_MISMATCH;
|
|
260
|
-
const target = new URL(request.url);
|
|
261
|
-
const host = target.hostname;
|
|
262
|
-
const authPlaceholder = [url, headerText(request.headers)].some(hasPlaceholder);
|
|
263
|
-
if (credentials === null)
|
|
264
|
-
return authPlaceholder ? UNAVAILABLE : { kind: "pass" };
|
|
265
|
-
const bodyCarriesCredential = bodyUsesCredential(request.body, credentials, host);
|
|
266
|
-
if (!authPlaceholder && !bodyCarriesCredential)
|
|
267
|
-
return { kind: "pass" };
|
|
268
|
-
const insecure = insecureRefusal(target);
|
|
269
|
-
if (insecure !== null)
|
|
270
|
-
return insecure;
|
|
271
|
-
const substituter = createSubstituter(credentials, host);
|
|
272
|
-
const rewrittenUrl = substituter.apply(url, encodeURIComponent);
|
|
273
|
-
if (!upstreamHostMatches(rewrittenUrl, host))
|
|
274
|
-
return HOST_MISMATCH;
|
|
275
|
-
const headers = rewriteHeaders(request.headers, substituter);
|
|
276
|
-
const body = bodyCarriesCredential ? rewriteBody(request, credentials, host) : undefined;
|
|
277
|
-
if (body?.kind === "reject")
|
|
278
|
-
return body;
|
|
279
|
-
const used = new Set([...substituter.used, ...(body?.used ?? [])]);
|
|
280
|
-
const refusal = refuse(substituter, host) ?? hostHeaderRefusal(request.headers, host, used);
|
|
281
|
-
if (refusal !== null)
|
|
282
|
-
return refusal;
|
|
283
|
-
return {
|
|
284
|
-
kind: "rewrite",
|
|
285
|
-
url: rewrittenUrl,
|
|
286
|
-
headers,
|
|
287
|
-
...(body === undefined ? {} : { body: body.text }),
|
|
288
|
-
used: [...used],
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
//# sourceMappingURL=rewrite.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rewrite.js","sourceRoot":"","sources":["../../src/broker/rewrite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rewrite.test.d.ts","sourceRoot":"","sources":["../../src/broker/rewrite.test.ts"],"names":[],"mappings":""}
|