mirror of
https://github.com/moltbot/moltbot.git
synced 2026-04-28 17:21:52 +00:00
92 lines
2.7 KiB
TypeScript
92 lines
2.7 KiB
TypeScript
import type { OpenClawConfig } from "./config.js";
|
|
import { DEFAULT_GATEWAY_PORT } from "./paths.js";
|
|
|
|
export type GatewayNonLoopbackBindMode = "lan" | "tailnet" | "custom";
|
|
|
|
export function isGatewayNonLoopbackBindMode(bind: unknown): bind is GatewayNonLoopbackBindMode {
|
|
return bind === "lan" || bind === "tailnet" || bind === "custom";
|
|
}
|
|
|
|
export function hasConfiguredControlUiAllowedOrigins(params: {
|
|
allowedOrigins: unknown;
|
|
dangerouslyAllowHostHeaderOriginFallback: unknown;
|
|
}): boolean {
|
|
if (params.dangerouslyAllowHostHeaderOriginFallback === true) {
|
|
return true;
|
|
}
|
|
return (
|
|
Array.isArray(params.allowedOrigins) &&
|
|
params.allowedOrigins.some((origin) => typeof origin === "string" && origin.trim().length > 0)
|
|
);
|
|
}
|
|
|
|
export function resolveGatewayPortWithDefault(
|
|
port: unknown,
|
|
fallback = DEFAULT_GATEWAY_PORT,
|
|
): number {
|
|
return typeof port === "number" && port > 0 ? port : fallback;
|
|
}
|
|
|
|
export function buildDefaultControlUiAllowedOrigins(params: {
|
|
port: number;
|
|
bind: unknown;
|
|
customBindHost?: string;
|
|
}): string[] {
|
|
const origins = new Set<string>([
|
|
`http://localhost:${params.port}`,
|
|
`http://127.0.0.1:${params.port}`,
|
|
]);
|
|
const customBindHost = params.customBindHost?.trim();
|
|
if (params.bind === "custom" && customBindHost) {
|
|
origins.add(`http://${customBindHost}:${params.port}`);
|
|
}
|
|
return [...origins];
|
|
}
|
|
|
|
export function ensureControlUiAllowedOriginsForNonLoopbackBind(
|
|
config: OpenClawConfig,
|
|
opts?: { defaultPort?: number; requireControlUiEnabled?: boolean },
|
|
): {
|
|
config: OpenClawConfig;
|
|
seededOrigins: string[] | null;
|
|
bind: GatewayNonLoopbackBindMode | null;
|
|
} {
|
|
const bind = config.gateway?.bind;
|
|
if (!isGatewayNonLoopbackBindMode(bind)) {
|
|
return { config, seededOrigins: null, bind: null };
|
|
}
|
|
if (opts?.requireControlUiEnabled && config.gateway?.controlUi?.enabled === false) {
|
|
return { config, seededOrigins: null, bind };
|
|
}
|
|
if (
|
|
hasConfiguredControlUiAllowedOrigins({
|
|
allowedOrigins: config.gateway?.controlUi?.allowedOrigins,
|
|
dangerouslyAllowHostHeaderOriginFallback:
|
|
config.gateway?.controlUi?.dangerouslyAllowHostHeaderOriginFallback,
|
|
})
|
|
) {
|
|
return { config, seededOrigins: null, bind };
|
|
}
|
|
|
|
const port = resolveGatewayPortWithDefault(config.gateway?.port, opts?.defaultPort);
|
|
const seededOrigins = buildDefaultControlUiAllowedOrigins({
|
|
port,
|
|
bind,
|
|
customBindHost: config.gateway?.customBindHost,
|
|
});
|
|
return {
|
|
config: {
|
|
...config,
|
|
gateway: {
|
|
...config.gateway,
|
|
controlUi: {
|
|
...config.gateway?.controlUi,
|
|
allowedOrigins: seededOrigins,
|
|
},
|
|
},
|
|
},
|
|
seededOrigins,
|
|
bind,
|
|
};
|
|
}
|