mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-16 11:23:11 -06:00
Fix a lot of room versions wiring (apart from syncapi)
This commit is contained in:
parent
1b52775ccd
commit
6bf0e69499
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
2
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
|
||||
|
|
|
|||
8
go.sum
8
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=
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue