From 3d019b8dc192dc7a2eff198fa962d52f6bdc3134 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sat, 3 Nov 2018 22:47:54 +0100 Subject: Fix crash when posting message after creating room --- src/Room.cpp | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/Room.cpp b/src/Room.cpp index 30375a3..95e5818 100644 --- a/src/Room.cpp +++ b/src/Room.cpp @@ -9,10 +9,9 @@ // TODO: Remove error checks when odhtdb has been improved to take care of such errors namespace dchat { - Room::Room(Rooms *_rooms, std::shared_ptr _id, std::shared_ptr _encryptionKey) : + Room::Room(Rooms *_rooms, std::shared_ptr _id) : rooms(_rooms), id(_id), - encryptionKey(_encryptionKey), userdata(nullptr) { @@ -43,6 +42,9 @@ namespace dchat void Room::publishMessage(const std::string &msg) { + assert(localUser); + assert(publicKeyToKeyPairMap.find(localUser->publicKey) != publicKeyToKeyPairMap.end()); + assert(encryptionKey); sibs::SafeSerializer serializer; serializer.add(RoomDataType::ADD_MESSAGE); serializer.add((const u8*)msg.data(), msg.size()); @@ -64,6 +66,7 @@ namespace dchat void Rooms::createNodeCallbackFunc(const odhtdb::DatabaseCreateNodeRequest &request) { + std::lock_guard lock(roomModifyMutex); auto roomIt = roomById.find(*request.nodeHash); if(roomIt != roomById.end()) { @@ -72,9 +75,11 @@ namespace dchat return; } - auto encryptionKey = roomEncryptionKey[*request.nodeHash]; auto roomId = std::make_shared(*request.nodeHash); - auto room = std::make_shared(this, roomId, encryptionKey); + auto room = std::make_shared(this, roomId); + auto encryptionKeyIt = roomEncryptionKey.find(*request.nodeHash); + if(encryptionKeyIt != roomEncryptionKey.end()) + room->encryptionKey = encryptionKeyIt->second; roomById[*request.nodeHash] = room; if(callbackFuncs.createRoomCallbackFunc) callbackFuncs.createRoomCallbackFunc(room); @@ -92,6 +97,7 @@ namespace dchat void Rooms::addNodeCallbackFunc(const odhtdb::DatabaseAddNodeRequest &request) { + std::lock_guard lock(roomModifyMutex); auto roomIt = roomById.find(*request.nodeHash); if(roomIt == roomById.end()) { @@ -197,6 +203,7 @@ namespace dchat void Rooms::addUserCallbackFunc(const odhtdb::DatabaseAddUserRequest &request) { + std::lock_guard lock(roomModifyMutex); auto roomIt = roomById.find(*request.nodeHash); if(roomIt == roomById.end()) { @@ -234,6 +241,7 @@ namespace dchat void Rooms::loginUser(const std::string &username, const std::string &password) { + std::lock_guard lock(roomModifyMutex); if(loggedIn) throw std::runtime_error(std::string("You are already logged in as ") + username); @@ -255,6 +263,7 @@ namespace dchat void Rooms::registerUser(const std::string &username, const std::string &password) { + std::lock_guard lock(roomModifyMutex); if(loggedIn) throw std::runtime_error(std::string("You are already logged in as ") + username); @@ -266,12 +275,24 @@ namespace dchat void Rooms::createRoom(const std::string &name) { + std::lock_guard lock(roomModifyMutex); if(!loggedIn) throw std::runtime_error("You need to be logged in to create a room "); auto newNode = database->create(); roomLocalUser[*newNode->getRequestHash()] = newNode->getNodeAdminKeyPair(); roomEncryptionKey[*newNode->getRequestHash()] = newNode->getNodeEncryptionKey(); + auto roomIt = roomById.find(*newNode->getRequestHash()); + if(roomIt != roomById.end()) + { + roomIt->second->encryptionKey = newNode->getNodeEncryptionKey(); + auto user = roomIt->second->getUserByPublicKey(newNode->getNodeAdminKeyPair()->getPublicKey()); + if(user) + { + roomIt->second->localUser = user; + roomIt->second->publicKeyToKeyPairMap[user->publicKey] = newNode->getNodeAdminKeyPair(); + } + } odhtdb::DatabaseNode nodeInfo(newNode->getNodeEncryptionKey(), newNode->getRequestHash()); database->storeNodeInfoForUserEncrypted(nodeInfo, currentUsername, currentUserPassword, *newNode->getNodeAdminKeyPair()); -- cgit v1.2.3