Make separate API call for room membership

This commit is contained in:
Neil Alexander 2021-07-09 16:15:05 +01:00
parent c396120c24
commit 6979de9844
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
4 changed files with 23 additions and 31 deletions

View file

@ -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()) logger := util.GetLogger(ctx).WithField("event_id", e.EventID()).WithField("room_id", e.RoomID())
t.work = "" // reset from previous event 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 // Work out if the roomserver knows everything it needs to know to auth
// the event. This includes the prev_events and auth_events. // the event. This includes the prev_events and auth_events.
// NOTE! This is going to include prev_events that have an empty state // 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) 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 // Prepare a map of all the events we already had before this point, so
// that we don't send them to the roomserver again. // that we don't send them to the roomserver again.
for _, eventID := range append(e.AuthEventIDs(), e.PrevEventIDs()...) { for _, eventID := range append(e.AuthEventIDs(), e.PrevEventIDs()...) {

View file

@ -142,7 +142,6 @@ func (t *testRoomserverAPI) QueryMissingAuthPrevEvents(
response.RoomVersion = testRoomVersion response.RoomVersion = testRoomVersion
res := t.queryMissingAuthPrevEvents(request) res := t.queryMissingAuthPrevEvents(request)
response.RoomExists = res.RoomExists response.RoomExists = res.RoomExists
response.RoomJoined = true
response.MissingAuthEventIDs = res.MissingAuthEventIDs response.MissingAuthEventIDs = res.MissingAuthEventIDs
response.MissingPrevEventIDs = res.MissingPrevEventIDs response.MissingPrevEventIDs = res.MissingPrevEventIDs
return nil return nil
@ -191,7 +190,9 @@ func (t *testRoomserverAPI) QueryServerJoinedToRoom(
request *api.QueryServerJoinedToRoomRequest, request *api.QueryServerJoinedToRoomRequest,
response *api.QueryServerJoinedToRoomResponse, response *api.QueryServerJoinedToRoomResponse,
) error { ) error {
return fmt.Errorf("not implemented") response.RoomExists = true
response.IsInRoom = true
return nil
} }
// Query whether a server is allowed to see an event // Query whether a server is allowed to see an event

View file

@ -96,8 +96,6 @@ type QueryMissingAuthPrevEventsResponse struct {
// Does the room exist on this roomserver? // Does the room exist on this roomserver?
// If the room doesn't exist all other fields will be empty. // If the room doesn't exist all other fields will be empty.
RoomExists bool `json:"room_exists"` RoomExists bool `json:"room_exists"`
// Are we joined to this room locally?
RoomJoined bool `json:"room_joined"`
// The room version of the room. // The room version of the room.
RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"` RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"`
// The event IDs of the auth events that we don't know locally. // 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 // QueryServerJoinedToRoomRequest is a request to QueryServerJoinedToRoom
type QueryServerJoinedToRoomRequest struct { 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"` ServerName gomatrixserverlib.ServerName `json:"server_name"`
// ID of the room to see if we are still joined to // ID of the room to see if we are still joined to
RoomID string `json:"room_id"` RoomID string `json:"room_id"`

View file

@ -142,14 +142,6 @@ func (r *Queryer) QueryMissingAuthPrevEvents(
response.RoomExists = !info.IsStub response.RoomExists = !info.IsStub
response.RoomVersion = info.RoomVersion 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 { for _, authEventID := range request.AuthEventIDs {
if nids, err := r.DB.EventNIDs(ctx, []string{authEventID}); err != nil || len(nids) == 0 { if nids, err := r.DB.EventNIDs(ctx, []string{authEventID}); err != nil || len(nids) == 0 {
response.MissingAuthEventIDs = append(response.MissingAuthEventIDs, authEventID) response.MissingAuthEventIDs = append(response.MissingAuthEventIDs, authEventID)
@ -337,7 +329,7 @@ func (r *Queryer) QueryServerJoinedToRoom(
} }
response.RoomExists = true response.RoomExists = true
if request.ServerName == r.ServerName { if request.ServerName == r.ServerName || request.ServerName == "" {
var joined bool var joined bool
joined, err = r.DB.GetLocalServerInRoom(ctx, info.RoomNID) joined, err = r.DB.GetLocalServerInRoom(ctx, info.RoomNID)
if err != nil { if err != nil {