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

Add room creation checks to spam checker #2495

Merged
merged 3 commits into from
Oct 4, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions synapse/events/spamcheck.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,53 @@ def user_may_invite(self, userid, room_id):
return True

return self.spam_checker.user_may_invite(userid, room_id)

def user_may_create_room(self, userid):
"""Checks if a given user may create a room

If this method returns false, the creation request will be rejected.

Args:
userid (string): The sender's user ID

Returns:
bool: True if the user may create a room, otherwise False
"""
if self.spam_checker is None:
return True

return self.spam_checker.user_may_create_room(userid)

def user_may_create_room_alias(self, userid, room_alias):
"""Checks if a given user may create a room alias

If this method returns false, the association request will be rejected.

Args:
userid (string): The sender's user ID
room_alias (string): The alias to be created

Returns:
bool: True if the user may create a room alias, otherwise False
"""
if self.spam_checker is None:
return True

return self.spam_checker.user_may_create_room_alias(userid, room_alias)

def user_may_publish_room(self, userid, room_id):
"""Checks if a given user may publish a room to the directory

If this method returns false, the publish request will be rejected.

Args:
userid (string): The sender's user ID
room_id (string): The ID of the room that would be published

Returns:
bool: True if the user may publish the room, otherwise False
"""
if self.spam_checker is None:
return True

return self.spam_checker.user_may_publish_room(userid, room_id)
15 changes: 15 additions & 0 deletions synapse/handlers/directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ def __init__(self, hs):
"directory", self.on_directory_query
)

self.spam_checker = hs.get_spam_checker()

@defer.inlineCallbacks
def _create_association(self, room_alias, room_id, servers=None, creator=None):
# general association creation for both human users and app services
Expand Down Expand Up @@ -73,6 +75,11 @@ def create_association(self, user_id, room_alias, room_id, servers=None):
# association creation for human users
# TODO(erikj): Do user auth.

if not self.spam_checker.user_may_create_room_alias(user_id, room_alias):
raise SynapseError(
403, "This user is not permitted to create this alias",
)

can_create = yield self.can_modify_alias(
room_alias,
user_id=user_id
Expand Down Expand Up @@ -327,6 +334,14 @@ def edit_published_room_list(self, requester, room_id, visibility):
room_id (str)
visibility (str): "public" or "private"
"""
if not self.spam_checker.user_may_publish_room(
requester.user.to_string(), room_id
):
raise AuthError(
403,
"This user is not permitted to publish rooms to the room list"
)

if requester.is_guest:
raise AuthError(403, "Guests cannot edit the published room list")

Expand Down
8 changes: 8 additions & 0 deletions synapse/handlers/room.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ class RoomCreationHandler(BaseHandler):
},
}

def __init__(self, hs):
super(RoomCreationHandler, self).__init__(hs)

self.spam_checker = hs.get_spam_checker()

@defer.inlineCallbacks
def create_room(self, requester, config, ratelimit=True):
""" Creates a new room.
Expand All @@ -75,6 +80,9 @@ def create_room(self, requester, config, ratelimit=True):
"""
user_id = requester.user.to_string()

if not self.spam_checker.user_may_create_room(user_id):
raise SynapseError(403, "You are not permitted to create rooms")

if ratelimit:
yield self.ratelimit(requester)

Expand Down