From 1be77d2a97a4ad92725b33103a652b2ce2e1f275 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Wed, 6 May 2020 15:10:44 +0100 Subject: [PATCH] Loopback invite events --- roomserver/internal/input.go | 16 +++++++++++----- roomserver/internal/input_events.go | 18 +++++++++--------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/roomserver/internal/input.go b/roomserver/internal/input.go index 19ebea660..e45dca3a5 100644 --- a/roomserver/internal/input.go +++ b/roomserver/internal/input.go @@ -58,15 +58,21 @@ func (r *RoomserverInternalAPI) InputRoomEvents( // We lock as processRoomEvent can only be called once at a time r.mutex.Lock() defer r.mutex.Unlock() + for i := range request.InputInviteEvents { + if event, e := processInviteEvent(ctx, r.DB, r, request.InputInviteEvents[i]); e != nil { + return e + } else { + request.InputRoomEvents = append(request.InputRoomEvents, api.InputRoomEvent{ + Kind: api.KindNew, + Event: *event, + AuthEventIDs: event.AuthEventIDs(), + }) + } + } for i := range request.InputRoomEvents { if response.EventID, err = processRoomEvent(ctx, r.DB, r, request.InputRoomEvents[i]); err != nil { return err } } - for i := range request.InputInviteEvents { - if err = processInviteEvent(ctx, r.DB, r, request.InputInviteEvents[i]); err != nil { - return err - } - } return nil } diff --git a/roomserver/internal/input_events.go b/roomserver/internal/input_events.go index 6da63716c..0021c5a50 100644 --- a/roomserver/internal/input_events.go +++ b/roomserver/internal/input_events.go @@ -134,9 +134,9 @@ func processInviteEvent( db storage.Database, ow OutputRoomEventWriter, input api.InputInviteEvent, -) (err error) { +) (returned *gomatrixserverlib.HeaderedEvent, err error) { if input.Event.StateKey() == nil { - return fmt.Errorf("invite must be a state event") + return nil, fmt.Errorf("invite must be a state event") } roomID := input.Event.RoomID() @@ -151,7 +151,7 @@ func processInviteEvent( updater, err := db.MembershipUpdater(ctx, roomID, targetUserID, input.RoomVersion) if err != nil { - return err + return nil, err } succeeded := false defer func() { @@ -189,7 +189,7 @@ func processInviteEvent( // For now we will implement option 2. Since in the abesence of a retry // mechanism it will be equivalent to option 1, and we don't have a // signalling mechanism to implement option 3. - return nil + return nil, nil } event := input.Event.Unwrap() @@ -199,7 +199,7 @@ func processInviteEvent( // most likely to be if the event came in over federation) then use // that. if err = event.SetUnsignedField("invite_room_state", input.InviteRoomState); err != nil { - return err + return nil, err } } else { // There's no invite room state, so let's have a go at building it @@ -208,22 +208,22 @@ func processInviteEvent( // the invite room state, if we don't then we just fail quietly. if irs, ierr := buildInviteStrippedState(ctx, db, input); ierr == nil { if err = event.SetUnsignedField("invite_room_state", irs); err != nil { - return err + return nil, err } } } outputUpdates, err := updateToInviteMembership(updater, &event, nil, input.Event.RoomVersion) if err != nil { - return err + return nil, err } if err = ow.WriteOutputEvents(roomID, outputUpdates); err != nil { - return err + return nil, err } succeeded = true - return nil + return &input.Event, nil } func buildInviteStrippedState(