From 6979de9844b47fc5bfd421f07f1b350226a2cd6f Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Fri, 9 Jul 2021 16:15:05 +0100 Subject: [PATCH] Make separate API call for room membership --- federationapi/routing/send.go | 34 +++++++++++++++--------------- federationapi/routing/send_test.go | 5 +++-- roomserver/api/query.go | 5 ++--- roomserver/internal/query/query.go | 10 +-------- 4 files changed, 23 insertions(+), 31 deletions(-) diff --git a/federationapi/routing/send.go b/federationapi/routing/send.go index 4effc0427..5f214e0fc 100644 --- a/federationapi/routing/send.go +++ b/federationapi/routing/send.go @@ -573,6 +573,23 @@ func (t *txnReq) processEvent(ctx context.Context, e *gomatrixserverlib.Event) e logger := util.GetLogger(ctx).WithField("event_id", e.EventID()).WithField("room_id", e.RoomID()) t.work = "" // reset from previous event + // Ask the roomserver if we know about the room and/or if we're joined + // to it. If we aren't then we won't bother processing the event. + joinedReq := api.QueryServerJoinedToRoomRequest{ + RoomID: e.RoomID(), + } + var joinedRes api.QueryServerJoinedToRoomResponse + if err := t.rsAPI.QueryServerJoinedToRoom(ctx, &joinedReq, &joinedRes); err != nil { + return fmt.Errorf("t.rsAPI.QueryServerJoinedToRoom: %w", err) + } + + if !joinedRes.RoomExists || !joinedRes.IsInRoom { + // We don't believe we're a member of this room, therefore there's + // no point in wasting work trying to figure out what to do with + // missing auth or prev events. Drop the event. + return roomNotFoundError{e.RoomID()} + } + // Work out if the roomserver knows everything it needs to know to auth // the event. This includes the prev_events and auth_events. // NOTE! This is going to include prev_events that have an empty state @@ -589,23 +606,6 @@ func (t *txnReq) processEvent(ctx context.Context, e *gomatrixserverlib.Event) e return fmt.Errorf("t.rsAPI.QueryMissingAuthPrevEvents: %w", err) } - if !stateResp.RoomExists { - // TODO: When synapse receives a message for a room it is not in it - // asks the remote server for the state of the room so that it can - // check if the remote server knows of a join "m.room.member" event - // that this server is unaware of. - // However generally speaking we should reject events for rooms we - // aren't a member of. - return roomNotFoundError{e.RoomID()} - } - - if !stateResp.RoomJoined { - // We don't believe we're a member of this room anymore, therefore - // there's no point in wasting work trying to figure out what to do - // with missing auth or prev events. Silently drop the event. - return nil - } - // Prepare a map of all the events we already had before this point, so // that we don't send them to the roomserver again. for _, eventID := range append(e.AuthEventIDs(), e.PrevEventIDs()...) { diff --git a/federationapi/routing/send_test.go b/federationapi/routing/send_test.go index 34020e9d0..0da06aa95 100644 --- a/federationapi/routing/send_test.go +++ b/federationapi/routing/send_test.go @@ -142,7 +142,6 @@ func (t *testRoomserverAPI) QueryMissingAuthPrevEvents( response.RoomVersion = testRoomVersion res := t.queryMissingAuthPrevEvents(request) response.RoomExists = res.RoomExists - response.RoomJoined = true response.MissingAuthEventIDs = res.MissingAuthEventIDs response.MissingPrevEventIDs = res.MissingPrevEventIDs return nil @@ -191,7 +190,9 @@ func (t *testRoomserverAPI) QueryServerJoinedToRoom( request *api.QueryServerJoinedToRoomRequest, response *api.QueryServerJoinedToRoomResponse, ) error { - return fmt.Errorf("not implemented") + response.RoomExists = true + response.IsInRoom = true + return nil } // Query whether a server is allowed to see an event diff --git a/roomserver/api/query.go b/roomserver/api/query.go index 164803ad8..c70db65c1 100644 --- a/roomserver/api/query.go +++ b/roomserver/api/query.go @@ -96,8 +96,6 @@ type QueryMissingAuthPrevEventsResponse struct { // Does the room exist on this roomserver? // If the room doesn't exist all other fields will be empty. RoomExists bool `json:"room_exists"` - // Are we joined to this room locally? - RoomJoined bool `json:"room_joined"` // The room version of the room. RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"` // The event IDs of the auth events that we don't know locally. @@ -172,7 +170,8 @@ type QueryMembershipsForRoomResponse struct { // QueryServerJoinedToRoomRequest is a request to QueryServerJoinedToRoom type QueryServerJoinedToRoomRequest struct { - // Server name of the server to find + // Server name of the server to find. If not specified, we will + // default to checking if the local server is joined. ServerName gomatrixserverlib.ServerName `json:"server_name"` // ID of the room to see if we are still joined to RoomID string `json:"room_id"` diff --git a/roomserver/internal/query/query.go b/roomserver/internal/query/query.go index 5d0717d7a..ccd093726 100644 --- a/roomserver/internal/query/query.go +++ b/roomserver/internal/query/query.go @@ -142,14 +142,6 @@ func (r *Queryer) QueryMissingAuthPrevEvents( response.RoomExists = !info.IsStub response.RoomVersion = info.RoomVersion - if response.RoomExists { - joined, err := r.DB.GetLocalServerInRoom(ctx, info.RoomNID) - if err != nil { - return fmt.Errorf("r.DB.GetLocalServerInRoom: %w", err) - } - response.RoomJoined = joined - } - for _, authEventID := range request.AuthEventIDs { if nids, err := r.DB.EventNIDs(ctx, []string{authEventID}); err != nil || len(nids) == 0 { response.MissingAuthEventIDs = append(response.MissingAuthEventIDs, authEventID) @@ -337,7 +329,7 @@ func (r *Queryer) QueryServerJoinedToRoom( } response.RoomExists = true - if request.ServerName == r.ServerName { + if request.ServerName == r.ServerName || request.ServerName == "" { var joined bool joined, err = r.DB.GetLocalServerInRoom(ctx, info.RoomNID) if err != nil {