summary refs log tree commit diff
path: root/src/encryption/VerificationManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/encryption/VerificationManager.cpp')
-rw-r--r--src/encryption/VerificationManager.cpp126
1 files changed, 126 insertions, 0 deletions
diff --git a/src/encryption/VerificationManager.cpp b/src/encryption/VerificationManager.cpp
new file mode 100644

index 00000000..b9b51d35 --- /dev/null +++ b/src/encryption/VerificationManager.cpp
@@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: 2021 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "VerificationManager.h" +#include "Cache.h" +#include "ChatPage.h" +#include "DeviceVerificationFlow.h" +#include "timeline/TimelineViewManager.h" + +VerificationManager::VerificationManager(TimelineViewManager *o) + : QObject(o) + , rooms_(o->rooms()) +{} + +void +VerificationManager::receivedRoomDeviceVerificationRequest( + const mtx::events::RoomEvent<mtx::events::msg::KeyVerificationRequest> &message, + TimelineModel *model) +{ + if (this->isInitialSync_) + return; + + auto event_id = QString::fromStdString(message.event_id); + if (!this->dvList.contains(event_id)) { + if (auto flow = DeviceVerificationFlow::NewInRoomVerification( + this, model, message.content, QString::fromStdString(message.sender), event_id)) { + dvList[event_id] = flow; + emit newDeviceVerificationRequest(flow.data()); + } + } +} + +void +VerificationManager::receivedDeviceVerificationRequest( + const mtx::events::msg::KeyVerificationRequest &msg, + std::string sender) +{ + if (this->isInitialSync_) + return; + + if (!msg.transaction_id) + return; + + auto txnid = QString::fromStdString(msg.transaction_id.value()); + if (!this->dvList.contains(txnid)) { + if (auto flow = DeviceVerificationFlow::NewToDeviceVerification( + this, msg, QString::fromStdString(sender), txnid)) { + dvList[txnid] = flow; + emit newDeviceVerificationRequest(flow.data()); + } + } +} + +void +VerificationManager::receivedDeviceVerificationStart( + const mtx::events::msg::KeyVerificationStart &msg, + std::string sender) +{ + if (this->isInitialSync_) + return; + + if (!msg.transaction_id) + return; + + auto txnid = QString::fromStdString(msg.transaction_id.value()); + if (!this->dvList.contains(txnid)) { + if (auto flow = DeviceVerificationFlow::NewToDeviceVerification( + this, msg, QString::fromStdString(sender), txnid)) { + dvList[txnid] = flow; + emit newDeviceVerificationRequest(flow.data()); + } + } +} + +void +VerificationManager::verifyUser(QString userid) +{ + auto joined_rooms = cache::joinedRooms(); + auto room_infos = cache::getRoomInfo(joined_rooms); + + for (std::string room_id : joined_rooms) { + if ((room_infos[QString::fromStdString(room_id)].member_count == 2) && + cache::isRoomEncrypted(room_id)) { + auto room_members = cache::roomMembers(room_id); + if (std::find(room_members.begin(), room_members.end(), (userid).toStdString()) != + room_members.end()) { + if (auto model = rooms_->getRoomById(QString::fromStdString(room_id))) { + auto flow = + DeviceVerificationFlow::InitiateUserVerification(this, model.data(), userid); + connect(model.data(), + &TimelineModel::updateFlowEventId, + this, + [this, flow](std::string eventId) { + dvList[QString::fromStdString(eventId)] = flow; + }); + emit newDeviceVerificationRequest(flow.data()); + return; + } + } + } + } + + emit ChatPage::instance()->showNotification( + tr("No encrypted private chat found with this user. Create an " + "encrypted private chat with this user and try again.")); +} + +void +VerificationManager::removeVerificationFlow(DeviceVerificationFlow *flow) +{ + for (auto it = dvList.keyValueBegin(); it != dvList.keyValueEnd(); ++it) { + if ((*it).second == flow) { + dvList.remove((*it).first); + return; + } + } +} + +void +VerificationManager::verifyDevice(QString userid, QString deviceid) +{ + auto flow = DeviceVerificationFlow::InitiateDeviceVerification(this, userid, deviceid); + this->dvList[flow->transactionId()] = flow; + emit newDeviceVerificationRequest(flow.data()); +}