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
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)
}

View file

@ -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")

View file

@ -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)
}

View file

@ -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
}

View file

@ -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,
},
}
}

View file

@ -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

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-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

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-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=

View file

@ -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

View file

@ -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.

View file

@ -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.

View file

@ -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
}

View file

@ -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
}

View file

@ -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
}
}

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)
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)
}

View file

@ -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

View file

@ -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,
)

View file

@ -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

View file

@ -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,
)

View file

@ -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))
}

View file

@ -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
}