Support MSC2033: Device ID on whoami (#9918)

* Fix no-access-token bug in deactivation tests
* Support MSC2033: Device ID on whoami
* Test for appservices too

MSC: https://github.com/matrix-org/matrix-doc/pull/2033

The MSC has passed FCP, which means stable endpoints can be used.
This commit is contained in:
Travis Ralston 2021-07-26 23:28:20 -06:00 committed by GitHub
parent b7186c6e8d
commit b3a757eb3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 2 deletions

1
changelog.d/9918.feature Normal file
View File

@ -0,0 +1 @@
Add support for [MSC2033](https://github.com/matrix-org/matrix-doc/pull/2033): `device_id` on `/account/whoami`.

View File

@ -884,7 +884,14 @@ class WhoamiRestServlet(RestServlet):
async def on_GET(self, request): async def on_GET(self, request):
requester = await self.auth.get_user_by_req(request) requester = await self.auth.get_user_by_req(request)
return 200, {"user_id": requester.user.to_string()} response = {"user_id": requester.user.to_string()}
# Appservices and similar accounts do not have device IDs
# that we can report on, so exclude them for compliance.
if requester.device_id is not None:
response["device_id"] = requester.device_id
return 200, response
def register_servlets(hs, http_server): def register_servlets(hs, http_server):

View File

@ -24,6 +24,7 @@ import pkg_resources
import synapse.rest.admin import synapse.rest.admin
from synapse.api.constants import LoginType, Membership from synapse.api.constants import LoginType, Membership
from synapse.api.errors import Codes, HttpResponseException from synapse.api.errors import Codes, HttpResponseException
from synapse.appservice import ApplicationService
from synapse.rest.client.v1 import login, room from synapse.rest.client.v1 import login, room
from synapse.rest.client.v2_alpha import account, register from synapse.rest.client.v2_alpha import account, register
from synapse.rest.synapse.client.password_reset import PasswordResetSubmitTokenResource from synapse.rest.synapse.client.password_reset import PasswordResetSubmitTokenResource
@ -397,7 +398,7 @@ class DeactivateTestCase(unittest.HomeserverTestCase):
self.assertTrue(self.get_success(store.get_user_deactivated_status(user_id))) self.assertTrue(self.get_success(store.get_user_deactivated_status(user_id)))
# Check that this access token has been invalidated. # Check that this access token has been invalidated.
channel = self.make_request("GET", "account/whoami") channel = self.make_request("GET", "account/whoami", access_token=tok)
self.assertEqual(channel.code, 401) self.assertEqual(channel.code, 401)
def test_pending_invites(self): def test_pending_invites(self):
@ -458,6 +459,46 @@ class DeactivateTestCase(unittest.HomeserverTestCase):
self.assertEqual(channel.code, 200) self.assertEqual(channel.code, 200)
class WhoamiTestCase(unittest.HomeserverTestCase):
servlets = [
synapse.rest.admin.register_servlets_for_client_rest_resource,
login.register_servlets,
account.register_servlets,
register.register_servlets,
]
def test_GET_whoami(self):
device_id = "wouldgohere"
user_id = self.register_user("kermit", "test")
tok = self.login("kermit", "test", device_id=device_id)
whoami = self.whoami(tok)
self.assertEqual(whoami, {"user_id": user_id, "device_id": device_id})
def test_GET_whoami_appservices(self):
user_id = "@as:test"
as_token = "i_am_an_app_service"
appservice = ApplicationService(
as_token,
self.hs.config.server_name,
id="1234",
namespaces={"users": [{"regex": user_id, "exclusive": True}]},
sender=user_id,
)
self.hs.get_datastore().services_cache.append(appservice)
whoami = self.whoami(as_token)
self.assertEqual(whoami, {"user_id": user_id})
self.assertFalse(hasattr(whoami, "device_id"))
def whoami(self, tok):
channel = self.make_request("GET", "account/whoami", {}, access_token=tok)
self.assertEqual(channel.code, 200)
return channel.json_body
class ThreepidEmailRestTestCase(unittest.HomeserverTestCase): class ThreepidEmailRestTestCase(unittest.HomeserverTestCase):
servlets = [ servlets = [