Encrypted messaging app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.4 KiB

  1. import 'dart:typed_data';
  2. import '/database/models/conversation_users.dart';
  3. import '/database/models/conversations.dart';
  4. import '/utils/storage/database.dart';
  5. import '/utils/encryption/aes_helper.dart';
  6. import '/utils/encryption/crypto_utils.dart';
  7. class ConversationUsersRepository {
  8. static Future<ConversationUser> getConversationUser(Conversation conversation, String userId) async {
  9. final db = await getDatabaseConnection();
  10. final List<Map<String, dynamic>> maps = await db.query(
  11. 'conversation_users',
  12. where: 'conversation_id = ? AND user_id = ?',
  13. whereArgs: [ conversation.id, userId ],
  14. );
  15. if (maps.length != 1) {
  16. throw ArgumentError('Invalid conversation_id or username');
  17. }
  18. return ConversationUser(
  19. id: maps[0]['id'],
  20. userId: maps[0]['user_id'],
  21. conversationId: maps[0]['conversation_id'],
  22. username: maps[0]['username'],
  23. associationKey: maps[0]['association_key'],
  24. publicKey: CryptoUtils.rsaPublicKeyFromPem(maps[0]['asymmetric_public_key']),
  25. admin: maps[0]['admin'] == 1,
  26. );
  27. }
  28. static Future<List<ConversationUser>> getConversationUsers(Conversation conversation) async {
  29. final db = await getDatabaseConnection();
  30. final List<Map<String, dynamic>> maps = await db.query(
  31. 'conversation_users',
  32. where: 'conversation_id = ?',
  33. whereArgs: [ conversation.id ],
  34. orderBy: 'username',
  35. );
  36. List<ConversationUser> conversationUsers = List.generate(maps.length, (i) {
  37. return ConversationUser(
  38. id: maps[i]['id'],
  39. userId: maps[i]['user_id'],
  40. conversationId: maps[i]['conversation_id'],
  41. username: maps[i]['username'],
  42. associationKey: maps[i]['association_key'],
  43. publicKey: CryptoUtils.rsaPublicKeyFromPem(maps[i]['asymmetric_public_key']),
  44. admin: maps[i]['admin'] == 1,
  45. );
  46. });
  47. int index = 0;
  48. List<ConversationUser> finalConversationUsers = [];
  49. for (ConversationUser conversationUser in conversationUsers) {
  50. if (!conversationUser.admin) {
  51. finalConversationUsers.add(conversationUser);
  52. continue;
  53. }
  54. finalConversationUsers.insert(index, conversationUser);
  55. index++;
  56. }
  57. return finalConversationUsers;
  58. }
  59. static Future<List<Map<String, dynamic>>> getEncryptedConversationUsers(Conversation conversation, Uint8List symKey) async {
  60. final db = await getDatabaseConnection();
  61. final List<Map<String, dynamic>> maps = await db.query(
  62. 'conversation_users',
  63. where: 'conversation_id = ?',
  64. whereArgs: [conversation.id],
  65. orderBy: 'username',
  66. );
  67. List<Map<String, dynamic>> conversationUsers = List.generate(maps.length, (i) {
  68. return {
  69. 'id': maps[i]['id'],
  70. 'conversation_id': maps[i]['conversation_id'],
  71. 'user_id': AesHelper.aesEncrypt(symKey, Uint8List.fromList(maps[i]['user_id'].codeUnits)),
  72. 'username': AesHelper.aesEncrypt(symKey, Uint8List.fromList(maps[i]['username'].codeUnits)),
  73. 'association_key': AesHelper.aesEncrypt(symKey, Uint8List.fromList(maps[i]['association_key'].codeUnits)),
  74. 'public_key': AesHelper.aesEncrypt(symKey, Uint8List.fromList(maps[i]['asymmetric_public_key'].codeUnits)),
  75. 'admin': AesHelper.aesEncrypt(symKey, Uint8List.fromList((maps[i]['admin'] == 1 ? 'true' : 'false').codeUnits)),
  76. };
  77. });
  78. return conversationUsers;
  79. }
  80. }