import 'dart:convert'; import 'dart:typed_data'; import 'package:Envelope/database/repositories/conversation_users_repository.dart'; import 'package:pointycastle/pointycastle.dart'; import '/database/models/conversation_users.dart'; import '/database/models/my_profile.dart'; import '/database/models/conversations.dart'; import '/utils/encryption/crypto_utils.dart'; const messageTypeReceiver = 'receiver'; const messageTypeSender = 'sender'; class Message { String id; String symmetricKey; String userSymmetricKey; String senderId; String senderUsername; String associationKey; String createdAt; bool failedToSend; Message({ required this.id, required this.symmetricKey, required this.userSymmetricKey, required this.senderId, required this.senderUsername, required this.associationKey, required this.createdAt, required this.failedToSend, }); Future>> payloadJsonBase( Uint8List symmetricKey, Uint8List userSymmetricKey, Conversation conversation, String messageId, String messageDataId, ) async { MyProfile profile = await MyProfile.getProfile(); if (profile.publicKey == null) { throw Exception('Could not get profile.publicKey'); } RSAPublicKey publicKey = profile.publicKey!; List> messages = []; List conversationUsers = await ConversationUsersRepository.getConversationUsers(conversation); for (var i = 0; i < conversationUsers.length; i++) { ConversationUser user = conversationUsers[i]; if (profile.id == user.userId) { messages.add({ 'id': messageId, 'message_data_id': messageDataId, 'symmetric_key': base64.encode(CryptoUtils.rsaEncrypt( userSymmetricKey, publicKey, )), 'association_key': user.associationKey, }); continue; } ConversationUser conversationUser = await ConversationUsersRepository.getConversationUser(conversation, user.userId); RSAPublicKey friendPublicKey = conversationUser.publicKey; messages.add({ 'message_data_id': messageDataId, 'symmetric_key': base64.encode(CryptoUtils.rsaEncrypt( userSymmetricKey, friendPublicKey, )), 'association_key': user.associationKey, }); } return messages; } String getContent() { return ''; } Map toMap() { return { 'id': id, 'symmetric_key': symmetricKey, 'user_symmetric_key': userSymmetricKey, 'sender_id': senderId, 'sender_username': senderUsername, 'association_key': associationKey, 'created_at': createdAt, 'failed_to_send': failedToSend ? 1 : 0, }; } }