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

main
Kegsay 2020-08-25 18:59:00 +01:00 committed by GitHub
parent c60270eea3
commit 55498c8deb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 19 additions and 1 deletions

View File

@ -139,6 +139,14 @@ func (s *inviteEventsStatements) SelectInviteEventsInRange(
return nil, nil, err 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 var event gomatrixserverlib.HeaderedEvent
if err := json.Unmarshal(eventJSON, &event); err != nil { if err := json.Unmarshal(eventJSON, &event); err != nil {
return nil, nil, err return nil, nil, err

View File

@ -150,6 +150,14 @@ func (s *inviteEventsStatements) SelectInviteEventsInRange(
return nil, nil, err 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 var event gomatrixserverlib.HeaderedEvent
if err := json.Unmarshal(eventJSON, &event); err != nil { if err := json.Unmarshal(eventJSON, &event); err != nil {
return nil, nil, err return nil, nil, err

View File

@ -33,7 +33,8 @@ type AccountData interface {
type Invites interface { type Invites interface {
InsertInviteEvent(ctx context.Context, txn *sql.Tx, inviteEvent gomatrixserverlib.HeaderedEvent) (streamPos types.StreamPosition, err error) InsertInviteEvent(ctx context.Context, txn *sql.Tx, inviteEvent gomatrixserverlib.HeaderedEvent) (streamPos types.StreamPosition, err error)
DeleteInviteEvent(ctx context.Context, inviteEventID string) (types.StreamPosition, 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) 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) SelectMaxInviteID(ctx context.Context, txn *sql.Tx) (id int64, err error)
} }

View File

@ -421,6 +421,7 @@ Remote users may not join unfederated rooms
Non-numeric ports in server names are rejected Non-numeric ports in server names are rejected
Invited user can reject invite over federation Invited user can reject invite over federation
Invited user can reject invite over federation for empty room 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 1
Can reject invites over federation for rooms with version 2 Can reject invites over federation for rooms with version 2
Can reject invites over federation for rooms with version 3 Can reject invites over federation for rooms with version 3