Skip to content
Snippets Groups Projects
Unverified Commit 98a64b7f authored by Patrick Cloke's avatar Patrick Cloke Committed by GitHub
Browse files

Add basic domain validation for `DomainSpecificString.is_valid`. (#9071)

This checks that the domain given to `DomainSpecificString.is_valid` (e.g.
`UserID`, `RoomAlias`, etc.) is of a valid form. Previously some validation
was done on the localpart (e.g. the sigil), but not the domain portion.
parent aa4d8c1f
No related branches found
No related tags found
No related merge requests found
Fix "Failed to send request" errors when a client provides an invalid room alias.
...@@ -37,6 +37,7 @@ from signedjson.key import decode_verify_key_bytes ...@@ -37,6 +37,7 @@ from signedjson.key import decode_verify_key_bytes
from unpaddedbase64 import decode_base64 from unpaddedbase64 import decode_base64
from synapse.api.errors import Codes, SynapseError from synapse.api.errors import Codes, SynapseError
from synapse.http.endpoint import parse_and_validate_server_name
if TYPE_CHECKING: if TYPE_CHECKING:
from synapse.appservice.api import ApplicationService from synapse.appservice.api import ApplicationService
...@@ -257,8 +258,13 @@ class DomainSpecificString( ...@@ -257,8 +258,13 @@ class DomainSpecificString(
@classmethod @classmethod
def is_valid(cls: Type[DS], s: str) -> bool: def is_valid(cls: Type[DS], s: str) -> bool:
"""Parses the input string and attempts to ensure it is valid."""
try: try:
cls.from_string(s) obj = cls.from_string(s)
# Apply additional validation to the domain. This is only done
# during is_valid (and not part of from_string) since it is
# possible for invalid data to exist in room-state, etc.
parse_and_validate_server_name(obj.domain)
return True return True
except Exception: except Exception:
return False return False
......
...@@ -58,6 +58,10 @@ class RoomAliasTestCase(unittest.HomeserverTestCase): ...@@ -58,6 +58,10 @@ class RoomAliasTestCase(unittest.HomeserverTestCase):
self.assertEquals(room.to_string(), "#channel:my.domain") self.assertEquals(room.to_string(), "#channel:my.domain")
def test_validate(self):
id_string = "#test:domain,test"
self.assertFalse(RoomAlias.is_valid(id_string))
class GroupIDTestCase(unittest.TestCase): class GroupIDTestCase(unittest.TestCase):
def test_parse(self): def test_parse(self):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment