diff --git a/go.mod b/go.mod index 02ce075fa..2675652a2 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.4.1 github.com/sirupsen/logrus v1.4.2 + github.com/tidwall/gjson v1.6.0 github.com/uber/jaeger-client-go v2.15.0+incompatible github.com/uber/jaeger-lib v1.5.0 go.uber.org/atomic v1.4.0 diff --git a/roomserver/input/events.go b/roomserver/input/events.go index f870471c0..66c22139d 100644 --- a/roomserver/input/events.go +++ b/roomserver/input/events.go @@ -266,7 +266,7 @@ func processInviteEvent( return err } - outputUpdates, err := updateToInviteMembership(updater, event, inviteStrippedState, nil, input.Event.RoomVersion) + outputUpdates, err := updateToInviteMembership(updater, event, nil, input.Event.RoomVersion) if err != nil { return err } diff --git a/roomserver/input/membership.go b/roomserver/input/membership.go index f1e0617c9..6c34b786d 100644 --- a/roomserver/input/membership.go +++ b/roomserver/input/membership.go @@ -22,6 +22,7 @@ import ( "github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/types" "github.com/matrix-org/gomatrixserverlib" + "github.com/tidwall/gjson" ) // updateMembership updates the current membership and the invites for each @@ -112,8 +113,8 @@ func updateMembership( } switch newMembership { - //case gomatrixserverlib.Invite: - // return updateToInviteMembership(mu, add, updates, updater.RoomVersion()) + case gomatrixserverlib.Invite: + return updateToInviteMembership(mu, *add, updates, updater.RoomVersion()) case gomatrixserverlib.Join: return updateToJoinMembership(mu, add, updates) case gomatrixserverlib.Leave, gomatrixserverlib.Ban: @@ -128,7 +129,6 @@ func updateMembership( func updateToInviteMembership( mu types.MembershipUpdater, add gomatrixserverlib.Event, - addState json.RawMessage, updates []api.OutputEvent, roomVersion gomatrixserverlib.RoomVersion, ) ([]api.OutputEvent, error) { @@ -141,6 +141,14 @@ func updateToInviteMembership( return nil, err } if needsSending { + // If there's any invite_room_state in the unsigned key from another + // homeserver then let's capture it. + var addState json.RawMessage + if unsigned := gjson.GetBytes(add.Unsigned(), "invite_room_state"); unsigned.Exists() { + if a, ok := unsigned.Value().([]byte); ok { + addState = a + } + } // We notify the consumers using a special event even though we will // notify them about the change in current state as part of the normal // room event stream. This ensures that the consumers only have to