diff --git a/synapse/appservice/api.py b/synapse/appservice/api.py
index 9cce4e0973..15ac1e27fc 100644
--- a/synapse/appservice/api.py
+++ b/synapse/appservice/api.py
@@ -41,7 +41,7 @@ class ApplicationServiceApi(SimpleHttpClient):
response = yield self.get_json(uri, {
"access_token": service.hs_token
})
- if response: # just an empty json object
+ if response is not None: # just an empty json object
defer.returnValue(True)
except CodeMessageException as e:
if e.code == 404:
@@ -60,13 +60,13 @@ class ApplicationServiceApi(SimpleHttpClient):
response = yield self.get_json(uri, {
"access_token": service.hs_token
})
- if response: # just an empty json object
+ if response is not None: # just an empty json object
defer.returnValue(True)
except CodeMessageException as e:
+ logger.warning("query_alias to %s received %s", uri, e.code)
if e.code == 404:
defer.returnValue(False)
return
- logger.warning("query_alias to %s received %s", uri, e.code)
except Exception as ex:
logger.warning("query_alias to %s threw exception %s", uri, ex)
defer.returnValue(False)
diff --git a/synapse/handlers/appservice.py b/synapse/handlers/appservice.py
index 5071a12eb1..8591a77bf3 100644
--- a/synapse/handlers/appservice.py
+++ b/synapse/handlers/appservice.py
@@ -124,15 +124,15 @@ class ApplicationServicesHandler(object):
namedtuple: with keys "room_id" and "servers" or None if no
association can be found.
"""
- room_alias = room_alias.to_string()
+ room_alias_str = room_alias.to_string()
alias_query_services = yield self._get_services_for_event(
event=None,
restrict_to=ApplicationService.NS_ALIASES,
- alias_list=[room_alias]
+ alias_list=[room_alias_str]
)
for alias_service in alias_query_services:
is_known_alias = yield self.appservice_api.query_alias(
- alias_service, room_alias
+ alias_service, room_alias_str
)
if is_known_alias:
# the alias exists now so don't query more ASes.
diff --git a/synapse/handlers/directory.py b/synapse/handlers/directory.py
index 22c6391a15..87bc12c983 100644
--- a/synapse/handlers/directory.py
+++ b/synapse/handlers/directory.py
@@ -64,8 +64,11 @@ class DirectoryHandler(BaseHandler):
# association creation for human users
# TODO(erikj): Do user auth.
- is_claimed = yield self.is_alias_exclusive_to_appservices(room_alias)
- if is_claimed:
+ can_create = yield self.can_modify_alias(
+ room_alias,
+ user_id=user_id
+ )
+ if not can_create:
raise SynapseError(
400, "This alias is reserved by an application service.",
errcode=Codes.EXCLUSIVE
@@ -91,8 +94,11 @@ class DirectoryHandler(BaseHandler):
# TODO Check if server admin
- is_claimed = yield self.is_alias_exclusive_to_appservices(room_alias)
- if is_claimed:
+ can_delete = yield self.can_modify_alias(
+ room_alias,
+ user_id=user_id
+ )
+ if not can_delete:
raise SynapseError(
400, "This alias is reserved by an application service.",
errcode=Codes.EXCLUSIVE
@@ -228,9 +234,14 @@ class DirectoryHandler(BaseHandler):
defer.returnValue(result)
@defer.inlineCallbacks
- def is_alias_exclusive_to_appservices(self, alias):
+ def can_modify_alias(self, alias, user_id=None):
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)
+ for service in interested_services:
+ if user_id == service.sender:
+ # this user IS the app service
+ defer.returnValue(True)
+ return
+ defer.returnValue(len(interested_services) == 0)
|