diff --git a/appservice/consumers/roomserver.go b/appservice/consumers/roomserver.go index 77d649950..6d3ea808f 100644 --- a/appservice/consumers/roomserver.go +++ b/appservice/consumers/roomserver.go @@ -94,16 +94,7 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error { return nil } - // TODO: Is this trusted here? - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(output.NewRoomEvent.Event, false, output.NewRoomEvent.RoomVersion) - if err != nil { - log.WithError(err).WithField("roomversion", output.NewRoomEvent.RoomVersion).Errorf( - "roomserver output log: couldn't create event from trusted JSON (%d bytes)", - len(output.NewRoomEvent.Event), - ) - return err - } - + ev := output.NewRoomEvent.Event log.WithFields(log.Fields{ "event_id": ev.EventID(), "room_id": ev.RoomID(), diff --git a/clientapi/consumers/roomserver.go b/clientapi/consumers/roomserver.go index 78da7e4d5..a65281514 100644 --- a/clientapi/consumers/roomserver.go +++ b/clientapi/consumers/roomserver.go @@ -84,16 +84,7 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error { return nil } - // TODO: Is this trusted here? - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(output.NewRoomEvent.Event, false, output.NewRoomEvent.RoomVersion) - if err != nil { - log.WithError(err).WithField("roomversion", output.NewRoomEvent.RoomVersion).Errorf( - "roomserver output log: couldn't create event from trusted JSON (%d bytes)", - len(output.NewRoomEvent.Event), - ) - return err - } - + ev := output.NewRoomEvent.Event log.WithFields(log.Fields{ "event_id": ev.EventID(), "room_id": ev.RoomID(), diff --git a/federationsender/consumers/roomserver.go b/federationsender/consumers/roomserver.go index 932f01e5a..0180e38e8 100644 --- a/federationsender/consumers/roomserver.go +++ b/federationsender/consumers/roomserver.go @@ -86,12 +86,7 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error { return nil } - // TODO: Is this trusted here? - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(output.NewRoomEvent.Event, false, output.NewRoomEvent.RoomVersion) - if err != nil { - return err - } - + ev := output.NewRoomEvent.Event log.WithFields(log.Fields{ "event_id": ev.EventID(), "room_id": ev.RoomID(), @@ -115,12 +110,7 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error { // processMessage updates the list of currently joined hosts in the room // and then sends the event to the hosts that were joined before the event. func (s *OutputRoomEventConsumer) processMessage(ore api.OutputNewRoomEvent) error { - // TODO: Is this trusted here? - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(ore.Event, false, ore.RoomVersion) - if err != nil { - return err - } - + ev := ore.Event addsStateEvents, err := s.lookupStateEvents(ore.AddsStateEventIDs, ev) if err != nil { return err @@ -183,15 +173,7 @@ func (s *OutputRoomEventConsumer) processMessage(ore api.OutputNewRoomEvent) err func (s *OutputRoomEventConsumer) joinedHostsAtEvent( ore api.OutputNewRoomEvent, oldJoinedHosts []types.JoinedHost, ) ([]gomatrixserverlib.ServerName, error) { - // TODO: Is this trusted here? - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(ore.Event, false, ore.RoomVersion) - if err != nil { - log.WithError(err).WithField("roomversion", ore.RoomVersion).Errorf( - "roomserver output log: couldn't create event from trusted JSON (%d bytes)", - len(ore.Event), - ) - return nil, err - } + ev := ore.Event // Combine the delta into a single delta so that the adds and removes can // cancel each other out. This should reduce the number of times we need diff --git a/go.mod b/go.mod index d15980207..f51d15c7e 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-20200310154032-5ca7e25c30ed + github.com/matrix-org/gomatrixserverlib v0.0.0-20200311110021-ac84b78b81be 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 3611bef80..732c350b6 100644 --- a/go.sum +++ b/go.sum @@ -94,6 +94,8 @@ github.com/matrix-org/gomatrixserverlib v0.0.0-20200310151755-d60e4e8147d2 h1:1k github.com/matrix-org/gomatrixserverlib v0.0.0-20200310151755-d60e4e8147d2/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= github.com/matrix-org/gomatrixserverlib v0.0.0-20200310154032-5ca7e25c30ed h1:USEw1Rw391AzQBo/QgNyEY1nSAkwkuMoQ9LNTwGaKC0= github.com/matrix-org/gomatrixserverlib v0.0.0-20200310154032-5ca7e25c30ed/go.mod h1:FsKa2pWE/bpQql9H7U4boOPXFoJX/QcqaZZ6ijLkaZI= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200311110021-ac84b78b81be h1:4ZM5Ps50b7Ku75VzML6+3fCyuw0NSuDJi/kYjB+UScI= +github.com/matrix-org/gomatrixserverlib v0.0.0-20200311110021-ac84b78b81be/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/publicroomsapi/consumers/roomserver.go b/publicroomsapi/consumers/roomserver.go index dd2c6c107..6c93ad78a 100644 --- a/publicroomsapi/consumers/roomserver.go +++ b/publicroomsapi/consumers/roomserver.go @@ -22,7 +22,6 @@ import ( "github.com/matrix-org/dendrite/common/config" "github.com/matrix-org/dendrite/publicroomsapi/storage" "github.com/matrix-org/dendrite/roomserver/api" - "github.com/matrix-org/gomatrixserverlib" log "github.com/sirupsen/logrus" sarama "gopkg.in/Shopify/sarama.v1" ) @@ -78,16 +77,20 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error { return nil } - // TODO: Is this trusted here? - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(output.NewRoomEvent.Event, false, output.NewRoomEvent.RoomVersion) - if err != nil { - log.WithError(err).WithField("roomversion", output.NewRoomEvent.RoomVersion).Errorf( - "roomserver output log: couldn't create event from trusted JSON (%d bytes)", - len(output.NewRoomEvent.Event), - ) + // Get the room version of the room + vQueryReq := api.QueryRoomVersionForRoomIDRequest{RoomID: output.NewRoomEvent.Event.RoomID()} + vQueryRes := api.QueryRoomVersionForRoomIDResponse{} + if err := s.query.QueryRoomVersionForRoomID(context.Background(), &vQueryReq, &vQueryRes); err != nil { return err } + if err := output.NewRoomEvent.Event.PrepareAs(vQueryRes.RoomVersion); err != nil { + log.WithFields(log.Fields{ + "room_version": vQueryRes.RoomVersion, + }).WithError(err).Errorf("can't prepare event to version") + } + + ev := output.NewRoomEvent.Event log.WithFields(log.Fields{ "event_id": ev.EventID(), "room_id": ev.RoomID(), diff --git a/roomserver/api/output.go b/roomserver/api/output.go index 5abbed3b4..5940ba57e 100644 --- a/roomserver/api/output.go +++ b/roomserver/api/output.go @@ -54,7 +54,7 @@ type OutputEvent struct { // prev_events. type OutputNewRoomEvent struct { // The event. - Event []byte `json:"event"` + Event gomatrixserverlib.Event `json:"event"` // The event version. RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"` // The latest events in the room after this event. diff --git a/roomserver/input/latest_events.go b/roomserver/input/latest_events.go index 8b28f8085..eb31b4779 100644 --- a/roomserver/input/latest_events.go +++ b/roomserver/input/latest_events.go @@ -262,18 +262,13 @@ func (u *latestEventsUpdater) makeOutputNewRoomEvent() (*api.OutputEvent, error) latestEventIDs[i] = u.latest[i].EventID } - eventJSON, err := u.event.MarshalJSON() - if err != nil { - return nil, err - } - roomVersion, err := u.db.GetRoomVersionForRoom(context.Background(), u.roomNID) if err != nil { return nil, err } ore := api.OutputNewRoomEvent{ - Event: eventJSON, + Event: u.event, RoomVersion: roomVersion, LastSentEventID: u.lastEventIDSent, LatestEventIDs: latestEventIDs, diff --git a/syncapi/consumers/roomserver.go b/syncapi/consumers/roomserver.go index e27325435..136934ef4 100644 --- a/syncapi/consumers/roomserver.go +++ b/syncapi/consumers/roomserver.go @@ -99,19 +99,16 @@ func (s *OutputRoomEventConsumer) onMessage(msg *sarama.ConsumerMessage) error { func (s *OutputRoomEventConsumer) onNewRoomEvent( ctx context.Context, msg api.OutputNewRoomEvent, ) error { + ev := msg.Event roomVersion := gomatrixserverlib.RoomVersionV1 - if rv := gjson.Get(string(msg.Event), "content.room_version"); rv.Exists() { + if rv := gjson.Get(string(ev.Content()), "room_version"); rv.Exists() { roomVersion = gomatrixserverlib.RoomVersion(rv.String()) } - // TODO: Is this trusted here? - ev, err := gomatrixserverlib.NewEventFromTrustedJSON(msg.Event, false, roomVersion) - if err != nil { - log.WithError(err).WithField("roomversion", msg.RoomVersion).Errorf( - "roomserver output log: couldn't create event from trusted JSON (%d bytes)", - len(msg.Event), - ) - return err + if err := msg.Event.PrepareAs(roomVersion); err != nil { + log.WithFields(log.Fields{ + "room_version": roomVersion, + }).WithError(err).Errorf("can't prepare event to version") } log.WithFields(log.Fields{ diff --git a/syncapi/storage/postgres/room_versions.go b/syncapi/storage/postgres/room_versions.go index 27d541572..6148518f5 100644 --- a/syncapi/storage/postgres/room_versions.go +++ b/syncapi/storage/postgres/room_versions.go @@ -28,7 +28,7 @@ func (s *roomVersionStatements) prepare(db *sql.DB) (err error) { func (s *roomVersionStatements) selectRoomVersion( ctx context.Context, txn *sql.Tx, roomID string, ) (roomVersion gomatrixserverlib.RoomVersion, err error) { - stmt := common.TxStmt(txn, s.selectStateEventStmt) + stmt := common.TxStmt(nil, s.selectStateEventStmt) var res []byte err = stmt.QueryRowContext(ctx, roomID, "m.room.create", "").Scan(&res) if err != nil {