openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
95 lines (94 loc) • 3.81 kB
JavaScript
import { l as normalizeOptionalString, o as normalizeLowercaseStringOrEmpty } from "./string-coerce-6kR-86XC.mjs";
import { r as getRuntimeConfig } from "./io.runtime-FunTy0y1.mjs";
import { r as resolveGatewayAuth } from "./auth-resolve-B8_rp6V3.mjs";
import "./string-coerce-runtime-B1b8UNzb.mjs";
import "./runtime-config-snapshot-DPEZoubb.mjs";
import { t as ensureGatewayStartupAuth } from "./startup-auth-CCc6lURQ.mjs";
import "./gateway-runtime-C4L8u4H3.mjs";
import { r as persistBrowserControlCredential } from "./config-mutations-CnhvrLhe.mjs";
import crypto from "node:crypto";
//#region extensions/browser/src/browser/control-auth.ts
/** Resolve browser-control auth material from config and environment. */
function resolveBrowserControlAuth(cfg, env = process.env) {
const auth = resolveGatewayAuth({
authConfig: cfg?.gateway?.auth,
env,
tailscaleMode: cfg?.gateway?.tailscale?.mode
});
const token = normalizeOptionalString(auth.token);
const password = normalizeOptionalString(auth.password);
switch (auth.mode) {
case "password":
case "trusted-proxy": return { password };
case "token":
case "none": return { token };
default: return {};
}
}
/** Return true when startup may auto-generate browser-control auth. */
function shouldAutoGenerateBrowserAuth(env) {
if (normalizeLowercaseStringOrEmpty(env.NODE_ENV) === "test") return false;
const vitest = normalizeLowercaseStringOrEmpty(env.VITEST);
if (vitest && vitest !== "0" && vitest !== "false" && vitest !== "off") return false;
return true;
}
function hasExplicitNonStringGatewayCredentialForMode(params) {
const { cfg, mode } = params;
const auth = cfg?.gateway?.auth;
if (!auth) return false;
if (mode === "none") return auth.token != null && typeof auth.token !== "string";
return auth.password != null && typeof auth.password !== "string";
}
async function generateAndPersistBrowserControlCredential(params) {
const credential = crypto.randomBytes(24).toString("hex");
await persistBrowserControlCredential({
kind: params.kind,
value: credential
});
const persistedAuth = resolveBrowserControlAuth(getRuntimeConfig(), params.env);
if (persistedAuth.token || persistedAuth.password) return {
auth: persistedAuth,
generatedToken: persistedAuth[params.kind] === credential ? credential : void 0
};
return {
auth: { [params.kind]: credential },
generatedToken: credential
};
}
/** Ensure browser-control auth exists, generating and persisting it when allowed. */
async function ensureBrowserControlAuth(params) {
const env = params.env ?? process.env;
const auth = resolveBrowserControlAuth(params.cfg, env);
if (auth.token || auth.password) return { auth };
if (!shouldAutoGenerateBrowserAuth(env)) return { auth };
if (params.cfg.gateway?.auth?.mode === "password") return { auth };
const latestCfg = getRuntimeConfig();
const latestAuth = resolveBrowserControlAuth(latestCfg, env);
if (latestAuth.token || latestAuth.password) return { auth: latestAuth };
if (latestCfg.gateway?.auth?.mode === "password") return { auth: latestAuth };
const latestMode = latestCfg.gateway?.auth?.mode;
if (latestMode === "none" || latestMode === "trusted-proxy") {
if (hasExplicitNonStringGatewayCredentialForMode({
cfg: latestCfg,
mode: latestMode
})) return { auth: latestAuth };
return await generateAndPersistBrowserControlCredential({
kind: latestMode === "trusted-proxy" ? "password" : "token",
env
});
}
const ensured = await ensureGatewayStartupAuth({
cfg: latestCfg,
env,
persist: true
});
return {
auth: {
token: ensured.auth.token,
password: ensured.auth.password
},
generatedToken: ensured.generatedToken
};
}
//#endregion
export { resolveBrowserControlAuth as n, shouldAutoGenerateBrowserAuth as r, ensureBrowserControlAuth as t };