Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Limit device_id size to 512B #12454

Merged
merged 10 commits into from
Apr 13, 2022
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/12454.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Limit length of device_id to less than 512 characters.
9 changes: 9 additions & 0 deletions synapse/rest/client/login.py
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,15 @@ async def _complete_login(
user_id = canonical_uid

device_id = login_submission.get("device_id")

# If device_id is present, check that device_id is not longer than a reasonable 512 characters
if device_id and len(device_id) > 512:
raise LoginError(
400,
"Device_id cannot be longer than 512 characters.",
H-Shay marked this conversation as resolved.
Show resolved Hide resolved
errcode=Codes.INVALID_PARAM,
)

initial_display_name = login_submission.get("initial_device_display_name")
(
device_id,
Expand Down
33 changes: 32 additions & 1 deletion tests/rest/client/test_login.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import json
import time
import urllib.parse
from typing import Any, Dict, List, Optional, Union
Expand Down Expand Up @@ -384,6 +384,37 @@ def test_session_can_hard_logout_all_sessions_after_being_soft_logged_out(
channel = self.make_request(b"POST", "/logout/all", access_token=access_token)
self.assertEqual(channel.result["code"], b"200", channel.result)

def test_login_with_overly_long_device_id_fails(self) -> None:
self.register_user("mickey", "cheese")

# create a device_id longer than 512 characters
device_id = "yolo" * 512

body = {
"type": "m.login.password",
"user": "mickey",
"password": "cheese",
"device_id": device_id,
}

# make a login request with the bad device_id
channel = self.make_request(
"POST",
"/_matrix/client/r0/login",
H-Shay marked this conversation as resolved.
Show resolved Hide resolved
json.dumps(body).encode("utf8"),
custom_headers=None,
)

# test that the login fails with the correct error code/message
self.assertEqual(channel.code, 400)
self.assertEqual(
channel.json_body,
{
"errcode": "M_INVALID_PARAM",
"error": "Device_id cannot be longer than 512 characters.",
H-Shay marked this conversation as resolved.
Show resolved Hide resolved
},
)


@skip_unless(has_saml2 and HAS_OIDC, "Requires SAML2 and OIDC")
class MultiSSOTestCase(unittest.HomeserverTestCase):
Expand Down