summary refs log tree commit diff
path: root/synapse
diff options
context:
space:
mode:
Diffstat (limited to 'synapse')
-rw-r--r--synapse/handlers/directory.py28
-rw-r--r--synapse/rest/client/v1/directory.py31
2 files changed, 52 insertions, 7 deletions
diff --git a/synapse/handlers/directory.py b/synapse/handlers/directory.py
index 4c15e57fa6..c3c95996e7 100644
--- a/synapse/handlers/directory.py
+++ b/synapse/handlers/directory.py
@@ -87,10 +87,9 @@ class DirectoryHandler(BaseHandler):
 
     @defer.inlineCallbacks
     def delete_association(self, user_id, room_alias):
-        # TODO Check if server admin
+        # association deletion for human users
 
-        if not self.hs.is_mine(room_alias):
-            raise SynapseError(400, "Room alias must be local")
+        # TODO Check if server admin
 
         is_claimed = yield self.is_alias_exclusive_to_appservices(room_alias)
         if is_claimed:
@@ -99,10 +98,29 @@ class DirectoryHandler(BaseHandler):
                 errcode=Codes.EXCLUSIVE
             )
 
+        yield self._delete_association(room_alias)
+
+    @defer.inlineCallbacks
+    def delete_appservice_association(self, service, room_alias):
+        if not service.is_interested_in_alias(room_alias.to_string()):
+            raise SynapseError(
+                400,
+                "This application service has not reserved this kind of alias",
+                errcode=Codes.EXCLUSIVE
+            )
+        yield self._delete_association(room_alias)
+
+    @defer.inlineCallbacks
+    def _delete_association(self, room_alias):
+        if not self.hs.is_mine(room_alias):
+            raise SynapseError(400, "Room alias must be local")
+
         room_id = yield self.store.delete_room_alias(room_alias)
 
-        if room_id:
-            yield self._update_room_alias_events(user_id, room_id)
+        # TODO - Looks like _update_room_alias_event has never been implemented
+        # if room_id:
+        #    yield self._update_room_alias_events(user_id, room_id)
+
 
     @defer.inlineCallbacks
     def get_association(self, room_alias):
diff --git a/synapse/rest/client/v1/directory.py b/synapse/rest/client/v1/directory.py
index f7e910bb40..8e83548bbf 100644
--- a/synapse/rest/client/v1/directory.py
+++ b/synapse/rest/client/v1/directory.py
@@ -87,24 +87,51 @@ class ClientDirectoryServer(ClientV1RestServlet):
             yield dir_handler.create_appservice_association(
                 service, room_alias, room_id, servers
             )
+            logger.info(
+                "Application service at %s created alias %s pointing to %s",
+                service.url,
+                room_alias.to_string(),
+                room_id
+            )
 
         defer.returnValue((200, {}))
 
     @defer.inlineCallbacks
     def on_DELETE(self, request, room_alias):
+        dir_handler = self.handlers.directory_handler
+
+        try:
+            service = yield self.auth.get_appservice_by_req(request)
+            room_alias = RoomAlias.from_string(room_alias)
+            yield dir_handler.delete_appservice_association(
+                service, room_alias
+            )
+            logger.info(
+                "Application service at %s deleted alias %s",
+                service.url,
+                room_alias.to_string()
+            )
+            defer.returnValue((200, {}))
+        except AuthError:
+            # fallback to default user behaviour if they aren't an AS
+            pass
+
         user, client = yield self.auth.get_user_by_req(request)
 
         is_admin = yield self.auth.is_server_admin(user)
         if not is_admin:
             raise AuthError(403, "You need to be a server admin")
 
-        dir_handler = self.handlers.directory_handler
-
         room_alias = RoomAlias.from_string(room_alias)
 
         yield dir_handler.delete_association(
             user.to_string(), room_alias
         )
+        logger.info(
+            "User %s deleted alias %s",
+            user.to_string(),
+            room_alias.to_string()
+        )
 
         defer.returnValue((200, {}))