From 2de420f9c04b50d72bd7a32ced497739b4aa4b29 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Wed, 22 Apr 2020 17:06:26 +0100 Subject: [PATCH] Send invite partial state properly --- roomserver/api/output.go | 2 -- roomserver/input/membership.go | 3 +-- syncapi/consumers/roomserver.go | 7 ++++++- syncapi/storage/postgres/syncserver.go | 6 +----- syncapi/storage/sqlite3/syncserver.go | 6 +----- syncapi/sync/requestpool.go | 6 ++++++ syncapi/types/types.go | 11 ++++++++--- 7 files changed, 23 insertions(+), 18 deletions(-) diff --git a/roomserver/api/output.go b/roomserver/api/output.go index 92a468a96..4e7adff79 100644 --- a/roomserver/api/output.go +++ b/roomserver/api/output.go @@ -116,8 +116,6 @@ type OutputNewRoomEvent struct { // Invite events can be received outside of an existing room so have to be // tracked separately from the room events themselves. type OutputNewInviteEvent struct { - // The room version of the invited room. - RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"` // The "m.room.member" invite event. Event gomatrixserverlib.HeaderedEvent `json:"event"` } diff --git a/roomserver/input/membership.go b/roomserver/input/membership.go index ee39ff5eb..ab5f6ba03 100644 --- a/roomserver/input/membership.go +++ b/roomserver/input/membership.go @@ -143,8 +143,7 @@ func updateToInviteMembership( // consider a single stream of events when determining whether a user // is invited, rather than having to combine multiple streams themselves. onie := api.OutputNewInviteEvent{ - Event: (*add).Headered(roomVersion), - RoomVersion: roomVersion, + Event: (*add).Headered(roomVersion), } updates = append(updates, api.OutputEvent{ Type: api.OutputTypeNewInviteEvent, diff --git a/syncapi/consumers/roomserver.go b/syncapi/consumers/roomserver.go index 1d512972d..bab165585 100644 --- a/syncapi/consumers/roomserver.go +++ b/syncapi/consumers/roomserver.go @@ -17,6 +17,7 @@ package consumers import ( "context" "encoding/json" + "errors" "fmt" "github.com/Shopify/sarama" @@ -154,6 +155,10 @@ func (s *OutputRoomEventConsumer) onNewRoomEvent( func (s *OutputRoomEventConsumer) onNewInviteEvent( ctx context.Context, msg api.OutputNewInviteEvent, ) error { + stateKey := msg.Event.StateKey() + if stateKey == nil { + return errors.New("invite has no state key") + } pduPos, err := s.db.AddInviteEvent(ctx, msg.Event) if err != nil { // panic rather than continue with an inconsistent database @@ -164,7 +169,7 @@ func (s *OutputRoomEventConsumer) onNewInviteEvent( }).Panicf("roomserver output log: write invite failure") return nil } - s.notifier.OnNewEvent(&msg.Event, "", nil, types.PaginationToken{PDUPosition: pduPos}) + s.notifier.OnNewEvent(&msg.Event, "", []string{*stateKey}, types.PaginationToken{PDUPosition: pduPos}) return nil } diff --git a/syncapi/storage/postgres/syncserver.go b/syncapi/storage/postgres/syncserver.go index 7fd75f066..1e078ef46 100644 --- a/syncapi/storage/postgres/syncserver.go +++ b/syncapi/storage/postgres/syncserver.go @@ -752,11 +752,7 @@ func (d *SyncServerDatasource) addInvitesToResponse( return err } for roomID, inviteEvent := range invites { - ir := types.NewInviteResponse() - ir.InviteState.Events = gomatrixserverlib.ToClientEvents( - []gomatrixserverlib.Event{inviteEvent.Event}, gomatrixserverlib.FormatSync, - ) - // TODO: add the invite state from the invite event. + ir := types.NewInviteResponse(inviteEvent) res.Rooms.Invite[roomID] = *ir } return nil diff --git a/syncapi/storage/sqlite3/syncserver.go b/syncapi/storage/sqlite3/syncserver.go index 29051cd06..cdfd29b84 100644 --- a/syncapi/storage/sqlite3/syncserver.go +++ b/syncapi/storage/sqlite3/syncserver.go @@ -799,11 +799,7 @@ func (d *SyncServerDatasource) addInvitesToResponse( return err } for roomID, inviteEvent := range invites { - ir := types.NewInviteResponse() - ir.InviteState.Events = gomatrixserverlib.HeaderedToClientEvents( - []gomatrixserverlib.HeaderedEvent{inviteEvent}, gomatrixserverlib.FormatSync, - ) - // TODO: add the invite state from the invite event. + ir := types.NewInviteResponse(inviteEvent) res.Rooms.Invite[roomID] = *ir } return nil diff --git a/syncapi/sync/requestpool.go b/syncapi/sync/requestpool.go index 69efd8aa8..8c65d5637 100644 --- a/syncapi/sync/requestpool.go +++ b/syncapi/sync/requestpool.go @@ -15,6 +15,8 @@ package sync import ( + "encoding/json" + "fmt" "net/http" "time" @@ -124,6 +126,10 @@ func (rp *RequestPool) OnIncomingSyncRequest(req *http.Request, device *authtype if !syncData.IsEmpty() || hasTimedOut { logger.WithField("next", syncData.NextBatch).WithField("timed_out", hasTimedOut).Info("Responding") + + j, _ := json.MarshalIndent(syncData, "", " ") + fmt.Println(string(j)) + return util.JSONResponse{ Code: http.StatusOK, JSON: syncData, diff --git a/syncapi/types/types.go b/syncapi/types/types.go index 718906ecd..c57d5f5ce 100644 --- a/syncapi/types/types.go +++ b/syncapi/types/types.go @@ -247,14 +247,19 @@ func NewJoinResponse() *JoinResponse { // InviteResponse represents a /sync response for a room which is under the 'invite' key. type InviteResponse struct { InviteState struct { - Events []gomatrixserverlib.ClientEvent `json:"events"` + Events json.RawMessage `json:"events"` } `json:"invite_state"` } // NewInviteResponse creates an empty response with initialised arrays. -func NewInviteResponse() *InviteResponse { +func NewInviteResponse(ev gomatrixserverlib.HeaderedEvent) *InviteResponse { res := InviteResponse{} - res.InviteState.Events = make([]gomatrixserverlib.ClientEvent, 0) + var unsigned struct { + InviteRoomState json.RawMessage `json:"invite_room_state"` + } + if err := json.Unmarshal(ev.Unsigned(), &unsigned); err == nil { + res.InviteState.Events = unsigned.InviteRoomState + } return &res }