Refactor QueryRoomVersionForRoom

This commit is contained in:
Till Faelligen 2023-04-25 16:51:40 +02:00
parent 8919a2b05d
commit 9b8602418e
No known key found for this signature in database
GPG key ID: ACCDC9606D472758
12 changed files with 63 additions and 93 deletions

View file

@ -338,9 +338,8 @@ func buildMembershipEvents(
evs := []*gomatrixserverlib.HeaderedEvent{} evs := []*gomatrixserverlib.HeaderedEvent{}
for _, roomID := range roomIDs { for _, roomID := range roomIDs {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} roomVersion, err := rsAPI.QueryRoomVersionForRoom(ctx, roomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err := rsAPI.QueryRoomVersionForRoom(ctx, &verReq, &verRes); err != nil {
return nil, err return nil, err
} }
@ -372,7 +371,7 @@ func buildMembershipEvents(
return nil, err return nil, err
} }
evs = append(evs, event.Headered(verRes.RoomVersion)) evs = append(evs, event.Headered(roomVersion))
} }
return evs, nil return evs, nil

View file

@ -76,9 +76,8 @@ func SendEvent(
rsAPI api.ClientRoomserverAPI, rsAPI api.ClientRoomserverAPI,
txnCache *transactions.Cache, txnCache *transactions.Cache,
) util.JSONResponse { ) util.JSONResponse {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} roomVersion, err := rsAPI.QueryRoomVersionForRoom(req.Context(), roomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err := rsAPI.QueryRoomVersionForRoom(req.Context(), &verReq, &verRes); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
JSON: jsonerror.UnsupportedRoomVersion(err.Error()), JSON: jsonerror.UnsupportedRoomVersion(err.Error()),
@ -185,7 +184,7 @@ func SendEvent(
req.Context(), rsAPI, req.Context(), rsAPI,
api.KindNew, api.KindNew,
[]*gomatrixserverlib.HeaderedEvent{ []*gomatrixserverlib.HeaderedEvent{
e.Headered(verRes.RoomVersion), e.Headered(roomVersion),
}, },
device.UserDomain(), device.UserDomain(),
domain, domain,
@ -200,7 +199,7 @@ func SendEvent(
util.GetLogger(req.Context()).WithFields(logrus.Fields{ util.GetLogger(req.Context()).WithFields(logrus.Fields{
"event_id": e.EventID(), "event_id": e.EventID(),
"room_id": roomID, "room_id": roomID,
"room_version": verRes.RoomVersion, "room_version": roomVersion,
}).Info("Sent event to roomserver") }).Info("Sent event to roomserver")
res := util.JSONResponse{ res := util.JSONResponse{

View file

@ -42,9 +42,8 @@ func MakeJoin(
roomID, userID string, roomID, userID string,
remoteVersions []gomatrixserverlib.RoomVersion, remoteVersions []gomatrixserverlib.RoomVersion,
) util.JSONResponse { ) util.JSONResponse {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} roomVersion, err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), roomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), &verReq, &verRes); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusInternalServerError, Code: http.StatusInternalServerError,
JSON: jsonerror.InternalServerError(), JSON: jsonerror.InternalServerError(),
@ -57,7 +56,7 @@ func MakeJoin(
// https://matrix.org/docs/spec/server_server/r0.1.3#get-matrix-federation-v1-make-join-roomid-userid // https://matrix.org/docs/spec/server_server/r0.1.3#get-matrix-federation-v1-make-join-roomid-userid
remoteSupportsVersion := false remoteSupportsVersion := false
for _, v := range remoteVersions { for _, v := range remoteVersions {
if v == verRes.RoomVersion { if v == roomVersion {
remoteSupportsVersion = true remoteSupportsVersion = true
break break
} }
@ -66,7 +65,7 @@ func MakeJoin(
if !remoteSupportsVersion { if !remoteSupportsVersion {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
JSON: jsonerror.IncompatibleRoomVersion(verRes.RoomVersion), JSON: jsonerror.IncompatibleRoomVersion(roomVersion),
} }
} }
@ -109,7 +108,7 @@ func MakeJoin(
// Check if the restricted join is allowed. If the room doesn't // Check if the restricted join is allowed. If the room doesn't
// support restricted joins then this is effectively a no-op. // support restricted joins then this is effectively a no-op.
res, authorisedVia, err := checkRestrictedJoin(httpReq, rsAPI, verRes.RoomVersion, roomID, userID) res, authorisedVia, err := checkRestrictedJoin(httpReq, rsAPI, roomVersion, roomID, userID)
if err != nil { if err != nil {
util.GetLogger(httpReq.Context()).WithError(err).Error("checkRestrictedJoin failed") util.GetLogger(httpReq.Context()).WithError(err).Error("checkRestrictedJoin failed")
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
@ -144,7 +143,7 @@ func MakeJoin(
} }
queryRes := api.QueryLatestEventsAndStateResponse{ queryRes := api.QueryLatestEventsAndStateResponse{
RoomVersion: verRes.RoomVersion, RoomVersion: roomVersion,
} }
event, err := eventutil.QueryAndBuildEvent(httpReq.Context(), &builder, cfg.Matrix, identity, time.Now(), rsAPI, &queryRes) event, err := eventutil.QueryAndBuildEvent(httpReq.Context(), &builder, cfg.Matrix, identity, time.Now(), rsAPI, &queryRes)
if err == eventutil.ErrRoomNoExists { if err == eventutil.ErrRoomNoExists {
@ -180,7 +179,7 @@ func MakeJoin(
Code: http.StatusOK, Code: http.StatusOK,
JSON: map[string]interface{}{ JSON: map[string]interface{}{
"event": builder, "event": builder,
"room_version": verRes.RoomVersion, "room_version": roomVersion,
}, },
} }
} }
@ -197,21 +196,20 @@ func SendJoin(
keys gomatrixserverlib.JSONVerifier, keys gomatrixserverlib.JSONVerifier,
roomID, eventID string, roomID, eventID string,
) util.JSONResponse { ) util.JSONResponse {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} roomVersion, err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), roomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), &verReq, &verRes); err != nil {
util.GetLogger(httpReq.Context()).WithError(err).Error("rsAPI.QueryRoomVersionForRoom failed") util.GetLogger(httpReq.Context()).WithError(err).Error("rsAPI.QueryRoomVersionForRoom failed")
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusInternalServerError, Code: http.StatusInternalServerError,
JSON: jsonerror.InternalServerError(), JSON: jsonerror.InternalServerError(),
} }
} }
verImpl, err := gomatrixserverlib.GetRoomVersion(verRes.RoomVersion) verImpl, err := gomatrixserverlib.GetRoomVersion(roomVersion)
if err != nil { if err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusInternalServerError, Code: http.StatusInternalServerError,
JSON: jsonerror.UnsupportedRoomVersion( JSON: jsonerror.UnsupportedRoomVersion(
fmt.Sprintf("QueryRoomVersionForRoom returned unknown room version: %s", verRes.RoomVersion), fmt.Sprintf("QueryRoomVersionForRoom returned unknown room version: %s", roomVersion),
), ),
} }
} }

View file

@ -140,21 +140,20 @@ func SendLeave(
keys gomatrixserverlib.JSONVerifier, keys gomatrixserverlib.JSONVerifier,
roomID, eventID string, roomID, eventID string,
) util.JSONResponse { ) util.JSONResponse {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} roomVersion, err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), roomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), &verReq, &verRes); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
JSON: jsonerror.UnsupportedRoomVersion(err.Error()), JSON: jsonerror.UnsupportedRoomVersion(err.Error()),
} }
} }
verImpl, err := gomatrixserverlib.GetRoomVersion(verRes.RoomVersion) verImpl, err := gomatrixserverlib.GetRoomVersion(roomVersion)
if err != nil { if err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusInternalServerError, Code: http.StatusInternalServerError,
JSON: jsonerror.UnsupportedRoomVersion( JSON: jsonerror.UnsupportedRoomVersion(
fmt.Sprintf("QueryRoomVersionForRoom returned unknown version: %s", verRes.RoomVersion), fmt.Sprintf("QueryRoomVersionForRoom returned unknown version: %s", roomVersion),
), ),
} }
} }
@ -313,7 +312,7 @@ func SendLeave(
InputRoomEvents: []api.InputRoomEvent{ InputRoomEvents: []api.InputRoomEvent{
{ {
Kind: api.KindNew, Kind: api.KindNew,
Event: event.Headered(verRes.RoomVersion), Event: event.Headered(roomVersion),
SendAsServer: string(cfg.Matrix.ServerName), SendAsServer: string(cfg.Matrix.ServerName),
TransactionID: nil, TransactionID: nil,
}, },

View file

@ -35,10 +35,8 @@ func Peek(
remoteVersions []gomatrixserverlib.RoomVersion, remoteVersions []gomatrixserverlib.RoomVersion,
) util.JSONResponse { ) util.JSONResponse {
// TODO: check if we're just refreshing an existing peek by querying the federationapi // TODO: check if we're just refreshing an existing peek by querying the federationapi
roomVersion, err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), roomID)
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} if err != nil {
verRes := api.QueryRoomVersionForRoomResponse{}
if err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), &verReq, &verRes); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusInternalServerError, Code: http.StatusInternalServerError,
JSON: jsonerror.InternalServerError(), JSON: jsonerror.InternalServerError(),
@ -50,7 +48,7 @@ func Peek(
// the peek URL. // the peek URL.
remoteSupportsVersion := false remoteSupportsVersion := false
for _, v := range remoteVersions { for _, v := range remoteVersions {
if v == verRes.RoomVersion { if v == roomVersion {
remoteSupportsVersion = true remoteSupportsVersion = true
break break
} }
@ -59,7 +57,7 @@ func Peek(
if !remoteSupportsVersion { if !remoteSupportsVersion {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
JSON: jsonerror.IncompatibleRoomVersion(verRes.RoomVersion), JSON: jsonerror.IncompatibleRoomVersion(roomVersion),
} }
} }
@ -69,7 +67,7 @@ func Peek(
renewalInterval := int64(60 * 60 * 1000 * 1000) renewalInterval := int64(60 * 60 * 1000 * 1000)
var response api.PerformInboundPeekResponse var response api.PerformInboundPeekResponse
err := rsAPI.PerformInboundPeek( err = rsAPI.PerformInboundPeek(
httpReq.Context(), httpReq.Context(),
&api.PerformInboundPeekRequest{ &api.PerformInboundPeekRequest{
RoomID: roomID, RoomID: roomID,

View file

@ -69,9 +69,8 @@ func CreateInvitesFrom3PIDInvites(
evs := []*gomatrixserverlib.HeaderedEvent{} evs := []*gomatrixserverlib.HeaderedEvent{}
for _, inv := range body.Invites { for _, inv := range body.Invites {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: inv.RoomID} roomVersion, err := rsAPI.QueryRoomVersionForRoom(req.Context(), inv.RoomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err := rsAPI.QueryRoomVersionForRoom(req.Context(), &verReq, &verRes); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
JSON: jsonerror.UnsupportedRoomVersion(err.Error()), JSON: jsonerror.UnsupportedRoomVersion(err.Error()),
@ -86,7 +85,7 @@ func CreateInvitesFrom3PIDInvites(
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
} }
if event != nil { if event != nil {
evs = append(evs, event.Headered(verRes.RoomVersion)) evs = append(evs, event.Headered(roomVersion))
} }
} }
@ -162,9 +161,8 @@ func ExchangeThirdPartyInvite(
} }
} }
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} roomVersion, err := rsAPI.QueryRoomVersionForRoom(httpReq.Context(), roomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err = rsAPI.QueryRoomVersionForRoom(httpReq.Context(), &verReq, &verRes); err != nil {
return util.JSONResponse{ return util.JSONResponse{
Code: http.StatusBadRequest, Code: http.StatusBadRequest,
JSON: jsonerror.UnsupportedRoomVersion(err.Error()), JSON: jsonerror.UnsupportedRoomVersion(err.Error()),
@ -185,7 +183,7 @@ func ExchangeThirdPartyInvite(
// Ask the requesting server to sign the newly created event so we know it // Ask the requesting server to sign the newly created event so we know it
// acknowledged it // acknowledged it
inviteReq, err := fclient.NewInviteV2Request(event.Headered(verRes.RoomVersion), nil) inviteReq, err := fclient.NewInviteV2Request(event.Headered(roomVersion), nil)
if err != nil { if err != nil {
util.GetLogger(httpReq.Context()).WithError(err).Error("failed to make invite v2 request") util.GetLogger(httpReq.Context()).WithError(err).Error("failed to make invite v2 request")
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
@ -195,9 +193,9 @@ func ExchangeThirdPartyInvite(
util.GetLogger(httpReq.Context()).WithError(err).Error("federation.SendInvite failed") util.GetLogger(httpReq.Context()).WithError(err).Error("federation.SendInvite failed")
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
} }
verImpl, err := gomatrixserverlib.GetRoomVersion(verRes.RoomVersion) verImpl, err := gomatrixserverlib.GetRoomVersion(roomVersion)
if err != nil { if err != nil {
util.GetLogger(httpReq.Context()).WithError(err).Errorf("unknown room version: %s", verRes.RoomVersion) util.GetLogger(httpReq.Context()).WithError(err).Errorf("unknown room version: %s", roomVersion)
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
} }
inviteEvent, err := verImpl.NewEventFromUntrustedJSON(signedEvent.Event) inviteEvent, err := verImpl.NewEventFromUntrustedJSON(signedEvent.Event)
@ -211,7 +209,7 @@ func ExchangeThirdPartyInvite(
httpReq.Context(), rsAPI, httpReq.Context(), rsAPI,
api.KindNew, api.KindNew,
[]*gomatrixserverlib.HeaderedEvent{ []*gomatrixserverlib.HeaderedEvent{
inviteEvent.Headered(verRes.RoomVersion), inviteEvent.Headered(roomVersion),
}, },
request.Destination(), request.Destination(),
request.Origin(), request.Origin(),
@ -239,12 +237,6 @@ func createInviteFrom3PIDInvite(
inv invite, federation fclient.FederationClient, inv invite, federation fclient.FederationClient,
userAPI userapi.FederationUserAPI, userAPI userapi.FederationUserAPI,
) (*gomatrixserverlib.Event, error) { ) (*gomatrixserverlib.Event, error) {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: inv.RoomID}
verRes := api.QueryRoomVersionForRoomResponse{}
if err := rsAPI.QueryRoomVersionForRoom(ctx, &verReq, &verRes); err != nil {
return nil, err
}
_, server, err := gomatrixserverlib.SplitID('@', inv.MXID) _, server, err := gomatrixserverlib.SplitID('@', inv.MXID)
if err != nil { if err != nil {
return nil, err return nil, err

View file

@ -115,14 +115,13 @@ func (t *TxnReq) ProcessTransaction(ctx context.Context) (*fclient.RespSend, *ut
if v, ok := roomVersions[roomID]; ok { if v, ok := roomVersions[roomID]; ok {
return v return v
} }
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} roomVersion, err := t.rsAPI.QueryRoomVersionForRoom(ctx, roomID)
verRes := api.QueryRoomVersionForRoomResponse{} if err != nil {
if err := t.rsAPI.QueryRoomVersionForRoom(ctx, &verReq, &verRes); err != nil { util.GetLogger(ctx).WithError(err).Debug("Transaction: Failed to query room version for room", roomID)
util.GetLogger(ctx).WithError(err).Debug("Transaction: Failed to query room version for room", verReq.RoomID)
return "" return ""
} }
roomVersions[roomID] = verRes.RoomVersion roomVersions[roomID] = roomVersion
return verRes.RoomVersion return roomVersion
} }
for _, pdu := range t.PDUs { for _, pdu := range t.PDUs {

View file

@ -72,14 +72,12 @@ type FakeRsAPI struct {
func (r *FakeRsAPI) QueryRoomVersionForRoom( func (r *FakeRsAPI) QueryRoomVersionForRoom(
ctx context.Context, ctx context.Context,
req *rsAPI.QueryRoomVersionForRoomRequest, roomID string,
res *rsAPI.QueryRoomVersionForRoomResponse, ) (gomatrixserverlib.RoomVersion, error) {
) error {
if r.shouldFailQuery { if r.shouldFailQuery {
return fmt.Errorf("Failure") return "", fmt.Errorf("Failure")
} }
res.RoomVersion = gomatrixserverlib.RoomVersionV10 return gomatrixserverlib.RoomVersionV10, nil
return nil
} }
func (r *FakeRsAPI) QueryServerBannedFromRoom( func (r *FakeRsAPI) QueryServerBannedFromRoom(
@ -722,11 +720,9 @@ func (t *testRoomserverAPI) QueryServerJoinedToRoom(
// Asks for the room version for a given room. // Asks for the room version for a given room.
func (t *testRoomserverAPI) QueryRoomVersionForRoom( func (t *testRoomserverAPI) QueryRoomVersionForRoom(
ctx context.Context, ctx context.Context,
request *rsAPI.QueryRoomVersionForRoomRequest, roomID string,
response *rsAPI.QueryRoomVersionForRoomResponse, ) (gomatrixserverlib.RoomVersion, error) {
) error { return testRoomVersion, nil
response.RoomVersion = testRoomVersion
return nil
} }
func (t *testRoomserverAPI) QueryServerBannedFromRoom( func (t *testRoomserverAPI) QueryServerBannedFromRoom(

View file

@ -143,7 +143,7 @@ type ClientRoomserverAPI interface {
QueryStateAfterEvents(ctx context.Context, req *QueryStateAfterEventsRequest, res *QueryStateAfterEventsResponse) error QueryStateAfterEvents(ctx context.Context, req *QueryStateAfterEventsRequest, res *QueryStateAfterEventsResponse) error
// QueryKnownUsers returns a list of users that we know about from our joined rooms. // QueryKnownUsers returns a list of users that we know about from our joined rooms.
QueryKnownUsers(ctx context.Context, req *QueryKnownUsersRequest, res *QueryKnownUsersResponse) error QueryKnownUsers(ctx context.Context, req *QueryKnownUsersRequest, res *QueryKnownUsersResponse) error
QueryRoomVersionForRoom(ctx context.Context, req *QueryRoomVersionForRoomRequest, res *QueryRoomVersionForRoomResponse) error QueryRoomVersionForRoom(ctx context.Context, roomID string) (gomatrixserverlib.RoomVersion, error)
QueryPublishedRooms(ctx context.Context, req *QueryPublishedRoomsRequest, res *QueryPublishedRoomsResponse) error QueryPublishedRooms(ctx context.Context, req *QueryPublishedRoomsRequest, res *QueryPublishedRoomsResponse) error
GetRoomIDForAlias(ctx context.Context, req *GetRoomIDForAliasRequest, res *GetRoomIDForAliasResponse) error GetRoomIDForAlias(ctx context.Context, req *GetRoomIDForAliasRequest, res *GetRoomIDForAliasResponse) error
@ -183,7 +183,7 @@ type FederationRoomserverAPI interface {
// QueryServerBannedFromRoom returns whether a server is banned from a room by server ACLs. // QueryServerBannedFromRoom returns whether a server is banned from a room by server ACLs.
QueryServerBannedFromRoom(ctx context.Context, req *QueryServerBannedFromRoomRequest, res *QueryServerBannedFromRoomResponse) error QueryServerBannedFromRoom(ctx context.Context, req *QueryServerBannedFromRoomRequest, res *QueryServerBannedFromRoomResponse) error
QueryMembershipsForRoom(ctx context.Context, req *QueryMembershipsForRoomRequest, res *QueryMembershipsForRoomResponse) error QueryMembershipsForRoom(ctx context.Context, req *QueryMembershipsForRoomRequest, res *QueryMembershipsForRoomResponse) error
QueryRoomVersionForRoom(ctx context.Context, req *QueryRoomVersionForRoomRequest, res *QueryRoomVersionForRoomResponse) error QueryRoomVersionForRoom(ctx context.Context, roomID string) (gomatrixserverlib.RoomVersion, error)
GetRoomIDForAlias(ctx context.Context, req *GetRoomIDForAliasRequest, res *GetRoomIDForAliasResponse) error GetRoomIDForAlias(ctx context.Context, req *GetRoomIDForAliasRequest, res *GetRoomIDForAliasResponse) error
// QueryEventsByID queries a list of events by event ID for one room. If no room is specified, it will try to determine // QueryEventsByID queries a list of events by event ID for one room. If no room is specified, it will try to determine
// which room to use by querying the first events roomID. // which room to use by querying the first events roomID.

View file

@ -319,9 +319,7 @@ func publishNewRoomAndUnpublishOldRoom(
} }
func (r *Upgrader) validateRoomExists(ctx context.Context, roomID string) error { func (r *Upgrader) validateRoomExists(ctx context.Context, roomID string) error {
verReq := api.QueryRoomVersionForRoomRequest{RoomID: roomID} if _, err := r.URSAPI.QueryRoomVersionForRoom(ctx, roomID); err != nil {
verRes := api.QueryRoomVersionForRoomResponse{}
if err := r.URSAPI.QueryRoomVersionForRoom(ctx, &verReq, &verRes); err != nil {
return &api.PerformError{ return &api.PerformError{
Code: api.PerformErrorNoRoom, Code: api.PerformErrorNoRoom,
Msg: "Room does not exist", Msg: "Room does not exist",

View file

@ -692,26 +692,20 @@ func GetAuthChain(
} }
// QueryRoomVersionForRoom implements api.RoomserverInternalAPI // QueryRoomVersionForRoom implements api.RoomserverInternalAPI
func (r *Queryer) QueryRoomVersionForRoom( func (r *Queryer) QueryRoomVersionForRoom(ctx context.Context, roomID string) (gomatrixserverlib.RoomVersion, error) {
ctx context.Context, if roomVersion, ok := r.Cache.GetRoomVersion(roomID); ok {
request *api.QueryRoomVersionForRoomRequest, return roomVersion, nil
response *api.QueryRoomVersionForRoomResponse,
) error {
if roomVersion, ok := r.Cache.GetRoomVersion(request.RoomID); ok {
response.RoomVersion = roomVersion
return nil
} }
info, err := r.DB.RoomInfo(ctx, request.RoomID) info, err := r.DB.RoomInfo(ctx, roomID)
if err != nil { if err != nil {
return err return "", err
} }
if info == nil { if info == nil {
return fmt.Errorf("QueryRoomVersionForRoom: missing room info for room %s", request.RoomID) return "", fmt.Errorf("QueryRoomVersionForRoom: missing room info for room %s", roomID)
} }
response.RoomVersion = info.RoomVersion r.Cache.StoreRoomVersion(roomID, info.RoomVersion)
r.Cache.StoreRoomVersion(request.RoomID, response.RoomVersion) return info.RoomVersion, nil
return nil
} }
func (r *Queryer) QueryPublishedRooms( func (r *Queryer) QueryPublishedRooms(

View file

@ -325,10 +325,8 @@ func (rc *reqCtx) fetchUnknownEvent(eventID, roomID string) *gomatrixserverlib.H
} }
logger := util.GetLogger(rc.ctx).WithField("room_id", roomID) logger := util.GetLogger(rc.ctx).WithField("room_id", roomID)
// if they supplied a room_id, check the room exists. // if they supplied a room_id, check the room exists.
var queryVerRes roomserver.QueryRoomVersionForRoomResponse
err := rc.rsAPI.QueryRoomVersionForRoom(rc.ctx, &roomserver.QueryRoomVersionForRoomRequest{ roomVersion, err := rc.rsAPI.QueryRoomVersionForRoom(rc.ctx, roomID)
RoomID: roomID,
}, &queryVerRes)
if err != nil { if err != nil {
logger.WithError(err).Warn("failed to query room version for room, does this room exist?") logger.WithError(err).Warn("failed to query room version for room, does this room exist?")
return nil return nil
@ -367,7 +365,7 @@ func (rc *reqCtx) fetchUnknownEvent(eventID, roomID string) *gomatrixserverlib.H
// Inject the response into the roomserver to remember the event across multiple calls and to set // Inject the response into the roomserver to remember the event across multiple calls and to set
// unexplored flags correctly. // unexplored flags correctly.
for _, srv := range serversToQuery { for _, srv := range serversToQuery {
res, err := rc.MSC2836EventRelationships(eventID, srv, queryVerRes.RoomVersion) res, err := rc.MSC2836EventRelationships(eventID, srv, roomVersion)
if err != nil { if err != nil {
continue continue
} }