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.

102 lines
2.7 KiB

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,
};
}
}