mirror of
https://github.com/morluto/rea.git
synced 2026-11-07 05:56:19 -10:00
fix(environment): ignore unsafe paging bounds (#9145)
This commit is contained in:
1 parent
772d6098f0
commit
cfa7ebb020
2 files changed
+16
-1
No files matched your search
@@ -1,5 +1,5 @@
|
||||
import { expect, it } from "vitest";
|
||||
import { startsAtBeginning } from "./environmentStatePaging.js";
|
||||
import { pageBound, startsAtBeginning } from "./environmentStatePaging.js";
|
||||
|
||||
it("requires every recorded position to establish the beginning, including repeated names", () => {
|
||||
expect(startsAtBeginning(undefined)).toBe(true);
|
||||
@@ -16,3 +16,12 @@ it("requires every recorded position to establish the beginning, including repea
|
||||
])
|
||||
expect(startsAtBeginning(query), query).toBe(false);
|
||||
});
|
||||
|
||||
it("does not infer a page bound from unsafe numeric query values", () => {
|
||||
for (const query of [
|
||||
"?_start=999999999999999999999999&_end=100",
|
||||
"?limit=9007199254740992",
|
||||
"?_start=9007199254740993&_end=9007199254740995",
|
||||
])
|
||||
expect(pageBound(query, 5), query).toBeUndefined();
|
||||
});
|
||||
@@ -64,15 +64,21 @@ const pageLimit = (
|
||||
): number | undefined => {
|
||||
let size = Infinity;
|
||||
const range = { start: 0, end: Infinity };
|
||||
let unsafeNumber = false;
|
||||
for (const [name, value] of iterateUrlQueryParameters(query ?? "")) {
|
||||
const key = name.toLowerCase();
|
||||
if (!/^\d+$/u.test(value)) continue;
|
||||
const number = Number(value);
|
||||
if (!Number.isSafeInteger(number)) {
|
||||
unsafeNumber = true;
|
||||
continue;
|
||||
}
|
||||
if (PAGE_SIZE_PARAMETERS.has(key)) {
|
||||
if (number > 0 || !unboundedZero) size = Math.min(size, number);
|
||||
} else if (key === "_start") range.start = number;
|
||||
else if (key === "_end") range.end = number;
|
||||
}
|
||||
if (unsafeNumber) return undefined;
|
||||
const width = Math.min(size, Math.max(range.end - range.start, 0));
|
||||
return Number.isFinite(width) ? width : undefined;
|
||||
};
|
||||
|
||||
Reference in new issue
Block a user