diff --git a/roomserver/internal/perform/perform_upgrade.go b/roomserver/internal/perform/perform_upgrade.go index f635d32ad..644f7fda3 100644 --- a/roomserver/internal/perform/perform_upgrade.go +++ b/roomserver/internal/perform/perform_upgrade.go @@ -355,7 +355,7 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, oldRoom *api.Query continue } if event.Type() == spec.MRoomMember && !event.StateKeyEquals(userID) { - // With the exception of bans and invites which we do want to copy, we + // 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. @@ -365,13 +365,13 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, oldRoom *api.Query } switch membership { case spec.Ban: - case spec.Invite: default: continue } } // skip events that rely on a specific user being present - if event.Type() != spec.MRoomMember && !event.StateKeyEquals("") { + sKey := *event.StateKey() + if event.Type() != spec.MRoomMember && len(sKey) > 0 && sKey[:1] == "@" { continue } state[gomatrixserverlib.StateKeyTuple{EventType: event.Type(), StateKey: *event.StateKey()}] = event diff --git a/roomserver/roomserver_test.go b/roomserver/roomserver_test.go index 85cee8a4b..d1a74d3c3 100644 --- a/roomserver/roomserver_test.go +++ b/roomserver/roomserver_test.go @@ -764,6 +764,7 @@ func TestUpgrade(t *testing.T) { charlie := test.NewUser(t) ctx := context.Background() + spaceChild := test.NewRoom(t, alice) validateTuples := []gomatrixserverlib.StateKeyTuple{ {EventType: spec.MRoomCreate}, {EventType: spec.MRoomPowerLevels}, @@ -772,8 +773,8 @@ func TestUpgrade(t *testing.T) { {EventType: spec.MRoomCanonicalAlias}, {EventType: "m.room.tombstone"}, {EventType: "m.custom.event"}, + {EventType: "m.space.child", StateKey: spaceChild.ID}, {EventType: "m.custom.event", StateKey: alice.ID}, - {EventType: spec.MRoomMember, StateKey: bob.ID}, // invite should be transferred {EventType: spec.MRoomMember, StateKey: charlie.ID}, // ban should be transferred } @@ -984,13 +985,10 @@ func TestUpgrade(t *testing.T) { }, }, { - name: "invites/bans are transferred", + name: "bans are transferred", upgradeUser: alice.ID, roomFunc: func(rsAPI api.RoomserverInternalAPI) string { r := test.NewRoom(t, alice) - r.CreateAndInsert(t, alice, spec.MRoomMember, map[string]interface{}{ - "membership": spec.Invite, - }, test.WithStateKey(bob.ID)) r.CreateAndInsert(t, alice, spec.MRoomMember, map[string]interface{}{ "membership": spec.Ban, }, test.WithStateKey(charlie.ID)) @@ -1002,6 +1000,21 @@ func TestUpgrade(t *testing.T) { wantNewRoom: true, validateFunc: validate, }, + { + name: "space childs are transferred", + upgradeUser: alice.ID, + roomFunc: func(rsAPI api.RoomserverInternalAPI) string { + r := test.NewRoom(t, alice) + + r.CreateAndInsert(t, alice, "m.space.child", map[string]interface{}{}, test.WithStateKey(spaceChild.ID)) + if err := api.SendEvents(ctx, rsAPI, api.KindNew, r.Events(), "test", "test", "test", nil, false); err != nil { + t.Errorf("failed to send events: %v", err) + } + return r.ID + }, + wantNewRoom: true, + validateFunc: validate, + }, { name: "custom state is not taken to the new room", // https://github.com/matrix-org/dendrite/issues/2912 upgradeUser: charlie.ID,