@hyperdreamer/pi-webui 1.6.1 → 1.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/assets/{CodeViewer-aB4ZVzEu.js → CodeViewer-6qlmWYzB.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-f8X7aTkU.js → UnifiedDiffViewer-SCHm0P_t.js} +1 -1
- package/dist/client/assets/{index-Cffeusjy.js → index-C9z5sr6t.js} +448 -388
- package/dist/client/index.html +1 -1
- package/dist/server/app.js +15 -1
- package/dist/server/app.js.map +1 -1
- package/dist/server/browser/browserCapabilities.js +74 -0
- package/dist/server/browser/browserCapabilities.js.map +1 -0
- package/dist/server/browser/browserCapabilityRoutes.js +34 -0
- package/dist/server/browser/browserCapabilityRoutes.js.map +1 -0
- package/dist/server/browser/browserPolicy.js +382 -0
- package/dist/server/browser/browserPolicy.js.map +1 -0
- package/dist/server/browser/browserRuntime.js +16 -0
- package/dist/server/browser/browserRuntime.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +95 -10
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionCleanup.js +26 -0
- package/dist/server/sessions/sessionCleanup.js.map +1 -1
- package/dist/server/sessions/sessionCommandService.js +1 -1
- package/dist/server/sessions/sessionCommandService.js.map +1 -1
- package/dist/server/sessions/sessionRoutes.js +26 -0
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/shared/apiTypes.d.ts +8 -0
- package/dist/shared/apiTypes.js +1 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +3 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +2 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/package.json +1 -1
package/dist/client/index.html
CHANGED
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
html, body { margin: 0; height: 100%; overflow: hidden; background: var(--pi-bg); color: var(--pi-text); }
|
|
54
54
|
body { min-height: 100dvh; }
|
|
55
55
|
</style>
|
|
56
|
-
<script type="module" crossorigin src="./assets/index-
|
|
56
|
+
<script type="module" crossorigin src="./assets/index-C9z5sr6t.js"></script>
|
|
57
57
|
<link rel="modulepreload" crossorigin href="./assets/vendor-editor-core-vUi74DnD.js">
|
|
58
58
|
<link rel="modulepreload" crossorigin href="./assets/vendor-editor-languages-DoaXUodB.js">
|
|
59
59
|
<link rel="modulepreload" crossorigin href="./assets/vendor-terminal-D8k4UKM2.js">
|
package/dist/server/app.js
CHANGED
|
@@ -33,6 +33,8 @@ import { MachineService } from "./machines/machineService.js";
|
|
|
33
33
|
import { registerMachineRoutes } from "./machines/machineRoutes.js";
|
|
34
34
|
import { registerMachineProxyRoutes } from "./machines/machineProxyRoutes.js";
|
|
35
35
|
import { proxyMachinePluginAsset, registerMachinePluginProxyRoutes } from "./machines/machinePluginProxyRoutes.js";
|
|
36
|
+
import { registerLocalBrowserCapabilityRoutes } from "./browser/browserCapabilityRoutes.js";
|
|
37
|
+
import { unavailableBrowserRuntime } from "./browser/browserRuntime.js";
|
|
36
38
|
function registerLocalProjectRoutes(app, projects, workspaces, prefix, options = {}) {
|
|
37
39
|
app.get(`${prefix}/projects`, async () => projects.list());
|
|
38
40
|
app.post(`${prefix}/projects`, async (request, reply) => {
|
|
@@ -121,6 +123,9 @@ async function withProfileDependency(reply, operation) {
|
|
|
121
123
|
return reply.code(503).send({ error: error.message });
|
|
122
124
|
}
|
|
123
125
|
}
|
|
126
|
+
function isApiPath(requestUrl) {
|
|
127
|
+
return requestUrl === "/api" || requestUrl.startsWith("/api/") || requestUrl.startsWith("/api?");
|
|
128
|
+
}
|
|
124
129
|
export async function buildApp(deps = {}) {
|
|
125
130
|
const app = Fastify({ logger: deps.logger ?? true, ...(deps.bodyLimit === undefined ? {} : { bodyLimit: deps.bodyLimit }) });
|
|
126
131
|
// Vite proxies development API requests here, while production and machine-scoped
|
|
@@ -135,6 +140,7 @@ export async function buildApp(deps = {}) {
|
|
|
135
140
|
const workspaces = deps.workspaces ?? new WorkspaceService();
|
|
136
141
|
const configService = deps.config ?? createFilePiWebUiConfigService();
|
|
137
142
|
const readConfig = () => readEffectiveConfig(configService);
|
|
143
|
+
const browserRuntime = deps.browserRuntime ?? unavailableBrowserRuntime();
|
|
138
144
|
const sessionDaemon = deps.sessionDaemon ?? new SessionDaemonClient();
|
|
139
145
|
const agentProfileProvider = deps.agentProfileProvider ?? new SessionDaemonActiveAgentProfileProvider(sessionDaemon);
|
|
140
146
|
const piWebUiPlugins = deps.piWebUiPlugins ?? new PiWebUiPluginService({
|
|
@@ -183,6 +189,10 @@ export async function buildApp(deps = {}) {
|
|
|
183
189
|
registerLocalMachineConfigRoutes(app, invalidatingConfigService);
|
|
184
190
|
registerMachineRoutes(app, machines);
|
|
185
191
|
registerMachinePluginProxyRoutes(app, machines);
|
|
192
|
+
registerLocalBrowserCapabilityRoutes(app, {
|
|
193
|
+
runtime: browserRuntime,
|
|
194
|
+
...(deps.browserPrincipalProvider === undefined ? {} : { principalProvider: deps.browserPrincipalProvider }),
|
|
195
|
+
});
|
|
186
196
|
registerLocalProjectRoutes(app, projects, workspaces, "/api", { config: configService });
|
|
187
197
|
registerLocalProjectRoutes(app, projects, workspaces, "/api/machines/local", { config: configService });
|
|
188
198
|
registerSessionProxyRoutes(app, sessionDaemon);
|
|
@@ -204,7 +214,11 @@ export async function buildApp(deps = {}) {
|
|
|
204
214
|
const clientDist = deps.clientDist ?? (existsSync(packagedClientDist) ? packagedClientDist : join(process.cwd(), "dist", "client"));
|
|
205
215
|
if (clientDist !== false && existsSync(clientDist)) {
|
|
206
216
|
await app.register(fastifyStatic, { root: clientDist });
|
|
207
|
-
app.setNotFoundHandler((
|
|
217
|
+
app.setNotFoundHandler((request, reply) => {
|
|
218
|
+
if (isApiPath(request.url))
|
|
219
|
+
return reply.code(404).send({ error: "API route not found" });
|
|
220
|
+
return reply.sendFile("index.html");
|
|
221
|
+
});
|
|
208
222
|
}
|
|
209
223
|
return app;
|
|
210
224
|
}
|
package/dist/server/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
const BROWSER_PROTOCOL_VERSION = 1;
|
|
2
|
+
const MAX_TABS_PER_SESSION = 10;
|
|
3
|
+
const MAX_SESSIONS_PER_PRINCIPAL = 2;
|
|
4
|
+
/**
|
|
5
|
+
* Pure feature gate for the browser capability. The runtime adapter must prove
|
|
6
|
+
* every isolation property; partial readiness never becomes browser access.
|
|
7
|
+
*/
|
|
8
|
+
export function evaluateBrowserRemoteCapability(principal, readiness) {
|
|
9
|
+
if (!hasTrustedPrincipal(principal))
|
|
10
|
+
return unavailable("BROWSER_AUTH_REQUIRED", false);
|
|
11
|
+
if (!principal.permissions.includes("browser.use"))
|
|
12
|
+
return unavailable("BROWSER_FORBIDDEN", false);
|
|
13
|
+
if (!hasSafeRuntime(readiness))
|
|
14
|
+
return unavailableBrowserRemoteCapability();
|
|
15
|
+
return {
|
|
16
|
+
available: true,
|
|
17
|
+
protocolVersions: [BROWSER_PROTOCOL_VERSION],
|
|
18
|
+
profileModes: ["ephemeral"],
|
|
19
|
+
limits: {
|
|
20
|
+
maxTabsPerSession: readiness.limits.maxTabsPerSession,
|
|
21
|
+
maxSessionsPerPrincipal: readiness.limits.maxSessionsPerPrincipal,
|
|
22
|
+
},
|
|
23
|
+
egress: {
|
|
24
|
+
mode: readiness.egress.mode,
|
|
25
|
+
privateNetworksBlocked: true,
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
function hasTrustedPrincipal(principal) {
|
|
30
|
+
if (!isRecord(principal) || typeof principal["subject"] !== "string" || !Array.isArray(principal["permissions"]))
|
|
31
|
+
return false;
|
|
32
|
+
return principal["subject"].trim() !== "" && principal["permissions"].every(isBrowserPermission);
|
|
33
|
+
}
|
|
34
|
+
function isBrowserPermission(value) {
|
|
35
|
+
return value === "browser.use" || value === "browser.admin" || value === "browser.persistent-profile";
|
|
36
|
+
}
|
|
37
|
+
function hasSafeRuntime(readiness) {
|
|
38
|
+
if (!isRecord(readiness) || !isRecord(readiness["egress"]) || !Array.isArray(readiness["protocolVersions"]))
|
|
39
|
+
return false;
|
|
40
|
+
const egress = readiness["egress"];
|
|
41
|
+
return readiness["controlChannel"] === "authenticated-private"
|
|
42
|
+
&& readiness["chromiumSandbox"] === "enforced"
|
|
43
|
+
&& readiness["profileIsolation"] === "ephemeral-per-principal"
|
|
44
|
+
&& readiness["hostIsolation"] === "enforced"
|
|
45
|
+
&& readiness["debuggingTransport"] === "pipe-private"
|
|
46
|
+
&& egress["state"] === "enforced"
|
|
47
|
+
&& (egress["mode"] === "public-web" || egress["mode"] === "domain-allowlist")
|
|
48
|
+
&& egress["privateNetworksBlocked"] === true
|
|
49
|
+
&& readiness["protocolVersions"].includes(BROWSER_PROTOCOL_VERSION)
|
|
50
|
+
&& hasBoundedLimits(readiness["limits"]);
|
|
51
|
+
}
|
|
52
|
+
function hasBoundedLimits(limits) {
|
|
53
|
+
if (!isRecord(limits))
|
|
54
|
+
return false;
|
|
55
|
+
const maxTabsPerSession = limits["maxTabsPerSession"];
|
|
56
|
+
const maxSessionsPerPrincipal = limits["maxSessionsPerPrincipal"];
|
|
57
|
+
return typeof maxTabsPerSession === "number"
|
|
58
|
+
&& typeof maxSessionsPerPrincipal === "number"
|
|
59
|
+
&& isPositiveIntegerAtMost(maxTabsPerSession, MAX_TABS_PER_SESSION)
|
|
60
|
+
&& isPositiveIntegerAtMost(maxSessionsPerPrincipal, MAX_SESSIONS_PER_PRINCIPAL);
|
|
61
|
+
}
|
|
62
|
+
function isPositiveIntegerAtMost(value, maximum) {
|
|
63
|
+
return Number.isSafeInteger(value) && value > 0 && value <= maximum;
|
|
64
|
+
}
|
|
65
|
+
export function unavailableBrowserRemoteCapability() {
|
|
66
|
+
return unavailable("BROWSER_UNAVAILABLE", true);
|
|
67
|
+
}
|
|
68
|
+
function unavailable(code, retryable) {
|
|
69
|
+
return { available: false, code, retryable };
|
|
70
|
+
}
|
|
71
|
+
function isRecord(value) {
|
|
72
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=browserCapabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserCapabilities.js","sourceRoot":"","sources":["../../../src/server/browser/browserCapabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { evaluateBrowserRemoteCapability, unavailableBrowserRemoteCapability } from "./browserCapabilities.js";
|
|
2
|
+
import { unavailableBrowserRuntimeReadiness } from "./browserRuntime.js";
|
|
3
|
+
/**
|
|
4
|
+
* This foundation intentionally registers capability discovery only. Browser
|
|
5
|
+
* controls and remote federation wait for the required runtime/delegation work.
|
|
6
|
+
*/
|
|
7
|
+
export function registerLocalBrowserCapabilityRoutes(app, deps) {
|
|
8
|
+
app.get("/api/machines/local/browser/capabilities", async (request) => {
|
|
9
|
+
const principal = await resolveBrowserPrincipal(request, deps.principalProvider);
|
|
10
|
+
if (principal.status === "unavailable")
|
|
11
|
+
return unavailableBrowserRemoteCapability();
|
|
12
|
+
if (principal.status === "absent")
|
|
13
|
+
return evaluateBrowserRemoteCapability(undefined, unavailableBrowserRuntimeReadiness());
|
|
14
|
+
try {
|
|
15
|
+
return evaluateBrowserRemoteCapability(principal.value, await deps.runtime.readiness());
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return evaluateBrowserRemoteCapability(principal.value, unavailableBrowserRuntimeReadiness());
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async function resolveBrowserPrincipal(request, provider) {
|
|
23
|
+
if (provider === undefined)
|
|
24
|
+
return { status: "absent" };
|
|
25
|
+
try {
|
|
26
|
+
const principal = await provider.principalFor(request);
|
|
27
|
+
return principal === undefined ? { status: "absent" } : { status: "available", value: principal };
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
request.log.warn({ dependency: "browser-principal-provider" }, "browser principal provider unavailable");
|
|
31
|
+
return { status: "unavailable" };
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=browserCapabilityRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browserCapabilityRoutes.js","sourceRoot":"","sources":["../../../src/server/browser/browserCapabilityRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,+BAA+B,EAAE,kCAAkC,EAAyB,MAAM,0BAA0B,CAAC;AACtI,OAAO,EAAE,kCAAkC,EAA6B,MAAM,qBAAqB,CAAC;AAgBpG;;;GAGG;AACH,MAAM,UAAU,oCAAoC,CAAC,GAAoB,EAAE,IAAwC;IACjH,GAAG,CAAC,GAAG,CAAC,0CAA0C,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;QACpE,MAAM,SAAS,GAAG,MAAM,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjF,IAAI,SAAS,CAAC,MAAM,KAAK,aAAa;YAAE,OAAO,kCAAkC,EAAE,CAAC;QACpF,IAAI,SAAS,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,+BAA+B,CAAC,SAAS,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAE3H,IAAI,CAAC;YACH,OAAO,+BAA+B,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;QAC1F,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,+BAA+B,CAAC,SAAS,CAAC,KAAK,EAAE,kCAAkC,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAOD,KAAK,UAAU,uBAAuB,CAAC,OAAuB,EAAE,QAA8C;IAC5G,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACxD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvD,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACpG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,4BAA4B,EAAE,EAAE,wCAAwC,CAAC,CAAC;QACzG,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { isIP } from "node:net";
|
|
2
|
+
const MAX_BROWSER_URL_LENGTH = 8_192;
|
|
3
|
+
const MAX_ALLOWED_DOMAIN_COUNT = 64;
|
|
4
|
+
const MAX_ALLOWED_PORT_COUNT = 16;
|
|
5
|
+
const MAX_DNS_ANSWER_COUNT = 16;
|
|
6
|
+
const DEFAULT_RESOLVER_DEADLINE_MS = 2_000;
|
|
7
|
+
const MAX_RESOLVER_DEADLINE_MS = 10_000;
|
|
8
|
+
const BROWSER_EGRESS_MODES = new Set(["public-web", "domain-allowlist"]);
|
|
9
|
+
const NON_PUBLIC_HOSTS = new Set([
|
|
10
|
+
"localhost",
|
|
11
|
+
"metadata",
|
|
12
|
+
"metadata.google.internal",
|
|
13
|
+
"instance-data",
|
|
14
|
+
"instance-data.ec2.internal",
|
|
15
|
+
]);
|
|
16
|
+
const VALIDATED_BROWSER_EGRESS_POLICIES = new WeakSet();
|
|
17
|
+
const SYSTEM_BROWSER_POLICY_CLOCK = { now: () => Date.now() };
|
|
18
|
+
const SYSTEM_BROWSER_POLICY_TIMER = {
|
|
19
|
+
setTimeout: (callback, delayMs) => setTimeout(callback, delayMs),
|
|
20
|
+
clearTimeout: (handle) => {
|
|
21
|
+
clearTimeout(handle);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Compile trusted machine configuration once at browser-runtime load/reload.
|
|
26
|
+
* Invalid configuration must keep the runtime unavailable; navigation checks
|
|
27
|
+
* only accept this immutable compiled output and never re-normalize list data.
|
|
28
|
+
*/
|
|
29
|
+
export function compileBrowserEgressPolicy(config) {
|
|
30
|
+
if (!isRecord(config))
|
|
31
|
+
return undefined;
|
|
32
|
+
const mode = config["mode"];
|
|
33
|
+
const allowedDomains = config["allowedDomains"];
|
|
34
|
+
const allowedPorts = config["allowedPorts"];
|
|
35
|
+
if (!isBrowserEgressMode(mode))
|
|
36
|
+
return undefined;
|
|
37
|
+
if (!Array.isArray(allowedDomains) || allowedDomains.length > MAX_ALLOWED_DOMAIN_COUNT)
|
|
38
|
+
return undefined;
|
|
39
|
+
if (!Array.isArray(allowedPorts) || allowedPorts.length > MAX_ALLOWED_PORT_COUNT)
|
|
40
|
+
return undefined;
|
|
41
|
+
const normalizedDomains = [];
|
|
42
|
+
for (const entry of allowedDomains) {
|
|
43
|
+
const normalized = normalizeAllowedDomain(entry);
|
|
44
|
+
if (normalized === undefined)
|
|
45
|
+
return undefined;
|
|
46
|
+
if (!normalizedDomains.includes(normalized))
|
|
47
|
+
normalizedDomains.push(normalized);
|
|
48
|
+
}
|
|
49
|
+
const normalizedPorts = [];
|
|
50
|
+
for (const entry of allowedPorts) {
|
|
51
|
+
if (!isAllowedPort(entry))
|
|
52
|
+
return undefined;
|
|
53
|
+
if (!normalizedPorts.includes(entry))
|
|
54
|
+
normalizedPorts.push(entry);
|
|
55
|
+
}
|
|
56
|
+
if (mode === "domain-allowlist" && normalizedDomains.length === 0)
|
|
57
|
+
return undefined;
|
|
58
|
+
const policy = Object.freeze({
|
|
59
|
+
mode,
|
|
60
|
+
allowedDomains: Object.freeze(normalizedDomains),
|
|
61
|
+
allowedPorts: Object.freeze(normalizedPorts),
|
|
62
|
+
});
|
|
63
|
+
VALIDATED_BROWSER_EGRESS_POLICIES.add(policy);
|
|
64
|
+
return policy;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parse and constrain an initial browser navigation without making a network
|
|
68
|
+
* request. This module never fetches or proxies a destination; Chromium must
|
|
69
|
+
* invoke the companion egress check for every request.
|
|
70
|
+
*/
|
|
71
|
+
export function evaluateBrowserNavigation(input, policy) {
|
|
72
|
+
if (!isCompiledBrowserEgressPolicy(policy))
|
|
73
|
+
return blocked("policy-invalid");
|
|
74
|
+
if (!isValidUrlInput(input))
|
|
75
|
+
return blocked("invalid-url");
|
|
76
|
+
let url;
|
|
77
|
+
try {
|
|
78
|
+
url = new URL(input);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return blocked("invalid-url");
|
|
82
|
+
}
|
|
83
|
+
if (url.protocol !== "http:" && url.protocol !== "https:")
|
|
84
|
+
return blocked("unsupported-scheme");
|
|
85
|
+
if (url.username !== "" || url.password !== "")
|
|
86
|
+
return blocked("userinfo-not-allowed");
|
|
87
|
+
const host = normalizeHostname(url.hostname);
|
|
88
|
+
if (host === undefined)
|
|
89
|
+
return blocked("invalid-url");
|
|
90
|
+
if (isNonPublicHostname(host))
|
|
91
|
+
return blocked("non-public-host");
|
|
92
|
+
const port = effectivePort(url);
|
|
93
|
+
if (!policy.allowedPorts.includes(port))
|
|
94
|
+
return blocked("port-not-allowed");
|
|
95
|
+
const hostAddressKind = isIP(host);
|
|
96
|
+
if (policy.mode === "domain-allowlist") {
|
|
97
|
+
if (hostAddressKind !== 0)
|
|
98
|
+
return blocked("literal-ip-not-allowed");
|
|
99
|
+
if (!isAllowedDomain(host, policy.allowedDomains))
|
|
100
|
+
return blocked("domain-not-allowed");
|
|
101
|
+
}
|
|
102
|
+
else if (hostAddressKind !== 0 && !isPublicInternetAddress(host)) {
|
|
103
|
+
return blocked("non-public-host");
|
|
104
|
+
}
|
|
105
|
+
url.hostname = host;
|
|
106
|
+
return { allowed: true, url: url.href, host, port, auditOrigin: url.origin };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Resolve a permitted hostname through an injected controlled resolver. This
|
|
110
|
+
* bounded preflight is defense in depth only: a future runtime still needs
|
|
111
|
+
* connection-time interception, a network boundary, and a concurrency budget
|
|
112
|
+
* to defeat rebinding and renderer paths.
|
|
113
|
+
*/
|
|
114
|
+
export async function evaluateBrowserEgress(input, policy, resolver, evaluationOptions) {
|
|
115
|
+
const navigation = evaluateBrowserNavigation(input, policy);
|
|
116
|
+
if (!navigation.allowed)
|
|
117
|
+
return navigation;
|
|
118
|
+
if (isIP(navigation.host) !== 0)
|
|
119
|
+
return navigation;
|
|
120
|
+
const options = resolveEgressEvaluationOptions(evaluationOptions);
|
|
121
|
+
if (options === undefined)
|
|
122
|
+
return blockedWithOrigin("dns-unavailable", navigation.auditOrigin);
|
|
123
|
+
const addresses = await resolveDnsWithDeadline(navigation.host, resolver, options);
|
|
124
|
+
if (!Array.isArray(addresses))
|
|
125
|
+
return blockedWithOrigin("dns-unavailable", navigation.auditOrigin);
|
|
126
|
+
if (addresses.length === 0)
|
|
127
|
+
return blockedWithOrigin("dns-no-addresses", navigation.auditOrigin);
|
|
128
|
+
if (addresses.length > MAX_DNS_ANSWER_COUNT)
|
|
129
|
+
return blockedWithOrigin("dns-answer-limit-exceeded", navigation.auditOrigin);
|
|
130
|
+
for (const address of addresses) {
|
|
131
|
+
if (typeof address !== "string" || !isPublicInternetAddress(address))
|
|
132
|
+
return blockedWithOrigin("non-public-address", navigation.auditOrigin);
|
|
133
|
+
}
|
|
134
|
+
return navigation;
|
|
135
|
+
}
|
|
136
|
+
/** Classify a DNS result or literal destination without exposing it to callers. */
|
|
137
|
+
export function isPublicInternetAddress(address) {
|
|
138
|
+
const normalized = stripIpv6Brackets(address);
|
|
139
|
+
const version = isIP(normalized);
|
|
140
|
+
if (version === 4)
|
|
141
|
+
return isPublicIpv4(normalized);
|
|
142
|
+
if (version !== 6)
|
|
143
|
+
return false;
|
|
144
|
+
const value = parseIpv6(normalized);
|
|
145
|
+
return value !== undefined && isPublicIpv6(value);
|
|
146
|
+
}
|
|
147
|
+
function isCompiledBrowserEgressPolicy(policy) {
|
|
148
|
+
return typeof policy === "object" && policy !== null && VALIDATED_BROWSER_EGRESS_POLICIES.has(policy);
|
|
149
|
+
}
|
|
150
|
+
function isBrowserEgressMode(value) {
|
|
151
|
+
return typeof value === "string" && BROWSER_EGRESS_MODES.has(value);
|
|
152
|
+
}
|
|
153
|
+
function resolveEgressEvaluationOptions(evaluationOptions) {
|
|
154
|
+
const clock = evaluationOptions?.clock ?? SYSTEM_BROWSER_POLICY_CLOCK;
|
|
155
|
+
const timer = evaluationOptions?.timer ?? SYSTEM_BROWSER_POLICY_TIMER;
|
|
156
|
+
const resolverDeadlineMs = evaluationOptions?.resolverDeadlineMs ?? DEFAULT_RESOLVER_DEADLINE_MS;
|
|
157
|
+
if (typeof clock.now !== "function" || typeof timer.setTimeout !== "function" || typeof timer.clearTimeout !== "function")
|
|
158
|
+
return undefined;
|
|
159
|
+
if (!Number.isSafeInteger(resolverDeadlineMs) || resolverDeadlineMs < 1 || resolverDeadlineMs > MAX_RESOLVER_DEADLINE_MS)
|
|
160
|
+
return undefined;
|
|
161
|
+
return { clock, timer, resolverDeadlineMs };
|
|
162
|
+
}
|
|
163
|
+
async function resolveDnsWithDeadline(host, resolver, options) {
|
|
164
|
+
const controller = new AbortController();
|
|
165
|
+
let timerHandle;
|
|
166
|
+
try {
|
|
167
|
+
const startedAtMs = options.clock.now();
|
|
168
|
+
const deadlineAtMs = startedAtMs + options.resolverDeadlineMs;
|
|
169
|
+
if (!Number.isSafeInteger(startedAtMs) || !Number.isSafeInteger(deadlineAtMs))
|
|
170
|
+
return undefined;
|
|
171
|
+
const timeout = new Promise((resolve) => {
|
|
172
|
+
timerHandle = options.timer.setTimeout(() => {
|
|
173
|
+
controller.abort();
|
|
174
|
+
resolve(undefined);
|
|
175
|
+
}, options.resolverDeadlineMs);
|
|
176
|
+
});
|
|
177
|
+
// The race remains bounded even when a resolver ignores the abort signal.
|
|
178
|
+
const resolution = Promise.resolve()
|
|
179
|
+
.then(() => resolver.resolve(host, { signal: controller.signal, deadlineAtMs }))
|
|
180
|
+
.catch(() => undefined);
|
|
181
|
+
return await Promise.race([resolution, timeout]);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return undefined;
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
controller.abort();
|
|
188
|
+
if (timerHandle !== undefined) {
|
|
189
|
+
try {
|
|
190
|
+
options.timer.clearTimeout(timerHandle);
|
|
191
|
+
}
|
|
192
|
+
catch {
|
|
193
|
+
// The resolver is already aborted and the bounded timer can no longer affect the decision.
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function isAllowedPort(value) {
|
|
199
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 1 && value <= 65_535;
|
|
200
|
+
}
|
|
201
|
+
function isRecord(value) {
|
|
202
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
203
|
+
}
|
|
204
|
+
function isValidUrlInput(input) {
|
|
205
|
+
return input.length > 0
|
|
206
|
+
&& input.length <= MAX_BROWSER_URL_LENGTH
|
|
207
|
+
&& input === input.trim()
|
|
208
|
+
&& !hasControlCharacter(input);
|
|
209
|
+
}
|
|
210
|
+
function hasControlCharacter(value) {
|
|
211
|
+
for (const character of value) {
|
|
212
|
+
const code = character.charCodeAt(0);
|
|
213
|
+
if (code < 32 || code === 127)
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
function normalizeHostname(value) {
|
|
219
|
+
const host = stripIpv6Brackets(value).toLowerCase().replace(/\.+$/u, "");
|
|
220
|
+
if (host === "")
|
|
221
|
+
return undefined;
|
|
222
|
+
if (isIP(host) !== 0)
|
|
223
|
+
return host;
|
|
224
|
+
if (host.length > 253)
|
|
225
|
+
return undefined;
|
|
226
|
+
const labels = host.split(".");
|
|
227
|
+
if (labels.some((label) => label.length === 0 || label.length > 63 || !/^[a-z\d](?:[a-z\d-]*[a-z\d])?$/u.test(label)))
|
|
228
|
+
return undefined;
|
|
229
|
+
return host;
|
|
230
|
+
}
|
|
231
|
+
function stripIpv6Brackets(value) {
|
|
232
|
+
return value.startsWith("[") && value.endsWith("]") ? value.slice(1, -1) : value;
|
|
233
|
+
}
|
|
234
|
+
function isNonPublicHostname(host) {
|
|
235
|
+
return isIP(host) === 0 && (!host.includes(".")
|
|
236
|
+
|| NON_PUBLIC_HOSTS.has(host)
|
|
237
|
+
|| host.endsWith(".localhost")
|
|
238
|
+
|| host.endsWith(".local")
|
|
239
|
+
|| host.endsWith(".internal"));
|
|
240
|
+
}
|
|
241
|
+
function effectivePort(url) {
|
|
242
|
+
if (url.port !== "")
|
|
243
|
+
return Number(url.port);
|
|
244
|
+
return url.protocol === "http:" ? 80 : 443;
|
|
245
|
+
}
|
|
246
|
+
function normalizeAllowedDomain(value) {
|
|
247
|
+
if (typeof value !== "string" || value.trim() !== value || value === "")
|
|
248
|
+
return undefined;
|
|
249
|
+
const wildcard = value.startsWith("*.");
|
|
250
|
+
const rawHost = wildcard ? value.slice(2) : value;
|
|
251
|
+
const host = normalizeHostname(rawHost);
|
|
252
|
+
if (host === undefined || !host.includes(".") || isIP(host) !== 0)
|
|
253
|
+
return undefined;
|
|
254
|
+
return wildcard ? `*.${host}` : host;
|
|
255
|
+
}
|
|
256
|
+
function isAllowedDomain(host, allowedDomains) {
|
|
257
|
+
return allowedDomains.some((normalized) => {
|
|
258
|
+
if (!normalized.startsWith("*."))
|
|
259
|
+
return host === normalized;
|
|
260
|
+
const suffix = normalized.slice(2);
|
|
261
|
+
return host !== suffix && host.endsWith(`.${suffix}`);
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
function blocked(reason) {
|
|
265
|
+
return { allowed: false, reason };
|
|
266
|
+
}
|
|
267
|
+
function blockedWithOrigin(reason, auditOrigin) {
|
|
268
|
+
return { allowed: false, reason, auditOrigin };
|
|
269
|
+
}
|
|
270
|
+
function isPublicIpv4(address) {
|
|
271
|
+
const octets = parseIpv4Octets(address);
|
|
272
|
+
if (octets === undefined)
|
|
273
|
+
return false;
|
|
274
|
+
const [first, second, third, fourth] = octets;
|
|
275
|
+
const value = ((first << 24) | (second << 16) | (third << 8) | fourth) >>> 0;
|
|
276
|
+
return !NON_PUBLIC_IPV4_PREFIXES.some(([prefix, bits]) => isIpv4Prefix(value, prefix, bits));
|
|
277
|
+
}
|
|
278
|
+
const NON_PUBLIC_IPV4_PREFIXES = [
|
|
279
|
+
[0x0000_0000, 8], // unspecified and "this" network
|
|
280
|
+
[0x0a00_0000, 8], // RFC1918
|
|
281
|
+
[0x6440_0000, 10], // carrier-grade NAT
|
|
282
|
+
[0x7f00_0000, 8], // loopback
|
|
283
|
+
[0xa9fe_0000, 16], // link-local / cloud metadata
|
|
284
|
+
[0xac10_0000, 12], // RFC1918
|
|
285
|
+
[0xc000_0000, 24], // IETF protocol assignments
|
|
286
|
+
[0xc000_0200, 24], // documentation
|
|
287
|
+
[0xc0a8_0000, 16], // RFC1918
|
|
288
|
+
[0xc612_0000, 15], // benchmarking
|
|
289
|
+
[0xc633_6400, 24], // documentation
|
|
290
|
+
[0xcb00_7100, 24], // documentation
|
|
291
|
+
[0xe000_0000, 4], // multicast and reserved
|
|
292
|
+
];
|
|
293
|
+
function isIpv4Prefix(value, prefix, bits) {
|
|
294
|
+
const mask = (0xffff_ffff << (32 - bits)) >>> 0;
|
|
295
|
+
return (value & mask) === (prefix & mask);
|
|
296
|
+
}
|
|
297
|
+
function isPublicIpv6(value) {
|
|
298
|
+
const embeddedIpv4 = embeddedIpv4Address(value);
|
|
299
|
+
if (embeddedIpv4 !== undefined)
|
|
300
|
+
return isPublicIpv4(integerToIpv4(embeddedIpv4));
|
|
301
|
+
if (isIpv6Prefix(value, IPV4_IPV6_TRANSLATION_ALLOCATION.prefix, IPV4_IPV6_TRANSLATION_ALLOCATION.bits))
|
|
302
|
+
return false;
|
|
303
|
+
if (!isIpv6Prefix(value, PUBLIC_NATIVE_IPV6_GLOBAL_UNICAST.prefix, PUBLIC_NATIVE_IPV6_GLOBAL_UNICAST.bits))
|
|
304
|
+
return false;
|
|
305
|
+
return !UNSUPPORTED_NATIVE_IPV6_PREFIXES.some(({ prefix, bits }) => isIpv6Prefix(value, prefix, bits));
|
|
306
|
+
}
|
|
307
|
+
function embeddedIpv4Address(value) {
|
|
308
|
+
if (!IPV4_EMBEDDED_IPV6_PREFIXES.some(({ prefix, bits }) => isIpv6Prefix(value, prefix, bits)))
|
|
309
|
+
return undefined;
|
|
310
|
+
return Number(value & 0xffffffffn);
|
|
311
|
+
}
|
|
312
|
+
function integerToIpv4(value) {
|
|
313
|
+
return [value >>> 24, (value >>> 16) & 255, (value >>> 8) & 255, value & 255].join(".");
|
|
314
|
+
}
|
|
315
|
+
function isIpv6Prefix(value, prefix, bits) {
|
|
316
|
+
return value >> BigInt(128 - bits) === prefix >> BigInt(128 - bits);
|
|
317
|
+
}
|
|
318
|
+
function parseIpv6(address) {
|
|
319
|
+
let normalized = address.toLowerCase();
|
|
320
|
+
const ipv4 = /\d+\.\d+\.\d+\.\d+$/u.exec(normalized)?.[0];
|
|
321
|
+
if (ipv4 !== undefined) {
|
|
322
|
+
const octets = parseIpv4Octets(ipv4);
|
|
323
|
+
if (octets === undefined)
|
|
324
|
+
return undefined;
|
|
325
|
+
const [first, second, third, fourth] = octets;
|
|
326
|
+
const highGroup = ((first << 8) | second).toString(16);
|
|
327
|
+
const lowGroup = ((third << 8) | fourth).toString(16);
|
|
328
|
+
normalized = `${normalized.slice(0, -ipv4.length)}${highGroup}:${lowGroup}`;
|
|
329
|
+
}
|
|
330
|
+
const halves = normalized.split("::");
|
|
331
|
+
if (halves.length > 2)
|
|
332
|
+
return undefined;
|
|
333
|
+
const [leftHalf, rightHalf] = halves;
|
|
334
|
+
if (leftHalf === undefined)
|
|
335
|
+
return undefined;
|
|
336
|
+
const left = leftHalf === "" ? [] : leftHalf.split(":");
|
|
337
|
+
const right = rightHalf === undefined || rightHalf === "" ? [] : rightHalf.split(":");
|
|
338
|
+
const missing = 8 - left.length - right.length;
|
|
339
|
+
if ((rightHalf === undefined && missing !== 0) || (rightHalf !== undefined && missing < 1))
|
|
340
|
+
return undefined;
|
|
341
|
+
const groups = [...left, ...Array.from({ length: missing }, () => "0"), ...right];
|
|
342
|
+
if (groups.length !== 8 || groups.some((group) => !/^[\da-f]{1,4}$/u.test(group)))
|
|
343
|
+
return undefined;
|
|
344
|
+
return groups.reduce((result, group) => (result << 16n) | BigInt(`0x${group}`), 0n);
|
|
345
|
+
}
|
|
346
|
+
function parseIpv4Octets(address) {
|
|
347
|
+
const parts = address.split(".").map(Number);
|
|
348
|
+
const [first, second, third, fourth] = parts;
|
|
349
|
+
if (parts.length !== 4 || first === undefined || second === undefined || third === undefined || fourth === undefined)
|
|
350
|
+
return undefined;
|
|
351
|
+
if (![first, second, third, fourth].every((part) => Number.isInteger(part) && part >= 0 && part <= 255))
|
|
352
|
+
return undefined;
|
|
353
|
+
return [first, second, third, fourth];
|
|
354
|
+
}
|
|
355
|
+
const IPV4_EMBEDDED_IPV6_PREFIXES = [
|
|
356
|
+
ipv6Prefix("::", 96), // IPv4-compatible
|
|
357
|
+
ipv6Prefix("::ffff:0:0", 96), // IPv4-mapped
|
|
358
|
+
ipv6Prefix("::ffff:0:0:0", 96), // IPv4-translated
|
|
359
|
+
ipv6Prefix("64:ff9b::", 96), // well-known NAT64
|
|
360
|
+
];
|
|
361
|
+
// Only the well-known /96 translation prefix is understood by this pure
|
|
362
|
+
// classifier. Other addresses in the IANA translation allocation fail closed.
|
|
363
|
+
const IPV4_IPV6_TRANSLATION_ALLOCATION = ipv6Prefix("64:ff9b::", 32);
|
|
364
|
+
// Native IPv6 is public only in the ordinary global-unicast /3. This rejects
|
|
365
|
+
// site-local, ULA, link-local, multicast, and non-GUA/unallocated 4000::/3.
|
|
366
|
+
const PUBLIC_NATIVE_IPV6_GLOBAL_UNICAST = ipv6Prefix("2000::", 3);
|
|
367
|
+
const UNSUPPORTED_NATIVE_IPV6_PREFIXES = [
|
|
368
|
+
// IETF protocol assignments include Teredo (2001::/32) and ORCHIDv2
|
|
369
|
+
// (2001:20::/28). Do not decode or permit any Teredo endpoint fields.
|
|
370
|
+
ipv6Prefix("2001::", 23),
|
|
371
|
+
ipv6Prefix("2001:db8::", 32), // documentation
|
|
372
|
+
ipv6Prefix("2002::", 16), // 6to4 transition addresses
|
|
373
|
+
ipv6Prefix("2620:4f:8000::", 48), // AS112 direct delegation
|
|
374
|
+
ipv6Prefix("3fff::", 20), // documentation
|
|
375
|
+
];
|
|
376
|
+
function ipv6Prefix(address, bits) {
|
|
377
|
+
const prefix = parseIpv6(address);
|
|
378
|
+
if (prefix === undefined)
|
|
379
|
+
throw new Error(`Invalid built-in IPv6 prefix: ${address}`);
|
|
380
|
+
return { prefix, bits };
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=browserPolicy.js.map
|