Skip to content

Commit c13e7ef

Browse files
authored
Merge pull request #132 from maltee1/block_parallel_invites
block parallel invites to the same room
2 parents 06adf2f + 41608a8 commit c13e7ef

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

mautrix/bridge/matrix.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
66
from __future__ import annotations
77

8+
from collections import defaultdict
89
import asyncio
910
import logging
1011
import sys
@@ -143,6 +144,7 @@ class BaseMatrixHandler:
143144
media_config: MediaRepoConfig
144145
versions: VersionsResponse
145146
minimum_spec_version: Version = SpecVersions.V11
147+
room_locks: dict[str, asyncio.Lock]
146148

147149
user_id_prefix: str
148150
user_id_suffix: str
@@ -159,6 +161,7 @@ def __init__(
159161
self.media_config = MediaRepoConfig(upload_size=50 * 1024 * 1024)
160162
self.versions = VersionsResponse.deserialize({"versions": ["v1.3"]})
161163
self.az.matrix_event_handler(self.int_handle_event)
164+
self.room_locks = defaultdict(asyncio.Lock)
162165

163166
self.e2ee = None
164167
self.require_e2ee = False
@@ -400,19 +403,20 @@ async def handle_puppet_invite(
400403
await intent.leave_room(room_id, reason="You're not allowed to invite this ghost.")
401404
return
402405

403-
portal = await self.bridge.get_portal(room_id)
404-
if portal:
405-
try:
406-
await portal.handle_matrix_invite(invited_by, puppet)
407-
except br.RejectMatrixInvite as e:
408-
await intent.leave_room(room_id, reason=e.message)
409-
except br.IgnoreMatrixInvite:
410-
pass
406+
async with self.room_locks[room_id]:
407+
portal = await self.bridge.get_portal(room_id)
408+
if portal:
409+
try:
410+
await portal.handle_matrix_invite(invited_by, puppet)
411+
except br.RejectMatrixInvite as e:
412+
await intent.leave_room(room_id, reason=e.message)
413+
except br.IgnoreMatrixInvite:
414+
pass
415+
else:
416+
await intent.join_room(room_id)
417+
return
411418
else:
412-
await intent.join_room(room_id)
413-
return
414-
else:
415-
await self.handle_puppet_nonportal_invite(room_id, puppet, invited_by, evt)
419+
await self.handle_puppet_nonportal_invite(room_id, puppet, invited_by, evt)
416420

417421
async def handle_invite(
418422
self, room_id: RoomID, user_id: UserID, invited_by: br.BaseUser, evt: StateEvent

0 commit comments

Comments
 (0)