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

Simplify the alias deletion logic as an application service. #13093

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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/13093.misc
@@ -0,0 +1 @@
Simplify the alias deletion logic as an application service.
35 changes: 13 additions & 22 deletions synapse/rest/client/directory.py
Expand Up @@ -17,13 +17,7 @@

from twisted.web.server import Request

from synapse.api.errors import (
AuthError,
Codes,
InvalidClientCredentialsError,
NotFoundError,
SynapseError,
)
from synapse.api.errors import AuthError, Codes, NotFoundError, SynapseError
from synapse.http.server import HttpServer
from synapse.http.servlet import RestServlet, parse_json_object_from_request
from synapse.http.site import SynapseRequest
Expand Down Expand Up @@ -96,30 +90,27 @@ async def on_DELETE(
self, request: SynapseRequest, room_alias: str
) -> Tuple[int, JsonDict]:
room_alias_obj = RoomAlias.from_string(room_alias)
requester = await self.auth.get_user_by_req(request)

try:
service = self.auth.get_appservice_by_req(request)
if requester.app_service:
await self.directory_handler.delete_appservice_association(
service, room_alias_obj
requester.app_service, room_alias_obj
)

logger.info(
"Application service at %s deleted alias %s",
service.url,
requester.app_service.url,
room_alias_obj.to_string(),
)
return 200, {}
except InvalidClientCredentialsError:
# fallback to default user behaviour if they aren't an AS
pass

requester = await self.auth.get_user_by_req(request)
user = requester.user

await self.directory_handler.delete_association(requester, room_alias_obj)
else:
await self.directory_handler.delete_association(requester, room_alias_obj)

logger.info(
"User %s deleted alias %s", user.to_string(), room_alias_obj.to_string()
)
logger.info(
"User %s deleted alias %s",
requester.user.to_string(),
room_alias_obj.to_string(),
)

return 200, {}

Expand Down
34 changes: 34 additions & 0 deletions tests/rest/client/test_directory.py
Expand Up @@ -16,6 +16,7 @@

from twisted.test.proto_helpers import MemoryReactor

from synapse.appservice import ApplicationService
from synapse.rest import admin
from synapse.rest.client import directory, login, room
from synapse.server import HomeServer
Expand Down Expand Up @@ -129,6 +130,39 @@ def test_deleting_alias_via_directory(self) -> None:
)
self.assertEqual(channel.code, HTTPStatus.OK, channel.result)

def test_deleting_alias_via_directory_appservice(self) -> None:
user_id = "@as:test"
as_token = "i_am_an_app_service"

appservice = ApplicationService(
as_token,
id="1234",
namespaces={"aliases": [{"regex": "#asns-*", "exclusive": True}]},
sender=user_id,
)
self.hs.get_datastores().main.services_cache.append(appservice)

# Add an alias for the room, as the appservice
alias = RoomAlias(f"asns-{random_string(5)}", self.hs.hostname).to_string()
data = {"room_id": self.room_id}
request_data = json.dumps(data)

channel = self.make_request(
"PUT",
f"/_matrix/client/r0/directory/room/{alias}",
request_data,
access_token=as_token,
)
self.assertEqual(channel.code, HTTPStatus.OK, channel.result)

# Then try to remove the alias, as the appservice
channel = self.make_request(
"DELETE",
f"/_matrix/client/r0/directory/room/{alias}",
access_token=as_token,
)
self.assertEqual(channel.code, HTTPStatus.OK, channel.result)

def test_deleting_nonexistant_alias(self) -> None:
# Check that no alias exists
alias = "#potato:test"
Expand Down