From c4af1e04a1139a1e3b03b319770dc3836ef56e84 Mon Sep 17 00:00:00 2001 From: Cnly Date: Tue, 15 Jan 2019 22:23:15 +0800 Subject: [PATCH] POST /join/{roomId}: Use server in roomID as last resort to join Signed-off-by: Alex Chen --- .../dendrite/clientapi/routing/joinroom.go | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/github.com/matrix-org/dendrite/clientapi/routing/joinroom.go b/src/github.com/matrix-org/dendrite/clientapi/routing/joinroom.go index 760e46d0b..c98688de0 100644 --- a/src/github.com/matrix-org/dendrite/clientapi/routing/joinroom.go +++ b/src/github.com/matrix-org/dendrite/clientapi/routing/joinroom.go @@ -118,28 +118,32 @@ func (r joinRoomReq) joinRoomByID(roomID string) util.JSONResponse { if err := r.queryAPI.QueryInvitesForUser(r.req.Context(), &queryReq, &queryRes); err != nil { return httputil.LogThenError(r.req, err) } - if len(queryRes.InviteSenderUserIDs) == 0 { - // Support clients erroneously trying to join without an invite - _, domain, err := gomatrixserverlib.SplitID('!', roomID) - if err != nil { - return httputil.LogThenError(r.req, err) - } - return r.joinRoomUsingServers(roomID, []gomatrixserverlib.ServerName{domain}) - } servers := []gomatrixserverlib.ServerName{} - seenBefore := map[gomatrixserverlib.ServerName]bool{} + seenInInviterIDs := map[gomatrixserverlib.ServerName]bool{} for _, userID := range queryRes.InviteSenderUserIDs { _, domain, err := gomatrixserverlib.SplitID('@', userID) if err != nil { return httputil.LogThenError(r.req, err) } - if !seenBefore[domain] { + if !seenInInviterIDs[domain] { servers = append(servers, domain) - seenBefore[domain] = true + seenInInviterIDs[domain] = true } } + // Also add the domain extracted from the roomID as a last resort to join + // in case the client is erroneously trying to join by ID without an invite + // or all previous attempts at domains extracted from the inviter IDs fail + // Note: It's no guarantee we'll succeed because a room isn't bound to the domain in its ID + _, domain, err := gomatrixserverlib.SplitID('!', roomID) + if err != nil { + return httputil.LogThenError(r.req, err) + } + if domain != r.cfg.Matrix.ServerName && !seenInInviterIDs[domain] { + servers = append(servers, domain) + } + return r.joinRoomUsingServers(roomID, servers) }