summary refs log tree commit diff
path: root/src/timeline
diff options
context:
space:
mode:
authorCH Chethan Reddy <40890937+Chethan2k1@users.noreply.github.com>2020-07-29 03:25:47 +0530
committerCH Chethan Reddy <40890937+Chethan2k1@users.noreply.github.com>2020-07-30 22:10:27 +0530
commit3635c185e93a6f7bf6e2f9c11b27966c2ee665ea (patch)
tree036e5fa56355cccded5c06d61e28d5a958a59c03 /src/timeline
parentAdding Room Key Verification Stuff (diff)
downloadnheko-3635c185e93a6f7bf6e2f9c11b27966c2ee665ea.tar.xz
Add Room Verification Messages
Diffstat (limited to 'src/timeline')
-rw-r--r--src/timeline/TimelineModel.cpp145
-rw-r--r--src/timeline/TimelineModel.h5
-rw-r--r--src/timeline/TimelineViewManager.cpp37
-rw-r--r--src/timeline/TimelineViewManager.h3
4 files changed, 159 insertions, 31 deletions
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp

index 71cc53c5..adf207ac 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp
@@ -139,6 +139,11 @@ struct RoomEventType return qml_mtx_events::EventType::KeyVerificationAccept; } qml_mtx_events::EventType operator()( + const mtx::events::Event<mtx::events::msg::KeyVerificationReady> &) + { + return qml_mtx_events::EventType::KeyVerificationReady; + } + qml_mtx_events::EventType operator()( const mtx::events::Event<mtx::events::msg::KeyVerificationCancel> &) { return qml_mtx_events::EventType::KeyVerificationCancel; @@ -637,30 +642,6 @@ TimelineModel::internalAddEvents( continue; } - if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationRequest>>( - &e)) { - std::cout << "got a request" << std::endl; - } - - if (auto cancelVerification = - std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationCancel>>( - &e)) { - std::cout<<"it is happening"<<std::endl; - if (cancelVerification->content.relates_to.has_value()) { - QString event_id = QString::fromStdString( - cancelVerification->content.relates_to.value() - .in_reply_to.event_id); - auto request = - std::find(eventOrder.begin(), eventOrder.end(), event_id); - if (request != eventOrder.end()) { - auto event = events.value(event_id); - auto e = std::get_if<mtx::events::RoomEvent< - mtx::events::msg::KeyVerificationRequest>>(&event); - std::cout<<json(*e)<<std::endl; - } - } - } - if (auto redaction = std::get_if<mtx::events::RedactionEvent<mtx::events::msg::Redaction>>(&e)) { QString redacts = QString::fromStdString(redaction->redacts); @@ -728,6 +709,55 @@ TimelineModel::internalAddEvents( if (encInfo) emit newEncryptedImage(encInfo.value()); + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationRequest>>( + &e_)) { + last_verification_request_event = *msg; + } + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationCancel>>( + &e_)) { + last_verification_cancel_event = *msg; + ChatPage::instance()->recievedDeviceVerificationCancel( + msg->content); + } + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationAccept>>( + &e_)) { + ChatPage::instance()->recievedDeviceVerificationAccept( + msg->content); + } + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationKey>>(&e_)) { + ChatPage::instance()->recievedDeviceVerificationKey(msg->content); + } + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationMac>>(&e_)) { + ChatPage::instance()->recievedDeviceVerificationMac(msg->content); + } + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationReady>>( + &e_)) { + ChatPage::instance()->recievedDeviceVerificationReady(msg->content); + } + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationDone>>(&e_)) { + ChatPage::instance()->recievedDeviceVerificationDone(msg->content); + } + + if (auto msg = std::get_if< + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationStart>>( + &e_)) { + ChatPage::instance()->recievedDeviceVerificationStart(msg->content, + msg->sender); + } } this->events.insert(id, e); @@ -754,6 +784,13 @@ TimelineModel::internalAddEvents( }); } } + + if (last_verification_request_event.origin_server_ts > + last_verification_cancel_event.origin_server_ts) { + ChatPage::instance()->recievedRoomDeviceVerificationRequest( + last_verification_request_event, this); + } + return ids; } @@ -1264,6 +1301,20 @@ struct SendMessageVisitor }; void +TimelineModel::processOnePendingMessage() +{ + if (pending.isEmpty()) + return; + + QString txn_id_qstr = pending.first(); + + auto event = events.value(txn_id_qstr); + std::cout << "Inside the process one pending message" << std::endl; + std::cout << std::visit([](auto &e) { return json(e); }, event).dump(2) << std::endl; + std::visit(SendMessageVisitor{txn_id_qstr, this}, event); +} + +void TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event) { std::visit( @@ -1275,7 +1326,51 @@ TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event) }, event); - std::visit(SendMessageVisitor{this}, event); + if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationReady>>(&event)) { + std::visit( + [](auto &msg) { msg.type = mtx::events::EventType::KeyVerificationReady; }, + event); + } + if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationStart>>(&event)) { + std::visit( + [](auto &msg) { msg.type = mtx::events::EventType::KeyVerificationStart; }, + event); + } + if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationKey>>(&event)) { + std::visit([](auto &msg) { msg.type = mtx::events::EventType::KeyVerificationKey; }, + event); + } + if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationMac>>(&event)) { + std::visit([](auto &msg) { msg.type = mtx::events::EventType::KeyVerificationMac; }, + event); + } + if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationDone>>(&event)) { + std::visit( + [](auto &msg) { msg.type = mtx::events::EventType::KeyVerificationDone; }, event); + } + if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationCancel>>(&event)) { + std::visit( + [](auto &msg) { msg.type = mtx::events::EventType::KeyVerificationCancel; }, + event); + } + if (std::get_if<mtx::events::RoomEvent<mtx::events::msg::KeyVerificationAccept>>(&event)) { + std::visit( + [](auto &msg) { msg.type = mtx::events::EventType::KeyVerificationAccept; }, + event); + } + + internalAddEvents({event}); + + QString txn_id_qstr = QString::fromStdString(mtx::accessors::event_id(event)); + pending.push_back(txn_id_qstr); + if (!std::get_if<mtx::events::RoomEvent<mtx::events::msg::Reaction>>(&event)) { + beginInsertRows(QModelIndex(), 0, 0); + this->eventOrder.insert(this->eventOrder.begin(), txn_id_qstr); + endInsertRows(); + } + updateLastMessage(); + + emit nextPendingMessage(); } bool diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 708ed38e..1b6f999e 100644 --- a/src/timeline/TimelineModel.h +++ b/src/timeline/TimelineModel.h
@@ -297,6 +297,11 @@ private: std::vector<QString> typingUsers_; TimelineViewManager *manager_; + // probably not the best way to do + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationRequest> + last_verification_request_event; + mtx::events::RoomEvent<mtx::events::msg::KeyVerificationCancel> + last_verification_cancel_event; friend struct SendMessageVisitor; }; diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index 02b74d20..c16e09d1 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp
@@ -17,6 +17,8 @@ #include "emoji/EmojiModel.h" #include "emoji/Provider.h" +#include <iostream> //only for debugging + Q_DECLARE_METATYPE(mtx::events::collections::TimelineEvents) Q_DECLARE_METATYPE(std::vector<DeviceInfo>) @@ -187,16 +189,42 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin &TimelineViewManager::updateEncryptedDescriptions); connect( dynamic_cast<ChatPage *>(parent), + &ChatPage::recievedRoomDeviceVerificationRequest, + this, + [this](const mtx::events::RoomEvent<mtx::events::msg::KeyVerificationRequest> &message, + TimelineModel *model) { + if (!(this->dvList->exist(QString::fromStdString(message.event_id)))) { + auto flow = + new DeviceVerificationFlow(this, DeviceVerificationFlow::Type::RoomMsg); + if (std::find(message.content.methods.begin(), + message.content.methods.end(), + mtx::events::msg::VerificationMethods::SASv1) != + message.content.methods.end()) { + flow->setModel(model); + flow->setEventId(message.event_id); + emit newDeviceVerificationRequest( + std::move(flow), + QString::fromStdString(message.event_id), + QString::fromStdString(message.sender), + QString::fromStdString(message.content.from_device), + true); + } else { + flow->cancelVerification( + DeviceVerificationFlow::Error::UnknownMethod); + } + } + }); + connect( + dynamic_cast<ChatPage *>(parent), &ChatPage::recievedDeviceVerificationRequest, this, [this](const mtx::events::msg::KeyVerificationRequest &msg, std::string sender) { - auto flow = new DeviceVerificationFlow(this); if (!(this->dvList->exist(QString::fromStdString(msg.transaction_id.value())))) { + auto flow = new DeviceVerificationFlow(this); if (std::find(msg.methods.begin(), msg.methods.end(), mtx::events::msg::VerificationMethods::SASv1) != msg.methods.end()) { - // flow->sendVerificationReady(); emit newDeviceVerificationRequest( std::move(flow), QString::fromStdString(msg.transaction_id.value()), @@ -213,9 +241,9 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin &ChatPage::recievedDeviceVerificationStart, this, [this](const mtx::events::msg::KeyVerificationStart &msg, std::string sender) { - auto flow = new DeviceVerificationFlow(this); - flow->canonical_json = nlohmann::json(msg); if (!(this->dvList->exist(QString::fromStdString(msg.transaction_id.value())))) { + auto flow = new DeviceVerificationFlow(this); + flow->canonical_json = nlohmann::json(msg); if ((std::find(msg.key_agreement_protocols.begin(), msg.key_agreement_protocols.end(), "curve25519-hkdf-sha256") != @@ -246,7 +274,6 @@ TimelineViewManager::TimelineViewManager(QSharedPointer<UserSettings> userSettin QString::fromStdString(msg.transaction_id.value()), QString::fromStdString(sender), QString::fromStdString(msg.from_device)); - flow->canonical_json = nlohmann::json(msg); } else { flow->cancelVerification( DeviceVerificationFlow::Error::UnknownMethod); diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 71aee5ef..031d07cc 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h
@@ -72,7 +72,8 @@ signals: void newDeviceVerificationRequest(DeviceVerificationFlow *flow, QString transactionId, QString userId, - QString deviceId); + QString deviceId, + bool isRequest = false); public slots: void updateReadReceipts(const QString &room_id, const std::vector<QString> &event_ids);