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<List<Map<String, String>>> 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<Map<String, String>> messages = [];
|
|
List<ConversationUser> 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<String, dynamic> 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,
|
|
};
|
|
}
|
|
}
|