test(security): add coverage for gateway probe auth selection
This commit is contained in:
@@ -401,4 +401,148 @@ describe("security audit", () => {
|
|||||||
]),
|
]),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("maybeProbeGateway auth selection", () => {
|
||||||
|
it("uses local auth when gateway.mode is local", async () => {
|
||||||
|
let capturedAuth: { token?: string; password?: string } | undefined;
|
||||||
|
const cfg: ClawdbotConfig = {
|
||||||
|
gateway: {
|
||||||
|
mode: "local",
|
||||||
|
auth: { token: "local-token-abc123" },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
await runSecurityAudit({
|
||||||
|
config: cfg,
|
||||||
|
deep: true,
|
||||||
|
deepTimeoutMs: 50,
|
||||||
|
includeFilesystem: false,
|
||||||
|
includeChannelSecurity: false,
|
||||||
|
probeGatewayFn: async (opts) => {
|
||||||
|
capturedAuth = opts.auth;
|
||||||
|
return {
|
||||||
|
ok: true,
|
||||||
|
url: opts.url,
|
||||||
|
connectLatencyMs: 10,
|
||||||
|
error: null,
|
||||||
|
close: null,
|
||||||
|
health: null,
|
||||||
|
status: null,
|
||||||
|
presence: null,
|
||||||
|
configSnapshot: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(capturedAuth?.token).toBe("local-token-abc123");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("uses local auth when gateway.mode is undefined (default)", async () => {
|
||||||
|
let capturedAuth: { token?: string; password?: string } | undefined;
|
||||||
|
const cfg: ClawdbotConfig = {
|
||||||
|
gateway: {
|
||||||
|
auth: { token: "default-local-token" },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
await runSecurityAudit({
|
||||||
|
config: cfg,
|
||||||
|
deep: true,
|
||||||
|
deepTimeoutMs: 50,
|
||||||
|
includeFilesystem: false,
|
||||||
|
includeChannelSecurity: false,
|
||||||
|
probeGatewayFn: async (opts) => {
|
||||||
|
capturedAuth = opts.auth;
|
||||||
|
return {
|
||||||
|
ok: true,
|
||||||
|
url: opts.url,
|
||||||
|
connectLatencyMs: 10,
|
||||||
|
error: null,
|
||||||
|
close: null,
|
||||||
|
health: null,
|
||||||
|
status: null,
|
||||||
|
presence: null,
|
||||||
|
configSnapshot: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(capturedAuth?.token).toBe("default-local-token");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("uses remote auth when gateway.mode is remote with URL", async () => {
|
||||||
|
let capturedAuth: { token?: string; password?: string } | undefined;
|
||||||
|
const cfg: ClawdbotConfig = {
|
||||||
|
gateway: {
|
||||||
|
mode: "remote",
|
||||||
|
auth: { token: "local-token-should-not-use" },
|
||||||
|
remote: {
|
||||||
|
url: "ws://remote.example.com:18789",
|
||||||
|
token: "remote-token-xyz789",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
await runSecurityAudit({
|
||||||
|
config: cfg,
|
||||||
|
deep: true,
|
||||||
|
deepTimeoutMs: 50,
|
||||||
|
includeFilesystem: false,
|
||||||
|
includeChannelSecurity: false,
|
||||||
|
probeGatewayFn: async (opts) => {
|
||||||
|
capturedAuth = opts.auth;
|
||||||
|
return {
|
||||||
|
ok: true,
|
||||||
|
url: opts.url,
|
||||||
|
connectLatencyMs: 10,
|
||||||
|
error: null,
|
||||||
|
close: null,
|
||||||
|
health: null,
|
||||||
|
status: null,
|
||||||
|
presence: null,
|
||||||
|
configSnapshot: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(capturedAuth?.token).toBe("remote-token-xyz789");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("falls back to local auth when gateway.mode is remote but URL is missing", async () => {
|
||||||
|
let capturedAuth: { token?: string; password?: string } | undefined;
|
||||||
|
const cfg: ClawdbotConfig = {
|
||||||
|
gateway: {
|
||||||
|
mode: "remote",
|
||||||
|
auth: { token: "fallback-local-token" },
|
||||||
|
remote: {
|
||||||
|
token: "remote-token-should-not-use",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
await runSecurityAudit({
|
||||||
|
config: cfg,
|
||||||
|
deep: true,
|
||||||
|
deepTimeoutMs: 50,
|
||||||
|
includeFilesystem: false,
|
||||||
|
includeChannelSecurity: false,
|
||||||
|
probeGatewayFn: async (opts) => {
|
||||||
|
capturedAuth = opts.auth;
|
||||||
|
return {
|
||||||
|
ok: true,
|
||||||
|
url: opts.url,
|
||||||
|
connectLatencyMs: 10,
|
||||||
|
error: null,
|
||||||
|
close: null,
|
||||||
|
health: null,
|
||||||
|
status: null,
|
||||||
|
presence: null,
|
||||||
|
configSnapshot: null,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(capturedAuth?.token).toBe("fallback-local-token");
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user