aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-05-13 11:52:04 +0100
committerGitHub <noreply@github.com>2022-05-13 11:52:04 +0100
commitbe9be2553f0f18baed07755e81669fd374f3525a (patch)
tree330bfd92c2e34fa8c16db56f409584a922bd17c7
parentcafc2d2c10daeeaf8012a50163d07815b5516043 (diff)
Resolve over old and new extremities (#2457)
* Feed existing state into state res when calculating state from new extremities * Remove duplicates * Fix bug * Sort and unique * Update to matrix-org/gomatrixserverlib#308 * Trim the slice properly * Update gomatrixserverlib again * Update to matrix-org/gomatrixserverlib#308
-rw-r--r--go.mod2
-rw-r--r--go.sum4
-rw-r--r--roomserver/internal/input/input_latest_events.go19
-rw-r--r--roomserver/types/types.go15
4 files changed, 31 insertions, 9 deletions
diff --git a/go.mod b/go.mod
index ca817b00..ecdeb77f 100644
--- a/go.mod
+++ b/go.mod
@@ -30,7 +30,7 @@ require (
github.com/matrix-org/dugong v0.0.0-20210921133753-66e6b1c67e2e
github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91
github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16
- github.com/matrix-org/gomatrixserverlib v0.0.0-20220509120958-8d818048c34c
+ github.com/matrix-org/gomatrixserverlib v0.0.0-20220513103617-eee8fd528433
github.com/matrix-org/pinecone v0.0.0-20220408153826-2999ea29ed48
github.com/matrix-org/util v0.0.0-20200807132607-55161520e1d4
github.com/mattn/go-sqlite3 v1.14.10
diff --git a/go.sum b/go.sum
index 7544768c..145c2a04 100644
--- a/go.sum
+++ b/go.sum
@@ -795,8 +795,8 @@ github.com/matrix-org/go-sqlite3-js v0.0.0-20220419092513-28aa791a1c91/go.mod h1
github.com/matrix-org/gomatrix v0.0.0-20190528120928-7df988a63f26/go.mod h1:3fxX6gUjWyI/2Bt7J1OLhpCzOfO/bB3AiX0cJtEKud0=
github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16 h1:ZtO5uywdd5dLDCud4r0r55eP4j9FuUNpl60Gmntcop4=
github.com/matrix-org/gomatrix v0.0.0-20210324163249-be2af5ef2e16/go.mod h1:/gBX06Kw0exX1HrwmoBibFA98yBk/jxKpGVeyQbff+s=
-github.com/matrix-org/gomatrixserverlib v0.0.0-20220509120958-8d818048c34c h1:KqzqFWxvs90pcDaW9QEveW+Q5JcEYuNnKyaqXc+ohno=
-github.com/matrix-org/gomatrixserverlib v0.0.0-20220509120958-8d818048c34c/go.mod h1:V5eO8rn/C3rcxig37A/BCeKerLFS+9Avg/77FIeTZ48=
+github.com/matrix-org/gomatrixserverlib v0.0.0-20220513103617-eee8fd528433 h1:nwAlThHGPI2EAAJklXvgMcdhXF6ZiHp60+fmaYMoaDA=
+github.com/matrix-org/gomatrixserverlib v0.0.0-20220513103617-eee8fd528433/go.mod h1:V5eO8rn/C3rcxig37A/BCeKerLFS+9Avg/77FIeTZ48=
github.com/matrix-org/pinecone v0.0.0-20220408153826-2999ea29ed48 h1:W0sjjC6yjskHX4mb0nk3p0fXAlbU5bAFUFeEtlrPASE=
github.com/matrix-org/pinecone v0.0.0-20220408153826-2999ea29ed48/go.mod h1:ulJzsVOTssIVp1j/m5eI//4VpAGDkMt5NrRuAVX7wpc=
github.com/matrix-org/util v0.0.0-20190711121626-527ce5ddefc7/go.mod h1:vVQlW/emklohkZnOPwD3LrZUBqdfsbiyO3p1lNV8F6U=
diff --git a/roomserver/internal/input/input_latest_events.go b/roomserver/internal/input/input_latest_events.go
index 9ad8b042..e4c138d5 100644
--- a/roomserver/internal/input/input_latest_events.go
+++ b/roomserver/internal/input/input_latest_events.go
@@ -233,12 +233,19 @@ func (u *latestEventsUpdater) latestState() error {
}
}
- // Get a list of the current latest events. This may or may not
- // include the new event from the input path, depending on whether
- // it is a forward extremity or not.
- latestStateAtEvents := make([]types.StateAtEvent, len(u.latest))
- for i := range u.latest {
- latestStateAtEvents[i] = u.latest[i].StateAtEvent
+ // Take the old set of extremities and the new set of extremities and
+ // mash them together into a list. This may or may not include the new event
+ // from the input path, depending on whether it became a forward extremity
+ // or not. We'll then run state resolution across all of them to determine
+ // the new current state of the room. Including the old extremities here
+ // ensures that new forward extremities with bad state snapshots (from
+ // possible malicious actors) can't completely corrupt the room state
+ // away from what it was before.
+ combinedExtremities := types.StateAtEventAndReferences(append(u.oldLatest, u.latest...))
+ combinedExtremities = combinedExtremities[:util.SortAndUnique(combinedExtremities)]
+ latestStateAtEvents := make([]types.StateAtEvent, len(combinedExtremities))
+ for i := range combinedExtremities {
+ latestStateAtEvents[i] = combinedExtremities[i].StateAtEvent
}
// Takes the NIDs of the latest events and creates a state snapshot
diff --git a/roomserver/types/types.go b/roomserver/types/types.go
index 65fbee04..ce4e5fd1 100644
--- a/roomserver/types/types.go
+++ b/roomserver/types/types.go
@@ -18,6 +18,7 @@ package types
import (
"encoding/json"
"sort"
+ "strings"
"github.com/matrix-org/gomatrixserverlib"
"golang.org/x/crypto/blake2b"
@@ -166,6 +167,20 @@ type StateAtEventAndReference struct {
gomatrixserverlib.EventReference
}
+type StateAtEventAndReferences []StateAtEventAndReference
+
+func (s StateAtEventAndReferences) Less(a, b int) bool {
+ return strings.Compare(s[a].EventID, s[b].EventID) < 0
+}
+
+func (s StateAtEventAndReferences) Len() int {
+ return len(s)
+}
+
+func (s StateAtEventAndReferences) Swap(a, b int) {
+ s[a], s[b] = s[b], s[a]
+}
+
// An Event is a gomatrixserverlib.Event with the numeric event ID attached.
// It is when performing bulk event lookup in the database.
type Event struct {