diff --git a/clientapi/routing/createroom.go b/clientapi/routing/createroom.go index e4027196b..8e8409f5d 100644 --- a/clientapi/routing/createroom.go +++ b/clientapi/routing/createroom.go @@ -39,16 +39,16 @@ import ( // https://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-createroom type createRoomRequest struct { - Invite []string `json:"invite"` - Name string `json:"name"` - Visibility string `json:"visibility"` - Topic string `json:"topic"` - Preset string `json:"preset"` - CreationContent map[string]interface{} `json:"creation_content"` - InitialState []fledglingEvent `json:"initial_state"` - RoomAliasName string `json:"room_alias_name"` - GuestCanJoin bool `json:"guest_can_join"` - RoomVersion string `json:"room_version"` + Invite []string `json:"invite"` + Name string `json:"name"` + Visibility string `json:"visibility"` + Topic string `json:"topic"` + Preset string `json:"preset"` + CreationContent map[string]interface{} `json:"creation_content"` + InitialState []fledglingEvent `json:"initial_state"` + RoomAliasName string `json:"room_alias_name"` + GuestCanJoin bool `json:"guest_can_join"` + RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"` } const ( @@ -183,13 +183,13 @@ func createRoom( roomVersion := roomserverVersion.GetDefaultRoomVersion() if r.RoomVersion != "" { - id, meta, verr := roomserverVersion.GetSupportedRoomVersionFromString(r.RoomVersion) + id, meta, verr := roomserverVersion.GetSupportedRoomVersion(r.RoomVersion) if verr == nil && meta.Supported { roomVersion = id } } - r.CreationContent["room_version"] = roomVersion.String() + r.CreationContent["room_version"] = roomVersion r.CreationContent["creator"] = userID // TODO: visibility/presets/raw initial state @@ -295,7 +295,7 @@ func createRoom( builder.PrevEvents = []gomatrixserverlib.EventReference{builtEvents[i-1].EventReference()} } var ev *gomatrixserverlib.Event - ev, err = buildEvent(&builder, &authEvents, cfg, evTime) + ev, err = buildEvent(&builder, &authEvents, cfg, evTime, roomVersion) if err != nil { util.GetLogger(req.Context()).WithError(err).Error("buildEvent failed") return jsonerror.InternalServerError() @@ -364,6 +364,7 @@ func buildEvent( provider gomatrixserverlib.AuthEventProvider, cfg *config.Dendrite, evTime time.Time, + roomVersion gomatrixserverlib.RoomVersion, ) (*gomatrixserverlib.Event, error) { eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder) if err != nil { @@ -375,7 +376,10 @@ func buildEvent( } builder.AuthEvents = refs eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) - event, err := builder.Build(eventID, evTime, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey) + event, err := builder.Build( + eventID, evTime, cfg.Matrix.ServerName, cfg.Matrix.KeyID, + cfg.Matrix.PrivateKey, roomVersion, + ) if err != nil { return nil, fmt.Errorf("cannot build event %s : Builder failed to build. %s", builder.Type, err) } diff --git a/clientapi/routing/joinroom.go b/clientapi/routing/joinroom.go index e7d3dc798..1f8882a22 100644 --- a/clientapi/routing/joinroom.go +++ b/clientapi/routing/joinroom.go @@ -300,11 +300,10 @@ func (r joinRoomReq) joinRoomUsingServers( // server was invalid this returns an error. // Otherwise this returns a JSONResponse. func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib.ServerName) (*util.JSONResponse, error) { - var roomVersions []int + var roomVersions []gomatrixserverlib.RoomVersion for i := range version.GetSupportedRoomVersions() { - roomVersions = append(roomVersions, int(i)) + roomVersions = append(roomVersions, i) } - fmt.Println("Supported versions:", roomVersions) respMakeJoin, err := r.federation.MakeJoin(r.req.Context(), server, roomID, r.userID, roomVersions) if err != nil { // TODO: Check if the user was not allowed to join the room. @@ -321,6 +320,7 @@ func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), r.cfg.Matrix.ServerName) event, err := respMakeJoin.JoinEvent.Build( eventID, r.evTime, r.cfg.Matrix.ServerName, r.cfg.Matrix.KeyID, r.cfg.Matrix.PrivateKey, + respMakeJoin.RoomVersion, ) if err != nil { util.GetLogger(r.req.Context()).WithError(err).Error("respMakeJoin.JoinEvent.Build failed") diff --git a/cmd/create-room-events/main.go b/cmd/create-room-events/main.go index 8475914f0..f1e8c8d8d 100644 --- a/cmd/create-room-events/main.go +++ b/cmd/create-room-events/main.go @@ -108,7 +108,7 @@ func buildAndOutput() gomatrixserverlib.EventReference { name := gomatrixserverlib.ServerName(*serverName) key := gomatrixserverlib.KeyID(*keyID) - event, err := b.Build(id, now, name, key, privateKey) + event, err := b.Build(id, now, name, key, privateKey, gomatrixserverlib.RoomVersionV1) if err != nil { panic(err) } diff --git a/common/events.go b/common/events.go index f347cea49..9a5f3e1c3 100644 --- a/common/events.go +++ b/common/events.go @@ -47,7 +47,7 @@ func BuildEvent( return nil, err } - roomVersion := 2 + roomVersion := gomatrixserverlib.RoomVersionV2 vQueryReq := api.QueryRoomVersionForRoomIDRequest{RoomID: builder.RoomID} vQueryRes := api.QueryRoomVersionForRoomIDResponse{} if e := queryAPI.QueryRoomVersionForRoomID(ctx, &vQueryReq, &vQueryRes); e == nil { @@ -60,7 +60,10 @@ func BuildEvent( // TODO: Room versions affect the below eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) - event, err := builder.Build(eventID, evTime, cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey) + event, err := builder.Build( + eventID, evTime, cfg.Matrix.ServerName, cfg.Matrix.KeyID, + cfg.Matrix.PrivateKey, roomVersion, + ) if err != nil { return nil, err } diff --git a/federationapi/routing/join.go b/federationapi/routing/join.go index 875f0e067..2fcb929ad 100644 --- a/federationapi/routing/join.go +++ b/federationapi/routing/join.go @@ -17,7 +17,6 @@ package routing import ( "encoding/json" "net/http" - "strconv" "time" "github.com/matrix-org/dendrite/clientapi/jsonerror" @@ -103,7 +102,7 @@ func MakeJoin( Code: http.StatusOK, JSON: map[string]interface{}{ "event": builder, - "room_version": strconv.Itoa(vQueryRes.RoomVersion), + "room_version": vQueryRes.RoomVersion, }, } } diff --git a/federationapi/routing/threepid.go b/federationapi/routing/threepid.go index 03f3c5bba..8ad9da915 100644 --- a/federationapi/routing/threepid.go +++ b/federationapi/routing/threepid.go @@ -257,6 +257,13 @@ func buildMembershipEvent( return nil, errNotInRoom } + // Get the room version of the room being joined + vQueryReq := roomserverAPI.QueryRoomVersionForRoomIDRequest{RoomID: builder.RoomID} + vQueryRes := roomserverAPI.QueryRoomVersionForRoomIDResponse{} + if e := queryAPI.QueryRoomVersionForRoomID(ctx, &vQueryReq, &vQueryRes); e != nil { + return nil, err + } + // Auth the event locally builder.Depth = queryRes.Depth builder.PrevEvents = queryRes.LatestEvents @@ -283,6 +290,7 @@ func buildMembershipEvent( eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) event, err := builder.Build( eventID, time.Now(), cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey, + vQueryRes.RoomVersion, ) return &event, err diff --git a/go.mod b/go.mod index 924c4b67d..6ec2bac63 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/matrix-org/go-http-js-libp2p v0.0.0-20200304160008-4ec1129a00c4 github.com/matrix-org/go-sqlite3-js v0.0.0-20200304164012-aa524245b658 github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26 - github.com/matrix-org/gomatrixserverlib v0.0.0-20200306154041-df6bb9a3e424 + github.com/matrix-org/gomatrixserverlib v0.0.0-20200310112444-8d1ed64a8914 github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1 github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7 github.com/mattn/go-sqlite3 v2.0.2+incompatible diff --git a/go.sum b/go.sum index a62af5c9a..4ed947800 100644 --- a/go.sum +++ b/go.sum @@ -82,6 +82,14 @@ github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26/go.mod h1:3fxX github.com/matrix-org/gomatrixserverlib v0.0.0-20200124100636-0c2ec91d1df5/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= github.com/matrix-org/gomatrixserverlib v0.0.0-20200306154041-df6bb9a3e424 h1:H61lT6ckUFIDl9qb636qNomfo0B52lFt73ecioiqF10= github.com/matrix-org/gomatrixserverlib v0.0.0-20200306154041-df6bb9a3e424/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200309170138-a2ca5c0dd9f0 h1:dCkV8HjAtDPl5p0aKQODklRbENzrgDKgJG7ZAcQ9NR4= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200309170138-a2ca5c0dd9f0/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200310085753-f283d7b6e509 h1:PViVONkVGP+OJJWOLdE6Ta1GkgzXPX4wiS5XBmxSkiI= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200310085753-f283d7b6e509/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200310090719-6b3c4d7090d0 h1:favHzedA8wJq0IOIhta6R9e72aGgGAcWSHpr53N75BY= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200310090719-6b3c4d7090d0/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200310112444-8d1ed64a8914 h1:VG6RETdiuI5lmh3POsUYDgyq6zK0E+A1RJspk0VtTug= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200310112444-8d1ed64a8914/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1 h1:osLoFdOy+ChQqVUn2PeTDETFftVkl4w9t/OW18g3lnk= github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1/go.mod h1:cXoYQIENbdWIQHt1SyCo6Bl3C3raHwJ0wgVrXHSqf+A= github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5 h1:W7l5CP4V7wPyPb4tYE11dbmeAOwtFQBTW0rf4OonOS8= diff --git a/roomserver/alias/alias.go b/roomserver/alias/alias.go index aeaf5ae94..a95106ccc 100644 --- a/roomserver/alias/alias.go +++ b/roomserver/alias/alias.go @@ -240,11 +240,18 @@ func (r *RoomserverAliasAPI) sendUpdatedAliasesEvent( } builder.AuthEvents = refs + vReq := roomserverAPI.QueryRoomVersionForRoomIDRequest{RoomID: roomID} + var vRes roomserverAPI.QueryRoomVersionForRoomIDResponse + if err = r.QueryAPI.QueryRoomVersionForRoomID(ctx, &vReq, &vRes); err != nil { + return err + } + // Build the event eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), r.Cfg.Matrix.ServerName) now := time.Now() event, err := builder.Build( eventID, now, r.Cfg.Matrix.ServerName, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey, + vRes.RoomVersion, ) if err != nil { return err diff --git a/roomserver/api/query.go b/roomserver/api/query.go index 373e5cd8e..09fec4af6 100644 --- a/roomserver/api/query.go +++ b/roomserver/api/query.go @@ -251,8 +251,8 @@ type QueryRoomVersionCapabilitiesRequest struct{} // QueryRoomVersionCapabilitiesResponse is a response to QueryServersInRoomAtEventResponse type QueryRoomVersionCapabilitiesResponse struct { - DefaultRoomVersion int `json:"default"` - AvailableRoomVersions map[int]string `json:"available"` + DefaultRoomVersion gomatrixserverlib.RoomVersion `json:"default"` + AvailableRoomVersions map[gomatrixserverlib.RoomVersion]string `json:"available"` } // QueryRoomVersionCapabilities asks for the default room version @@ -262,7 +262,7 @@ type QueryRoomVersionForRoomIDRequest struct { // QueryRoomVersionCapabilitiesResponse is a response to QueryServersInRoomAtEventResponse type QueryRoomVersionForRoomIDResponse struct { - RoomVersion int `json:"version"` + RoomVersion gomatrixserverlib.RoomVersion `json:"version"` } // RoomserverQueryAPI is used to query information from the room server. diff --git a/roomserver/input/events.go b/roomserver/input/events.go index 80cf6f1a2..17c92917f 100644 --- a/roomserver/input/events.go +++ b/roomserver/input/events.go @@ -75,7 +75,7 @@ type RoomEventDatabase interface { // Look up the room version from the database. GetRoomVersionForRoom( ctx context.Context, roomNID types.RoomNID, - ) (int64, error) + ) (gomatrixserverlib.RoomVersion, error) } // OutputRoomEventWriter has the APIs needed to write an event to the output logs. diff --git a/roomserver/query/query.go b/roomserver/query/query.go index 6e15a9168..7ac9e7389 100644 --- a/roomserver/query/query.go +++ b/roomserver/query/query.go @@ -92,7 +92,7 @@ type RoomserverQueryAPIDatabase interface { // Look up the room version from the database. GetRoomVersionForRoom( ctx context.Context, roomNID types.RoomNID, - ) (int64, error) + ) (gomatrixserverlib.RoomVersion, error) // Get the room NID for a given event ID. RoomNIDForEventID( ctx context.Context, eventID string, @@ -768,13 +768,13 @@ func (r *RoomserverQueryAPI) QueryRoomVersionCapabilities( request *api.QueryRoomVersionCapabilitiesRequest, response *api.QueryRoomVersionCapabilitiesResponse, ) error { - response.DefaultRoomVersion = int(version.GetDefaultRoomVersion()) - response.AvailableRoomVersions = make(map[int]string) + response.DefaultRoomVersion = version.GetDefaultRoomVersion() + response.AvailableRoomVersions = make(map[gomatrixserverlib.RoomVersion]string) for v, desc := range version.GetSupportedRoomVersions() { if desc.Stable { - response.AvailableRoomVersions[int(v)] = "stable" + response.AvailableRoomVersions[v] = "stable" } else { - response.AvailableRoomVersions[int(v)] = "unstable" + response.AvailableRoomVersions[v] = "unstable" } } return nil @@ -799,7 +799,7 @@ func (r *RoomserverQueryAPI) QueryRoomVersionForRoomID( } // Populate the response - response.RoomVersion = int(roomVersion) + response.RoomVersion = roomVersion return nil } diff --git a/roomserver/query/query_test.go b/roomserver/query/query_test.go index 76c2e158f..db8b1451f 100644 --- a/roomserver/query/query_test.go +++ b/roomserver/query/query_test.go @@ -54,7 +54,7 @@ func (db *getEventDB) addFakeEvent(eventID string, authIDs []string) error { return err } - event, err := gomatrixserverlib.NewEventFromTrustedJSON(eventJSON, false) + event, err := gomatrixserverlib.NewEventFromTrustedJSON(eventJSON, false, gomatrixserverlib.RoomVersionV1) if err != nil { return err } diff --git a/roomserver/state/state.go b/roomserver/state/state.go index 553fe46a1..846c4ed07 100644 --- a/roomserver/state/state.go +++ b/roomserver/state/state.go @@ -38,15 +38,13 @@ const ( ) func GetStateResolutionAlgorithm( - version int64, db database.RoomStateDatabase, + version gomatrixserverlib.RoomVersion, db database.RoomStateDatabase, ) (StateResolutionImpl, error) { switch version { - case 1: + case gomatrixserverlib.RoomVersionV1: return Prepare(db, StateResolutionAlgorithmV1), nil - case 2, 3, 4, 5: - return Prepare(db, StateResolutionAlgorithmV2), nil default: - return nil, errors.New("unsupported room version") + return Prepare(db, StateResolutionAlgorithmV2), nil } } diff --git a/roomserver/storage/interface.go b/roomserver/storage/interface.go index ad290017c..0f7b9e614 100644 --- a/roomserver/storage/interface.go +++ b/roomserver/storage/interface.go @@ -45,7 +45,7 @@ type Database interface { GetMembership(ctx context.Context, roomNID types.RoomNID, requestSenderUserID string) (membershipEventNID types.EventNID, stillInRoom bool, err error) GetMembershipEventNIDsForRoom(ctx context.Context, roomNID types.RoomNID, joinOnly bool) ([]types.EventNID, error) EventsFromIDs(ctx context.Context, eventIDs []string) ([]types.Event, error) - GetRoomVersionForRoom(ctx context.Context, roomNID types.RoomNID) (int64, error) + GetRoomVersionForRoom(ctx context.Context, roomNID types.RoomNID) (gomatrixserverlib.RoomVersion, error) RoomNIDForEventID(ctx context.Context, eventID string) (types.RoomNID, error) RoomNIDForEventNID(ctx context.Context, eventNID types.EventNID) (types.RoomNID, error) } diff --git a/roomserver/storage/postgres/rooms_table.go b/roomserver/storage/postgres/rooms_table.go index 8f52d3507..d42117309 100644 --- a/roomserver/storage/postgres/rooms_table.go +++ b/roomserver/storage/postgres/rooms_table.go @@ -22,6 +22,7 @@ import ( "github.com/lib/pq" "github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/roomserver/types" + "github.com/matrix-org/gomatrixserverlib" ) const roomsSchema = ` @@ -42,7 +43,7 @@ CREATE TABLE IF NOT EXISTS roomserver_rooms ( state_snapshot_nid BIGINT NOT NULL DEFAULT 0, -- The version of the room, which will assist in determining the state resolution -- algorithm, event ID format, etc. - room_version BIGINT NOT NULL DEFAULT 1 + room_version TEXT NOT NULL DEFAULT '1' ); ` @@ -92,7 +93,8 @@ func (s *roomStatements) prepare(db *sql.DB) (err error) { } func (s *roomStatements) insertRoomNID( - ctx context.Context, txn *sql.Tx, roomID string, roomVersion string, + ctx context.Context, txn *sql.Tx, roomID string, + roomVersion gomatrixserverlib.RoomVersion, ) (types.RoomNID, error) { var roomNID int64 stmt := common.TxStmt(txn, s.insertRoomNIDStmt) @@ -165,8 +167,8 @@ func (s *roomStatements) updateLatestEventNIDs( func (s *roomStatements) selectRoomVersionForRoomNID( ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, -) (int64, error) { - var roomVersion int64 +) (gomatrixserverlib.RoomVersion, error) { + var roomVersion gomatrixserverlib.RoomVersion stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt) err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion) return roomVersion, err diff --git a/roomserver/storage/postgres/storage.go b/roomserver/storage/postgres/storage.go index 6f8fd9f66..8bd974f45 100644 --- a/roomserver/storage/postgres/storage.go +++ b/roomserver/storage/postgres/storage.go @@ -19,14 +19,12 @@ import ( "context" "database/sql" "encoding/json" - "strconv" // Import the postgres database driver. _ "github.com/lib/pq" "github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/types" - "github.com/matrix-org/dendrite/roomserver/version" "github.com/matrix-org/gomatrixserverlib" ) @@ -74,7 +72,7 @@ func (d *Database) StoreEvent( // The only room version where the "room_version" key isn't specified is // room version 1 - roomVersion := 1 + roomVersion := gomatrixserverlib.RoomVersionV1 // The below works because the first event to be persisted to the database // is always the m.room.create event. We can therefore set the room version // correctly at the same time as assigning the room NID. @@ -82,7 +80,7 @@ func (d *Database) StoreEvent( var createContent gomatrixserverlib.CreateContent if err := json.Unmarshal(event.Content(), &createContent); err == nil { if createContent.RoomVersion != nil { - roomVersion = *createContent.RoomVersion + roomVersion = gomatrixserverlib.RoomVersion(*createContent.RoomVersion) } } } @@ -140,7 +138,8 @@ func (d *Database) StoreEvent( } func (d *Database) assignRoomNID( - ctx context.Context, txn *sql.Tx, roomID string, roomVersion string, + ctx context.Context, txn *sql.Tx, roomID string, + roomVersion gomatrixserverlib.RoomVersion, ) (types.RoomNID, error) { // Check if we already have a numeric ID in the database. roomNID, err := d.statements.selectRoomNID(ctx, txn, roomID) @@ -234,8 +233,16 @@ func (d *Database) Events( for i, eventJSON := range eventJSONs { result := &results[i] result.EventNID = eventJSON.EventNID + roomNID, err := d.RoomNIDForEventNID(ctx, result.EventNID) + if err != nil { + return nil, err + } + roomVersion, err := d.GetRoomVersionForRoom(ctx, roomNID) + if err != nil { + return nil, err + } // TODO: Use NewEventFromTrustedJSON for efficiency - result.Event, err = gomatrixserverlib.NewEventFromUntrustedJSON(eventJSON.EventJSON) + result.Event, err = gomatrixserverlib.NewEventFromUntrustedJSON(eventJSON.EventJSON, roomVersion) if err != nil { return nil, err } @@ -738,7 +745,7 @@ func (d *Database) EventsFromIDs(ctx context.Context, eventIDs []string) ([]type func (d *Database) GetRoomVersionForRoom( ctx context.Context, roomNID types.RoomNID, -) (int64, error) { +) (gomatrixserverlib.RoomVersion, error) { return d.statements.selectRoomVersionForRoomNID( ctx, nil, roomNID, ) diff --git a/roomserver/storage/sqlite3/rooms_table.go b/roomserver/storage/sqlite3/rooms_table.go index 50ddb40e8..2f721a222 100644 --- a/roomserver/storage/sqlite3/rooms_table.go +++ b/roomserver/storage/sqlite3/rooms_table.go @@ -22,6 +22,7 @@ import ( "github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/roomserver/types" + "github.com/matrix-org/gomatrixserverlib" ) const roomsSchema = ` @@ -31,7 +32,7 @@ const roomsSchema = ` latest_event_nids TEXT NOT NULL DEFAULT '[]', last_event_sent_nid INTEGER NOT NULL DEFAULT 0, state_snapshot_nid INTEGER NOT NULL DEFAULT 0, - room_version INTEGER NOT NULL DEFAULT 1 + room_version TEXT NOT NULL DEFAULT '1' ); ` @@ -81,7 +82,8 @@ func (s *roomStatements) prepare(db *sql.DB) (err error) { } func (s *roomStatements) insertRoomNID( - ctx context.Context, txn *sql.Tx, roomID string, roomVersion string, + ctx context.Context, txn *sql.Tx, roomID string, + roomVersion gomatrixserverlib.RoomVersion, ) (types.RoomNID, error) { var err error insertStmt := common.TxStmt(txn, s.insertRoomNIDStmt) @@ -157,8 +159,8 @@ func (s *roomStatements) updateLatestEventNIDs( func (s *roomStatements) selectRoomVersionForRoomNID( ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, -) (int64, error) { - var roomVersion int64 +) (gomatrixserverlib.RoomVersion, error) { + var roomVersion gomatrixserverlib.RoomVersion stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt) err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion) return roomVersion, err diff --git a/roomserver/storage/sqlite3/storage.go b/roomserver/storage/sqlite3/storage.go index e70a1b9ec..f5904798e 100644 --- a/roomserver/storage/sqlite3/storage.go +++ b/roomserver/storage/sqlite3/storage.go @@ -21,12 +21,10 @@ import ( "encoding/json" "errors" "net/url" - "strconv" "github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/types" - "github.com/matrix-org/dendrite/roomserver/version" "github.com/matrix-org/gomatrixserverlib" _ "github.com/mattn/go-sqlite3" ) @@ -95,7 +93,7 @@ func (d *Database) StoreEvent( // The only room version where the "room_version" key isn't specified is // room version 1 - roomVersion := 1 + roomVersion := gomatrixserverlib.RoomVersionV1 // The below works because the first event to be persisted to the database // is always the m.room.create event. We can therefore set the room version // correctly at the same time as assigning the room NID. @@ -103,7 +101,7 @@ func (d *Database) StoreEvent( var createContent gomatrixserverlib.CreateContent if err := json.Unmarshal(event.Content(), &createContent); err == nil { if createContent.RoomVersion != nil { - roomVersion = *createContent.RoomVersion + roomVersion = gomatrixserverlib.RoomVersion(*createContent.RoomVersion) } } } @@ -168,7 +166,8 @@ func (d *Database) StoreEvent( } func (d *Database) assignRoomNID( - ctx context.Context, txn *sql.Tx, roomID string, roomVersion string, + ctx context.Context, txn *sql.Tx, roomID string, + roomVersion gomatrixserverlib.RoomVersion, ) (roomNID types.RoomNID, err error) { // Check if we already have a numeric ID in the database. roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID) @@ -286,10 +285,18 @@ func (d *Database) Events( for i, eventJSON := range eventJSONs { result := &results[i] result.EventNID = eventJSON.EventNID - // TODO: Use NewEventFromTrustedJSON for efficiency - result.Event, err = gomatrixserverlib.NewEventFromUntrustedJSON(eventJSON.EventJSON) + roomNID, err := d.RoomNIDForEventNID(ctx, result.EventNID) if err != nil { - return nil + return err + } + roomVersion, err := d.GetRoomVersionForRoom(ctx, roomNID) + if err != nil { + return err + } + // TODO: Use NewEventFromTrustedJSON for efficiency + result.Event, err = gomatrixserverlib.NewEventFromUntrustedJSON(eventJSON.EventJSON, roomVersion) + if err != nil { + return err } } return nil @@ -891,7 +898,7 @@ func (d *Database) EventsFromIDs(ctx context.Context, eventIDs []string) ([]type func (d *Database) GetRoomVersionForRoom( ctx context.Context, roomNID types.RoomNID, -) (int64, error) { +) (gomatrixserverlib.RoomVersion, error) { return d.statements.selectRoomVersionForRoomNID( ctx, nil, roomNID, ) diff --git a/roomserver/version/version.go b/roomserver/version/version.go index e31351cad..1bd75f726 100644 --- a/roomserver/version/version.go +++ b/roomserver/version/version.go @@ -16,84 +16,56 @@ package version import ( "errors" - "strconv" - "github.com/matrix-org/dendrite/roomserver/state" -) - -type RoomVersionID int -type EventFormatID int - -const ( - RoomVersionV1 RoomVersionID = iota + 1 - RoomVersionV2 - RoomVersionV3 - RoomVersionV4 - RoomVersionV5 + "github.com/matrix-org/gomatrixserverlib" ) const ( - EventFormatV1 EventFormatID = iota + 1 // original event ID formatting - EventFormatV2 // event ID is event hash - EventFormatV3 // event ID is URL-safe base64 event hash + RoomVersionV1 gomatrixserverlib.RoomVersion = "1" + RoomVersionV2 gomatrixserverlib.RoomVersion = "2" + RoomVersionV3 gomatrixserverlib.RoomVersion = "3" + RoomVersionV4 gomatrixserverlib.RoomVersion = "4" + RoomVersionV5 gomatrixserverlib.RoomVersion = "5" ) type RoomVersionDescription struct { - Supported bool - Stable bool - StateResolution state.StateResolutionVersion - EventFormat EventFormatID - EnforceSigningKeyValidity bool + Supported bool + Stable bool } -var roomVersions = map[RoomVersionID]RoomVersionDescription{ +var roomVersions = map[gomatrixserverlib.RoomVersion]RoomVersionDescription{ RoomVersionV1: RoomVersionDescription{ - Supported: true, - Stable: true, - StateResolution: state.StateResolutionAlgorithmV1, - EventFormat: EventFormatV1, - EnforceSigningKeyValidity: false, + Supported: true, + Stable: true, }, RoomVersionV2: RoomVersionDescription{ - Supported: true, - Stable: true, - StateResolution: state.StateResolutionAlgorithmV2, - EventFormat: EventFormatV1, - EnforceSigningKeyValidity: false, + Supported: true, + Stable: true, }, RoomVersionV3: RoomVersionDescription{ - Supported: false, - Stable: true, - StateResolution: state.StateResolutionAlgorithmV2, - EventFormat: EventFormatV2, - EnforceSigningKeyValidity: false, + Supported: true, + Stable: false, }, RoomVersionV4: RoomVersionDescription{ - Supported: false, - Stable: true, - StateResolution: state.StateResolutionAlgorithmV2, - EventFormat: EventFormatV3, - EnforceSigningKeyValidity: false, + Supported: true, + Stable: false, }, RoomVersionV5: RoomVersionDescription{ - Supported: false, - Stable: true, - StateResolution: state.StateResolutionAlgorithmV2, - EventFormat: EventFormatV3, - EnforceSigningKeyValidity: true, + Supported: false, + Stable: false, }, } -func GetDefaultRoomVersion() RoomVersionID { +func GetDefaultRoomVersion() gomatrixserverlib.RoomVersion { return RoomVersionV2 } -func GetRoomVersions() map[RoomVersionID]RoomVersionDescription { +func GetRoomVersions() map[gomatrixserverlib.RoomVersion]RoomVersionDescription { return roomVersions } -func GetSupportedRoomVersions() map[RoomVersionID]RoomVersionDescription { - versions := make(map[RoomVersionID]RoomVersionDescription) +func GetSupportedRoomVersions() map[gomatrixserverlib.RoomVersion]RoomVersionDescription { + versions := make(map[gomatrixserverlib.RoomVersion]RoomVersionDescription) for id, version := range GetRoomVersions() { if version.Supported { versions[id] = version @@ -102,8 +74,8 @@ func GetSupportedRoomVersions() map[RoomVersionID]RoomVersionDescription { return versions } -func GetSupportedRoomVersion(id RoomVersionID) ( - ver RoomVersionID, +func GetSupportedRoomVersion(id gomatrixserverlib.RoomVersion) ( + ver gomatrixserverlib.RoomVersion, desc RoomVersionDescription, err error, ) { @@ -117,20 +89,10 @@ func GetSupportedRoomVersion(id RoomVersionID) ( return } -func (v RoomVersionID) String() string { - return strconv.Itoa(int(v)) -} - func GetSupportedRoomVersionFromString(version string) ( - ver RoomVersionID, + ver gomatrixserverlib.RoomVersion, desc RoomVersionDescription, err error, ) { - var v RoomVersionID - if version, err := strconv.Atoi(version); err == nil { - v = RoomVersionID(version) - } else { - v = GetDefaultRoomVersion() - } - return GetSupportedRoomVersion(v) + return GetSupportedRoomVersion(gomatrixserverlib.RoomVersion(version)) } diff --git a/syncapi/storage/postgres/current_room_state_table.go b/syncapi/storage/postgres/current_room_state_table.go index 6f5c1e803..102ff78d3 100644 --- a/syncapi/storage/postgres/current_room_state_table.go +++ b/syncapi/storage/postgres/current_room_state_table.go @@ -252,7 +252,7 @@ func (s *currentRoomStateStatements) selectEventsWithEventIDs( return rowsToStreamEvents(rows) } -func rowsToEvents(rows *sql.Rows) ([]gomatrixserverlib.Event, error) { +func rowsToEvents(rows *sql.Rows, roomVersion gomatrixserverlib.RoomVersion) ([]gomatrixserverlib.Event, error) { result := []gomatrixserverlib.Event{} for rows.Next() { var eventBytes []byte @@ -260,7 +260,7 @@ func rowsToEvents(rows *sql.Rows) ([]gomatrixserverlib.Event, error) { return nil, err } // TODO: Handle redacted events - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(eventBytes, false) + ev, err := gomatrixserverlib.NewEventFromTrustedJSON(eventBytes, false, roomVersion) if err != nil { return nil, err }