Skip to content
This repository was archived by the owner on Nov 25, 2024. It is now read-only.

Commit 1647213

Browse files
authored
Implement new RoomVersionImpl API (#3062)
As outlined in matrix-org/gomatrixserverlib#368 The main change Dendrite side is that `RoomVersion` no longer has any methods on it. Instead, you need to bounce via `gmsl.GetRoomVersion`. It's very interesting to see where exactly Dendrite cares about this. For some places it's creating events (fine) but others are way more specific. Those areas will need to migrate to GMSL at some point.
1 parent 71eeccf commit 1647213

File tree

25 files changed

+144
-65
lines changed

25 files changed

+144
-65
lines changed

federationapi/federationapi_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ func TestRoomsV3URLEscapeDoNot404(t *testing.T) {
321321
)
322322

323323
for _, tc := range testCases {
324-
ev, err := tc.roomVer.NewEventFromTrustedJSON([]byte(tc.eventJSON), false)
324+
ev, err := gomatrixserverlib.MustGetRoomVersion(tc.roomVer).NewEventFromTrustedJSON([]byte(tc.eventJSON), false)
325325
if err != nil {
326326
t.Errorf("failed to parse event: %s", err)
327327
}

federationapi/internal/perform.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,9 @@ func (r *FederationInternalAPI) performJoinUsingServer(
201201
if respMakeJoin.RoomVersion == "" {
202202
respMakeJoin.RoomVersion = setDefaultRoomVersionFromJoinEvent(respMakeJoin.JoinEvent)
203203
}
204-
if _, err = respMakeJoin.RoomVersion.EventFormat(); err != nil {
205-
return fmt.Errorf("respMakeJoin.RoomVersion.EventFormat: %w", err)
204+
verImpl, err := gomatrixserverlib.GetRoomVersion(respMakeJoin.RoomVersion)
205+
if err != nil {
206+
return err
206207
}
207208

208209
// Build the join event.
@@ -235,7 +236,7 @@ func (r *FederationInternalAPI) performJoinUsingServer(
235236
// contain signatures that we don't know about.
236237
if len(respSendJoin.Event) > 0 {
237238
var remoteEvent *gomatrixserverlib.Event
238-
remoteEvent, err = respMakeJoin.RoomVersion.NewEventFromUntrustedJSON(respSendJoin.Event)
239+
remoteEvent, err = verImpl.NewEventFromUntrustedJSON(respSendJoin.Event)
239240
if err == nil && isWellFormedMembershipEvent(
240241
remoteEvent, roomID, userID,
241242
) {
@@ -464,8 +465,8 @@ func (r *FederationInternalAPI) performOutboundPeekUsingServer(
464465
if respPeek.RoomVersion == "" {
465466
respPeek.RoomVersion = gomatrixserverlib.RoomVersionV1
466467
}
467-
if _, err = respPeek.RoomVersion.EventFormat(); err != nil {
468-
return fmt.Errorf("respPeek.RoomVersion.EventFormat: %w", err)
468+
if !gomatrixserverlib.KnownRoomVersion(respPeek.RoomVersion) {
469+
return fmt.Errorf("unknown room version: %s", respPeek.RoomVersion)
469470
}
470471

471472
// we have the peek state now so let's process regardless of whether upstream gives up
@@ -552,6 +553,13 @@ func (r *FederationInternalAPI) PerformLeave(
552553
continue
553554
}
554555

556+
// Work out if we support the room version that has been supplied in
557+
// the make_leave response.
558+
_, err = gomatrixserverlib.GetRoomVersion(respMakeLeave.RoomVersion)
559+
if err != nil {
560+
return err
561+
}
562+
555563
// Set all the fields to be what they should be, this should be a no-op
556564
// but it's possible that the remote server returned us something "odd"
557565
respMakeLeave.LeaveEvent.Type = spec.MRoomMember
@@ -573,12 +581,6 @@ func (r *FederationInternalAPI) PerformLeave(
573581
continue
574582
}
575583

576-
// Work out if we support the room version that has been supplied in
577-
// the make_leave response.
578-
if _, err = respMakeLeave.RoomVersion.EventFormat(); err != nil {
579-
return gomatrixserverlib.UnsupportedRoomVersionError{}
580-
}
581-
582584
// Build the leave event.
583585
event, err := respMakeLeave.LeaveEvent.Build(
584586
time.Now(),
@@ -659,8 +661,12 @@ func (r *FederationInternalAPI) PerformInvite(
659661
if err != nil {
660662
return fmt.Errorf("r.federation.SendInviteV2: failed to send invite: %w", err)
661663
}
664+
verImpl, err := gomatrixserverlib.GetRoomVersion(request.RoomVersion)
665+
if err != nil {
666+
return err
667+
}
662668

663-
inviteEvent, err := request.RoomVersion.NewEventFromUntrustedJSON(inviteRes.Event)
669+
inviteEvent, err := verImpl.NewEventFromUntrustedJSON(inviteRes.Event)
664670
if err != nil {
665671
return fmt.Errorf("r.federation.SendInviteV2 failed to decode event response: %w", err)
666672
}
@@ -779,6 +785,10 @@ func federatedAuthProvider(
779785
// to repeat the entire set of checks just for a missing event or two.
780786
return func(roomVersion gomatrixserverlib.RoomVersion, eventIDs []string) ([]*gomatrixserverlib.Event, error) {
781787
returning := []*gomatrixserverlib.Event{}
788+
verImpl, err := gomatrixserverlib.GetRoomVersion(roomVersion)
789+
if err != nil {
790+
return nil, err
791+
}
782792

783793
// See if we have retry entries for each of the supplied event IDs.
784794
for _, eventID := range eventIDs {
@@ -808,7 +818,7 @@ func federatedAuthProvider(
808818
// event ID again.
809819
for _, pdu := range tx.PDUs {
810820
// Try to parse the event.
811-
ev, everr := roomVersion.NewEventFromUntrustedJSON(pdu)
821+
ev, everr := verImpl.NewEventFromUntrustedJSON(pdu)
812822
if everr != nil {
813823
return nil, fmt.Errorf("missingAuth gomatrixserverlib.NewEventFromUntrustedJSON: %w", everr)
814824
}

federationapi/queue/queue_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ func (f *stubFederationClient) P2PSendTransactionToRelay(ctx context.Context, u
105105
func mustCreatePDU(t *testing.T) *gomatrixserverlib.HeaderedEvent {
106106
t.Helper()
107107
content := `{"type":"m.room.message"}`
108-
ev, err := gomatrixserverlib.RoomVersionV10.NewEventFromTrustedJSON([]byte(content), false)
108+
ev, err := gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionV10).NewEventFromTrustedJSON([]byte(content), false)
109109
if err != nil {
110110
t.Fatalf("failed to create event: %v", err)
111111
}

federationapi/routing/invite.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
"github.com/matrix-org/dendrite/clientapi/jsonerror"
2424
"github.com/matrix-org/dendrite/roomserver/api"
25-
roomserverVersion "github.com/matrix-org/dendrite/roomserver/version"
2625
"github.com/matrix-org/dendrite/setup/config"
2726
"github.com/matrix-org/gomatrixserverlib"
2827
"github.com/matrix-org/gomatrixserverlib/fclient"
@@ -78,7 +77,7 @@ func InviteV1(
7877
) util.JSONResponse {
7978
roomVer := gomatrixserverlib.RoomVersionV1
8079
body := request.Content()
81-
event, err := roomVer.NewEventFromTrustedJSON(body, false)
80+
event, err := gomatrixserverlib.MustGetRoomVersion(roomVer).NewEventFromTrustedJSON(body, false)
8281
switch err.(type) {
8382
case gomatrixserverlib.BadJSONError:
8483
return util.JSONResponse{
@@ -116,7 +115,8 @@ func processInvite(
116115
) util.JSONResponse {
117116

118117
// Check that we can accept invites for this room version.
119-
if _, err := roomserverVersion.SupportedRoomVersion(roomVer); err != nil {
118+
verImpl, err := gomatrixserverlib.GetRoomVersion(roomVer)
119+
if err != nil {
120120
return util.JSONResponse{
121121
Code: http.StatusBadRequest,
122122
JSON: jsonerror.UnsupportedRoomVersion(
@@ -157,7 +157,7 @@ func processInvite(
157157
}
158158

159159
// Check that the event is signed by the server sending the request.
160-
redacted, err := event.Version().RedactEventJSON(event.JSON())
160+
redacted, err := verImpl.RedactEventJSON(event.JSON())
161161
if err != nil {
162162
return util.JSONResponse{
163163
Code: http.StatusBadRequest,

federationapi/routing/join.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,17 @@ func SendJoin(
206206
JSON: jsonerror.InternalServerError(),
207207
}
208208
}
209+
verImpl, err := gomatrixserverlib.GetRoomVersion(verRes.RoomVersion)
210+
if err != nil {
211+
return util.JSONResponse{
212+
Code: http.StatusInternalServerError,
213+
JSON: jsonerror.UnsupportedRoomVersion(
214+
fmt.Sprintf("QueryRoomVersionForRoom returned unknown room version: %s", verRes.RoomVersion),
215+
),
216+
}
217+
}
209218

210-
event, err := verRes.RoomVersion.NewEventFromUntrustedJSON(request.Content())
219+
event, err := verImpl.NewEventFromUntrustedJSON(request.Content())
211220
if err != nil {
212221
return util.JSONResponse{
213222
Code: http.StatusBadRequest,
@@ -287,7 +296,7 @@ func SendJoin(
287296
}
288297

289298
// Check that the event is signed by the server sending the request.
290-
redacted, err := event.Version().RedactEventJSON(event.JSON())
299+
redacted, err := verImpl.RedactEventJSON(event.JSON())
291300
if err != nil {
292301
logrus.WithError(err).Errorf("XXX: join.go")
293302
return util.JSONResponse{
@@ -461,9 +470,11 @@ func checkRestrictedJoin(
461470
roomVersion gomatrixserverlib.RoomVersion,
462471
roomID, userID string,
463472
) (*util.JSONResponse, string, error) {
464-
if allowRestricted, err := roomVersion.MayAllowRestrictedJoinsInEventAuth(); err != nil {
473+
verImpl, err := gomatrixserverlib.GetRoomVersion(roomVersion)
474+
if err != nil {
465475
return nil, "", err
466-
} else if !allowRestricted {
476+
}
477+
if !verImpl.MayAllowRestrictedJoinsInEventAuth() {
467478
return nil, "", nil
468479
}
469480
req := &api.QueryRestrictedJoinAllowedRequest{

federationapi/routing/leave.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,18 @@ func SendLeave(
149149
}
150150
}
151151

152+
verImpl, err := gomatrixserverlib.GetRoomVersion(verRes.RoomVersion)
153+
if err != nil {
154+
return util.JSONResponse{
155+
Code: http.StatusInternalServerError,
156+
JSON: jsonerror.UnsupportedRoomVersion(
157+
fmt.Sprintf("QueryRoomVersionForRoom returned unknown version: %s", verRes.RoomVersion),
158+
),
159+
}
160+
}
161+
152162
// Decode the event JSON from the request.
153-
event, err := verRes.RoomVersion.NewEventFromUntrustedJSON(request.Content())
163+
event, err := verImpl.NewEventFromUntrustedJSON(request.Content())
154164
switch err.(type) {
155165
case gomatrixserverlib.BadJSONError:
156166
return util.JSONResponse{
@@ -253,7 +263,7 @@ func SendLeave(
253263
}
254264

255265
// Check that the event is signed by the server sending the request.
256-
redacted, err := event.Version().RedactEventJSON(event.JSON())
266+
redacted, err := verImpl.RedactEventJSON(event.JSON())
257267
if err != nil {
258268
logrus.WithError(err).Errorf("XXX: leave.go")
259269
return util.JSONResponse{

federationapi/routing/threepid.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,12 @@ func ExchangeThirdPartyInvite(
196196
util.GetLogger(httpReq.Context()).WithError(err).Error("federation.SendInvite failed")
197197
return jsonerror.InternalServerError()
198198
}
199-
inviteEvent, err := verRes.RoomVersion.NewEventFromUntrustedJSON(signedEvent.Event)
199+
verImpl, err := gomatrixserverlib.GetRoomVersion(verRes.RoomVersion)
200+
if err != nil {
201+
util.GetLogger(httpReq.Context()).WithError(err).Errorf("unknown room version: %s", verRes.RoomVersion)
202+
return jsonerror.InternalServerError()
203+
}
204+
inviteEvent, err := verImpl.NewEventFromUntrustedJSON(signedEvent.Event)
200205
if err != nil {
201206
util.GetLogger(httpReq.Context()).WithError(err).Error("federation.SendInvite failed")
202207
return jsonerror.InternalServerError()

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ require (
2222
github.com/matrix-org/dugong v0.0.0-20210921133753-66e6b1c67e2e
2323
github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91
2424
github.com/matrix-org/gomatrix v0.0.0-20220926102614-ceba4d9f7530
25-
github.com/matrix-org/gomatrixserverlib v0.0.0-20230420172450-7ea8ead4a832
25+
github.com/matrix-org/gomatrixserverlib v0.0.0-20230421153744-40a91492619e
2626
github.com/matrix-org/pinecone v0.11.1-0.20230210171230-8c3b24f2649a
2727
github.com/matrix-org/util v0.0.0-20221111132719-399730281e66
2828
github.com/mattn/go-sqlite3 v1.14.16

go.sum

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,12 @@ github.com/matrix-org/gomatrixserverlib v0.0.0-20230420165305-c51ffd14d28d h1:pS
337337
github.com/matrix-org/gomatrixserverlib v0.0.0-20230420165305-c51ffd14d28d/go.mod h1:7HTbSZe+CIdmeqVyFMekwD5dFU8khWQyngKATvd12FU=
338338
github.com/matrix-org/gomatrixserverlib v0.0.0-20230420172450-7ea8ead4a832 h1:xEUPCS8+BEJ9+JEazxkQS1+YnWyFAsHoIMp5ijA7NAY=
339339
github.com/matrix-org/gomatrixserverlib v0.0.0-20230420172450-7ea8ead4a832/go.mod h1:7HTbSZe+CIdmeqVyFMekwD5dFU8khWQyngKATvd12FU=
340+
github.com/matrix-org/gomatrixserverlib v0.0.0-20230421103805-98f1fbf26443 h1:UxYdP/B+wN67pOWpvzlNeASMn9K1reF/bPHFo1wpqXQ=
341+
github.com/matrix-org/gomatrixserverlib v0.0.0-20230421103805-98f1fbf26443/go.mod h1:7HTbSZe+CIdmeqVyFMekwD5dFU8khWQyngKATvd12FU=
342+
github.com/matrix-org/gomatrixserverlib v0.0.0-20230421152946-4e6e880889e3 h1:+svc0Md8R2SYlcJu45NR+/JO1aYzMrMAi7rGLS1UfsM=
343+
github.com/matrix-org/gomatrixserverlib v0.0.0-20230421152946-4e6e880889e3/go.mod h1:7HTbSZe+CIdmeqVyFMekwD5dFU8khWQyngKATvd12FU=
344+
github.com/matrix-org/gomatrixserverlib v0.0.0-20230421153744-40a91492619e h1:lGhoTgpiLYPkVIAHOW/7itugzkLWs81tNlpHI6bhT5I=
345+
github.com/matrix-org/gomatrixserverlib v0.0.0-20230421153744-40a91492619e/go.mod h1:7HTbSZe+CIdmeqVyFMekwD5dFU8khWQyngKATvd12FU=
340346
github.com/matrix-org/pinecone v0.11.1-0.20230210171230-8c3b24f2649a h1:awrPDf9LEFySxTLKYBMCiObelNx/cBuv/wzllvCCH3A=
341347
github.com/matrix-org/pinecone v0.11.1-0.20230210171230-8c3b24f2649a/go.mod h1:HchJX9oKMXaT2xYFs0Ha/6Zs06mxLU8k6F1ODnrGkeQ=
342348
github.com/matrix-org/util v0.0.0-20221111132719-399730281e66 h1:6z4KxomXSIGWqhHcfzExgkH3Z3UkIXry4ibJS4Aqz2Y=

internal/eventutil/events.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,10 +112,11 @@ func addPrevEventsToEvent(
112112
return ErrRoomNoExists
113113
}
114114

115-
eventFormat, err := queryRes.RoomVersion.EventFormat()
115+
verImpl, err := gomatrixserverlib.GetRoomVersion(queryRes.RoomVersion)
116116
if err != nil {
117-
return fmt.Errorf("queryRes.RoomVersion.EventFormat: %w", err)
117+
return fmt.Errorf("GetRoomVersion: %w", err)
118118
}
119+
eventFormat := verImpl.EventFormat()
119120

120121
builder.Depth = queryRes.Depth
121122

0 commit comments

Comments
 (0)