Simplify the alias deletion logic as an application service. (#13093)
parent
5ef05c70c3
commit
73af10f419
|
@ -0,0 +1 @@
|
|||
Simplify the alias deletion logic as an application service.
|
|
@ -17,13 +17,7 @@ from typing import TYPE_CHECKING, Tuple
|
|||
|
||||
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
|
||||
|
@ -96,30 +90,27 @@ class ClientDirectoryServer(RestServlet):
|
|||
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
|
||||
else:
|
||||
await self.directory_handler.delete_association(requester, room_alias_obj)
|
||||
|
||||
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, {}
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ from http import HTTPStatus
|
|||
|
||||
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
|
||||
|
@ -129,6 +130,39 @@ class DirectoryTestCase(unittest.HomeserverTestCase):
|
|||
)
|
||||
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"
|
||||
|
|
Loading…
Reference in New Issue