@@ -907,6 +907,7 @@ async def user_device_resync(
907
907
master_key = result .get ("master_key" )
908
908
self_signing_key = result .get ("self_signing_key" )
909
909
910
+ ignore_devices = False
910
911
# If the remote server has more than ~1000 devices for this user
911
912
# we assume that something is going horribly wrong (e.g. a bot
912
913
# that logs in and creates a new device every time it tries to
@@ -925,6 +926,12 @@ async def user_device_resync(
925
926
len (devices ),
926
927
)
927
928
devices = []
929
+ ignore_devices = True
930
+ else :
931
+ cached_devices = await self .store .get_cached_devices_for_user (user_id )
932
+ if cached_devices == {d ["device_id" ]: d for d in devices }:
933
+ devices = []
934
+ ignore_devices = True
928
935
929
936
for device in devices :
930
937
logger .debug (
@@ -934,7 +941,10 @@ async def user_device_resync(
934
941
stream_id ,
935
942
)
936
943
937
- await self .store .update_remote_device_list_cache (user_id , devices , stream_id )
944
+ if not ignore_devices :
945
+ await self .store .update_remote_device_list_cache (
946
+ user_id , devices , stream_id
947
+ )
938
948
device_ids = [device ["device_id" ] for device in devices ]
939
949
940
950
# Handle cross-signing keys.
@@ -945,7 +955,8 @@ async def user_device_resync(
945
955
)
946
956
device_ids = device_ids + cross_signing_device_ids
947
957
948
- await self .device_handler .notify_device_update (user_id , device_ids )
958
+ if device_ids :
959
+ await self .device_handler .notify_device_update (user_id , device_ids )
949
960
950
961
# We clobber the seen updates since we've re-synced from a given
951
962
# point.
@@ -973,14 +984,17 @@ async def process_cross_signing_key_update(
973
984
"""
974
985
device_ids = []
975
986
976
- if master_key :
987
+ current_keys_map = await self .store .get_e2e_cross_signing_keys_bulk ([user_id ])
988
+ current_keys = current_keys_map .get (user_id ) or {}
989
+
990
+ if master_key and master_key != current_keys .get ("master" ):
977
991
await self .store .set_e2e_cross_signing_key (user_id , "master" , master_key )
978
992
_ , verify_key = get_verify_key_from_cross_signing_key (master_key )
979
993
# verify_key is a VerifyKey from signedjson, which uses
980
994
# .version to denote the portion of the key ID after the
981
995
# algorithm and colon, which is the device ID
982
996
device_ids .append (verify_key .version )
983
- if self_signing_key :
997
+ if self_signing_key and self_signing_key != current_keys . get ( "self_signing" ) :
984
998
await self .store .set_e2e_cross_signing_key (
985
999
user_id , "self_signing" , self_signing_key
986
1000
)
0 commit comments