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 continue
} }
if event.Type() == gomatrixserverlib.MRoomMember && !event.StateKeyEquals(userID) { if event.Type() == gomatrixserverlib.MRoomMember && !event.StateKeyEquals(userID) {
// Ignore membership events that aren't our own, as event auth will // With the exception of bans which we do want to copy, we should ignore
// prevent us from being able to create membership events on behalf // membership events that aren't our own, as event auth will prevent us
// of other users anyway unless they are invites or bans. // from being able to create membership events on behalf of other users
continue // 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 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. // Duplicate all of the old state events into the new room.
for tuple, event := range state { for tuple, event := range state {
if _, ok := override[tuple]; ok { if _, ok := override[tuple]; ok {
@ -453,10 +447,10 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, userID, roomID, ne
// are already in `eventsToMake`. // are already in `eventsToMake`.
continue continue
} }
if event.Type() == gomatrixserverlib.MRoomMember { if membership, merr := event.Membership(); merr == nil && membership != gomatrixserverlib.Ban {
// Don't duplicate membership events. Our own membership // Don't duplicate membership events that aren't bans. Our own
// event has already been created above, and event auth won't // membership event has already been created above, and event auth
// let us create membership events for other users. // won't let us create join membership events for other users.
continue continue
} }
newEvent := fledglingEvent{ newEvent := fledglingEvent{
@ -607,30 +601,6 @@ func (r *Upgrader) makeHeaderedEvent(ctx context.Context, evTime time.Time, user
return headeredEvent, nil 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 { func createTemporaryPowerLevels(powerLevelContent *gomatrixserverlib.PowerLevelContent, userID string) fledglingEvent {
eventPowerLevels := powerLevelContent.Events eventPowerLevels := powerLevelContent.Events
stateDefaultPowerLevel := powerLevelContent.StateDefault stateDefaultPowerLevel := powerLevelContent.StateDefault