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 #5477 from matrix-org/babolivier/third_party_rules…
Browse files Browse the repository at this point in the history
…_3pid

Add third party rules hook for 3PID invites
  • Loading branch information
babolivier committed Jun 17, 2019
2 parents 8353ddd + 33ea87b commit d6328e0
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 1 deletion.
1 change: 1 addition & 0 deletions changelog.d/5477.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.
33 changes: 32 additions & 1 deletion synapse/events/third_party_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ def __init__(self, hs):
module, config = hs.config.third_party_event_rules

if module is not None:
self.third_party_rules = module(config=config)
self.third_party_rules = module(
config=config,
http_client=hs.get_simple_http_client(),
)

@defer.inlineCallbacks
def check_event_allowed(self, event, context):
Expand Down Expand Up @@ -81,3 +84,31 @@ def on_create_room(self, requester, config, is_requester_admin):
yield self.third_party_rules.on_create_room(
requester, config, is_requester_admin
)

@defer.inlineCallbacks
def check_threepid_can_be_invited(self, medium, address, room_id):
"""Check if a provided 3PID can be invited in the given room.
Args:
medium (str): The 3PID's medium.
address (str): The 3PID's address.
room_id (str): The room we want to invite the threepid to.
Returns:
defer.Deferred[bool], True if the 3PID can be invited, False if not.
"""

if self.third_party_rules is None:
defer.returnValue(True)

state_ids = yield self.store.get_filtered_current_state_ids(room_id)
room_state_events = yield self.store.get_events(state_ids.values())

state_events = {}
for key, event_id in state_ids.items():
state_events[key] = room_state_events[event_id]

ret = yield self.third_party_rules.check_threepid_can_be_invited(
medium, address, state_events,
)
defer.returnValue(ret)
10 changes: 10 additions & 0 deletions synapse/handlers/room_member.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ def __init__(self, hs):

self.clock = hs.get_clock()
self.spam_checker = hs.get_spam_checker()
self.third_party_event_rules = hs.get_third_party_event_rules()
self._server_notices_mxid = self.config.server_notices_mxid
self._enable_lookup = hs.config.enable_3pid_lookup
self.allow_per_room_profiles = self.config.allow_per_room_profiles
Expand Down Expand Up @@ -723,6 +724,15 @@ def do_3pid_invite(
# can't just rely on the standard ratelimiting of events.
yield self.base_handler.ratelimit(requester)

can_invite = yield self.third_party_event_rules.check_threepid_can_be_invited(
medium, address, room_id,
)
if not can_invite:
raise SynapseError(
403, "This third-party identifier can not be invited in this room",
Codes.FORBIDDEN,
)

invitee = yield self._lookup_3pid(
id_server, medium, address
)
Expand Down

0 comments on commit d6328e0

Please sign in to comment.