aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-11-03 22:47:54 +0100
committerdec05eba <dec05eba@protonmail.com>2018-11-03 22:48:09 +0100
commit3d019b8dc192dc7a2eff198fa962d52f6bdc3134 (patch)
treed99ce382c93093d98ecf3c567d50adae3d55b239 /src
parentfe99723d0a6374ee20c52b0f96c45452026da519 (diff)
Fix crash when posting message after creating room
Diffstat (limited to 'src')
-rw-r--r--src/Room.cpp29
1 files changed, 25 insertions, 4 deletions
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<odhtdb::Hash> _id, std::shared_ptr<odhtdb::OwnedByteArray> _encryptionKey) :
+ Room::Room(Rooms *_rooms, std::shared_ptr<odhtdb::Hash> _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<std::recursive_mutex> 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<odhtdb::Hash>(*request.nodeHash);
- auto room = std::make_shared<Room>(this, roomId, encryptionKey);
+ auto room = std::make_shared<Room>(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<std::recursive_mutex> 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<std::recursive_mutex> 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<std::recursive_mutex> 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<std::recursive_mutex> 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<std::recursive_mutex> 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());