Add invite_list and cloning param to create room rule

This commit is contained in:
Erik Johnston 2019-03-18 10:16:19 +00:00
parent aa3dc78f65
commit 4eca8d3fb3
5 changed files with 60 additions and 11 deletions

View file

@ -46,13 +46,18 @@ class SpamChecker(object):
return self.spam_checker.check_event_for_spam(event) return self.spam_checker.check_event_for_spam(event)
def user_may_invite(self, inviter_userid, invitee_userid, room_id): def user_may_invite(self, inviter_userid, invitee_userid, room_id, new_room):
"""Checks if a given user may send an invite """Checks if a given user may send an invite
If this method returns false, the invite will be rejected. If this method returns false, the invite will be rejected.
Args: Args:
userid (string): The sender's user ID inviter_userid (str)
invitee_userid (str)
room_id (str)
new_room (bool): Wether the user is being invited to the room as
part of a room creation, if so the invitee would have been
included in the call to `user_may_create_room`.
Returns: Returns:
bool: True if the user may send an invite, otherwise False bool: True if the user may send an invite, otherwise False
@ -60,15 +65,21 @@ class SpamChecker(object):
if self.spam_checker is None: if self.spam_checker is None:
return True return True
return self.spam_checker.user_may_invite(inviter_userid, invitee_userid, room_id) return self.spam_checker.user_may_invite(
inviter_userid, invitee_userid, room_id, new_room,
)
def user_may_create_room(self, userid): def user_may_create_room(self, userid, invite_list, cloning):
"""Checks if a given user may create a room """Checks if a given user may create a room
If this method returns false, the creation request will be rejected. If this method returns false, the creation request will be rejected.
Args: Args:
userid (string): The sender's user ID userid (string): The sender's user ID
invite_list (list[str]): List of user IDs that would be invited to
the new room.
cloning (bool): Whether the user is cloning an existing room, e.g.
upgrading a room.
Returns: Returns:
bool: True if the user may create a room, otherwise False bool: True if the user may create a room, otherwise False
@ -76,7 +87,7 @@ class SpamChecker(object):
if self.spam_checker is None: if self.spam_checker is None:
return True return True
return self.spam_checker.user_may_create_room(userid) return self.spam_checker.user_may_create_room(userid, invite_list, cloning)
def user_may_create_room_alias(self, userid, room_alias): def user_may_create_room_alias(self, userid, room_alias):
"""Checks if a given user may create a room alias """Checks if a given user may create a room alias

View file

@ -1299,7 +1299,7 @@ class FederationHandler(BaseHandler):
raise SynapseError(403, "This server does not accept room invites") raise SynapseError(403, "This server does not accept room invites")
if not self.spam_checker.user_may_invite( if not self.spam_checker.user_may_invite(
event.sender, event.state_key, event.room_id, event.sender, event.state_key, event.room_id, new_room=False,
): ):
raise SynapseError( raise SynapseError(
403, "This user is not permitted to send invites to this server/user" 403, "This user is not permitted to send invites to this server/user"

View file

@ -254,7 +254,11 @@ class RoomCreationHandler(BaseHandler):
""" """
user_id = requester.user.to_string() user_id = requester.user.to_string()
if not self.spam_checker.user_may_create_room(user_id): if not self.spam_checker.user_may_create_room(
user_id,
invite_list=[],
cloning=True,
):
raise SynapseError(403, "You are not permitted to create rooms") raise SynapseError(403, "You are not permitted to create rooms")
creation_content = { creation_content = {
@ -475,7 +479,13 @@ class RoomCreationHandler(BaseHandler):
yield self.auth.check_auth_blocking(user_id) yield self.auth.check_auth_blocking(user_id)
if not self.spam_checker.user_may_create_room(user_id): invite_list = config.get("invite", [])
if not self.spam_checker.user_may_create_room(
user_id,
invite_list=invite_list,
cloning=False,
):
raise SynapseError(403, "You are not permitted to create rooms") raise SynapseError(403, "You are not permitted to create rooms")
if ratelimit: if ratelimit:
@ -518,7 +528,6 @@ class RoomCreationHandler(BaseHandler):
else: else:
room_alias = None room_alias = None
invite_list = config.get("invite", [])
for i in invite_list: for i in invite_list:
try: try:
UserID.from_string(i) UserID.from_string(i)
@ -615,6 +624,7 @@ class RoomCreationHandler(BaseHandler):
"invite", "invite",
ratelimit=False, ratelimit=False,
content=content, content=content,
new_room=True,
) )
for invite_3pid in invite_3pid_list: for invite_3pid in invite_3pid_list:
@ -699,6 +709,7 @@ class RoomCreationHandler(BaseHandler):
"join", "join",
ratelimit=False, ratelimit=False,
content=creator_join_profile, content=creator_join_profile,
new_room=True,
) )
# We treat the power levels override specially as this needs to be one # We treat the power levels override specially as this needs to be one

View file

@ -301,7 +301,30 @@ class RoomMemberHandler(object):
third_party_signed=None, third_party_signed=None,
ratelimit=True, ratelimit=True,
content=None, content=None,
new_room=False,
): ):
"""Update a users membership in a room
Args:
requester (Requester)
target (UserID)
room_id (str)
action (str): The "action" the requester is performing against the
target. One of join/leave/kick/ban/invite/unban.
txn_id (str|None): The transaction ID associated with the request,
or None not provided.
remote_room_hosts (list[str]|None): List of remote servers to try
and join via if server isn't already in the room.
third_party_signed (dict|None): The signed object for third party
invites.
ratelimit (bool): Whether to apply ratelimiting to this request.
content (dict|None): Fields to include in the new events content.
new_room (bool): Whether these membership changes are happening
as part of a room creation (e.g. initial joins and invites)
Returns:
Deferred[FrozenEvent]
"""
key = (room_id,) key = (room_id,)
with (yield self.member_linearizer.queue(key)): with (yield self.member_linearizer.queue(key)):
@ -315,6 +338,7 @@ class RoomMemberHandler(object):
third_party_signed=third_party_signed, third_party_signed=third_party_signed,
ratelimit=ratelimit, ratelimit=ratelimit,
content=content, content=content,
new_room=new_room,
) )
defer.returnValue(result) defer.returnValue(result)
@ -331,6 +355,7 @@ class RoomMemberHandler(object):
third_party_signed=None, third_party_signed=None,
ratelimit=True, ratelimit=True,
content=None, content=None,
new_room=False,
): ):
content_specified = bool(content) content_specified = bool(content)
if content is None: if content is None:
@ -392,6 +417,7 @@ class RoomMemberHandler(object):
if not self.spam_checker.user_may_invite( if not self.spam_checker.user_may_invite(
requester.user.to_string(), target.to_string(), room_id, requester.user.to_string(), target.to_string(), room_id,
new_room=new_room,
): ):
logger.info("Blocking invite due to spam checker") logger.info("Blocking invite due to spam checker")
block_invite = True block_invite = True

View file

@ -48,7 +48,8 @@ class DomainRuleChecker(object):
""" """
return False return False
def user_may_invite(self, inviter_userid, invitee_userid, room_id): def user_may_invite(self, inviter_userid, invitee_userid, room_id,
new_room):
"""Implements synapse.events.SpamChecker.user_may_invite """Implements synapse.events.SpamChecker.user_may_invite
""" """
inviter_domain = self._get_domain_from_id(inviter_userid) inviter_domain = self._get_domain_from_id(inviter_userid)
@ -59,7 +60,7 @@ class DomainRuleChecker(object):
return invitee_domain in self.domain_mapping[inviter_domain] return invitee_domain in self.domain_mapping[inviter_domain]
def user_may_create_room(self, userid): def user_may_create_room(self, userid, invite_list, cloning):
"""Implements synapse.events.SpamChecker.user_may_create_room """Implements synapse.events.SpamChecker.user_may_create_room
""" """
return True return True