diff options
author | Kegsay <kegan@matrix.org> | 2020-08-25 18:59:00 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-25 18:59:00 +0100 |
commit | 55498c8deb262e564e1b79bf4409eb5593f3034e (patch) | |
tree | b02e7f2cd5ee0508c43c0730bee7ea6d603dc1e3 | |
parent | c60270eea31f062f176b59e69e9d9e9e43b4b004 (diff) |
Fix 'Invited user can reject invite over federation several times' (#1341)
-rw-r--r-- | syncapi/storage/postgres/invites_table.go | 8 | ||||
-rw-r--r-- | syncapi/storage/sqlite3/invites_table.go | 8 | ||||
-rw-r--r-- | syncapi/storage/tables/interface.go | 3 | ||||
-rw-r--r-- | sytest-whitelist | 1 |
4 files changed, 19 insertions, 1 deletions
diff --git a/syncapi/storage/postgres/invites_table.go b/syncapi/storage/postgres/invites_table.go index 530dc645..eed58c15 100644 --- a/syncapi/storage/postgres/invites_table.go +++ b/syncapi/storage/postgres/invites_table.go @@ -139,6 +139,14 @@ func (s *inviteEventsStatements) SelectInviteEventsInRange( return nil, nil, err } + // if we have seen this room before, it has a higher stream position and hence takes priority + // because the query is ORDER BY id DESC so drop them + _, isRetired := retired[roomID] + _, isInvited := result[roomID] + if isRetired || isInvited { + continue + } + var event gomatrixserverlib.HeaderedEvent if err := json.Unmarshal(eventJSON, &event); err != nil { return nil, nil, err diff --git a/syncapi/storage/sqlite3/invites_table.go b/syncapi/storage/sqlite3/invites_table.go index 45862efb..7da86683 100644 --- a/syncapi/storage/sqlite3/invites_table.go +++ b/syncapi/storage/sqlite3/invites_table.go @@ -150,6 +150,14 @@ func (s *inviteEventsStatements) SelectInviteEventsInRange( return nil, nil, err } + // if we have seen this room before, it has a higher stream position and hence takes priority + // because the query is ORDER BY id DESC so drop them + _, isRetired := retired[roomID] + _, isInvited := result[roomID] + if isRetired || isInvited { + continue + } + var event gomatrixserverlib.HeaderedEvent if err := json.Unmarshal(eventJSON, &event); err != nil { return nil, nil, err diff --git a/syncapi/storage/tables/interface.go b/syncapi/storage/tables/interface.go index 9d239d23..2ff229cb 100644 --- a/syncapi/storage/tables/interface.go +++ b/syncapi/storage/tables/interface.go @@ -33,7 +33,8 @@ type AccountData interface { type Invites interface { InsertInviteEvent(ctx context.Context, txn *sql.Tx, inviteEvent gomatrixserverlib.HeaderedEvent) (streamPos types.StreamPosition, err error) DeleteInviteEvent(ctx context.Context, inviteEventID string) (types.StreamPosition, error) - // SelectInviteEventsInRange returns a map of room ID to invite events. + // SelectInviteEventsInRange returns a map of room ID to invite events. If multiple invite/retired invites exist in the given range, return the latest value + // for the room. SelectInviteEventsInRange(ctx context.Context, txn *sql.Tx, targetUserID string, r types.Range) (invites map[string]gomatrixserverlib.HeaderedEvent, retired map[string]gomatrixserverlib.HeaderedEvent, err error) SelectMaxInviteID(ctx context.Context, txn *sql.Tx) (id int64, err error) } diff --git a/sytest-whitelist b/sytest-whitelist index 8084bbe3..a17ed840 100644 --- a/sytest-whitelist +++ b/sytest-whitelist @@ -421,6 +421,7 @@ Remote users may not join unfederated rooms Non-numeric ports in server names are rejected Invited user can reject invite over federation Invited user can reject invite over federation for empty room +Invited user can reject invite over federation several times Can reject invites over federation for rooms with version 1 Can reject invites over federation for rooms with version 2 Can reject invites over federation for rooms with version 3 |