Set predecessor.event_id in non-v12 rooms

This commit is contained in:
Kegan Dougal 2025-08-11 19:30:15 +01:00
parent 982440285e
commit 88724bcb57

View file

@ -84,17 +84,26 @@ func (r *Upgrader) performRoomUpgrade(
// Make the create event and calculate the new room ID. // Make the create event and calculate the new room ID.
var newRoomID string var newRoomID string
newRoomVerImpl := gomatrixserverlib.MustGetRoomVersion(roomVersion) newRoomVerImpl := gomatrixserverlib.MustGetRoomVersion(roomVersion)
var tombstoneEvent *types.HeaderedEvent
var newCreateEvent gomatrixserverlib.PDU var newCreateEvent gomatrixserverlib.PDU
var pErr error
if !newRoomVerImpl.DomainlessRoomIDs() { if !newRoomVerImpl.DomainlessRoomIDs() {
// TODO (#267): Check room ID doesn't clash with an existing one, and we // TODO (#267): Check room ID doesn't clash with an existing one, and we
// probably shouldn't be using pseudo-random strings, maybe GUIDs? // probably shouldn't be using pseudo-random strings, maybe GUIDs?
newRoomID = fmt.Sprintf("!%s:%s", util.RandomString(16), userID.Domain()) newRoomID = fmt.Sprintf("!%s:%s", util.RandomString(16), userID.Domain())
// Make the tombstone event
tombstoneEvent, pErr = r.makeTombstoneEvent(ctx, evTime, *senderID, userID.Domain(), roomID, newRoomID)
if pErr != nil {
return "", pErr
}
} }
content := struct { content := struct {
Federate *bool `json:"m.federate,omitempty"` Federate *bool `json:"m.federate,omitempty"`
Type string `json:"type,omitempty"` Type string `json:"type,omitempty"`
Predecessor struct { Predecessor struct {
RoomID string `json:"room_id"` RoomID string `json:"room_id"`
EventID string `json:"event_id,omitempty"`
} `json:"predecessor"` } `json:"predecessor"`
}{} }{}
// keep existing values in old room e.g type/m.federate // keep existing values in old room e.g type/m.federate
@ -102,6 +111,10 @@ func (r *Upgrader) performRoomUpgrade(
return "", fmt.Errorf("failed to copy old create event content to new create event: %s", err) return "", fmt.Errorf("failed to copy old create event content to new create event: %s", err)
} }
content.Predecessor.RoomID = roomID content.Predecessor.RoomID = roomID
content.Predecessor.EventID = ""
if tombstoneEvent != nil {
content.Predecessor.EventID = tombstoneEvent.EventID()
}
contentJSON, err := json.Marshal(content) contentJSON, err := json.Marshal(content)
if err != nil { if err != nil {
return "", fmt.Errorf("Failed to make content for new create event: %s", err) return "", fmt.Errorf("Failed to make content for new create event: %s", err)
@ -136,17 +149,19 @@ func (r *Upgrader) performRoomUpgrade(
newRoomID = newCreateEvent.RoomID().String() newRoomID = newCreateEvent.RoomID().String()
} }
// Make the tombstone event if tombstoneEvent == nil {
tombstoneEvent, pErr := r.makeTombstoneEvent(ctx, evTime, *senderID, userID.Domain(), roomID, newRoomID) // Make the tombstone event
if pErr != nil { tombstoneEvent, pErr = r.makeTombstoneEvent(ctx, evTime, *senderID, userID.Domain(), roomID, newRoomID)
return "", pErr if pErr != nil {
return "", pErr
}
} }
creators := gomatrixserverlib.CreatorsFromCreateEvent(newCreateEvent) creators := gomatrixserverlib.CreatorsFromCreateEvent(newCreateEvent)
// Generate the initial events we need to send into the new room. This includes copied state events and bans // Generate the initial events we need to send into the new room. This includes copied state events and bans
// as well as the power level events needed to set up the room // as well as the power level events needed to set up the room
eventsToMake, pErr := r.generateInitialEvents(ctx, oldRoomRes, *senderID, roomID, roomVersion, tombstoneEvent, creators) eventsToMake, pErr := r.generateInitialEvents(ctx, oldRoomRes, *senderID, roomID, roomVersion, creators)
if pErr != nil { if pErr != nil {
return "", pErr return "", pErr
} }
@ -374,7 +389,7 @@ func (r *Upgrader) userIsAuthorized(ctx context.Context, senderID spec.SenderID,
// nolint:gocyclo // nolint:gocyclo
func (r *Upgrader) generateInitialEvents( func (r *Upgrader) generateInitialEvents(
ctx context.Context, oldRoom *api.QueryLatestEventsAndStateResponse, senderID spec.SenderID, _ string, newVersion gomatrixserverlib.RoomVersion, ctx context.Context, oldRoom *api.QueryLatestEventsAndStateResponse, senderID spec.SenderID, _ string, newVersion gomatrixserverlib.RoomVersion,
_ *types.HeaderedEvent, creators []string) ([]gomatrixserverlib.FledglingEvent, error) { creators []string) ([]gomatrixserverlib.FledglingEvent, error) {
state := make(map[gomatrixserverlib.StateKeyTuple]*types.HeaderedEvent, len(oldRoom.StateEvents)) state := make(map[gomatrixserverlib.StateKeyTuple]*types.HeaderedEvent, len(oldRoom.StateEvents))
for _, event := range oldRoom.StateEvents { for _, event := range oldRoom.StateEvents {