-
Notifications
You must be signed in to change notification settings - Fork 412
Parse Integer negative value validation #16920
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 7 commits
daa1448
c63ba0a
2d18bef
00cf8ee
f97abbc
673ffd3
00acf73
40a4fa1
6272437
5c71b50
591c87f
7a9c5d9
046b7d8
6ad8ce5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| Adds `limit` parameter negative value validation check to prevent 500 internal server error on publicRooms request. | ||
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -70,12 +70,21 @@ def parse_integer(request: Request, name: str, *, required: Literal[True]) -> in | |||||||
|
|
||||||||
| @overload | ||||||||
| def parse_integer( | ||||||||
| request: Request, name: str, default: Optional[int] = None, required: bool = False | ||||||||
| ) -> Optional[int]: ... | ||||||||
| request: Request, | ||||||||
| name: str, | ||||||||
| default: Optional[int] = None, | ||||||||
| required: bool = False, | ||||||||
| negative: bool = False, | ||||||||
| ) -> int: | ||||||||
| ... | ||||||||
|
||||||||
|
|
||||||||
|
|
||||||||
| def parse_integer( | ||||||||
| request: Request, name: str, default: Optional[int] = None, required: bool = False | ||||||||
| request: Request, | ||||||||
| name: str, | ||||||||
| default: Optional[int] = None, | ||||||||
| required: bool = False, | ||||||||
| negative: bool = False, | ||||||||
| ) -> Optional[int]: | ||||||||
| """Parse an integer parameter from the request string | ||||||||
|
|
||||||||
|
|
@@ -85,16 +94,17 @@ def parse_integer( | |||||||
| default: value to use if the parameter is absent, defaults to None. | ||||||||
| required: whether to raise a 400 SynapseError if the parameter is absent, | ||||||||
| defaults to False. | ||||||||
|
|
||||||||
| negative: whether to allow negative integers, defaults to True. | ||||||||
| Returns: | ||||||||
| An int value or the default. | ||||||||
|
|
||||||||
| Raises: | ||||||||
| SynapseError: if the parameter is absent and required, or if the | ||||||||
| parameter is present and not an integer. | ||||||||
| SynapseError: if the parameter is absent and required, if the | ||||||||
| parameter is present and not an integer, or if the | ||||||||
| parameter is illegitimate negative. | ||||||||
| """ | ||||||||
| args: Mapping[bytes, Sequence[bytes]] = request.args # type: ignore | ||||||||
| return parse_integer_from_args(args, name, default, required) | ||||||||
| return parse_integer_from_args(args, name, default, required, negative) | ||||||||
|
|
||||||||
|
|
||||||||
| @overload | ||||||||
|
|
@@ -120,14 +130,17 @@ def parse_integer_from_args( | |||||||
| name: str, | ||||||||
| default: Optional[int] = None, | ||||||||
| required: bool = False, | ||||||||
| ) -> Optional[int]: ... | ||||||||
| negative: bool = False, | ||||||||
| ) -> Optional[int]: | ||||||||
| ... | ||||||||
|
||||||||
| ) -> Optional[int]: | |
| ... | |
| ) -> Optional[int]: ... |
| Original file line number | Diff line number | Diff line change | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -63,38 +63,12 @@ async def on_GET(self, request: SynapseRequest) -> Tuple[int, JsonDict]: | |||||||||||||
| ), | ||||||||||||||
| ) | ||||||||||||||
|
|
||||||||||||||
| start = parse_integer(request, "from", default=0) | ||||||||||||||
| if start < 0: | ||||||||||||||
| raise SynapseError( | ||||||||||||||
| HTTPStatus.BAD_REQUEST, | ||||||||||||||
| "Query parameter from must be a string representing a positive integer.", | ||||||||||||||
| errcode=Codes.INVALID_PARAM, | ||||||||||||||
| ) | ||||||||||||||
|
|
||||||||||||||
| limit = parse_integer(request, "limit", default=100) | ||||||||||||||
| if limit < 0: | ||||||||||||||
| raise SynapseError( | ||||||||||||||
| HTTPStatus.BAD_REQUEST, | ||||||||||||||
| "Query parameter limit must be a string representing a positive integer.", | ||||||||||||||
| errcode=Codes.INVALID_PARAM, | ||||||||||||||
| ) | ||||||||||||||
|
|
||||||||||||||
| from_ts = parse_integer(request, "from_ts", default=0) | ||||||||||||||
| if from_ts < 0: | ||||||||||||||
| raise SynapseError( | ||||||||||||||
| HTTPStatus.BAD_REQUEST, | ||||||||||||||
| "Query parameter from_ts must be a string representing a positive integer.", | ||||||||||||||
| errcode=Codes.INVALID_PARAM, | ||||||||||||||
| ) | ||||||||||||||
|
|
||||||||||||||
| until_ts = parse_integer(request, "until_ts") | ||||||||||||||
| start = parse_integer(request, "from", default=0, negative=False) | ||||||||||||||
| limit = parse_integer(request, "limit", default=100, negative=False) | ||||||||||||||
| from_ts = parse_integer(request, "from_ts", default=0, negative=False) | ||||||||||||||
| until_ts = parse_integer(request, "until_ts", negative=False) | ||||||||||||||
|
|
||||||||||||||
| if until_ts is not None: | ||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There are spaces. |
||||||||||||||
| if until_ts < 0: | ||||||||||||||
| raise SynapseError( | ||||||||||||||
| HTTPStatus.BAD_REQUEST, | ||||||||||||||
| "Query parameter until_ts must be a string representing a positive integer.", | ||||||||||||||
| errcode=Codes.INVALID_PARAM, | ||||||||||||||
| ) | ||||||||||||||
| if until_ts <= from_ts: | ||||||||||||||
| raise SynapseError( | ||||||||||||||
| HTTPStatus.BAD_REQUEST, | ||||||||||||||
|
|
||||||||||||||
| Original file line number | Diff line number | Diff line change | ||||||
|---|---|---|---|---|---|---|---|---|
|
|
@@ -277,7 +277,7 @@ def test_missing_parameter(self) -> None: | |||||||
| self.assertEqual(400, channel.code, msg=channel.json_body) | ||||||||
| self.assertEqual(Codes.MISSING_PARAM, channel.json_body["errcode"]) | ||||||||
| self.assertEqual( | ||||||||
| "Missing integer query parameter 'before_ts'", channel.json_body["error"] | ||||||||
| "Missing required integer query parameter before_ts", channel.json_body["error"] | ||||||||
|
||||||||
| "Missing required integer query parameter before_ts", channel.json_body["error"] | |
| "Missing required integer query parameter before_ts", | |
| channel.json_body["error"], |
Uh oh!
There was an error while loading. Please reload this page.