Fix a lot of room versions wiring (apart from syncapi)

This commit is contained in:
Neil Alexander 2020-03-10 11:31:55 +00:00
parent 1b52775ccd
commit 6bf0e69499
21 changed files with 138 additions and 131 deletions

View file

@ -39,16 +39,16 @@ import (
// https://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-createroom // https://matrix.org/docs/spec/client_server/r0.2.0.html#post-matrix-client-r0-createroom
type createRoomRequest struct { type createRoomRequest struct {
Invite []string `json:"invite"` Invite []string `json:"invite"`
Name string `json:"name"` Name string `json:"name"`
Visibility string `json:"visibility"` Visibility string `json:"visibility"`
Topic string `json:"topic"` Topic string `json:"topic"`
Preset string `json:"preset"` Preset string `json:"preset"`
CreationContent map[string]interface{} `json:"creation_content"` CreationContent map[string]interface{} `json:"creation_content"`
InitialState []fledglingEvent `json:"initial_state"` InitialState []fledglingEvent `json:"initial_state"`
RoomAliasName string `json:"room_alias_name"` RoomAliasName string `json:"room_alias_name"`
GuestCanJoin bool `json:"guest_can_join"` GuestCanJoin bool `json:"guest_can_join"`
RoomVersion string `json:"room_version"` RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"`
} }
const ( const (
@ -183,13 +183,13 @@ func createRoom(
roomVersion := roomserverVersion.GetDefaultRoomVersion() roomVersion := roomserverVersion.GetDefaultRoomVersion()
if r.RoomVersion != "" { if r.RoomVersion != "" {
id, meta, verr := roomserverVersion.GetSupportedRoomVersionFromString(r.RoomVersion) id, meta, verr := roomserverVersion.GetSupportedRoomVersion(r.RoomVersion)
if verr == nil && meta.Supported { if verr == nil && meta.Supported {
roomVersion = id roomVersion = id
} }
} }
r.CreationContent["room_version"] = roomVersion.String() r.CreationContent["room_version"] = roomVersion
r.CreationContent["creator"] = userID r.CreationContent["creator"] = userID
// TODO: visibility/presets/raw initial state // TODO: visibility/presets/raw initial state
@ -295,7 +295,7 @@ func createRoom(
builder.PrevEvents = []gomatrixserverlib.EventReference{builtEvents[i-1].EventReference()} builder.PrevEvents = []gomatrixserverlib.EventReference{builtEvents[i-1].EventReference()}
} }
var ev *gomatrixserverlib.Event var ev *gomatrixserverlib.Event
ev, err = buildEvent(&builder, &authEvents, cfg, evTime) ev, err = buildEvent(&builder, &authEvents, cfg, evTime, roomVersion)
if err != nil { if err != nil {
util.GetLogger(req.Context()).WithError(err).Error("buildEvent failed") util.GetLogger(req.Context()).WithError(err).Error("buildEvent failed")
return jsonerror.InternalServerError() return jsonerror.InternalServerError()
@ -364,6 +364,7 @@ func buildEvent(
provider gomatrixserverlib.AuthEventProvider, provider gomatrixserverlib.AuthEventProvider,
cfg *config.Dendrite, cfg *config.Dendrite,
evTime time.Time, evTime time.Time,
roomVersion gomatrixserverlib.RoomVersion,
) (*gomatrixserverlib.Event, error) { ) (*gomatrixserverlib.Event, error) {
eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder) eventsNeeded, err := gomatrixserverlib.StateNeededForEventBuilder(builder)
if err != nil { if err != nil {
@ -375,7 +376,10 @@ func buildEvent(
} }
builder.AuthEvents = refs builder.AuthEvents = refs
eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) 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 { if err != nil {
return nil, fmt.Errorf("cannot build event %s : Builder failed to build. %s", builder.Type, err) return nil, fmt.Errorf("cannot build event %s : Builder failed to build. %s", builder.Type, err)
} }

View file

@ -300,11 +300,10 @@ func (r joinRoomReq) joinRoomUsingServers(
// server was invalid this returns an error. // server was invalid this returns an error.
// Otherwise this returns a JSONResponse. // Otherwise this returns a JSONResponse.
func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib.ServerName) (*util.JSONResponse, error) { func (r joinRoomReq) joinRoomUsingServer(roomID string, server gomatrixserverlib.ServerName) (*util.JSONResponse, error) {
var roomVersions []int var roomVersions []gomatrixserverlib.RoomVersion
for i := range version.GetSupportedRoomVersions() { 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) respMakeJoin, err := r.federation.MakeJoin(r.req.Context(), server, roomID, r.userID, roomVersions)
if err != nil { if err != nil {
// TODO: Check if the user was not allowed to join the room. // 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) eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), r.cfg.Matrix.ServerName)
event, err := respMakeJoin.JoinEvent.Build( event, err := respMakeJoin.JoinEvent.Build(
eventID, r.evTime, r.cfg.Matrix.ServerName, r.cfg.Matrix.KeyID, r.cfg.Matrix.PrivateKey, eventID, r.evTime, r.cfg.Matrix.ServerName, r.cfg.Matrix.KeyID, r.cfg.Matrix.PrivateKey,
respMakeJoin.RoomVersion,
) )
if err != nil { if err != nil {
util.GetLogger(r.req.Context()).WithError(err).Error("respMakeJoin.JoinEvent.Build failed") util.GetLogger(r.req.Context()).WithError(err).Error("respMakeJoin.JoinEvent.Build failed")

View file

@ -108,7 +108,7 @@ func buildAndOutput() gomatrixserverlib.EventReference {
name := gomatrixserverlib.ServerName(*serverName) name := gomatrixserverlib.ServerName(*serverName)
key := gomatrixserverlib.KeyID(*keyID) 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 { if err != nil {
panic(err) panic(err)
} }

View file

@ -47,7 +47,7 @@ func BuildEvent(
return nil, err return nil, err
} }
roomVersion := 2 roomVersion := gomatrixserverlib.RoomVersionV2
vQueryReq := api.QueryRoomVersionForRoomIDRequest{RoomID: builder.RoomID} vQueryReq := api.QueryRoomVersionForRoomIDRequest{RoomID: builder.RoomID}
vQueryRes := api.QueryRoomVersionForRoomIDResponse{} vQueryRes := api.QueryRoomVersionForRoomIDResponse{}
if e := queryAPI.QueryRoomVersionForRoomID(ctx, &vQueryReq, &vQueryRes); e == nil { if e := queryAPI.QueryRoomVersionForRoomID(ctx, &vQueryReq, &vQueryRes); e == nil {
@ -60,7 +60,10 @@ func BuildEvent(
// TODO: Room versions affect the below // TODO: Room versions affect the below
eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) 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 { if err != nil {
return nil, err return nil, err
} }

View file

@ -17,7 +17,6 @@ package routing
import ( import (
"encoding/json" "encoding/json"
"net/http" "net/http"
"strconv"
"time" "time"
"github.com/matrix-org/dendrite/clientapi/jsonerror" "github.com/matrix-org/dendrite/clientapi/jsonerror"
@ -103,7 +102,7 @@ func MakeJoin(
Code: http.StatusOK, Code: http.StatusOK,
JSON: map[string]interface{}{ JSON: map[string]interface{}{
"event": builder, "event": builder,
"room_version": strconv.Itoa(vQueryRes.RoomVersion), "room_version": vQueryRes.RoomVersion,
}, },
} }
} }

View file

@ -257,6 +257,13 @@ func buildMembershipEvent(
return nil, errNotInRoom 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 // Auth the event locally
builder.Depth = queryRes.Depth builder.Depth = queryRes.Depth
builder.PrevEvents = queryRes.LatestEvents builder.PrevEvents = queryRes.LatestEvents
@ -283,6 +290,7 @@ func buildMembershipEvent(
eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName) eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), cfg.Matrix.ServerName)
event, err := builder.Build( event, err := builder.Build(
eventID, time.Now(), cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey, eventID, time.Now(), cfg.Matrix.ServerName, cfg.Matrix.KeyID, cfg.Matrix.PrivateKey,
vQueryRes.RoomVersion,
) )
return &event, err return &event, err

2
go.mod
View file

@ -8,7 +8,7 @@ require (
github.com/matrix-org/go-http-js-libp2p v0.0.0-20200304160008-4ec1129a00c4 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/go-sqlite3-js v0.0.0-20200304164012-aa524245b658
github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26 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/naffka v0.0.0-20200127221512-0716baaabaf1
github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7 github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7
github.com/mattn/go-sqlite3 v2.0.2+incompatible github.com/mattn/go-sqlite3 v2.0.2+incompatible

8
go.sum
View file

@ -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-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 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-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 h1:osLoFdOy+ChQqVUn2PeTDETFftVkl4w9t/OW18g3lnk=
github.com/matrix-org/naffka v0.0.0-20200127221512-0716baaabaf1/go.mod h1:cXoYQIENbdWIQHt1SyCo6Bl3C3raHwJ0wgVrXHSqf+A= 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= github.com/matrix-org/util v0.0.0-20171127121716-2e2df66af2f5 h1:W7l5CP4V7wPyPb4tYE11dbmeAOwtFQBTW0rf4OonOS8=

View file

@ -240,11 +240,18 @@ func (r *RoomserverAliasAPI) sendUpdatedAliasesEvent(
} }
builder.AuthEvents = refs 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 // Build the event
eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), r.Cfg.Matrix.ServerName) eventID := fmt.Sprintf("$%s:%s", util.RandomString(16), r.Cfg.Matrix.ServerName)
now := time.Now() now := time.Now()
event, err := builder.Build( event, err := builder.Build(
eventID, now, r.Cfg.Matrix.ServerName, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey, eventID, now, r.Cfg.Matrix.ServerName, r.Cfg.Matrix.KeyID, r.Cfg.Matrix.PrivateKey,
vRes.RoomVersion,
) )
if err != nil { if err != nil {
return err return err

View file

@ -251,8 +251,8 @@ type QueryRoomVersionCapabilitiesRequest struct{}
// QueryRoomVersionCapabilitiesResponse is a response to QueryServersInRoomAtEventResponse // QueryRoomVersionCapabilitiesResponse is a response to QueryServersInRoomAtEventResponse
type QueryRoomVersionCapabilitiesResponse struct { type QueryRoomVersionCapabilitiesResponse struct {
DefaultRoomVersion int `json:"default"` DefaultRoomVersion gomatrixserverlib.RoomVersion `json:"default"`
AvailableRoomVersions map[int]string `json:"available"` AvailableRoomVersions map[gomatrixserverlib.RoomVersion]string `json:"available"`
} }
// QueryRoomVersionCapabilities asks for the default room version // QueryRoomVersionCapabilities asks for the default room version
@ -262,7 +262,7 @@ type QueryRoomVersionForRoomIDRequest struct {
// QueryRoomVersionCapabilitiesResponse is a response to QueryServersInRoomAtEventResponse // QueryRoomVersionCapabilitiesResponse is a response to QueryServersInRoomAtEventResponse
type QueryRoomVersionForRoomIDResponse struct { type QueryRoomVersionForRoomIDResponse struct {
RoomVersion int `json:"version"` RoomVersion gomatrixserverlib.RoomVersion `json:"version"`
} }
// RoomserverQueryAPI is used to query information from the room server. // RoomserverQueryAPI is used to query information from the room server.

View file

@ -75,7 +75,7 @@ type RoomEventDatabase interface {
// Look up the room version from the database. // Look up the room version from the database.
GetRoomVersionForRoom( GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID, ctx context.Context, roomNID types.RoomNID,
) (int64, error) ) (gomatrixserverlib.RoomVersion, error)
} }
// OutputRoomEventWriter has the APIs needed to write an event to the output logs. // OutputRoomEventWriter has the APIs needed to write an event to the output logs.

View file

@ -92,7 +92,7 @@ type RoomserverQueryAPIDatabase interface {
// Look up the room version from the database. // Look up the room version from the database.
GetRoomVersionForRoom( GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID, ctx context.Context, roomNID types.RoomNID,
) (int64, error) ) (gomatrixserverlib.RoomVersion, error)
// Get the room NID for a given event ID. // Get the room NID for a given event ID.
RoomNIDForEventID( RoomNIDForEventID(
ctx context.Context, eventID string, ctx context.Context, eventID string,
@ -768,13 +768,13 @@ func (r *RoomserverQueryAPI) QueryRoomVersionCapabilities(
request *api.QueryRoomVersionCapabilitiesRequest, request *api.QueryRoomVersionCapabilitiesRequest,
response *api.QueryRoomVersionCapabilitiesResponse, response *api.QueryRoomVersionCapabilitiesResponse,
) error { ) error {
response.DefaultRoomVersion = int(version.GetDefaultRoomVersion()) response.DefaultRoomVersion = version.GetDefaultRoomVersion()
response.AvailableRoomVersions = make(map[int]string) response.AvailableRoomVersions = make(map[gomatrixserverlib.RoomVersion]string)
for v, desc := range version.GetSupportedRoomVersions() { for v, desc := range version.GetSupportedRoomVersions() {
if desc.Stable { if desc.Stable {
response.AvailableRoomVersions[int(v)] = "stable" response.AvailableRoomVersions[v] = "stable"
} else { } else {
response.AvailableRoomVersions[int(v)] = "unstable" response.AvailableRoomVersions[v] = "unstable"
} }
} }
return nil return nil
@ -799,7 +799,7 @@ func (r *RoomserverQueryAPI) QueryRoomVersionForRoomID(
} }
// Populate the response // Populate the response
response.RoomVersion = int(roomVersion) response.RoomVersion = roomVersion
return nil return nil
} }

View file

@ -54,7 +54,7 @@ func (db *getEventDB) addFakeEvent(eventID string, authIDs []string) error {
return err return err
} }
event, err := gomatrixserverlib.NewEventFromTrustedJSON(eventJSON, false) event, err := gomatrixserverlib.NewEventFromTrustedJSON(eventJSON, false, gomatrixserverlib.RoomVersionV1)
if err != nil { if err != nil {
return err return err
} }

View file

@ -38,15 +38,13 @@ const (
) )
func GetStateResolutionAlgorithm( func GetStateResolutionAlgorithm(
version int64, db database.RoomStateDatabase, version gomatrixserverlib.RoomVersion, db database.RoomStateDatabase,
) (StateResolutionImpl, error) { ) (StateResolutionImpl, error) {
switch version { switch version {
case 1: case gomatrixserverlib.RoomVersionV1:
return Prepare(db, StateResolutionAlgorithmV1), nil return Prepare(db, StateResolutionAlgorithmV1), nil
case 2, 3, 4, 5:
return Prepare(db, StateResolutionAlgorithmV2), nil
default: default:
return nil, errors.New("unsupported room version") return Prepare(db, StateResolutionAlgorithmV2), nil
} }
} }

View file

@ -45,7 +45,7 @@ type Database interface {
GetMembership(ctx context.Context, roomNID types.RoomNID, requestSenderUserID string) (membershipEventNID types.EventNID, stillInRoom bool, err error) 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) GetMembershipEventNIDsForRoom(ctx context.Context, roomNID types.RoomNID, joinOnly bool) ([]types.EventNID, error)
EventsFromIDs(ctx context.Context, eventIDs []string) ([]types.Event, 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) RoomNIDForEventID(ctx context.Context, eventID string) (types.RoomNID, error)
RoomNIDForEventNID(ctx context.Context, eventNID types.EventNID) (types.RoomNID, error) RoomNIDForEventNID(ctx context.Context, eventNID types.EventNID) (types.RoomNID, error)
} }

View file

@ -22,6 +22,7 @@ import (
"github.com/lib/pq" "github.com/lib/pq"
"github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/types" "github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/gomatrixserverlib"
) )
const roomsSchema = ` const roomsSchema = `
@ -42,7 +43,7 @@ CREATE TABLE IF NOT EXISTS roomserver_rooms (
state_snapshot_nid BIGINT NOT NULL DEFAULT 0, state_snapshot_nid BIGINT NOT NULL DEFAULT 0,
-- The version of the room, which will assist in determining the state resolution -- The version of the room, which will assist in determining the state resolution
-- algorithm, event ID format, etc. -- 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( 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) { ) (types.RoomNID, error) {
var roomNID int64 var roomNID int64
stmt := common.TxStmt(txn, s.insertRoomNIDStmt) stmt := common.TxStmt(txn, s.insertRoomNIDStmt)
@ -165,8 +167,8 @@ func (s *roomStatements) updateLatestEventNIDs(
func (s *roomStatements) selectRoomVersionForRoomNID( func (s *roomStatements) selectRoomVersionForRoomNID(
ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, ctx context.Context, txn *sql.Tx, roomNID types.RoomNID,
) (int64, error) { ) (gomatrixserverlib.RoomVersion, error) {
var roomVersion int64 var roomVersion gomatrixserverlib.RoomVersion
stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt) stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt)
err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion) err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion)
return roomVersion, err return roomVersion, err

View file

@ -19,14 +19,12 @@ import (
"context" "context"
"database/sql" "database/sql"
"encoding/json" "encoding/json"
"strconv"
// Import the postgres database driver. // Import the postgres database driver.
_ "github.com/lib/pq" _ "github.com/lib/pq"
"github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/types" "github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/dendrite/roomserver/version"
"github.com/matrix-org/gomatrixserverlib" "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 // The only room version where the "room_version" key isn't specified is
// room version 1 // room version 1
roomVersion := 1 roomVersion := gomatrixserverlib.RoomVersionV1
// The below works because the first event to be persisted to the database // 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 // is always the m.room.create event. We can therefore set the room version
// correctly at the same time as assigning the room NID. // correctly at the same time as assigning the room NID.
@ -82,7 +80,7 @@ func (d *Database) StoreEvent(
var createContent gomatrixserverlib.CreateContent var createContent gomatrixserverlib.CreateContent
if err := json.Unmarshal(event.Content(), &createContent); err == nil { if err := json.Unmarshal(event.Content(), &createContent); err == nil {
if createContent.RoomVersion != 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( 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) { ) (types.RoomNID, error) {
// Check if we already have a numeric ID in the database. // Check if we already have a numeric ID in the database.
roomNID, err := d.statements.selectRoomNID(ctx, txn, roomID) roomNID, err := d.statements.selectRoomNID(ctx, txn, roomID)
@ -234,8 +233,16 @@ func (d *Database) Events(
for i, eventJSON := range eventJSONs { for i, eventJSON := range eventJSONs {
result := &results[i] result := &results[i]
result.EventNID = eventJSON.EventNID 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 // TODO: Use NewEventFromTrustedJSON for efficiency
result.Event, err = gomatrixserverlib.NewEventFromUntrustedJSON(eventJSON.EventJSON) result.Event, err = gomatrixserverlib.NewEventFromUntrustedJSON(eventJSON.EventJSON, roomVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -738,7 +745,7 @@ func (d *Database) EventsFromIDs(ctx context.Context, eventIDs []string) ([]type
func (d *Database) GetRoomVersionForRoom( func (d *Database) GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID, ctx context.Context, roomNID types.RoomNID,
) (int64, error) { ) (gomatrixserverlib.RoomVersion, error) {
return d.statements.selectRoomVersionForRoomNID( return d.statements.selectRoomVersionForRoomNID(
ctx, nil, roomNID, ctx, nil, roomNID,
) )

View file

@ -22,6 +22,7 @@ import (
"github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/types" "github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/gomatrixserverlib"
) )
const roomsSchema = ` const roomsSchema = `
@ -31,7 +32,7 @@ const roomsSchema = `
latest_event_nids TEXT NOT NULL DEFAULT '[]', latest_event_nids TEXT NOT NULL DEFAULT '[]',
last_event_sent_nid INTEGER NOT NULL DEFAULT 0, last_event_sent_nid INTEGER NOT NULL DEFAULT 0,
state_snapshot_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( 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) { ) (types.RoomNID, error) {
var err error var err error
insertStmt := common.TxStmt(txn, s.insertRoomNIDStmt) insertStmt := common.TxStmt(txn, s.insertRoomNIDStmt)
@ -157,8 +159,8 @@ func (s *roomStatements) updateLatestEventNIDs(
func (s *roomStatements) selectRoomVersionForRoomNID( func (s *roomStatements) selectRoomVersionForRoomNID(
ctx context.Context, txn *sql.Tx, roomNID types.RoomNID, ctx context.Context, txn *sql.Tx, roomNID types.RoomNID,
) (int64, error) { ) (gomatrixserverlib.RoomVersion, error) {
var roomVersion int64 var roomVersion gomatrixserverlib.RoomVersion
stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt) stmt := common.TxStmt(txn, s.selectRoomVersionForRoomNIDStmt)
err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion) err := stmt.QueryRowContext(ctx, roomNID).Scan(&roomVersion)
return roomVersion, err return roomVersion, err

View file

@ -21,12 +21,10 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"net/url" "net/url"
"strconv"
"github.com/matrix-org/dendrite/common" "github.com/matrix-org/dendrite/common"
"github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/api"
"github.com/matrix-org/dendrite/roomserver/types" "github.com/matrix-org/dendrite/roomserver/types"
"github.com/matrix-org/dendrite/roomserver/version"
"github.com/matrix-org/gomatrixserverlib" "github.com/matrix-org/gomatrixserverlib"
_ "github.com/mattn/go-sqlite3" _ "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 // The only room version where the "room_version" key isn't specified is
// room version 1 // room version 1
roomVersion := 1 roomVersion := gomatrixserverlib.RoomVersionV1
// The below works because the first event to be persisted to the database // 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 // is always the m.room.create event. We can therefore set the room version
// correctly at the same time as assigning the room NID. // correctly at the same time as assigning the room NID.
@ -103,7 +101,7 @@ func (d *Database) StoreEvent(
var createContent gomatrixserverlib.CreateContent var createContent gomatrixserverlib.CreateContent
if err := json.Unmarshal(event.Content(), &createContent); err == nil { if err := json.Unmarshal(event.Content(), &createContent); err == nil {
if createContent.RoomVersion != 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( 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) { ) (roomNID types.RoomNID, err error) {
// Check if we already have a numeric ID in the database. // Check if we already have a numeric ID in the database.
roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID) roomNID, err = d.statements.selectRoomNID(ctx, txn, roomID)
@ -286,10 +285,18 @@ func (d *Database) Events(
for i, eventJSON := range eventJSONs { for i, eventJSON := range eventJSONs {
result := &results[i] result := &results[i]
result.EventNID = eventJSON.EventNID result.EventNID = eventJSON.EventNID
// TODO: Use NewEventFromTrustedJSON for efficiency roomNID, err := d.RoomNIDForEventNID(ctx, result.EventNID)
result.Event, err = gomatrixserverlib.NewEventFromUntrustedJSON(eventJSON.EventJSON)
if err != nil { 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 return nil
@ -891,7 +898,7 @@ func (d *Database) EventsFromIDs(ctx context.Context, eventIDs []string) ([]type
func (d *Database) GetRoomVersionForRoom( func (d *Database) GetRoomVersionForRoom(
ctx context.Context, roomNID types.RoomNID, ctx context.Context, roomNID types.RoomNID,
) (int64, error) { ) (gomatrixserverlib.RoomVersion, error) {
return d.statements.selectRoomVersionForRoomNID( return d.statements.selectRoomVersionForRoomNID(
ctx, nil, roomNID, ctx, nil, roomNID,
) )

View file

@ -16,84 +16,56 @@ package version
import ( import (
"errors" "errors"
"strconv"
"github.com/matrix-org/dendrite/roomserver/state" "github.com/matrix-org/gomatrixserverlib"
)
type RoomVersionID int
type EventFormatID int
const (
RoomVersionV1 RoomVersionID = iota + 1
RoomVersionV2
RoomVersionV3
RoomVersionV4
RoomVersionV5
) )
const ( const (
EventFormatV1 EventFormatID = iota + 1 // original event ID formatting RoomVersionV1 gomatrixserverlib.RoomVersion = "1"
EventFormatV2 // event ID is event hash RoomVersionV2 gomatrixserverlib.RoomVersion = "2"
EventFormatV3 // event ID is URL-safe base64 event hash RoomVersionV3 gomatrixserverlib.RoomVersion = "3"
RoomVersionV4 gomatrixserverlib.RoomVersion = "4"
RoomVersionV5 gomatrixserverlib.RoomVersion = "5"
) )
type RoomVersionDescription struct { type RoomVersionDescription struct {
Supported bool Supported bool
Stable bool Stable bool
StateResolution state.StateResolutionVersion
EventFormat EventFormatID
EnforceSigningKeyValidity bool
} }
var roomVersions = map[RoomVersionID]RoomVersionDescription{ var roomVersions = map[gomatrixserverlib.RoomVersion]RoomVersionDescription{
RoomVersionV1: RoomVersionDescription{ RoomVersionV1: RoomVersionDescription{
Supported: true, Supported: true,
Stable: true, Stable: true,
StateResolution: state.StateResolutionAlgorithmV1,
EventFormat: EventFormatV1,
EnforceSigningKeyValidity: false,
}, },
RoomVersionV2: RoomVersionDescription{ RoomVersionV2: RoomVersionDescription{
Supported: true, Supported: true,
Stable: true, Stable: true,
StateResolution: state.StateResolutionAlgorithmV2,
EventFormat: EventFormatV1,
EnforceSigningKeyValidity: false,
}, },
RoomVersionV3: RoomVersionDescription{ RoomVersionV3: RoomVersionDescription{
Supported: false, Supported: true,
Stable: true, Stable: false,
StateResolution: state.StateResolutionAlgorithmV2,
EventFormat: EventFormatV2,
EnforceSigningKeyValidity: false,
}, },
RoomVersionV4: RoomVersionDescription{ RoomVersionV4: RoomVersionDescription{
Supported: false, Supported: true,
Stable: true, Stable: false,
StateResolution: state.StateResolutionAlgorithmV2,
EventFormat: EventFormatV3,
EnforceSigningKeyValidity: false,
}, },
RoomVersionV5: RoomVersionDescription{ RoomVersionV5: RoomVersionDescription{
Supported: false, Supported: false,
Stable: true, Stable: false,
StateResolution: state.StateResolutionAlgorithmV2,
EventFormat: EventFormatV3,
EnforceSigningKeyValidity: true,
}, },
} }
func GetDefaultRoomVersion() RoomVersionID { func GetDefaultRoomVersion() gomatrixserverlib.RoomVersion {
return RoomVersionV2 return RoomVersionV2
} }
func GetRoomVersions() map[RoomVersionID]RoomVersionDescription { func GetRoomVersions() map[gomatrixserverlib.RoomVersion]RoomVersionDescription {
return roomVersions return roomVersions
} }
func GetSupportedRoomVersions() map[RoomVersionID]RoomVersionDescription { func GetSupportedRoomVersions() map[gomatrixserverlib.RoomVersion]RoomVersionDescription {
versions := make(map[RoomVersionID]RoomVersionDescription) versions := make(map[gomatrixserverlib.RoomVersion]RoomVersionDescription)
for id, version := range GetRoomVersions() { for id, version := range GetRoomVersions() {
if version.Supported { if version.Supported {
versions[id] = version versions[id] = version
@ -102,8 +74,8 @@ func GetSupportedRoomVersions() map[RoomVersionID]RoomVersionDescription {
return versions return versions
} }
func GetSupportedRoomVersion(id RoomVersionID) ( func GetSupportedRoomVersion(id gomatrixserverlib.RoomVersion) (
ver RoomVersionID, ver gomatrixserverlib.RoomVersion,
desc RoomVersionDescription, desc RoomVersionDescription,
err error, err error,
) { ) {
@ -117,20 +89,10 @@ func GetSupportedRoomVersion(id RoomVersionID) (
return return
} }
func (v RoomVersionID) String() string {
return strconv.Itoa(int(v))
}
func GetSupportedRoomVersionFromString(version string) ( func GetSupportedRoomVersionFromString(version string) (
ver RoomVersionID, ver gomatrixserverlib.RoomVersion,
desc RoomVersionDescription, desc RoomVersionDescription,
err error, err error,
) { ) {
var v RoomVersionID return GetSupportedRoomVersion(gomatrixserverlib.RoomVersion(version))
if version, err := strconv.Atoi(version); err == nil {
v = RoomVersionID(version)
} else {
v = GetDefaultRoomVersion()
}
return GetSupportedRoomVersion(v)
} }

View file

@ -252,7 +252,7 @@ func (s *currentRoomStateStatements) selectEventsWithEventIDs(
return rowsToStreamEvents(rows) 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{} result := []gomatrixserverlib.Event{}
for rows.Next() { for rows.Next() {
var eventBytes []byte var eventBytes []byte
@ -260,7 +260,7 @@ func rowsToEvents(rows *sql.Rows) ([]gomatrixserverlib.Event, error) {
return nil, err return nil, err
} }
// TODO: Handle redacted events // TODO: Handle redacted events
ev, err := gomatrixserverlib.NewEventFromTrustedJSON(eventBytes, false) ev, err := gomatrixserverlib.NewEventFromTrustedJSON(eventBytes, false, roomVersion)
if err != nil { if err != nil {
return nil, err return nil, err
} }