361 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			361 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'package:famedlysdk/famedlysdk.dart';
 | |
| import 'package:famedlysdk/matrix_api.dart';
 | |
| import '../test/fake_database.dart';
 | |
| 
 | |
| void main() => test();
 | |
| 
 | |
| const String homeserver = 'https://matrix.test.famedly.de';
 | |
| const String testUserA = '@tick:test.famedly.de';
 | |
| const String testPasswordA = 'test';
 | |
| const String testUserB = '@trick:test.famedly.de';
 | |
| const String testPasswordB = 'test';
 | |
| const String testMessage = 'Hello world';
 | |
| const String testMessage2 = 'Hello moon';
 | |
| const String testMessage3 = 'Hello sun';
 | |
| const String testMessage4 = 'Hello star';
 | |
| const String testMessage5 = 'Hello earth';
 | |
| const String testMessage6 = 'Hello mars';
 | |
| 
 | |
| void test() async {
 | |
|   print('++++ Login $testUserA ++++');
 | |
|   var testClientA = Client('TestClientA', debug: false);
 | |
|   testClientA.database = getDatabase();
 | |
|   await testClientA.checkServer(homeserver);
 | |
|   await testClientA.login(testUserA, testPasswordA);
 | |
|   assert(testClientA.encryptionEnabled);
 | |
| 
 | |
|   print('++++ Login $testUserB ++++');
 | |
|   var testClientB = Client('TestClientB', debug: false);
 | |
|   testClientB.database = getDatabase();
 | |
|   await testClientB.checkServer(homeserver);
 | |
|   await testClientB.login(testUserB, testPasswordA);
 | |
|   assert(testClientB.encryptionEnabled);
 | |
| 
 | |
|   print('++++ ($testUserA) Leave all rooms ++++');
 | |
|   while (testClientA.rooms.isNotEmpty) {
 | |
|     var room = testClientA.rooms.first;
 | |
|     if (room.canonicalAlias?.isNotEmpty ?? false) {
 | |
|       break;
 | |
|     }
 | |
|     try {
 | |
|       await room.leave();
 | |
|       await room.forget();
 | |
|     } catch (_) {}
 | |
|   }
 | |
| 
 | |
|   print('++++ ($testUserB) Leave all rooms ++++');
 | |
|   for (var i = 0; i < 3; i++) {
 | |
|     if (testClientB.rooms.isNotEmpty) {
 | |
|       var room = testClientB.rooms.first;
 | |
|       try {
 | |
|         await room.leave();
 | |
|         await room.forget();
 | |
|       } catch (_) {}
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   print('++++ Check if own olm device is verified by default ++++');
 | |
|   assert(testClientA.userDeviceKeys.containsKey(testUserA));
 | |
|   assert(testClientA.userDeviceKeys[testUserA].deviceKeys
 | |
|       .containsKey(testClientA.deviceID));
 | |
|   assert(testClientA
 | |
|       .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].verified);
 | |
|   assert(!testClientA
 | |
|       .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].blocked);
 | |
|   assert(testClientB.userDeviceKeys.containsKey(testUserB));
 | |
|   assert(testClientB.userDeviceKeys[testUserB].deviceKeys
 | |
|       .containsKey(testClientB.deviceID));
 | |
|   assert(testClientB
 | |
|       .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].verified);
 | |
|   assert(!testClientB
 | |
|       .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].blocked);
 | |
| 
 | |
|   print('++++ ($testUserA) Create room and invite $testUserB ++++');
 | |
|   await testClientA.api.createRoom(invite: [testUserB]);
 | |
|   await Future.delayed(Duration(seconds: 1));
 | |
|   var room = testClientA.rooms.first;
 | |
|   assert(room != null);
 | |
|   final roomId = room.id;
 | |
| 
 | |
|   print('++++ ($testUserB) Join room ++++');
 | |
|   var inviteRoom = testClientB.getRoomById(roomId);
 | |
|   await inviteRoom.join();
 | |
|   await Future.delayed(Duration(seconds: 1));
 | |
|   assert(inviteRoom.membership == Membership.join);
 | |
| 
 | |
|   print('++++ ($testUserA) Enable encryption ++++');
 | |
|   assert(room.encrypted == false);
 | |
|   await room.enableEncryption();
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
|   assert(room.encrypted == true);
 | |
|   assert(room.client.encryption.keyManager.getOutboundGroupSession(room.id) ==
 | |
|       null);
 | |
| 
 | |
|   print('++++ ($testUserA) Check known olm devices ++++');
 | |
|   assert(testClientA.userDeviceKeys.containsKey(testUserB));
 | |
|   assert(testClientA.userDeviceKeys[testUserB].deviceKeys
 | |
|       .containsKey(testClientB.deviceID));
 | |
|   assert(!testClientA
 | |
|       .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].verified);
 | |
|   assert(!testClientA
 | |
|       .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].blocked);
 | |
|   assert(testClientB.userDeviceKeys.containsKey(testUserA));
 | |
|   assert(testClientB.userDeviceKeys[testUserA].deviceKeys
 | |
|       .containsKey(testClientA.deviceID));
 | |
|   assert(!testClientB
 | |
|       .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].verified);
 | |
|   assert(!testClientB
 | |
|       .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].blocked);
 | |
|   await testClientA.userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID]
 | |
|       .setVerified(true, testClientA);
 | |
| 
 | |
|   print('++++ Check if own olm device is verified by default ++++');
 | |
|   assert(testClientA.userDeviceKeys.containsKey(testUserA));
 | |
|   assert(testClientA.userDeviceKeys[testUserA].deviceKeys
 | |
|       .containsKey(testClientA.deviceID));
 | |
|   assert(testClientA
 | |
|       .userDeviceKeys[testUserA].deviceKeys[testClientA.deviceID].verified);
 | |
|   assert(testClientB.userDeviceKeys.containsKey(testUserB));
 | |
|   assert(testClientB.userDeviceKeys[testUserB].deviceKeys
 | |
|       .containsKey(testClientB.deviceID));
 | |
|   assert(testClientB
 | |
|       .userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].verified);
 | |
| 
 | |
|   print("++++ ($testUserA) Send encrypted message: '$testMessage' ++++");
 | |
|   await room.sendTextEvent(testMessage);
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
|   assert(room.client.encryption.keyManager.getOutboundGroupSession(room.id) !=
 | |
|       null);
 | |
|   var currentSessionIdA = room.client.encryption.keyManager
 | |
|       .getOutboundGroupSession(room.id)
 | |
|       .outboundGroupSession
 | |
|       .session_id();
 | |
|   assert(room.client.encryption.keyManager
 | |
|           .getInboundGroupSession(room.id, currentSessionIdA, '') !=
 | |
|       null);
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].first
 | |
|           .session_id() ==
 | |
|       testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].first
 | |
|           .session_id());
 | |
|   assert(inviteRoom.client.encryption.keyManager
 | |
|           .getInboundGroupSession(inviteRoom.id, currentSessionIdA, '') !=
 | |
|       null);
 | |
|   assert(room.lastMessage == testMessage);
 | |
|   assert(inviteRoom.lastMessage == testMessage);
 | |
|   print(
 | |
|       "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");
 | |
| 
 | |
|   print("++++ ($testUserA) Send again encrypted message: '$testMessage2' ++++");
 | |
|   await room.sendTextEvent(testMessage2);
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].first
 | |
|           .session_id() ==
 | |
|       testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].first
 | |
|           .session_id());
 | |
| 
 | |
|   assert(room.client.encryption.keyManager
 | |
|           .getOutboundGroupSession(room.id)
 | |
|           .outboundGroupSession
 | |
|           .session_id() ==
 | |
|       currentSessionIdA);
 | |
|   assert(room.client.encryption.keyManager
 | |
|           .getInboundGroupSession(room.id, currentSessionIdA, '') !=
 | |
|       null);
 | |
|   assert(room.lastMessage == testMessage2);
 | |
|   assert(inviteRoom.lastMessage == testMessage2);
 | |
|   print(
 | |
|       "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");
 | |
| 
 | |
|   print("++++ ($testUserB) Send again encrypted message: '$testMessage3' ++++");
 | |
|   await inviteRoom.sendTextEvent(testMessage3);
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].length ==
 | |
|       1);
 | |
|   assert(room.client.encryption.keyManager
 | |
|           .getOutboundGroupSession(room.id)
 | |
|           .outboundGroupSession
 | |
|           .session_id() ==
 | |
|       currentSessionIdA);
 | |
|   var inviteRoomOutboundGroupSession = inviteRoom.client.encryption.keyManager
 | |
|       .getOutboundGroupSession(inviteRoom.id);
 | |
| 
 | |
|   assert(inviteRoomOutboundGroupSession != null);
 | |
|   assert(inviteRoom.client.encryption.keyManager.getInboundGroupSession(
 | |
|           inviteRoom.id,
 | |
|           inviteRoomOutboundGroupSession.outboundGroupSession.session_id(),
 | |
|           '') !=
 | |
|       null);
 | |
|   assert(room.client.encryption.keyManager.getInboundGroupSession(
 | |
|           room.id,
 | |
|           inviteRoomOutboundGroupSession.outboundGroupSession.session_id(),
 | |
|           '') !=
 | |
|       null);
 | |
|   assert(inviteRoom.lastMessage == testMessage3);
 | |
|   assert(room.lastMessage == testMessage3);
 | |
|   print(
 | |
|       "++++ ($testUserA) Received decrypted message: '${room.lastMessage}' ++++");
 | |
| 
 | |
|   print('++++ Login $testUserB in another client ++++');
 | |
|   var testClientC =
 | |
|       Client('TestClientC', debug: false, database: getDatabase());
 | |
|   await testClientC.checkServer(homeserver);
 | |
|   await testClientC.login(testUserB, testPasswordA);
 | |
|   await Future.delayed(Duration(seconds: 3));
 | |
| 
 | |
|   print("++++ ($testUserA) Send again encrypted message: '$testMessage4' ++++");
 | |
|   await room.sendTextEvent(testMessage4);
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].first
 | |
|           .session_id() ==
 | |
|       testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].first
 | |
|           .session_id());
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientC.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientC
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientC.identityKey].first
 | |
|           .session_id() ==
 | |
|       testClientC
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].first
 | |
|           .session_id());
 | |
|   assert(room.client.encryption.keyManager
 | |
|           .getOutboundGroupSession(room.id)
 | |
|           .outboundGroupSession
 | |
|           .session_id() !=
 | |
|       currentSessionIdA);
 | |
|   currentSessionIdA = room.client.encryption.keyManager
 | |
|       .getOutboundGroupSession(room.id)
 | |
|       .outboundGroupSession
 | |
|       .session_id();
 | |
|   assert(inviteRoom.client.encryption.keyManager
 | |
|           .getInboundGroupSession(inviteRoom.id, currentSessionIdA, '') !=
 | |
|       null);
 | |
|   assert(room.lastMessage == testMessage4);
 | |
|   assert(inviteRoom.lastMessage == testMessage4);
 | |
|   print(
 | |
|       "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");
 | |
| 
 | |
|   print('++++ Logout $testUserB another client ++++');
 | |
|   await testClientC.dispose();
 | |
|   await testClientC.logout();
 | |
|   testClientC = null;
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
| 
 | |
|   print("++++ ($testUserA) Send again encrypted message: '$testMessage6' ++++");
 | |
|   await room.sendTextEvent(testMessage6);
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].length ==
 | |
|       1);
 | |
|   assert(testClientA
 | |
|           .encryption.olmManager.olmSessions[testClientB.identityKey].first
 | |
|           .session_id() ==
 | |
|       testClientB
 | |
|           .encryption.olmManager.olmSessions[testClientA.identityKey].first
 | |
|           .session_id());
 | |
|   assert(room.client.encryption.keyManager
 | |
|           .getOutboundGroupSession(room.id)
 | |
|           .outboundGroupSession
 | |
|           .session_id() !=
 | |
|       currentSessionIdA);
 | |
|   currentSessionIdA = room.client.encryption.keyManager
 | |
|       .getOutboundGroupSession(room.id)
 | |
|       .outboundGroupSession
 | |
|       .session_id();
 | |
|   assert(inviteRoom.client.encryption.keyManager
 | |
|           .getInboundGroupSession(inviteRoom.id, currentSessionIdA, '') !=
 | |
|       null);
 | |
|   assert(room.lastMessage == testMessage6);
 | |
|   assert(inviteRoom.lastMessage == testMessage6);
 | |
|   print(
 | |
|       "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");
 | |
| 
 | |
| /*  print('++++ ($testUserA) Restore user ++++');
 | |
|   await testClientA.dispose();
 | |
|   testClientA = null;
 | |
|   testClientA = Client(
 | |
|     'TestClientA',
 | |
|     debug: false,
 | |
|     database: getDatabase(),
 | |
|   );
 | |
|   testClientA.connect();
 | |
|   await Future.delayed(Duration(seconds: 3));
 | |
|   var restoredRoom = testClientA.rooms.first;
 | |
|   assert(room != null);
 | |
|   assert(restoredRoom.id == room.id);
 | |
|   assert(restoredRoom.outboundGroupSession.session_id() ==
 | |
|       room.outboundGroupSession.session_id());
 | |
|   assert(restoredRoom.inboundGroupSessions.length == 4);
 | |
|   assert(restoredRoom.inboundGroupSessions.length ==
 | |
|       room.inboundGroupSessions.length);
 | |
|   for (var i = 0; i < restoredRoom.inboundGroupSessions.length; i++) {
 | |
|     assert(restoredRoom.inboundGroupSessions.keys.toList()[i] ==
 | |
|         room.inboundGroupSessions.keys.toList()[i]);
 | |
|   }
 | |
|   assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].length == 1);
 | |
|   assert(testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].length == 1);
 | |
|   assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].first.session_id() ==
 | |
|       testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].first.session_id());
 | |
| 
 | |
|   print("++++ ($testUserA) Send again encrypted message: '$testMessage5' ++++");
 | |
|   await restoredRoom.sendTextEvent(testMessage5);
 | |
|   await Future.delayed(Duration(seconds: 5));
 | |
|   assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].length == 1);
 | |
|   assert(testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].length == 1);
 | |
|   assert(testClientA.encryption.olmManager.olmSessions[testClientB.identityKey].first.session_id() ==
 | |
|       testClientB.encryption.olmManager.olmSessions[testClientA.identityKey].first.session_id());
 | |
|   assert(restoredRoom.lastMessage == testMessage5);
 | |
|   assert(inviteRoom.lastMessage == testMessage5);
 | |
|   assert(testClientB.getRoomById(roomId).lastMessage == testMessage5);
 | |
|   print(
 | |
|       "++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");*/
 | |
| 
 | |
|   print('++++ Logout $testUserA and $testUserB ++++');
 | |
|   await room.leave();
 | |
|   await room.forget();
 | |
|   await inviteRoom.leave();
 | |
|   await inviteRoom.forget();
 | |
|   await Future.delayed(Duration(seconds: 1));
 | |
|   await testClientA.dispose();
 | |
|   await testClientB.dispose();
 | |
|   await testClientA.api.logoutAll();
 | |
|   await testClientB.api.logoutAll();
 | |
|   testClientA = null;
 | |
|   testClientB = null;
 | |
|   return;
 | |
| }
 |