Relax checks for well-formedness of join rules, membership event etc

This commit is contained in:
Neil Alexander 2022-04-05 09:29:46 +01:00
parent 1b54b0b7aa
commit 44c34be527
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -392,12 +392,7 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, oldRoom *api.Query
// means that we preserve any other interesting fields that might be present // means that we preserve any other interesting fields that might be present
// in the create event (such as for the room types MSC). // in the create event (such as for the room types MSC).
newCreateContent := map[string]interface{}{} newCreateContent := map[string]interface{}{}
if err := json.Unmarshal(oldCreateEvent.Content(), &newCreateContent); err != nil { _ = json.Unmarshal(oldCreateEvent.Content(), &newCreateContent)
util.GetLogger(ctx).WithError(err).Error()
return nil, &api.PerformError{
Msg: "Create event content was invalid",
}
}
newCreateContent["creator"] = userID newCreateContent["creator"] = userID
newCreateContent["room_version"] = newVersion newCreateContent["room_version"] = newVersion
newCreateContent["predecessor"] = gomatrixserverlib.PreviousRoom{ newCreateContent["predecessor"] = gomatrixserverlib.PreviousRoom{
@ -410,26 +405,17 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, oldRoom *api.Query
Content: newCreateContent, Content: newCreateContent,
} }
membershipContent := gomatrixserverlib.MemberContent{} // Now create the new membership event. Same rules apply as above, so
if err := json.Unmarshal(oldMembershipEvent.Content(), &membershipContent); err != nil { // that we preserve fields we don't otherwise know about. We'll always
util.GetLogger(ctx).WithError(err).Error() // set the membership to join though, because that is necessary to auth
return nil, &api.PerformError{ // the events after it.
Msg: "Membership event content was invalid", newMembershipContent := map[string]interface{}{}
} _ = json.Unmarshal(oldMembershipEvent.Content(), &newMembershipContent)
} newMembershipContent["membership"] = gomatrixserverlib.Join
membershipContent.Membership = gomatrixserverlib.Join newMembershipEvent := fledglingEvent{
membershipEvent := fledglingEvent{
Type: gomatrixserverlib.MRoomMember, Type: gomatrixserverlib.MRoomMember,
StateKey: userID, StateKey: userID,
Content: membershipContent, Content: newMembershipContent,
}
powerLevelContent, err := oldPowerLevelsEvent.PowerLevels()
if err != nil {
util.GetLogger(ctx).WithError(err).Error()
return nil, &api.PerformError{
Msg: "Power level event content was invalid",
}
} }
// We might need to temporarily give ourselves a higher power level // We might need to temporarily give ourselves a higher power level
@ -437,27 +423,38 @@ func (r *Upgrader) generateInitialEvents(ctx context.Context, oldRoom *api.Query
// the relevant state events. This function will return whether we // the relevant state events. This function will return whether we
// had to override the power level events or not — if we did, we // had to override the power level events or not — if we did, we
// need to send the original power levels again later on. // need to send the original power levels again later on.
tempPowerLevelsEvent, powerLevelsOverridden := createTemporaryPowerLevels(powerLevelContent, userID) powerLevelContent, err := oldPowerLevelsEvent.PowerLevels()
joinRulesContent, err := oldJoinRulesEvent.JoinRule()
if err != nil { if err != nil {
util.GetLogger(ctx).WithError(err).Error()
return nil, &api.PerformError{ return nil, &api.PerformError{
Msg: "Join rules event content was invalid", Msg: "Power level event content was invalid",
} }
} }
tempPowerLevelsEvent, powerLevelsOverridden := createTemporaryPowerLevels(powerLevelContent, userID)
// Now do the join rules event, same as the create and membership
// events. We'll set a sane default of "invite" so that if the
// existing join rules contains garbage, the room can still be
// upgraded.
newJoinRulesContent := map[string]interface{}{
"join_rule": gomatrixserverlib.Invite, // sane default
}
_ = json.Unmarshal(oldJoinRulesEvent.Content(), &newJoinRulesContent)
newJoinRulesEvent := fledglingEvent{ newJoinRulesEvent := fledglingEvent{
Type: gomatrixserverlib.MRoomJoinRules, Type: gomatrixserverlib.MRoomJoinRules,
StateKey: "", StateKey: "",
Content: map[string]interface{}{ Content: newJoinRulesContent,
"join_rule": joinRulesContent,
},
} }
eventsToMake := make([]fledglingEvent, 0, len(state)) eventsToMake := make([]fledglingEvent, 0, len(state))
eventsToMake = append(eventsToMake, newCreateEvent, membershipEvent, tempPowerLevelsEvent, newJoinRulesEvent) eventsToMake = append(
eventsToMake, newCreateEvent, newMembershipEvent,
tempPowerLevelsEvent, newJoinRulesEvent,
)
// For some reason Sytest expects there to be a guest access event.
// Create one if it doesn't exist.
if _, ok := state[gomatrixserverlib.StateKeyTuple{EventType: gomatrixserverlib.MRoomGuestAccess, StateKey: ""}]; !ok { if _, ok := state[gomatrixserverlib.StateKeyTuple{EventType: gomatrixserverlib.MRoomGuestAccess, StateKey: ""}]; !ok {
// Appease sytest, as it expects a guest access event for some reason.
eventsToMake = append(eventsToMake, fledglingEvent{ eventsToMake = append(eventsToMake, fledglingEvent{
Type: gomatrixserverlib.MRoomGuestAccess, Type: gomatrixserverlib.MRoomGuestAccess,
Content: map[string]string{ Content: map[string]string{