diff --git a/roomserver/internal/input/input_membership.go b/roomserver/internal/input/input_membership.go index bc646c3c6..44435bfd9 100644 --- a/roomserver/internal/input/input_membership.go +++ b/roomserver/internal/input/input_membership.go @@ -107,6 +107,23 @@ func (r *Inputer) updateMembership( return updates, nil } + // In an ideal world, we shouldn't ever have "add" be nil and "remove" be + // set, as this implies that we're deleting a state event without replacing + // it (a thing that ordinarily shouldn't happen in Matrix). However, state + // resets are sadly a thing occasionally and we have to account for that. + // Beforehand there used to be a check here which stopped dead if we hit + // this scenario, but that meant that the membership table got out of sync + // after a state reset, often thinking that the user was still joined to + // the room even though the room state said otherwise, and this would prevent + // the user from being able to attempt to rejoin the room without modifying + // the database. So instead what we'll do is we'll just update the membership + // table to say that the user is "leave" and we'll use the old event to + // avoid nil pointer exceptions on the code path that follows. + if add == nil { + add = remove + newMembership = gomatrixserverlib.Leave + } + mu, err := updater.MembershipUpdater(targetUserNID, r.isLocalTarget(add)) if err != nil { return nil, err diff --git a/setup/mscs/msc2946/msc2946.go b/setup/mscs/msc2946/msc2946.go index 3580d4d2e..03af06669 100644 --- a/setup/mscs/msc2946/msc2946.go +++ b/setup/mscs/msc2946/msc2946.go @@ -46,7 +46,7 @@ const ( // Defaults sets the request defaults func Defaults(r *gomatrixserverlib.MSC2946SpacesRequest) { - r.Limit = 100 + r.Limit = 2000 r.MaxRoomsPerSpace = -1 } @@ -108,9 +108,6 @@ func federatedSpacesHandler( JSON: jsonerror.BadJSON("The request body could not be decoded into valid JSON. " + err.Error()), } } - if r.Limit > 100 { - r.Limit = 100 - } w := walker{ req: &r, rootRoomID: roomID, @@ -147,9 +144,6 @@ func spacesHandler( if resErr := chttputil.UnmarshalJSONRequest(req, &r); resErr != nil { return *resErr } - if r.Limit > 100 { - r.Limit = 100 - } w := walker{ req: &r, rootRoomID: roomID,