Handle ban events in the state transfer

This commit is contained in:
Neil Alexander 2022-04-04 09:42:41 +01:00
parent 3613ac3f74
commit 63cf4ae416
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -329,10 +329,13 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, userID, roomID, ne
continue
}
if event.Type() == gomatrixserverlib.MRoomMember && !event.StateKeyEquals(userID) {
// Ignore membership events that aren't our own, as event auth will
// prevent us from being able to create membership events on behalf
// of other users anyway unless they are invites or bans.
continue
// With the exception of bans which we do want to copy, we should ignore
// membership events that aren't our own, as event auth will prevent us
// from being able to create membership events on behalf of other users
// anyway unless they are invites or bans.
if membership, err := event.Membership(); err == nil && membership != gomatrixserverlib.Ban {
continue
}
}
state[gomatrixserverlib.StateKeyTuple{EventType: event.Type(), StateKey: *event.StateKey()}] = event
}
@ -437,15 +440,6 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, userID, roomID, ne
})
}
banEvents, err := getBanEvents(ctx, roomID, r.URSAPI)
if err != nil {
return nil, &api.PerformError{
Msg: err.Error(),
}
} else {
eventsToMake = append(eventsToMake, banEvents...)
}
// Duplicate all of the old state events into the new room.
for tuple, event := range state {
if _, ok := override[tuple]; ok {
@ -453,10 +447,10 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, userID, roomID, ne
// are already in `eventsToMake`.
continue
}
if event.Type() == gomatrixserverlib.MRoomMember {
// Don't duplicate membership events. Our own membership
// event has already been created above, and event auth won't
// let us create membership events for other users.
if membership, merr := event.Membership(); merr == nil && membership != gomatrixserverlib.Ban {
// Don't duplicate membership events that aren't bans. Our own
// membership event has already been created above, and event auth
// won't let us create join membership events for other users.
continue
}
newEvent := fledglingEvent{
@ -607,30 +601,6 @@ func (r *Upgrader) makeHeaderedEvent(ctx context.Context, evTime time.Time, user
return headeredEvent, nil
}
func getBanEvents(ctx context.Context, roomID string, URSAPI api.RoomserverInternalAPI) ([]fledglingEvent, error) {
var err error
banEvents := []fledglingEvent{}
roomMemberReq := api.QueryCurrentStateRequest{RoomID: roomID, AllowWildcards: true, StateTuples: []gomatrixserverlib.StateKeyTuple{
{EventType: gomatrixserverlib.MRoomMember, StateKey: "*"},
}}
roomMemberRes := api.QueryCurrentStateResponse{}
if err = URSAPI.QueryCurrentState(ctx, &roomMemberReq, &roomMemberRes); err != nil {
return nil, err
}
for _, event := range roomMemberRes.StateEvents {
if event == nil {
continue
}
memberContent, err := gomatrixserverlib.NewMemberContentFromEvent(event.Event)
if err != nil || memberContent.Membership != gomatrixserverlib.Ban {
continue
}
banEvents = append(banEvents, fledglingEvent{Type: gomatrixserverlib.MRoomMember, StateKey: *event.StateKey(), Content: memberContent})
}
return banEvents, nil
}
func createTemporaryPowerLevels(powerLevelContent *gomatrixserverlib.PowerLevelContent, userID string) fledglingEvent {
eventPowerLevels := powerLevelContent.Events
stateDefaultPowerLevel := powerLevelContent.StateDefault