27
27
import synapse .rest .admin
28
28
from synapse .api .errors import Codes
29
29
from synapse .handlers .device import DeviceHandler
30
- from synapse .rest .client import login
30
+ from synapse .rest .client import devices , login
31
31
from synapse .server import HomeServer
32
32
from synapse .util import Clock
33
33
@@ -299,6 +299,7 @@ def test_delete_device(self) -> None:
299
299
class DevicesRestTestCase (unittest .HomeserverTestCase ):
300
300
servlets = [
301
301
synapse .rest .admin .register_servlets ,
302
+ devices .register_servlets ,
302
303
login .register_servlets ,
303
304
]
304
305
@@ -390,15 +391,63 @@ def test_user_has_no_devices(self) -> None:
390
391
self .assertEqual (0 , channel .json_body ["total" ])
391
392
self .assertEqual (0 , len (channel .json_body ["devices" ]))
392
393
394
+ @unittest .override_config (
395
+ {"experimental_features" : {"msc2697_enabled" : False , "msc3814_enabled" : True }}
396
+ )
393
397
def test_get_devices (self ) -> None :
394
398
"""
395
399
Tests that a normal lookup for devices is successfully
396
400
"""
397
401
# Create devices
398
402
number_devices = 5
399
- for _ in range (number_devices ):
403
+ # we create 2 fewer devices in the loop, because we will create another
404
+ # login after the loop, and we will create a dehydrated device
405
+ for _ in range (number_devices - 2 ):
400
406
self .login ("user" , "pass" )
401
407
408
+ other_user_token = self .login ("user" , "pass" )
409
+ dehydrated_device_url = (
410
+ "/_matrix/client/unstable/org.matrix.msc3814.v1/dehydrated_device"
411
+ )
412
+ content = {
413
+ "device_data" : {
414
+ "algorithm" : "m.dehydration.v1.olm" ,
415
+ },
416
+ "device_id" : "dehydrated_device" ,
417
+ "initial_device_display_name" : "foo bar" ,
418
+ "device_keys" : {
419
+ "user_id" : "@user:test" ,
420
+ "device_id" : "dehydrated_device" ,
421
+ "valid_until_ts" : "80" ,
422
+ "algorithms" : [
423
+ "m.olm.curve25519-aes-sha2" ,
424
+ ],
425
+ "keys" : {
426
+ "<algorithm>:<device_id>" : "<key_base64>" ,
427
+ },
428
+ "signatures" : {
429
+ "@user:test" : {"<algorithm>:<device_id>" : "<signature_base64>" }
430
+ },
431
+ },
432
+ "fallback_keys" : {
433
+ "alg1:device1" : "f4llb4ckk3y" ,
434
+ "signed_<algorithm>:<device_id>" : {
435
+ "fallback" : "true" ,
436
+ "key" : "f4llb4ckk3y" ,
437
+ "signatures" : {
438
+ "@user:test" : {"<algorithm>:<device_id>" : "<key_base64>" }
439
+ },
440
+ },
441
+ },
442
+ "one_time_keys" : {"alg1:k1" : "0net1m3k3y" },
443
+ }
444
+ self .make_request (
445
+ "PUT" ,
446
+ dehydrated_device_url ,
447
+ access_token = other_user_token ,
448
+ content = content ,
449
+ )
450
+
402
451
# Get devices
403
452
channel = self .make_request (
404
453
"GET" ,
@@ -410,13 +459,22 @@ def test_get_devices(self) -> None:
410
459
self .assertEqual (number_devices , channel .json_body ["total" ])
411
460
self .assertEqual (number_devices , len (channel .json_body ["devices" ]))
412
461
self .assertEqual (self .other_user , channel .json_body ["devices" ][0 ]["user_id" ])
413
- # Check that all fields are available
462
+ # Check that all fields are available, and that the dehydrated device is marked as dehydrated
463
+ found_dehydrated = False
414
464
for d in channel .json_body ["devices" ]:
415
465
self .assertIn ("user_id" , d )
416
466
self .assertIn ("device_id" , d )
417
467
self .assertIn ("display_name" , d )
418
468
self .assertIn ("last_seen_ip" , d )
419
469
self .assertIn ("last_seen_ts" , d )
470
+ if d ["device_id" ] == "dehydrated_device" :
471
+ self .assertTrue (d .get ("dehydrated" ))
472
+ found_dehydrated = True
473
+ else :
474
+ # Either the field is not present, or set to False
475
+ self .assertFalse (d .get ("dehydrated" ))
476
+
477
+ self .assertTrue (found_dehydrated )
420
478
421
479
422
480
class DeleteDevicesRestTestCase (unittest .HomeserverTestCase ):
0 commit comments