Loopback invite events

This commit is contained in:
Neil Alexander 2020-05-06 15:10:44 +01:00
parent 7ff2bbf13e
commit 1be77d2a97
2 changed files with 20 additions and 14 deletions

View file

@ -58,15 +58,21 @@ func (r *RoomserverInternalAPI) InputRoomEvents(
// We lock as processRoomEvent can only be called once at a time // We lock as processRoomEvent can only be called once at a time
r.mutex.Lock() r.mutex.Lock()
defer r.mutex.Unlock() 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 { for i := range request.InputRoomEvents {
if response.EventID, err = processRoomEvent(ctx, r.DB, r, request.InputRoomEvents[i]); err != nil { if response.EventID, err = processRoomEvent(ctx, r.DB, r, request.InputRoomEvents[i]); err != nil {
return err return err
} }
} }
for i := range request.InputInviteEvents {
if err = processInviteEvent(ctx, r.DB, r, request.InputInviteEvents[i]); err != nil {
return err
}
}
return nil return nil
} }

View file

@ -134,9 +134,9 @@ func processInviteEvent(
db storage.Database, db storage.Database,
ow OutputRoomEventWriter, ow OutputRoomEventWriter,
input api.InputInviteEvent, input api.InputInviteEvent,
) (err error) { ) (returned *gomatrixserverlib.HeaderedEvent, err error) {
if input.Event.StateKey() == nil { 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() roomID := input.Event.RoomID()
@ -151,7 +151,7 @@ func processInviteEvent(
updater, err := db.MembershipUpdater(ctx, roomID, targetUserID, input.RoomVersion) updater, err := db.MembershipUpdater(ctx, roomID, targetUserID, input.RoomVersion)
if err != nil { if err != nil {
return err return nil, err
} }
succeeded := false succeeded := false
defer func() { defer func() {
@ -189,7 +189,7 @@ func processInviteEvent(
// For now we will implement option 2. Since in the abesence of a retry // 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 // mechanism it will be equivalent to option 1, and we don't have a
// signalling mechanism to implement option 3. // signalling mechanism to implement option 3.
return nil return nil, nil
} }
event := input.Event.Unwrap() event := input.Event.Unwrap()
@ -199,7 +199,7 @@ func processInviteEvent(
// most likely to be if the event came in over federation) then use // most likely to be if the event came in over federation) then use
// that. // that.
if err = event.SetUnsignedField("invite_room_state", input.InviteRoomState); err != nil { if err = event.SetUnsignedField("invite_room_state", input.InviteRoomState); err != nil {
return err return nil, err
} }
} else { } else {
// There's no invite room state, so let's have a go at building it // 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. // the invite room state, if we don't then we just fail quietly.
if irs, ierr := buildInviteStrippedState(ctx, db, input); ierr == nil { if irs, ierr := buildInviteStrippedState(ctx, db, input); ierr == nil {
if err = event.SetUnsignedField("invite_room_state", irs); err != 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) outputUpdates, err := updateToInviteMembership(updater, &event, nil, input.Event.RoomVersion)
if err != nil { if err != nil {
return err return nil, err
} }
if err = ow.WriteOutputEvents(roomID, outputUpdates); err != nil { if err = ow.WriteOutputEvents(roomID, outputUpdates); err != nil {
return err return nil, err
} }
succeeded = true succeeded = true
return nil return &input.Event, nil
} }
func buildInviteStrippedState( func buildInviteStrippedState(