Skip to content

Commit 700d2cc

Browse files
authored
Tidy up integer parsing (#17339)
The parse_integer function was previously made to reject negative values by default in #16920, but the documentation stated otherwise. This fixes the documentation and also: - Removes explicit negative=False parameters from call sites. - Brings the negative default of parse_integer_from_args in alignment with parse_integer.
1 parent 1e74b50 commit 700d2cc

8 files changed

Lines changed: 25 additions & 34 deletions

File tree

changelog.d/17339.misc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Tidy up `parse_integer` docs and call sites to reflect the fact that they require non-negative integers by default, and bring `parse_integer_from_args` default in alignment. Contributed by Denis Kasak (@dkasak).

synapse/http/servlet.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,15 @@ def parse_integer(
119119
default: value to use if the parameter is absent, defaults to None.
120120
required: whether to raise a 400 SynapseError if the parameter is absent,
121121
defaults to False.
122-
negative: whether to allow negative integers, defaults to True.
122+
negative: whether to allow negative integers, defaults to False (disallowing
123+
negatives).
123124
Returns:
124125
An int value or the default.
125126
126127
Raises:
127128
SynapseError: if the parameter is absent and required, if the
128129
parameter is present and not an integer, or if the
129-
parameter is illegitimate negative.
130+
parameter is illegitimately negative.
130131
"""
131132
args: Mapping[bytes, Sequence[bytes]] = request.args # type: ignore
132133
return parse_integer_from_args(args, name, default, required, negative)
@@ -164,7 +165,7 @@ def parse_integer_from_args(
164165
name: str,
165166
default: Optional[int] = None,
166167
required: bool = False,
167-
negative: bool = True,
168+
negative: bool = False,
168169
) -> Optional[int]:
169170
"""Parse an integer parameter from the request string
170171
@@ -174,15 +175,16 @@ def parse_integer_from_args(
174175
default: value to use if the parameter is absent, defaults to None.
175176
required: whether to raise a 400 SynapseError if the parameter is absent,
176177
defaults to False.
177-
negative: whether to allow negative integers, defaults to True.
178+
negative: whether to allow negative integers, defaults to False (disallowing
179+
negatives).
178180
179181
Returns:
180182
An int value or the default.
181183
182184
Raises:
183185
SynapseError: if the parameter is absent and required, if the
184186
parameter is present and not an integer, or if the
185-
parameter is illegitimate negative.
187+
parameter is illegitimately negative.
186188
"""
187189
name_bytes = name.encode("ascii")
188190

synapse/rest/admin/federation.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ def __init__(self, hs: "HomeServer"):
6161
async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
6262
await assert_requester_is_admin(self._auth, request)
6363

64-
start = parse_integer(request, "from", default=0, negative=False)
65-
limit = parse_integer(request, "limit", default=100, negative=False)
64+
start = parse_integer(request, "from", default=0)
65+
limit = parse_integer(request, "limit", default=100)
6666

6767
destination = parse_string(request, "destination")
6868

@@ -181,8 +181,8 @@ async def on_GET(
181181
if not await self._store.is_destination_known(destination):
182182
raise NotFoundError("Unknown destination")
183183

184-
start = parse_integer(request, "from", default=0, negative=False)
185-
limit = parse_integer(request, "limit", default=100, negative=False)
184+
start = parse_integer(request, "from", default=0)
185+
limit = parse_integer(request, "limit", default=100)
186186

187187
direction = parse_enum(request, "dir", Direction, default=Direction.FORWARDS)
188188

synapse/rest/admin/media.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,8 @@ async def on_POST(
311311
) -> Tuple[int, JsonDict]:
312312
await assert_requester_is_admin(self.auth, request)
313313

314-
before_ts = parse_integer(request, "before_ts", required=True, negative=False)
315-
size_gt = parse_integer(request, "size_gt", default=0, negative=False)
314+
before_ts = parse_integer(request, "before_ts", required=True)
315+
size_gt = parse_integer(request, "size_gt", default=0)
316316
keep_profiles = parse_boolean(request, "keep_profiles", default=True)
317317

318318
if before_ts < 30000000000: # Dec 1970 in milliseconds, Aug 2920 in seconds
@@ -377,8 +377,8 @@ async def on_GET(
377377
if user is None:
378378
raise NotFoundError("Unknown user")
379379

380-
start = parse_integer(request, "from", default=0, negative=False)
381-
limit = parse_integer(request, "limit", default=100, negative=False)
380+
start = parse_integer(request, "from", default=0)
381+
limit = parse_integer(request, "limit", default=100)
382382

383383
# If neither `order_by` nor `dir` is set, set the default order
384384
# to newest media is on top for backward compatibility.
@@ -421,8 +421,8 @@ async def on_DELETE(
421421
if user is None:
422422
raise NotFoundError("Unknown user")
423423

424-
start = parse_integer(request, "from", default=0, negative=False)
425-
limit = parse_integer(request, "limit", default=100, negative=False)
424+
start = parse_integer(request, "from", default=0)
425+
limit = parse_integer(request, "limit", default=100)
426426

427427
# If neither `order_by` nor `dir` is set, set the default order
428428
# to newest media is on top for backward compatibility.

synapse/rest/admin/statistics.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
6363
),
6464
)
6565

66-
start = parse_integer(request, "from", default=0, negative=False)
67-
limit = parse_integer(request, "limit", default=100, negative=False)
68-
from_ts = parse_integer(request, "from_ts", default=0, negative=False)
69-
until_ts = parse_integer(request, "until_ts", negative=False)
66+
start = parse_integer(request, "from", default=0)
67+
limit = parse_integer(request, "limit", default=100)
68+
from_ts = parse_integer(request, "from_ts", default=0)
69+
until_ts = parse_integer(request, "until_ts")
7070

7171
if until_ts is not None:
7272
if until_ts <= from_ts:

synapse/rest/admin/users.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,8 @@ def __init__(self, hs: "HomeServer"):
9090
async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
9191
await assert_requester_is_admin(self.auth, request)
9292

93-
start = parse_integer(request, "from", default=0, negative=False)
94-
limit = parse_integer(request, "limit", default=100, negative=False)
93+
start = parse_integer(request, "from", default=0)
94+
limit = parse_integer(request, "limit", default=100)
9595

9696
user_id = parse_string(request, "user_id")
9797
name = parse_string(request, "name", encoding="utf-8")

synapse/rest/client/room.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]:
510510
if server:
511511
raise e
512512

513-
limit: Optional[int] = parse_integer(request, "limit", 0, negative=False)
513+
limit: Optional[int] = parse_integer(request, "limit", 0)
514514
since_token = parse_string(request, "since")
515515

516516
if limit == 0:
@@ -1430,16 +1430,7 @@ async def on_GET(
14301430
requester = await self._auth.get_user_by_req(request, allow_guest=True)
14311431

14321432
max_depth = parse_integer(request, "max_depth")
1433-
if max_depth is not None and max_depth < 0:
1434-
raise SynapseError(
1435-
400, "'max_depth' must be a non-negative integer", Codes.BAD_JSON
1436-
)
1437-
14381433
limit = parse_integer(request, "limit")
1439-
if limit is not None and limit <= 0:
1440-
raise SynapseError(
1441-
400, "'limit' must be a positive integer", Codes.BAD_JSON
1442-
)
14431434

14441435
return 200, await self._room_summary_handler.get_room_hierarchy(
14451436
requester,

synapse/streams/config.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,6 @@ async def from_request(
7575
raise SynapseError(400, "'to' parameter is invalid")
7676

7777
limit = parse_integer(request, "limit", default=default_limit)
78-
if limit < 0:
79-
raise SynapseError(400, "Limit must be 0 or above")
80-
8178
limit = min(limit, MAX_LIMIT)
8279

8380
try:

0 commit comments

Comments
 (0)