Fix 'Invited user can reject invite over federation several times'
MODIFY
syncapi/storage/postgres/invites_table.go
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

MODIFY
syncapi/storage/sqlite3/invites_table.go
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

MODIFY
syncapi/storage/tables/interface.go
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)
}

MODIFY
sytest-whitelist
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

Fix 'Invited user can reject invite over federation several times' (#1341)