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 #2495 from matrix-org/dbkr/spam_check_room_creation
Browse files Browse the repository at this point in the history
Add room creation checks to spam checker
  • Loading branch information
dbkr authored Oct 4, 2017
2 parents 5f20a91 + d8ce68b commit 93b0cf7
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
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

0 comments on commit 93b0cf7

Please sign in to comment.