aboutsummaryrefslogtreecommitdiff
path: root/src/MessageBoard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/MessageBoard.cpp')
-rw-r--r--src/MessageBoard.cpp24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/MessageBoard.cpp b/src/MessageBoard.cpp
index bdaccf3..f2796e5 100644
--- a/src/MessageBoard.cpp
+++ b/src/MessageBoard.cpp
@@ -16,6 +16,7 @@
#include <SFML/Window/Mouse.hpp>
#include <SFML/Graphics/Rect.hpp>
#include <SFML/Graphics/Text.hpp>
+#include <odhtdb/User.hpp>
#include <cmath>
using namespace std;
@@ -76,11 +77,20 @@ namespace dchat
scrollToBottom = true;
}
- void MessageBoard::deleteMessage(const odhtdb::Hash &id)
+ void MessageBoard::deleteMessage(const odhtdb::Hash &id, const odhtdb::Signature::PublicKey &requestedByUser)
{
lock_guard<mutex> lock(messageProcessMutex);
auto it = messageIdMap.find(id);
if(it == messageIdMap.end()) return;
+ if(it->second->user->type == User::Type::ONLINE)
+ {
+ auto onlineUser = static_cast<const OnlineUser*>(it->second->user);
+ if(onlineUser->databaseUser->getPublicKey() != requestedByUser)
+ {
+ fprintf(stderr, "Warning: user %s requested to delete a message owned by user %s, ignoring request\n", requestedByUser.toString().c_str(), onlineUser->databaseUser->getPublicKey().toString().c_str());
+ return;
+ }
+ }
for(usize i = 0; i < messages.size(); ++i)
{
@@ -282,20 +292,24 @@ namespace dchat
message->text.processEvent(event);
}
- if(event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Button::Right)
+ OnlineUser *localOnlineUser = nullptr;
+ if(channel->getLocalUser()->type == User::Type::ONLINE)
+ localOnlineUser = static_cast<OnlineUser*>(channel->getLocalUser());
+
+ if(localOnlineUser && event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Button::Right)
{
for(auto it : messageIdMap)
{
it.second->text.processEvent(event);
auto textPos = it.second->text.getPosition();
- if(event.mouseButton.x >= textPos.x && event.mouseButton.x <= textPos.x + it.second->text.getMaxWidth() && event.mouseButton.y >= textPos.y && event.mouseButton.y <= textPos.y + it.second->text.getHeight())
+ if(it.second->user == channel->getLocalUser() && event.mouseButton.x >= textPos.x && event.mouseButton.x <= textPos.x + it.second->text.getMaxWidth() && event.mouseButton.y >= textPos.y && event.mouseButton.y <= textPos.y + it.second->text.getHeight())
{
auto contextMenu = GlobalContextMenu::getEditMessageContextMenu();
contextMenu->setPosition(sf::Vector2f(event.mouseButton.x, event.mouseButton.y));
contextMenu->setVisible(true);
- GlobalContextMenu::setClickDeleteMessageCallbackFunc([this, it](ContextMenuItem *menuItem)
+ GlobalContextMenu::setClickDeleteMessageCallbackFunc([this, it, localOnlineUser](ContextMenuItem *menuItem)
{
- channel->deleteMessage(it.first);
+ channel->deleteMessage(it.first, localOnlineUser->databaseUser->getPublicKey());
GlobalContextMenu::setClickDeleteMessageCallbackFunc(nullptr);
});
return;