@@ -44,6 +44,7 @@ import { logger } from "../../src/logger";
44
44
import { emitPromise } from "../test-utils/test-utils" ;
45
45
import { defer } from "../../src/utils" ;
46
46
import { KnownMembership } from "../../src/@types/membership" ;
47
+ import { SyncCryptoCallbacks } from "../../src/common-crypto/CryptoBackend" ;
47
48
48
49
declare module "../../src/@types/event" {
49
50
interface AccountDataEvents {
@@ -57,6 +58,7 @@ describe("SlidingSyncSdk", () => {
57
58
let httpBackend : MockHttpBackend | undefined ;
58
59
let sdk : SlidingSyncSdk | undefined ;
59
60
let mockSlidingSync : SlidingSync | undefined ;
61
+ let syncCryptoCallback : SyncCryptoCallbacks | undefined ;
60
62
const selfUserId = "@alice:localhost" ;
61
63
const selfAccessToken = "aseukfgwef" ;
62
64
@@ -117,13 +119,19 @@ describe("SlidingSyncSdk", () => {
117
119
} ;
118
120
119
121
// assign client/httpBackend globals
120
- const setupClient = async ( testOpts ?: Partial < IStoredClientOpts > ) => {
122
+ const setupClient = async ( testOpts ?: Partial < IStoredClientOpts & { withCrypto : boolean } > ) => {
121
123
testOpts = testOpts || { } ;
122
124
const syncOpts : SyncApiOptions = { } ;
123
125
const testClient = new TestClient ( selfUserId , "DEVICE" , selfAccessToken ) ;
124
126
httpBackend = testClient . httpBackend ;
125
127
client = testClient . client ;
126
128
mockSlidingSync = mockifySlidingSync ( new SlidingSync ( "" , new Map ( ) , { } , client , 0 ) ) ;
129
+ if ( testOpts . withCrypto ) {
130
+ httpBackend ! . when ( "GET" , "/room_keys/version" ) . respond ( 404 , { } ) ;
131
+ await client ! . initRustCrypto ( { useIndexedDB : false } ) ;
132
+ syncCryptoCallback = client ! . getCrypto ( ) as unknown as SyncCryptoCallbacks ;
133
+ syncOpts . cryptoCallbacks = syncCryptoCallback ;
134
+ }
127
135
httpBackend ! . when ( "GET" , "/_matrix/client/v3/pushrules" ) . respond ( 200 , { } ) ;
128
136
sdk = new SlidingSyncSdk ( mockSlidingSync , client , testOpts , syncOpts ) ;
129
137
} ;
@@ -622,6 +630,54 @@ describe("SlidingSyncSdk", () => {
622
630
} ) ;
623
631
} ) ;
624
632
633
+ describe ( "ExtensionE2EE" , ( ) => {
634
+ let ext : Extension < any , any > ;
635
+
636
+ beforeAll ( async ( ) => {
637
+ await setupClient ( {
638
+ withCrypto : true ,
639
+ } ) ;
640
+ const hasSynced = sdk ! . sync ( ) ;
641
+ await httpBackend ! . flushAllExpected ( ) ;
642
+ await hasSynced ;
643
+ ext = findExtension ( "e2ee" ) ;
644
+ } ) ;
645
+
646
+ it ( "gets enabled on the initial request only" , ( ) => {
647
+ expect ( ext . onRequest ( true ) ) . toEqual ( {
648
+ enabled : true ,
649
+ } ) ;
650
+ expect ( ext . onRequest ( false ) ) . toEqual ( undefined ) ;
651
+ } ) ;
652
+
653
+ it ( "can update device lists" , ( ) => {
654
+ syncCryptoCallback ! . processDeviceLists = jest . fn ( ) ;
655
+ ext . onResponse ( {
656
+ device_lists : {
657
+ changed : [ "@alice:localhost" ] ,
658
+ left : [ "@bob:localhost" ] ,
659
+ } ,
660
+ } ) ;
661
+ expect ( syncCryptoCallback ! . processDeviceLists ) . toHaveBeenCalledWith ( {
662
+ changed : [ "@alice:localhost" ] ,
663
+ left : [ "@bob:localhost" ] ,
664
+ } ) ;
665
+ } ) ;
666
+
667
+ it ( "can update OTK counts and unused fallback keys" , ( ) => {
668
+ syncCryptoCallback ! . processKeyCounts = jest . fn ( ) ;
669
+ ext . onResponse ( {
670
+ device_one_time_keys_count : {
671
+ signed_curve25519 : 42 ,
672
+ } ,
673
+ device_unused_fallback_key_types : [ "signed_curve25519" ] ,
674
+ } ) ;
675
+ expect ( syncCryptoCallback ! . processKeyCounts ) . toHaveBeenCalledWith ( { signed_curve25519 : 42 } , [
676
+ "signed_curve25519" ,
677
+ ] ) ;
678
+ } ) ;
679
+ } ) ;
680
+
625
681
describe ( "ExtensionAccountData" , ( ) => {
626
682
let ext : Extension < any , any > ;
627
683
0 commit comments