Skip to content

Commit 6a2ccbc

Browse files
committed
fix(gateway): require strict preauth budget env
1 parent 4b6517d commit 6a2ccbc

2 files changed

Lines changed: 28 additions & 5 deletions

File tree

src/gateway/server/preauth-connection-budget.test.ts

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
import { describe, expect, it } from "vitest";
1+
import { afterEach, describe, expect, it, vi } from "vitest";
22
import { createPreauthConnectionBudget } from "./preauth-connection-budget.js";
33

44
describe("createPreauthConnectionBudget", () => {
5+
afterEach(() => {
6+
vi.unstubAllEnvs();
7+
});
8+
59
it("caps connections with a finite configured limit", () => {
610
const budget = createPreauthConnectionBudget(2);
711

@@ -30,4 +34,23 @@ describe("createPreauthConnectionBudget", () => {
3034
}
3135
expect(budget.acquire(undefined)).toBe(false);
3236
});
37+
38+
it("accepts strict plus-signed env limits", () => {
39+
vi.stubEnv("OPENCLAW_MAX_PREAUTH_CONNECTIONS_PER_IP", "+02");
40+
const budget = createPreauthConnectionBudget();
41+
42+
expect(budget.acquire("127.0.0.1")).toBe(true);
43+
expect(budget.acquire("127.0.0.1")).toBe(true);
44+
expect(budget.acquire("127.0.0.1")).toBe(false);
45+
});
46+
47+
it("ignores non-decimal env limits", () => {
48+
vi.stubEnv("OPENCLAW_MAX_PREAUTH_CONNECTIONS_PER_IP", "0x2");
49+
const budget = createPreauthConnectionBudget();
50+
51+
for (let i = 0; i < 32; i += 1) {
52+
expect(budget.acquire("127.0.0.1")).toBe(true);
53+
}
54+
expect(budget.acquire("127.0.0.1")).toBe(false);
55+
});
3356
});

src/gateway/server/preauth-connection-budget.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { resolveIntegerOption } from "../../shared/number-coercion.js";
1+
import { parseStrictPositiveInteger, resolveIntegerOption } from "../../shared/number-coercion.js";
22

33
const DEFAULT_MAX_PREAUTH_CONNECTIONS_PER_IP = 32;
44
const UNKNOWN_CLIENT_IP_BUDGET_KEY = "__openclaw_unknown_client_ip__";
@@ -10,11 +10,11 @@ function getMaxPreauthConnectionsPerIpFromEnv(env: NodeJS.ProcessEnv = process.e
1010
if (!configured) {
1111
return DEFAULT_MAX_PREAUTH_CONNECTIONS_PER_IP;
1212
}
13-
const parsed = Number(configured);
14-
if (!Number.isFinite(parsed) || parsed < 1) {
13+
const parsed = parseStrictPositiveInteger(configured);
14+
if (parsed === undefined) {
1515
return DEFAULT_MAX_PREAUTH_CONNECTIONS_PER_IP;
1616
}
17-
return Math.max(1, Math.floor(parsed));
17+
return parsed;
1818
}
1919

2020
export type PreauthConnectionBudget = {

0 commit comments

Comments
 (0)