Environment
Server Implementation: Tuwunel
Client Implementation: ElementX (iOS / Android)
Reverse Proxy: HAProxy
Description
When a user clicks a room link (e.g., a room upgrade link redirected via m.room.tombstone or a specific internal room link matrix structure) to navigate to a room they haven't joined yet, ElementX gets stuck in an infinite retry loop, flashing alert dialogs continuously.
An investigation via HAProxy tracking logs shows that the issue stems from a combination of unimplemented endpoints and permission handling in Tuwunel when encountering unjoined rooms.
HAProxy Log Evidence
Plaintext
1. Missing endpoint for room preview
bk_matrix_tuwunel/s1 ... 404 ... "GET /_matrix/client/v1/room_summary/!CsRxv6JBvOzBVdjIgYlQrYbZYc1AIGfLhCPI1XE3gks?via=cst.sns.com&via=v.tcz.io HTTP/2.0"
2. Authorization rejected when client falls back to fetching room metadata
bk_matrix_tuwunel/s1 ... 403 ... "GET /_matrix/client/v3/rooms/!CsRxv6JBvOzBVdjIgYlQrYbZYc1AIGfLhCPI1XE3gks/state HTTP/2.0"
bk_matrix_tuwunel/s1 ... 403 ... "GET /_matrix/client/v3/rooms/!CsRxv6JBvOzBVdjIgYlQrYbZYc1AIGfLhCPI1XE3gks/joined_members HTTP/2.0"
3. Bad Request when attempting to poll publicRooms from federation via server query
bk_matrix_tuwunel/s1 ... 400 ... "POST /_matrix/client/v3/publicRooms?server=v.tcz.io HTTP/2.0"
Root Cause Analysis
/_matrix/client/v1/room_summary/... returns 404 Not Found: ElementX strictly relies on this client-server endpoint to render room previews prior to joining. Tuwunel currently lacks implementation for this router.
/state and /joined_members return 403 Forbidden: Because the client fails to obtain the room summary, it attempts to fall back to older endpoints. However, since the user is not yet a member of the target room, the server correctly (but obstructively for this use case) denies access with a 403.
Federated publicRooms query returns 400 Bad Request: The server errors out when attempting to proxy the public directory request to the remote home server specified in the via parameter (v.tcz.io).
This cascading failure deprives ElementX of any structural metadata regarding the target replacement room, inducing a UI-handling panic and the infinite request loop.
Expected Behavior
The server should implement the /_matrix/client/v1/room_summary/* endpoint according to the Spec, allowing non-members to retrieve basic context (such as room name, avatar, and join rules) for navigation and preview validation, avoiding unexpected 404/403 blockades.
Environment
Server Implementation: Tuwunel
Client Implementation: ElementX (iOS / Android)
Reverse Proxy: HAProxy
Description
When a user clicks a room link (e.g., a room upgrade link redirected via m.room.tombstone or a specific internal room link matrix structure) to navigate to a room they haven't joined yet, ElementX gets stuck in an infinite retry loop, flashing alert dialogs continuously.
An investigation via HAProxy tracking logs shows that the issue stems from a combination of unimplemented endpoints and permission handling in Tuwunel when encountering unjoined rooms.
HAProxy Log Evidence
Plaintext
1. Missing endpoint for room preview
bk_matrix_tuwunel/s1 ... 404 ... "GET /_matrix/client/v1/room_summary/!CsRxv6JBvOzBVdjIgYlQrYbZYc1AIGfLhCPI1XE3gks?via=cst.sns.com&via=v.tcz.io HTTP/2.0"
2. Authorization rejected when client falls back to fetching room metadata
bk_matrix_tuwunel/s1 ... 403 ... "GET /_matrix/client/v3/rooms/!CsRxv6JBvOzBVdjIgYlQrYbZYc1AIGfLhCPI1XE3gks/state HTTP/2.0"
bk_matrix_tuwunel/s1 ... 403 ... "GET /_matrix/client/v3/rooms/!CsRxv6JBvOzBVdjIgYlQrYbZYc1AIGfLhCPI1XE3gks/joined_members HTTP/2.0"
3. Bad Request when attempting to poll publicRooms from federation via server query
bk_matrix_tuwunel/s1 ... 400 ... "POST /_matrix/client/v3/publicRooms?server=v.tcz.io HTTP/2.0"
Root Cause Analysis
/_matrix/client/v1/room_summary/... returns 404 Not Found: ElementX strictly relies on this client-server endpoint to render room previews prior to joining. Tuwunel currently lacks implementation for this router.
/state and /joined_members return 403 Forbidden: Because the client fails to obtain the room summary, it attempts to fall back to older endpoints. However, since the user is not yet a member of the target room, the server correctly (but obstructively for this use case) denies access with a 403.
Federated publicRooms query returns 400 Bad Request: The server errors out when attempting to proxy the public directory request to the remote home server specified in the via parameter (v.tcz.io).
This cascading failure deprives ElementX of any structural metadata regarding the target replacement room, inducing a UI-handling panic and the infinite request loop.
Expected Behavior
The server should implement the /_matrix/client/v1/room_summary/* endpoint according to the Spec, allowing non-members to retrieve basic context (such as room name, avatar, and join rules) for navigation and preview validation, avoiding unexpected 404/403 blockades.