diff --git a/performinvite.go b/performinvite.go index 69ea5152..5bc7e2ae 100644 --- a/performinvite.go +++ b/performinvite.go @@ -112,6 +112,9 @@ func PerformInvite(ctx context.Context, input PerformInviteInput, fedClient Fede if len(stateNeeded.Tuples()) == 0 { return nil, spec.InternalServerError{} } + if stateNeeded.Create && verImpl.DomainlessRoomIDs() { + stateNeeded.Create = false + } latestEvents, err := input.EventQuerier(ctx, input.RoomID, stateNeeded.Tuples()) if err != nil { diff --git a/stateresolutionv2.go b/stateresolutionv2.go index 770d9282..10c7bc6c 100644 --- a/stateresolutionv2.go +++ b/stateresolutionv2.go @@ -391,17 +391,26 @@ func ResolveStateConflictsV2New( // using Kahn's algorithm in order to topologically order them. The // result array of events will be sorted so that "earlier" events appear // first. +// FIXME: this function does not sort correctly because it doesn't lookup PL events +// correctly, meaning it will sort incorrectly for PL tiebreaks. func ReverseTopologicalOrdering(input []PDU, order TopologicalOrder) []PDU { - r := stateResolverV2{} + r := stateResolverV2{ + resolvedCreate: getCreateEvent(input), + } return r.reverseTopologicalOrdering(input, order) } +// TODO: Remove this function. Use ReverseTopologicalOrdering. // HeaderedReverseTopologicalOrdering takes a set of input events and sorts // them using Kahn's algorithm in order to topologically order them. The // result array of events will be sorted so that "earlier" events appear // first. +// FIXME: this function does not sort correctly because it doesn't lookup PL events +// correctly, meaning it will sort incorrectly for PL tiebreaks. func HeaderedReverseTopologicalOrdering(events []PDU, order TopologicalOrder) []PDU { - r := stateResolverV2{} + r := stateResolverV2{ + resolvedCreate: getCreateEvent(events), + } input := make([]PDU, len(events)) for i := range events { unwrapped := events[i] @@ -414,6 +423,15 @@ func HeaderedReverseTopologicalOrdering(events []PDU, order TopologicalOrder) [] return result } +func getCreateEvent(input []PDU) PDU { + for _, ev := range input { + if ev.Type() == spec.MRoomCreate && ev.StateKeyEquals("") { + return ev + } + } + return nil +} + // isControlEvent returns true if the event meets the criteria for being classed // as a "control" event for reverse topological sorting. If not then the event // will be mainline sorted.