Skip to content

Commit 409356f

Browse files
committed
fix: validate synology rate limits
1 parent c0946e6 commit 409356f

2 files changed

Lines changed: 38 additions & 7 deletions

File tree

extensions/synology-chat/src/accounts.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,23 @@ function parseAllowedUserIds(raw: string | string[] | undefined): string[] {
6666
return normalizeStringEntries(raw.split(","));
6767
}
6868

69-
function parseRateLimitPerMinute(raw: string | undefined): number {
70-
if (raw == null) {
71-
return 30;
69+
function normalizeRateLimitPerMinuteValue(raw: unknown): number | undefined {
70+
if (typeof raw === "number") {
71+
return Number.isSafeInteger(raw) && raw >= 0 ? raw : undefined;
72+
}
73+
if (typeof raw !== "string") {
74+
return undefined;
7275
}
7376
const trimmed = raw.trim();
74-
if (!/^-?\d+$/.test(trimmed)) {
75-
return 30;
77+
if (!/^\d+$/.test(trimmed)) {
78+
return undefined;
7679
}
77-
return parseStrictInteger(trimmed) ?? 30;
80+
const parsed = parseStrictInteger(trimmed);
81+
return parsed != null && parsed >= 0 ? parsed : undefined;
82+
}
83+
84+
function parseRateLimitPerMinute(raw: string | undefined): number {
85+
return normalizeRateLimitPerMinuteValue(raw) ?? 30;
7886
}
7987

8088
/**
@@ -143,7 +151,8 @@ export function resolveAccount(
143151
dangerouslyAllowInheritedWebhookPath,
144152
dmPolicy: merged.dmPolicy ?? "allowlist",
145153
allowedUserIds: parseAllowedUserIds(merged.allowedUserIds ?? envAllowedUserIds),
146-
rateLimitPerMinute: merged.rateLimitPerMinute ?? envRateLimitValue,
154+
rateLimitPerMinute:
155+
normalizeRateLimitPerMinuteValue(merged.rateLimitPerMinute) ?? envRateLimitValue,
147156
botName: merged.botName ?? envBotName,
148157
allowInsecureSsl: merged.allowInsecureSsl ?? false,
149158
};

extensions/synology-chat/src/core.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,28 @@ describe("synology-chat account resolution", () => {
324324

325325
process.env.SYNOLOGY_RATE_LIMIT = "0abc";
326326
expect(resolveAccount({ channels: { "synology-chat": {} } }).rateLimitPerMinute).toBe(30);
327+
328+
process.env.SYNOLOGY_RATE_LIMIT = "-1";
329+
expect(resolveAccount({ channels: { "synology-chat": {} } }).rateLimitPerMinute).toBe(30);
330+
});
331+
332+
it("ignores malformed configured rate limits", () => {
333+
process.env.SYNOLOGY_RATE_LIMIT = "12";
334+
335+
expect(
336+
resolveAccount({
337+
channels: {
338+
"synology-chat": { rateLimitPerMinute: -1 },
339+
},
340+
}).rateLimitPerMinute,
341+
).toBe(12);
342+
expect(
343+
resolveAccount({
344+
channels: {
345+
"synology-chat": { rateLimitPerMinute: 1.5 },
346+
},
347+
}).rateLimitPerMinute,
348+
).toBe(12);
327349
});
328350
});
329351

0 commit comments

Comments
 (0)