summary refs log tree commit diff
diff options
context:
space:
mode:
authorMatthew Hodgson <matthew@arasphere.net>2019-01-15 21:47:00 +0000
committerGitHub <noreply@github.com>2019-01-15 21:47:00 +0000
commitb43172ffbceb5b9a703073e4ade17e9e9ec4cd38 (patch)
treebbfe5298b1d366804cffbc43dbaba2bb4a37e806
parentMerge tag 'v0.34.1.1' into matrix-org-hotfixes (diff)
parentdrop the limit to 1K as e2e will be hosed beyond that point anyway (diff)
downloadsynapse-b43172ffbceb5b9a703073e4ade17e9e9ec4cd38.tar.xz
Merge pull request #4396 from matrix-org/matthew/bodge_device_update_dos
limit remote device lists to 10000 entries per user
-rw-r--r--synapse/handlers/device.py15
1 files changed, 15 insertions, 0 deletions
diff --git a/synapse/handlers/device.py b/synapse/handlers/device.py

index 9e017116a9..a93dfd1d63 100644 --- a/synapse/handlers/device.py +++ b/synapse/handlers/device.py
@@ -532,6 +532,21 @@ class DeviceListEduUpdater(object): stream_id = result["stream_id"] devices = result["devices"] + + # If the remote server has more than ~1000 devices for this user + # we assume that something is going horribly wrong (e.g. a bot + # that logs in and creates a new device every time it tries to + # send a message). Maintaining lots of devices per user in the + # cache can cause serious performance issues as if this request + # takes more than 60s to complete, internal replication from the + # inbound federation worker to the synapse master may time out + # causing the inbound federation to fail and causing the remote + # server to retry, causing a DoS. So in this scenario we give + # up on storing the total list of devices and only handle the + # delta instead. + if len(devices) > 1000: + devices = [] + yield self.store.update_remote_device_list_cache( user_id, devices, stream_id, )