From 26054089722e7ca023927bb5d1239b4f5673fe87 Mon Sep 17 00:00:00 2001 From: Jason Little Date: Tue, 30 Jun 2026 08:45:44 -0500 Subject: [PATCH 1/4] Remove check on Room IDs having a domain component as Room IDs should be opaque strings --- event.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/event.go b/event.go index 9d605abf..efa8339d 100644 --- a/event.go +++ b/event.go @@ -65,9 +65,6 @@ const ( ) func checkID(id, kind string, sigil byte) (err error) { - if _, err = domainFromID(id); err != nil { - return - } if id[0] != sigil { err = fmt.Errorf( "gomatrixserverlib: invalid %s ID, wanted first byte to be '%c' got '%c'", From b97d4a0a3ce1ebb31c66ccaea8fac1e3bf969b68 Mon Sep 17 00:00:00 2001 From: Jason Little Date: Tue, 30 Jun 2026 10:48:00 -0500 Subject: [PATCH 2/4] Ensure this check still exists for other kinds of ID, like "user" To be fair, "user" is only featured once while "room" is far more prevelant --- event.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/event.go b/event.go index efa8339d..0580835a 100644 --- a/event.go +++ b/event.go @@ -65,6 +65,12 @@ const ( ) func checkID(id, kind string, sigil byte) (err error) { + if kind != "room" { + // RoomIDs should always be an opaque string, so only do this check for other kinds of ID + if _, err = domainFromID(id); err != nil { + return + } + } if id[0] != sigil { err = fmt.Errorf( "gomatrixserverlib: invalid %s ID, wanted first byte to be '%c' got '%c'", From 7e1698532f2c31a3b78d96abe582b58121eac7a6 Mon Sep 17 00:00:00 2001 From: Jason Little Date: Thu, 16 Jul 2026 05:52:40 -0500 Subject: [PATCH 3/4] Use ParseAndValidateRoomID() after exposing as public function to parse the RoomID instead --- event.go | 4 ++-- spec/roomid.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/event.go b/event.go index 0580835a..020369a0 100644 --- a/event.go +++ b/event.go @@ -65,9 +65,9 @@ const ( ) func checkID(id, kind string, sigil byte) (err error) { - if kind != "room" { + if kind == "room" { // RoomIDs should always be an opaque string, so only do this check for other kinds of ID - if _, err = domainFromID(id); err != nil { + if _, err = spec.ParseAndValidateRoomID(id); err != nil { return } } diff --git a/spec/roomid.go b/spec/roomid.go index 332db30f..a2f8340e 100644 --- a/spec/roomid.go +++ b/spec/roomid.go @@ -20,7 +20,7 @@ type RoomID struct { } func NewRoomID(id string) (*RoomID, error) { - return parseAndValidateRoomID(id) + return ParseAndValidateRoomID(id) } // Returns the full roomID string including leading sigil @@ -41,7 +41,7 @@ func (room RoomID) Domain() ServerName { return ServerName(room.domain) } -func parseAndValidateRoomID(id string) (*RoomID, error) { +func ParseAndValidateRoomID(id string) (*RoomID, error) { idLength := len(id) if idLength < 4 { // 4 since minimum roomID includes an !, :, non-empty opaque ID, non-empty domain return nil, fmt.Errorf("length %d is too short to be valid", idLength) From b674263407b06e3abbf9418e7e48cebd433ad02e Mon Sep 17 00:00:00 2001 From: Jason Little Date: Thu, 16 Jul 2026 05:53:52 -0500 Subject: [PATCH 4/4] remove comment --- event.go | 1 - 1 file changed, 1 deletion(-) diff --git a/event.go b/event.go index 020369a0..147c912d 100644 --- a/event.go +++ b/event.go @@ -66,7 +66,6 @@ const ( func checkID(id, kind string, sigil byte) (err error) { if kind == "room" { - // RoomIDs should always be an opaque string, so only do this check for other kinds of ID if _, err = spec.ParseAndValidateRoomID(id); err != nil { return }