diff --git a/lib/src/client.dart b/lib/src/client.dart index e6da4ba7..cc46ce78 100644 --- a/lib/src/client.dart +++ b/lib/src/client.dart @@ -571,12 +571,14 @@ class Client extends MatrixApi { enableEncryption ??= await userOwnsEncryptionKeys(mxid); if (enableEncryption) { initialState ??= []; - initialState.add(StateEvent( - content: { - 'algorithm': supportedGroupEncryptionAlgorithms.first, - }, - type: EventTypes.Encryption, - )); + if (!initialState.any((s) => s.type == EventTypes.Encryption)) { + initialState.add(StateEvent( + content: { + 'algorithm': supportedGroupEncryptionAlgorithms.first, + }, + type: EventTypes.Encryption, + )); + } } // Start a new direct chat @@ -587,12 +589,10 @@ class Client extends MatrixApi { initialState: initialState, ); - if (waitForSync) { - if (getRoomById(roomId) == null) { - // Wait for room actually appears in sync - await onSync.stream.firstWhere( - (sync) => sync.rooms?.join?.containsKey(roomId) ?? false); - } + if (waitForSync && getRoomById(roomId) == null) { + // Wait for room actually appears in sync + await onSync.stream + .firstWhere((sync) => sync.rooms?.join?.containsKey(roomId) ?? false); } await Room(id: roomId, client: this).addToDirectChat(mxid); @@ -615,12 +615,14 @@ class Client extends MatrixApi { encryptionEnabled && preset != CreateRoomPreset.publicChat; if (enableEncryption) { initialState ??= []; - initialState.add(StateEvent( - content: { - 'algorithm': supportedGroupEncryptionAlgorithms.first, - }, - type: EventTypes.Encryption, - )); + if (!initialState.any((s) => s.type == EventTypes.Encryption)) { + initialState.add(StateEvent( + content: { + 'algorithm': supportedGroupEncryptionAlgorithms.first, + }, + type: EventTypes.Encryption, + )); + } } final roomId = await createRoom( invite: invite, diff --git a/lib/src/utils/device_keys_list.dart b/lib/src/utils/device_keys_list.dart index 6babeb1e..a6bdb115 100644 --- a/lib/src/utils/device_keys_list.dart +++ b/lib/src/utils/device_keys_list.dart @@ -67,14 +67,25 @@ class DeviceKeysList { } } - Future startVerification() async { + /// Starts a verification with this device. This might need to create a new + /// direct chat to send the verification request over this room. For this you + /// can set parameters here. + Future startVerification({ + bool? newDirectChatEnableEncryption, + List? newDirectChatInitialState, + }) async { final encryption = client.encryption; if (encryption == null) { throw Exception('Encryption not enabled'); } if (userId != client.userID) { // in-room verification with someone else - final roomId = await client.startDirectChat(userId); + final roomId = await client.startDirectChat( + userId, + enableEncryption: newDirectChatEnableEncryption, + initialState: newDirectChatInitialState, + waitForSync: false, + ); final room = client.getRoomById(roomId) ?? Room(id: roomId, client: client); diff --git a/test/device_keys_list_test.dart b/test/device_keys_list_test.dart index 98560862..13d24f59 100644 --- a/test/device_keys_list_test.dart +++ b/test/device_keys_list_test.dart @@ -252,7 +252,7 @@ void main() { expect(req?.room != null, false); req = await client.userDeviceKeys['@alice:example.com'] - ?.startVerification(); + ?.startVerification(newDirectChatEnableEncryption: false); expect(req != null, true); expect(req?.room != null, true); }); diff --git a/test/encryption/key_verification_test.dart b/test/encryption/key_verification_test.dart index 8a622e44..770af7aa 100644 --- a/test/encryption/key_verification_test.dart +++ b/test/encryption/key_verification_test.dart @@ -119,7 +119,9 @@ void main() { client1.userDeviceKeys[client1.userID]!.masterKey! .setDirectVerified(false); final req1 = - await client1.userDeviceKeys[client2.userID]!.startVerification(); + await client1.userDeviceKeys[client2.userID]!.startVerification( + newDirectChatEnableEncryption: false, + ); var evt = getLastSentEvent(req1); expect(req1.state, KeyVerificationState.waitingAccept); @@ -221,8 +223,8 @@ void main() { client1.userDeviceKeys[client1.userID]!.masterKey! .setDirectVerified(true); await client1.encryption!.ssss.clearCache(); - final req1 = - await client1.userDeviceKeys[client2.userID]!.startVerification(); + final req1 = await client1.userDeviceKeys[client2.userID]! + .startVerification(newDirectChatEnableEncryption: false); expect(req1.state, KeyVerificationState.askSSSS); await req1.openSSSS(recoveryKey: ssssKey); await Future.delayed(Duration(seconds: 1)); @@ -241,8 +243,8 @@ void main() { // the other one has to have their master key verified to trigger asking for ssss client2.userDeviceKeys[client2.userID]!.masterKey! .setDirectVerified(true); - final req1 = - await client1.userDeviceKeys[client2.userID]!.startVerification(); + final req1 = await client1.userDeviceKeys[client2.userID]! + .startVerification(newDirectChatEnableEncryption: false); var evt = getLastSentEvent(req1); expect(req1.state, KeyVerificationState.waitingAccept); @@ -345,8 +347,8 @@ void main() { // make sure our master key is *not* verified to not triger SSSS for now client1.userDeviceKeys[client1.userID]!.masterKey! .setDirectVerified(false); - final req1 = - await client1.userDeviceKeys[client2.userID]!.startVerification(); + final req1 = await client1.userDeviceKeys[client2.userID]! + .startVerification(newDirectChatEnableEncryption: false); var evt = getLastSentEvent(req1); expect(req1.state, KeyVerificationState.waitingAccept); @@ -375,8 +377,8 @@ void main() { // make sure our master key is *not* verified to not triger SSSS for now client1.userDeviceKeys[client1.userID]!.masterKey! .setDirectVerified(false); - final req1 = - await client1.userDeviceKeys[client2.userID]!.startVerification(); + final req1 = await client1.userDeviceKeys[client2.userID]! + .startVerification(newDirectChatEnableEncryption: false); var evt = getLastSentEvent(req1); expect(req1.state, KeyVerificationState.waitingAccept); @@ -436,8 +438,8 @@ void main() { // make sure our master key is *not* verified to not triger SSSS for now client1.userDeviceKeys[client1.userID]!.masterKey! .setDirectVerified(false); - final req1 = - await client1.userDeviceKeys[client2.userID]!.startVerification(); + final req1 = await client1.userDeviceKeys[client2.userID]! + .startVerification(newDirectChatEnableEncryption: false); final evt = getLastSentEvent(req1); expect(req1.state, KeyVerificationState.waitingAccept);