Prevent aliases in AS namespaces being created/deleted by users. Check with ASes when queried for room aliases via federation.

pull/50/head
Kegan Dougal 2015-02-05 16:29:56 +00:00
parent c20281ee33
commit e9484d6a95
1 changed files with 33 additions and 9 deletions

View File

@ -49,6 +49,12 @@ class DirectoryHandler(BaseHandler):
# TODO(erikj): Check if there is a current association. # TODO(erikj): Check if there is a current association.
is_claimed = yield self.is_alias_exclusive_to_appservices(room_alias)
if is_claimed:
raise SynapseError(
400, "This alias is reserved by an application service."
)
if not servers: if not servers:
servers = yield self.store.get_joined_hosts_for_room(room_id) servers = yield self.store.get_joined_hosts_for_room(room_id)
@ -68,6 +74,12 @@ class DirectoryHandler(BaseHandler):
if not self.hs.is_mine(room_alias): if not self.hs.is_mine(room_alias):
raise SynapseError(400, "Room alias must be local") raise SynapseError(400, "Room alias must be local")
is_claimed = yield self.is_alias_exclusive_to_appservices(room_alias)
if is_claimed:
raise SynapseError(
400, "This alias is reserved by an application service."
)
room_id = yield self.store.delete_room_alias(room_alias) room_id = yield self.store.delete_room_alias(room_alias)
if room_id: if room_id:
@ -77,20 +89,13 @@ class DirectoryHandler(BaseHandler):
def get_association(self, room_alias): def get_association(self, room_alias):
room_id = None room_id = None
if self.hs.is_mine(room_alias): if self.hs.is_mine(room_alias):
result = yield self.store.get_association_from_room_alias( result = yield self.get_association_from_room_alias(
room_alias room_alias
) )
if result: if result:
room_id = result.room_id room_id = result.room_id
servers = result.servers servers = result.servers
else:
# Query AS to see if it exists
as_handler = self.hs.get_handlers().appservice_handler
result = yield as_handler.query_room_alias_exists(room_alias)
if result:
room_id = result.room_id
servers = result.servers
else: else:
try: try:
result = yield self.federation.make_query( result = yield self.federation.make_query(
@ -145,7 +150,7 @@ class DirectoryHandler(BaseHandler):
400, "Room Alias is not hosted on this Home Server" 400, "Room Alias is not hosted on this Home Server"
) )
result = yield self.store.get_association_from_room_alias( result = yield self.get_association_from_room_alias(
room_alias room_alias
) )
@ -173,3 +178,22 @@ class DirectoryHandler(BaseHandler):
"sender": user_id, "sender": user_id,
"content": {"aliases": aliases}, "content": {"aliases": aliases},
}, ratelimit=False) }, ratelimit=False)
@defer.inlineCallbacks
def get_association_from_room_alias(self, room_alias):
result = yield self.store.get_association_from_room_alias(
room_alias
)
if not result:
# Query AS to see if it exists
as_handler = self.hs.get_handlers().appservice_handler
result = yield as_handler.query_room_alias_exists(room_alias)
defer.returnValue(result)
@defer.inlineCallbacks
def is_alias_exclusive_to_appservices(self, alias):
services = yield self.store.get_app_services()
interested_services = [
s for s in services if s.is_interested_in_alias(alias.to_string())
]
defer.returnValue(len(interested_services) > 0)