mirror of
https://github.com/element-hq/synapse.git
synced 2024-11-25 19:15:51 +03:00
Register the /devices endpoint on workers. (#9092)
This commit is contained in:
parent
98a64b7f7f
commit
d1eb1b96e8
4 changed files with 34 additions and 11 deletions
1
changelog.d/9092.feature
Normal file
1
changelog.d/9092.feature
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Add experimental support for handling `/devices` API on worker processes.
|
|
@ -214,6 +214,7 @@ expressions:
|
||||||
^/_matrix/client/(api/v1|r0|unstable)/rooms/.*/members$
|
^/_matrix/client/(api/v1|r0|unstable)/rooms/.*/members$
|
||||||
^/_matrix/client/(api/v1|r0|unstable)/rooms/.*/state$
|
^/_matrix/client/(api/v1|r0|unstable)/rooms/.*/state$
|
||||||
^/_matrix/client/(api/v1|r0|unstable)/account/3pid$
|
^/_matrix/client/(api/v1|r0|unstable)/account/3pid$
|
||||||
|
^/_matrix/client/(api/v1|r0|unstable)/devices$
|
||||||
^/_matrix/client/(api/v1|r0|unstable)/keys/query$
|
^/_matrix/client/(api/v1|r0|unstable)/keys/query$
|
||||||
^/_matrix/client/(api/v1|r0|unstable)/keys/changes$
|
^/_matrix/client/(api/v1|r0|unstable)/keys/changes$
|
||||||
^/_matrix/client/versions$
|
^/_matrix/client/versions$
|
||||||
|
|
|
@ -107,6 +107,7 @@ from synapse.rest.client.v2_alpha.account_data import (
|
||||||
AccountDataServlet,
|
AccountDataServlet,
|
||||||
RoomAccountDataServlet,
|
RoomAccountDataServlet,
|
||||||
)
|
)
|
||||||
|
from synapse.rest.client.v2_alpha.devices import DevicesRestServlet
|
||||||
from synapse.rest.client.v2_alpha.keys import (
|
from synapse.rest.client.v2_alpha.keys import (
|
||||||
KeyChangesServlet,
|
KeyChangesServlet,
|
||||||
KeyQueryServlet,
|
KeyQueryServlet,
|
||||||
|
@ -509,6 +510,7 @@ class GenericWorkerServer(HomeServer):
|
||||||
RegisterRestServlet(self).register(resource)
|
RegisterRestServlet(self).register(resource)
|
||||||
LoginRestServlet(self).register(resource)
|
LoginRestServlet(self).register(resource)
|
||||||
ThreepidRestServlet(self).register(resource)
|
ThreepidRestServlet(self).register(resource)
|
||||||
|
DevicesRestServlet(self).register(resource)
|
||||||
KeyQueryServlet(self).register(resource)
|
KeyQueryServlet(self).register(resource)
|
||||||
OneTimeKeyServlet(self).register(resource)
|
OneTimeKeyServlet(self).register(resource)
|
||||||
KeyChangesServlet(self).register(resource)
|
KeyChangesServlet(self).register(resource)
|
||||||
|
|
|
@ -407,6 +407,34 @@ class ClientIpWorkerStore(ClientIpBackgroundUpdateStore):
|
||||||
"_prune_old_user_ips", _prune_old_user_ips_txn
|
"_prune_old_user_ips", _prune_old_user_ips_txn
|
||||||
)
|
)
|
||||||
|
|
||||||
|
async def get_last_client_ip_by_device(
|
||||||
|
self, user_id: str, device_id: Optional[str]
|
||||||
|
) -> Dict[Tuple[str, str], dict]:
|
||||||
|
"""For each device_id listed, give the user_ip it was last seen on.
|
||||||
|
|
||||||
|
The result might be slightly out of date as client IPs are inserted in batches.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
user_id: The user to fetch devices for.
|
||||||
|
device_id: If None fetches all devices for the user
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A dictionary mapping a tuple of (user_id, device_id) to dicts, with
|
||||||
|
keys giving the column names from the devices table.
|
||||||
|
"""
|
||||||
|
|
||||||
|
keyvalues = {"user_id": user_id}
|
||||||
|
if device_id is not None:
|
||||||
|
keyvalues["device_id"] = device_id
|
||||||
|
|
||||||
|
res = await self.db_pool.simple_select_list(
|
||||||
|
table="devices",
|
||||||
|
keyvalues=keyvalues,
|
||||||
|
retcols=("user_id", "ip", "user_agent", "device_id", "last_seen"),
|
||||||
|
)
|
||||||
|
|
||||||
|
return {(d["user_id"], d["device_id"]): d for d in res}
|
||||||
|
|
||||||
|
|
||||||
class ClientIpStore(ClientIpWorkerStore):
|
class ClientIpStore(ClientIpWorkerStore):
|
||||||
def __init__(self, database: DatabasePool, db_conn, hs):
|
def __init__(self, database: DatabasePool, db_conn, hs):
|
||||||
|
@ -512,18 +540,9 @@ class ClientIpStore(ClientIpWorkerStore):
|
||||||
A dictionary mapping a tuple of (user_id, device_id) to dicts, with
|
A dictionary mapping a tuple of (user_id, device_id) to dicts, with
|
||||||
keys giving the column names from the devices table.
|
keys giving the column names from the devices table.
|
||||||
"""
|
"""
|
||||||
|
ret = await super().get_last_client_ip_by_device(user_id, device_id)
|
||||||
|
|
||||||
keyvalues = {"user_id": user_id}
|
# Update what is retrieved from the database with data which is pending insertion.
|
||||||
if device_id is not None:
|
|
||||||
keyvalues["device_id"] = device_id
|
|
||||||
|
|
||||||
res = await self.db_pool.simple_select_list(
|
|
||||||
table="devices",
|
|
||||||
keyvalues=keyvalues,
|
|
||||||
retcols=("user_id", "ip", "user_agent", "device_id", "last_seen"),
|
|
||||||
)
|
|
||||||
|
|
||||||
ret = {(d["user_id"], d["device_id"]): d for d in res}
|
|
||||||
for key in self._batch_row_update:
|
for key in self._batch_row_update:
|
||||||
uid, access_token, ip = key
|
uid, access_token, ip = key
|
||||||
if uid == user_id:
|
if uid == user_id:
|
||||||
|
|
Loading…
Reference in a new issue