Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions authchain_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ func TestVerifyEventAuthChain(t *testing.T) {
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":2,"event_id":"$xOJZshi3NeKKJiCf:baba.is.you","hashes":{"sha256":"lu5fF5HE090AXdu/+NpJ/RjRVRk/2tWCUozUc5t7Ru4"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"5KoVSLOBesqH9vciKXDExdu95lKFDtK1I72Hq1GG/UeEsH9jx7wL3V4jGYSKDnX2aLYp/VPiBQje7DFjde+hDQ"}},"type":"m.room.message"}`),
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":3,"event_id":"$4Kp0G1yWZ6tNpeI7:baba.is.you","hashes":{"sha256":"B+MjcGZRh72iaGOgyNbIxgFkHDJo6NO8NQDgiKDKDBA"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$xOJZshi3NeKKJiCf:baba.is.you",{"sha256":"5PGENImHC863Yz9sO6IJX+bIQthZFI2RMhFZyFy+bC0"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"rP+Ybp17GPCqQBrTQ3yz+q6PihdaMWvNY3SngV8aDLHv8wdDlH4ULGnjsB+Az7trqYdCE3rZVo9M7Hy5tOObDg"}},"type":"m.room.message"}`),
}
testEvent, _ := gomatrixserverlib.RoomVersionV1.NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
testEvent, _ := gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionV1).NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
if err := gomatrixserverlib.VerifyEventAuthChain(ctx, testEvent.Headered(gomatrixserverlib.RoomVersionV1), provideEvents(t, testEvents)); err != nil {
t.Fatalf("Expected event to pass auth chain checks, but failed: %s", err)
}
Expand All @@ -31,7 +31,7 @@ func TestVerifyEventAuthChainMissing(t *testing.T) {
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":2,"event_id":"$xOJZshi3NeKKJiCf:baba.is.you","hashes":{"sha256":"lu5fF5HE090AXdu/+NpJ/RjRVRk/2tWCUozUc5t7Ru4"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"5KoVSLOBesqH9vciKXDExdu95lKFDtK1I72Hq1GG/UeEsH9jx7wL3V4jGYSKDnX2aLYp/VPiBQje7DFjde+hDQ"}},"type":"m.room.message"}`),
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":3,"event_id":"$4Kp0G1yWZ6tNpeI7:baba.is.you","hashes":{"sha256":"B+MjcGZRh72iaGOgyNbIxgFkHDJo6NO8NQDgiKDKDBA"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$xOJZshi3NeKKJiCf:baba.is.you",{"sha256":"5PGENImHC863Yz9sO6IJX+bIQthZFI2RMhFZyFy+bC0"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"rP+Ybp17GPCqQBrTQ3yz+q6PihdaMWvNY3SngV8aDLHv8wdDlH4ULGnjsB+Az7trqYdCE3rZVo9M7Hy5tOObDg"}},"type":"m.room.message"}`),
}
testEvent, _ := gomatrixserverlib.RoomVersionV1.NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
testEvent, _ := gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionV1).NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
if err := gomatrixserverlib.VerifyEventAuthChain(ctx, testEvent.Headered(gomatrixserverlib.RoomVersionV1), provideEvents(t, testEvents)); err == nil {
t.Fatalf("Expected event to fail auth chain checks, but passed")
}
Expand All @@ -47,7 +47,7 @@ func TestVerifyEventAuthChainLying(t *testing.T) {
// modified to remove $fnwGrQEpiOIUoDU2 from auth_events
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}]],"content":{"body":"Test Message"},"depth":3,"event_id":"$4Kp0G1yWZ6tNpeI7:baba.is.you","hashes":{"sha256":"B+MjcGZRh72iaGOgyNbIxgFkHDJo6NO8NQDgiKDKDBA"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$xOJZshi3NeKKJiCf:baba.is.you",{"sha256":"5PGENImHC863Yz9sO6IJX+bIQthZFI2RMhFZyFy+bC0"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"rP+Ybp17GPCqQBrTQ3yz+q6PihdaMWvNY3SngV8aDLHv8wdDlH4ULGnjsB+Az7trqYdCE3rZVo9M7Hy5tOObDg"}},"type":"m.room.message"}`),
}
testEvent, _ := gomatrixserverlib.RoomVersionV1.NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
testEvent, _ := gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionV1).NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
if err := gomatrixserverlib.VerifyEventAuthChain(ctx, testEvent.Headered(gomatrixserverlib.RoomVersionV1), provideEvents(t, testEvents)); err == nil {
t.Fatalf("Expected event to fail auth chain checks, but passed")
}
Expand All @@ -64,7 +64,7 @@ func TestVerifyEventAuthChainCascadeFailure(t *testing.T) {
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":2,"event_id":"$xOJZshi3NeKKJiCf:baba.is.you","hashes":{"sha256":"lu5fF5HE090AXdu/+NpJ/RjRVRk/2tWCUozUc5t7Ru4"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"5KoVSLOBesqH9vciKXDExdu95lKFDtK1I72Hq1GG/UeEsH9jx7wL3V4jGYSKDnX2aLYp/VPiBQje7DFjde+hDQ"}},"type":"m.room.message"}`),
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":3,"event_id":"$4Kp0G1yWZ6tNpeI7:baba.is.you","hashes":{"sha256":"B+MjcGZRh72iaGOgyNbIxgFkHDJo6NO8NQDgiKDKDBA"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$xOJZshi3NeKKJiCf:baba.is.you",{"sha256":"5PGENImHC863Yz9sO6IJX+bIQthZFI2RMhFZyFy+bC0"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"rP+Ybp17GPCqQBrTQ3yz+q6PihdaMWvNY3SngV8aDLHv8wdDlH4ULGnjsB+Az7trqYdCE3rZVo9M7Hy5tOObDg"}},"type":"m.room.message"}`),
}
testEvent, _ := gomatrixserverlib.RoomVersionV1.NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
testEvent, _ := gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionV1).NewEventFromTrustedJSON(testEvents[len(testEvents)-1], false)
if err := gomatrixserverlib.VerifyEventAuthChain(ctx, testEvent.Headered(gomatrixserverlib.RoomVersionV1), provideEvents(t, testEvents)); err == nil {
t.Fatalf("Expected event to fail auth chain checks, but passed")
}
Expand All @@ -73,7 +73,7 @@ func TestVerifyEventAuthChainCascadeFailure(t *testing.T) {
func provideEvents(t *testing.T, events [][]byte) gomatrixserverlib.AuthChainProvider {
eventMap := make(map[string]*gomatrixserverlib.Event)
for _, eventBytes := range events {
ev, err := gomatrixserverlib.RoomVersionV1.NewEventFromTrustedJSON(eventBytes, false)
ev, err := gomatrixserverlib.MustGetRoomVersion(gomatrixserverlib.RoomVersionV1).NewEventFromTrustedJSON(eventBytes, false)
if err != nil {
t.Fatalf("Failed to load event: %s", err)
}
Expand Down
8 changes: 6 additions & 2 deletions authstate.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,9 +81,13 @@ func (p *FederatedStateProvider) StateBeforeEvent(ctx context.Context, roomVer R
if err != nil {
return nil, err
}
roomVerImpl, err := GetRoomVersion(roomVer)
if err != nil {
return nil, err
}
if p.RememberAuthEvents {
for _, js := range res.GetAuthEvents() {
event, err := roomVer.NewEventFromUntrustedJSON(js)
event, err := roomVerImpl.NewEventFromUntrustedJSON(js)
if err != nil {
continue
}
Expand All @@ -93,7 +97,7 @@ func (p *FederatedStateProvider) StateBeforeEvent(ctx context.Context, roomVer R

result := make(map[string]*Event)
for _, js := range res.GetStateEvents() {
event, err := roomVer.NewEventFromUntrustedJSON(js)
event, err := roomVerImpl.NewEventFromUntrustedJSON(js)
if err != nil {
continue
}
Expand Down
10 changes: 5 additions & 5 deletions authstate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func TestVerifyAuthRulesAtStateValidate(t *testing.T) {
}
eventToVerify, err := newEventFromTrustedJSON(
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":2,"event_id":"$xOJZshi3NeKKJiCf:baba.is.you","hashes":{"sha256":"lu5fF5HE090AXdu/+NpJ/RjRVRk/2tWCUozUc5t7Ru4"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"5KoVSLOBesqH9vciKXDExdu95lKFDtK1I72Hq1GG/UeEsH9jx7wL3V4jGYSKDnX2aLYp/VPiBQje7DFjde+hDQ"}},"type":"m.room.message"}`),
false, RoomVersionV1,
false, MustGetRoomVersion(RoomVersionV1),
)
if err != nil {
t.Fatalf("Failed to load test event: %s", err)
Expand Down Expand Up @@ -63,7 +63,7 @@ func TestVerifyAuthRulesAtStateVerify(t *testing.T) {
}
eventToVerify, err := newEventFromTrustedJSON(
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":2,"event_id":"$xOJZshi3NeKKJiCf:baba.is.you","hashes":{"sha256":"lu5fF5HE090AXdu/+NpJ/RjRVRk/2tWCUozUc5t7Ru4"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"5KoVSLOBesqH9vciKXDExdu95lKFDtK1I72Hq1GG/UeEsH9jx7wL3V4jGYSKDnX2aLYp/VPiBQje7DFjde+hDQ"}},"type":"m.room.message"}`),
false, RoomVersionV1,
false, MustGetRoomVersion(RoomVersionV1),
)
if err != nil {
t.Fatalf("Failed to load test event: %s", err)
Expand Down Expand Up @@ -92,7 +92,7 @@ func TestVerifyAuthRulesAtStateVerifyFailure(t *testing.T) {
}
eventToVerify, err := newEventFromTrustedJSON(
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":2,"event_id":"$xOJZshi3NeKKJiCf:baba.is.you","hashes":{"sha256":"lu5fF5HE090AXdu/+NpJ/RjRVRk/2tWCUozUc5t7Ru4"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"5KoVSLOBesqH9vciKXDExdu95lKFDtK1I72Hq1GG/UeEsH9jx7wL3V4jGYSKDnX2aLYp/VPiBQje7DFjde+hDQ"}},"type":"m.room.message"}`),
false, RoomVersionV1,
false, MustGetRoomVersion(RoomVersionV1),
)
if err != nil {
t.Fatalf("Failed to load test event: %s", err)
Expand Down Expand Up @@ -126,7 +126,7 @@ func TestVerifyAuthRulesAtStateBadAuthRuleButValidState(t *testing.T) {
}
eventToVerify, err := newEventFromTrustedJSON(
[]byte(`{"auth_events":[["$WCraVpPZe5TtHAqs:baba.is.you",{"sha256":"gBxQI2xzDLMoyIjkrpCJFBXC5NnrSemepc7SninSARI"}],["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"content":{"body":"Test Message"},"depth":2,"event_id":"$xOJZshi3NeKKJiCf:baba.is.you","hashes":{"sha256":"lu5fF5HE090AXdu/+NpJ/RjRVRk/2tWCUozUc5t7Ru4"},"origin":"baba.is.you","origin_server_ts":0,"prev_events":[["$fnwGrQEpiOIUoDU2:baba.is.you",{"sha256":"gUr26K5Tt7GQlNs8BlUup92gOzAZHbT8WNEobkrEIqk"}]],"room_id":"!roomid:baba.is.you","sender":"@userid:baba.is.you","signatures":{"baba.is.you":{"ed25519:auto":"5KoVSLOBesqH9vciKXDExdu95lKFDtK1I72Hq1GG/UeEsH9jx7wL3V4jGYSKDnX2aLYp/VPiBQje7DFjde+hDQ"}},"type":"m.room.message"}`),
false, RoomVersionV1,
false, MustGetRoomVersion(RoomVersionV1),
)
if err != nil {
t.Fatalf("Failed to load test event: %s", err)
Expand All @@ -142,7 +142,7 @@ func TestVerifyAuthRulesAtStateBadAuthRuleButValidState(t *testing.T) {

func makeEvents(t *testing.T, in [][]byte) (out []*Event) {
for _, raw := range in {
ev, err := newEventFromTrustedJSON(raw, false, RoomVersionV1)
ev, err := newEventFromTrustedJSON(raw, false, MustGetRoomVersion(RoomVersionV1))
if err != nil {
t.Fatalf("makeEvent failed: %s", err)
}
Expand Down
2 changes: 1 addition & 1 deletion backfill_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ func (t *testBackfillRequester) Backfill(ctx context.Context, origin, server spe
func (t *testBackfillRequester) ProvideEvents(roomVer RoomVersion, eventIDs []string) (result []*Event, err error) {
eventMap := make(map[string]*Event)
for _, eventBytes := range t.authEventsToProvide {
ev, err := newEventFromTrustedJSON(eventBytes, false, RoomVersionV1)
ev, err := newEventFromTrustedJSON(eventBytes, false, MustGetRoomVersion(RoomVersionV1))
if err != nil {
panic("Failed to load event: " + err.Error())
}
Expand Down
82 changes: 28 additions & 54 deletions event.go
Original file line number Diff line number Diff line change
Expand Up @@ -244,20 +244,13 @@ func (eb *EventBuilder) Build(
now time.Time, origin spec.ServerName, keyID KeyID,
privateKey ed25519.PrivateKey, roomVersion RoomVersion,
) (result *Event, err error) {
if ver, ok := SupportedRoomVersions()[roomVersion]; !ok || !ver.Supported {
return nil, UnsupportedRoomVersionError{
Version: roomVersion,
}
}

eventFormat, err := roomVersion.EventFormat()
if err != nil {
return result, err
}
eventIDFormat, err := roomVersion.EventIDFormat()
verImpl, err := GetRoomVersion(roomVersion)
if err != nil {
return result, err
return nil, err
}

eventFormat := verImpl.EventFormat()
eventIDFormat := verImpl.EventIDFormat()
var event struct {
EventBuilder
EventID string `json:"event_id"`
Expand Down Expand Up @@ -369,37 +362,22 @@ func (eb *EventBuilder) Build(
// This checks that the event is valid JSON.
// It also checks the content hashes to ensure the event has not been tampered with.
// This should be used when receiving new events from remote servers.
func newEventFromUntrustedJSON(eventJSON []byte, roomVersion RoomVersion) (result *Event, err error) {
if ver, ok := SupportedRoomVersions()[roomVersion]; !ok || !ver.Supported {
return nil, UnsupportedRoomVersionError{
Version: roomVersion,
}
}

func newEventFromUntrustedJSON(eventJSON []byte, roomVersion RoomVersionImpl) (result *Event, err error) {
if r := gjson.GetBytes(eventJSON, "_*"); r.Exists() {
err = fmt.Errorf("gomatrixserverlib NewEventFromUntrustedJSON: %w", UnexpectedHeaderedEvent{})
return
}

var enforceCanonicalJSON bool
if enforceCanonicalJSON, err = roomVersion.EnforceCanonicalJSON(); err != nil {
return
}
if enforceCanonicalJSON {
if roomVersion.EnforceCanonicalJSON() {
if err = verifyEnforcedCanonicalJSON(eventJSON); err != nil {
err = BadJSONError{err}
return
}
}

result = &Event{}
result.roomVersion = roomVersion
result.roomVersion = roomVersion.ver

var eventFormat EventFormat
eventFormat, err = result.roomVersion.EventFormat()
if err != nil {
return
}
eventFormat := roomVersion.EventFormat()

if eventJSON, err = sjson.DeleteBytes(eventJSON, "unsigned"); err != nil {
return
Expand Down Expand Up @@ -457,15 +435,9 @@ func newEventFromUntrustedJSON(eventJSON []byte, roomVersion RoomVersion) (resul
// newEventFromTrustedJSON loads a new event from some JSON that must be valid.
// This will be more efficient than NewEventFromUntrustedJSON since it can skip cryptographic checks.
// This can be used when loading matrix events from a local database.
func newEventFromTrustedJSON(eventJSON []byte, redacted bool, roomVersion RoomVersion) (result *Event, err error) {
if ver, ok := SupportedRoomVersions()[roomVersion]; !ok || !ver.Supported {
return nil, UnsupportedRoomVersionError{
Version: roomVersion,
}
}

func newEventFromTrustedJSON(eventJSON []byte, redacted bool, roomVersion RoomVersionImpl) (result *Event, err error) {
result = &Event{}
result.roomVersion = roomVersion
result.roomVersion = roomVersion.ver
result.redacted = redacted
err = result.populateFieldsFromJSON("", eventJSON) // "" -> event ID not known
return
Expand All @@ -476,15 +448,9 @@ func newEventFromTrustedJSON(eventJSON []byte, redacted bool, roomVersion RoomVe
// an event from the database and NEVER when accepting an event over federation.
// This will be more efficient than NewEventFromTrustedJSON since, if the event
// ID is known, we skip all the reference hash and canonicalisation work.
func newEventFromTrustedJSONWithEventID(eventID string, eventJSON []byte, redacted bool, roomVersion RoomVersion) (result *Event, err error) {
if ver, ok := SupportedRoomVersions()[roomVersion]; !ok || !ver.Supported {
return nil, UnsupportedRoomVersionError{
Version: roomVersion,
}
}

func newEventFromTrustedJSONWithEventID(eventID string, eventJSON []byte, redacted bool, roomVersion RoomVersionImpl) (result *Event, err error) {
result = &Event{}
result.roomVersion = roomVersion
result.roomVersion = roomVersion.ver
result.redacted = redacted
err = result.populateFieldsFromJSON(eventID, eventJSON)
return
Expand All @@ -497,9 +463,12 @@ func newEventFromTrustedJSONWithEventID(eventID string, eventJSON []byte, redact
// calculations etc as they are expensive operations. If the event
// ID isn't known, pass an empty string and we'll work it out.
func (e *Event) populateFieldsFromJSON(eventIDIfKnown string, eventJSON []byte) error {
verImpl, err := GetRoomVersion(e.roomVersion)
if err != nil {
return err
}
// Work out the format of the event from the room version.
var eventFormat EventFormat
eventFormat, err := e.roomVersion.EventFormat()
eventFormat := verImpl.EventFormat()
if err != nil {
return err
}
Expand Down Expand Up @@ -557,7 +526,11 @@ func (e *Event) Redact() {
if e.redacted {
return
}
eventJSON, err := e.roomVersion.RedactEventJSON(e.eventJSON)
verImpl, err := GetRoomVersion(e.roomVersion)
if err != nil {
panic(fmt.Errorf("gomatrixserverlib: invalid event %v", err))
}
eventJSON, err := verImpl.RedactEventJSON(e.eventJSON)
if err != nil {
// This is unreachable for events created with EventBuilder.Build or NewEventFromUntrustedJSON
panic(fmt.Errorf("gomatrixserverlib: invalid event %v", err))
Expand Down Expand Up @@ -806,11 +779,11 @@ func checkID(id, kind string, sigil byte) (err error) {
}

func (e *Event) generateEventID() (eventID string, err error) {
var eventFormat EventFormat
eventFormat, err = e.roomVersion.EventFormat()
verImpl, err := GetRoomVersion(e.roomVersion)
if err != nil {
return
return "", err
}
eventFormat := verImpl.EventFormat()
switch eventFormat {
case EventFormatV1:
eventID = e.fields.(eventFormatV1Fields).EventID
Expand Down Expand Up @@ -943,10 +916,11 @@ func (e *Event) PrevEventIDs() []string {
}

func (e *Event) extractContent(eventType string, content interface{}) error {
eventFormat, err := e.roomVersion.EventFormat()
verImpl, err := GetRoomVersion(e.roomVersion)
if err != nil {
panic(err)
}
eventFormat := verImpl.EventFormat()
var fields eventFields
switch eventFormat {
case EventFormatV1:
Expand Down
Loading