summary refs log tree commit diff
path: root/src/timeline/EventStore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/timeline/EventStore.cpp')
-rw-r--r--src/timeline/EventStore.cpp221
1 files changed, 136 insertions, 85 deletions
diff --git a/src/timeline/EventStore.cpp b/src/timeline/EventStore.cpp

index 639cae0f..208b20e2 100644 --- a/src/timeline/EventStore.cpp +++ b/src/timeline/EventStore.cpp
@@ -5,6 +5,7 @@ #include "Cache.h" #include "Cache_p.h" +#include "ChatPage.h" #include "EventAccessors.h" #include "Logging.h" #include "MatrixClient.h" @@ -31,41 +32,38 @@ EventStore::EventStore(std::string room_id, QObject *) this->last = range->last; } - connect( - this, - &EventStore::eventFetched, - this, - [this](std::string id, - std::string relatedTo, - mtx::events::collections::TimelineEvents timeline) { - cache::client()->storeEvent(room_id_, id, {timeline}); - - if (!relatedTo.empty()) { - auto idx = idToIndex(relatedTo); - if (idx) - emit dataChanged(*idx, *idx); - } - }, - Qt::QueuedConnection); - - connect( - this, - &EventStore::oldMessagesRetrieved, - this, - [this](const mtx::responses::Messages &res) { - // - uint64_t newFirst = cache::client()->saveOldMessages(room_id_, res); - if (newFirst == first) - fetchMore(); - else { - emit beginInsertRows(toExternalIdx(newFirst), - toExternalIdx(this->first - 1)); - this->first = newFirst; - emit endInsertRows(); - emit fetchedMore(); - } - }, - Qt::QueuedConnection); + connect(this, + &EventStore::eventFetched, + this, + [this](std::string id, + std::string relatedTo, + mtx::events::collections::TimelineEvents timeline) { + cache::client()->storeEvent(room_id_, id, {timeline}); + + if (!relatedTo.empty()) { + auto idx = idToIndex(relatedTo); + if (idx) + emit dataChanged(*idx, *idx); + } + }, + Qt::QueuedConnection); + + connect(this, + &EventStore::oldMessagesRetrieved, + this, + [this](const mtx::responses::Messages &res) { + uint64_t newFirst = cache::client()->saveOldMessages(room_id_, res); + if (newFirst == first) + fetchMore(); + else { + emit beginInsertRows(toExternalIdx(newFirst), + toExternalIdx(this->first - 1)); + this->first = newFirst; + emit endInsertRows(); + emit fetchedMore(); + } + }, + Qt::QueuedConnection); connect(this, &EventStore::processPending, this, [this]() { if (!current_txn.empty()) { @@ -116,48 +114,46 @@ EventStore::EventStore(std::string room_id, QObject *) event->data); }); - connect( - this, - &EventStore::messageFailed, - this, - [this](std::string txn_id) { - if (current_txn == txn_id) { - current_txn_error_count++; - if (current_txn_error_count > 10) { - nhlog::ui()->debug("failing txn id '{}'", txn_id); - cache::client()->removePendingStatus(room_id_, txn_id); - current_txn_error_count = 0; - } - } - QTimer::singleShot(1000, this, [this]() { - nhlog::ui()->debug("timeout"); - this->current_txn = ""; - emit processPending(); - }); - }, - Qt::QueuedConnection); - - connect( - this, - &EventStore::messageSent, - this, - [this](std::string txn_id, std::string event_id) { - nhlog::ui()->debug("sent {}", txn_id); - - http::client()->read_event( - room_id_, event_id, [this, event_id](mtx::http::RequestErr err) { - if (err) { - nhlog::net()->warn( - "failed to read_event ({}, {})", room_id_, event_id); - } - }); - - cache::client()->removePendingStatus(room_id_, txn_id); - this->current_txn = ""; - this->current_txn_error_count = 0; - emit processPending(); - }, - Qt::QueuedConnection); + connect(this, + &EventStore::messageFailed, + this, + [this](std::string txn_id) { + if (current_txn == txn_id) { + current_txn_error_count++; + if (current_txn_error_count > 10) { + nhlog::ui()->debug("failing txn id '{}'", txn_id); + cache::client()->removePendingStatus(room_id_, txn_id); + current_txn_error_count = 0; + } + } + QTimer::singleShot(1000, this, [this]() { + nhlog::ui()->debug("timeout"); + this->current_txn = ""; + emit processPending(); + }); + }, + Qt::QueuedConnection); + + connect(this, + &EventStore::messageSent, + this, + [this](std::string txn_id, std::string event_id) { + nhlog::ui()->debug("sent {}", txn_id); + + http::client()->read_event( + room_id_, event_id, [this, event_id](mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn( + "failed to read_event ({}, {})", room_id_, event_id); + } + }); + + cache::client()->removePendingStatus(room_id_, txn_id); + this->current_txn = ""; + this->current_txn_error_count = 0; + emit processPending(); + }, + Qt::QueuedConnection); } void @@ -245,6 +241,58 @@ EventStore::handleSync(const mtx::responses::Timeline &events) emit dataChanged(toExternalIdx(*idx), toExternalIdx(*idx)); } } + + // decrypting and checking some encrypted messages + if (auto encrypted = + std::get_if<mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>>( + &event)) { + auto event = decryptEvent({room_id_, encrypted->event_id}, *encrypted); + if (std::visit( + [](auto e) { return (e.sender != utils::localUser().toStdString()); }, + *event)) { + if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationRequest>>(event)) { + last_verification_request_event = *msg; + } else if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationCancel>>(event)) { + last_verification_cancel_event = *msg; + ChatPage::instance()->recievedDeviceVerificationCancel( + msg->content); + } else if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationAccept>>(event)) { + ChatPage::instance()->recievedDeviceVerificationAccept( + msg->content); + } else if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationKey>>(event)) { + ChatPage::instance()->recievedDeviceVerificationKey( + msg->content); + } else if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationMac>>(event)) { + ChatPage::instance()->recievedDeviceVerificationMac( + msg->content); + } else if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationReady>>(event)) { + ChatPage::instance()->recievedDeviceVerificationReady( + msg->content); + } else if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationDone>>(event)) { + ChatPage::instance()->recievedDeviceVerificationDone( + msg->content); + } else if (auto msg = std::get_if<mtx::events::RoomEvent< + mtx::events::msg::KeyVerificationStart>>(event)) { + ChatPage::instance()->recievedDeviceVerificationStart( + msg->content, msg->sender); + } + } + } + } + + if (last_verification_request_event.has_value()) { + if (last_verification_request_event.value().origin_server_ts > + last_verification_cancel_event.origin_server_ts) { + emit startDMVerification(last_verification_request_event.value()); + last_verification_request_event = {}; + } } } @@ -425,7 +473,8 @@ EventStore::decryptEvent(const IdIndex &idx, e.what()); dummy.content.body = tr("-- Decryption Error (failed to retrieve megolm keys from db) --", - "Placeholder, when the message can't be decrypted, because the DB access " + "Placeholder, when the message can't be decrypted, because the DB " + "access " "failed.") .toStdString(); return asCacheEntry(std::move(dummy)); @@ -437,7 +486,8 @@ EventStore::decryptEvent(const IdIndex &idx, e.what()); dummy.content.body = tr("-- Decryption Error (%1) --", - "Placeholder, when the message can't be decrypted. In this case, the Olm " + "Placeholder, when the message can't be decrypted. In this case, the " + "Olm " "decrytion returned an error, which is passed as %1.") .arg(e.what()) .toStdString(); @@ -470,11 +520,11 @@ EventStore::decryptEvent(const IdIndex &idx, return asCacheEntry(std::move(temp_events[0])); } - dummy.content.body = - tr("-- Encrypted Event (Unknown event type) --", - "Placeholder, when the message was decrypted, but we couldn't parse it, because " - "Nheko/mtxclient don't support that event type yet.") - .toStdString(); + dummy.content.body = tr("-- Encrypted Event (Unknown event type) --", + "Placeholder, when the message was decrypted, but we " + "couldn't parse it, because " + "Nheko/mtxclient don't support that event type yet.") + .toStdString(); return asCacheEntry(std::move(dummy)); } @@ -502,7 +552,8 @@ EventStore::get(std::string_view id, std::string_view related_to, bool decrypt) mtx::http::RequestErr err) { if (err) { nhlog::net()->error( - "Failed to retrieve event with id {}, which was " + "Failed to retrieve event with id {}, which " + "was " "requested to show the replyTo for event {}", relatedTo, id);