Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Merge pull request #5474 from matrix-org/erikj/add_create_room_hook
Browse files Browse the repository at this point in the history
Add third party rules hook into create room
  • Loading branch information
erikjohnston authored Jun 17, 2019
2 parents 40ea934 + e5e6900 commit c834978
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 6 deletions.
1 change: 1 addition & 0 deletions changelog.d/5474.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Allow server admins to define implementations of extra rules for allowing or denying incoming events.
27 changes: 24 additions & 3 deletions synapse/events/third_party_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@


class ThirdPartyEventRules(object):
"""Allows server admins to provide a Python module implementing an extra set of rules
to apply when processing events.
"""Allows server admins to provide a Python module implementing an extra
set of rules to apply when processing events.
This is designed to help admins of closed federations with enforcing custom
behaviours.
Expand Down Expand Up @@ -46,7 +46,7 @@ def check_event_allowed(self, event, context):
context (synapse.events.snapshot.EventContext): The context of the event.
Returns:
defer.Deferred(bool), True if the event should be allowed, False if not.
defer.Deferred[bool]: True if the event should be allowed, False if not.
"""
if self.third_party_rules is None:
defer.returnValue(True)
Expand All @@ -60,3 +60,24 @@ def check_event_allowed(self, event, context):

ret = yield self.third_party_rules.check_event_allowed(event, state_events)
defer.returnValue(ret)

@defer.inlineCallbacks
def on_create_room(self, requester, config, is_requester_admin):
"""Intercept requests to create room to allow, deny or update the
request config.
Args:
requester (Requester)
config (dict): The creation config from the client.
is_requester_admin (bool): If the requester is an admin
Returns:
defer.Deferred
"""

if self.third_party_rules is None:
return

yield self.third_party_rules.on_create_room(
requester, config, is_requester_admin
)
16 changes: 13 additions & 3 deletions synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,8 @@ def __init__(self, hs):

self._server_notices_mxid = hs.config.server_notices_mxid

self.third_party_event_rules = hs.get_third_party_event_rules()

@defer.inlineCallbacks
def upgrade_room(self, requester, old_room_id, new_version):
"""Replace a room with a new room with a different version
Expand Down Expand Up @@ -489,9 +491,6 @@ def create_room(self, requester, config, ratelimit=True,

yield self.auth.check_auth_blocking(user_id)

invite_list = config.get("invite", [])
invite_3pid_list = config.get("invite_3pid", [])

if (self._server_notices_mxid is not None and
requester.user.to_string() == self._server_notices_mxid):
# allow the server notices mxid to create rooms
Expand All @@ -501,6 +500,17 @@ def create_room(self, requester, config, ratelimit=True,
requester.user,
)

# Check whether the third party rules allows/changes the room create
# request.
yield self.third_party_event_rules.on_create_room(
requester,
config,
is_requester_admin=is_requester_admin,
)

invite_list = config.get("invite", [])
invite_3pid_list = config.get("invite_3pid", [])

if not is_requester_admin and not self.spam_checker.user_may_create_room(
user_id,
invite_list=invite_list,
Expand Down

0 comments on commit c834978

Please sign in to comment.