Fix invitations not sending push notifications (#3207)

The tests added in https://github.com/matrix-org/sytest/pull/1356
uncovered that we don't consider invitations as events the userapi
should handle and thus just don't notify the client about any new
invitations received over federation.
This commit is contained in:
Till 2023-09-26 15:47:37 +02:00 committed by GitHub
parent db83789654
commit d065219de1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 18 deletions

View file

@ -784,3 +784,7 @@ Invited user can reject local invite after originator leaves
Guest users can join guest_access rooms Guest users can join guest_access rooms
Forgotten room messages cannot be paginated Forgotten room messages cannot be paginated
Local device key changes get to remote servers with correct prev_id Local device key changes get to remote servers with correct prev_id
HS provides query metadata
HS can provide query metadata on a single protocol
Invites over federation are correctly pushed
Invites over federation are correctly pushed with name

View file

@ -92,29 +92,42 @@ func (s *OutputRoomEventConsumer) Start() error {
func (s *OutputRoomEventConsumer) onMessage(ctx context.Context, msgs []*nats.Msg) bool { func (s *OutputRoomEventConsumer) onMessage(ctx context.Context, msgs []*nats.Msg) bool {
msg := msgs[0] // Guaranteed to exist if onMessage is called msg := msgs[0] // Guaranteed to exist if onMessage is called
// Only handle events we care about // Only handle events we care about
if rsapi.OutputType(msg.Header.Get(jetstream.RoomEventType)) != rsapi.OutputTypeNewRoomEvent {
return true var event *rstypes.HeaderedEvent
} var isNewRoomEvent bool
switch rsapi.OutputType(msg.Header.Get(jetstream.RoomEventType)) {
case rsapi.OutputTypeNewRoomEvent:
isNewRoomEvent = true
fallthrough
case rsapi.OutputTypeNewInviteEvent:
var output rsapi.OutputEvent var output rsapi.OutputEvent
if err := json.Unmarshal(msg.Data, &output); err != nil { if err := json.Unmarshal(msg.Data, &output); err != nil {
// If the message was invalid, log it and move on to the next message in the stream // If the message was invalid, log it and move on to the next message in the stream
log.WithError(err).Errorf("roomserver output log: message parse failure") log.WithError(err).Errorf("roomserver output log: message parse failure")
return true return true
} }
event := output.NewRoomEvent.Event if isNewRoomEvent {
event = output.NewRoomEvent.Event
} else {
event = output.NewInviteEvent.Event
}
if event == nil { if event == nil {
log.Errorf("userapi consumer: expected event") log.Errorf("userapi consumer: expected event")
return true return true
} }
if s.cfg.Matrix.ReportStats.Enabled {
go s.storeMessageStats(ctx, event.Type(), string(event.SenderID()), event.RoomID().String())
}
log.WithFields(log.Fields{ log.WithFields(log.Fields{
"event_id": event.EventID(), "event_id": event.EventID(),
"event_type": event.Type(), "event_type": event.Type(),
}).Tracef("Received message from roomserver: %#v", output) }).Tracef("Received message from roomserver: %#v", output)
default:
return true
}
if s.cfg.Matrix.ReportStats.Enabled {
go s.storeMessageStats(ctx, event.Type(), string(event.SenderID()), event.RoomID().String())
}
metadata, err := msg.Metadata() metadata, err := msg.Metadata()
if err != nil { if err != nil {
@ -448,6 +461,19 @@ func (s *OutputRoomEventConsumer) roomName(ctx context.Context, event *rstypes.H
} }
} }
// Special case for invites, as we don't store any "current state" for these events,
// we need to make sure that, if present, the m.room.name is sent as well.
if event.Type() == spec.MRoomMember &&
gjson.GetBytes(event.Content(), "membership").Str == "invite" {
invState := gjson.GetBytes(event.JSON(), "unsigned.invite_room_state")
for _, ev := range invState.Array() {
if ev.Get("type").Str == spec.MRoomName {
name := ev.Get("content.name").Str
return name, nil
}
}
}
req := &rsapi.QueryCurrentStateRequest{ req := &rsapi.QueryCurrentStateRequest{
RoomID: event.RoomID().String(), RoomID: event.RoomID().String(),
StateTuples: []gomatrixserverlib.StateKeyTuple{roomNameTuple, canonicalAliasTuple}, StateTuples: []gomatrixserverlib.StateKeyTuple{roomNameTuple, canonicalAliasTuple},