Handle Device Verification related to_device messages
This commit is contained in:
parent
cd5dd0e39b
commit
1eb162cb6f
@ -29,6 +29,14 @@ ApplicationWindow{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: deviceVerificationDialog
|
||||||
|
DeviceVerification {}
|
||||||
|
}
|
||||||
|
DeviceVerificationFlow {
|
||||||
|
id: deviceVerificationFlow
|
||||||
|
}
|
||||||
|
|
||||||
background: Item{
|
background: Item{
|
||||||
id: userProfileItem
|
id: userProfileItem
|
||||||
width: userProfileDialog.width
|
width: userProfileDialog.width
|
||||||
@ -98,22 +106,15 @@ ApplicationWindow{
|
|||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
text: displayName
|
text: displayName
|
||||||
}
|
}
|
||||||
Component {
|
|
||||||
id: deviceVerificationDialog
|
|
||||||
DeviceVerification {}
|
|
||||||
}
|
|
||||||
DeviceVerificationFlow {
|
|
||||||
id: deviceVerificationFlow
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Button{
|
Button{
|
||||||
id: verifyButton
|
id: verifyButton
|
||||||
text:"Verify"
|
text:"Verify"
|
||||||
onClicked: {
|
onClicked: {
|
||||||
var dialog = deviceVerificationDialog.createObject(userProfileDialog,
|
|
||||||
{flow: deviceVerificationFlow,sender: false});
|
|
||||||
deviceVerificationFlow.userId = user_data.userId
|
deviceVerificationFlow.userId = user_data.userId
|
||||||
deviceVerificationFlow.deviceId = model.deviceID
|
deviceVerificationFlow.deviceId = model.deviceID
|
||||||
|
var dialog = deviceVerificationDialog.createObject(userProfileDialog,
|
||||||
|
{flow: deviceVerificationFlow,sender: true});
|
||||||
dialog.show();
|
dialog.show();
|
||||||
}
|
}
|
||||||
contentItem: Text {
|
contentItem: Text {
|
||||||
|
@ -83,7 +83,7 @@ ApplicationWindow {
|
|||||||
Button {
|
Button {
|
||||||
Layout.alignment: Qt.AlignRight
|
Layout.alignment: Qt.AlignRight
|
||||||
text: "Start verification"
|
text: "Start verification"
|
||||||
onClicked: { stack.replace(awaitingVerificationRequestAccept); flow.sendVerificationRequest(); }
|
onClicked: { stack.replace(awaitingVerificationRequestAccept); flow.startVerificationRequest(); }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
#include "Cache_p.h"
|
#include "Cache_p.h"
|
||||||
#include "ChatPage.h"
|
#include "ChatPage.h"
|
||||||
#include "EventAccessors.h"
|
#include "EventAccessors.h"
|
||||||
|
#include "DeviceVerificationFlow.h"
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "MatrixClient.h"
|
#include "MatrixClient.h"
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
#include <stack>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
|
||||||
#include <mtx/common.hpp>
|
#include <mtx/common.hpp>
|
||||||
@ -164,6 +165,17 @@ signals:
|
|||||||
void themeChanged();
|
void themeChanged();
|
||||||
void decryptSidebarChanged();
|
void decryptSidebarChanged();
|
||||||
|
|
||||||
|
//! Signals for device verificaiton
|
||||||
|
void recievedDeviceVerificationAccept(
|
||||||
|
const mtx::events::collections::DeviceEvents &message);
|
||||||
|
void recievedDeviceVerificationRequest(
|
||||||
|
const mtx::events::collections::DeviceEvents &message);
|
||||||
|
void recievedDeviceVerificationCancel(
|
||||||
|
const mtx::events::collections::DeviceEvents &message);
|
||||||
|
void recievedDeviceVerificationKey(const mtx::events::collections::DeviceEvents &message);
|
||||||
|
void recievedDeviceVerificationMac(const mtx::events::collections::DeviceEvents &message);
|
||||||
|
void recievedDeviceVerificationStart(const mtx::events::collections::DeviceEvents &message);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void showUnreadMessageNotification(int count);
|
void showUnreadMessageNotification(int count);
|
||||||
void updateTopBarAvatar(const QString &roomid, const QString &img);
|
void updateTopBarAvatar(const QString &roomid, const QString &img);
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "DeviceVerificationFlow.h"
|
#include "DeviceVerificationFlow.h"
|
||||||
|
#include "ChatPage.h"
|
||||||
|
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
@ -8,22 +9,73 @@
|
|||||||
|
|
||||||
static constexpr int TIMEOUT = 2 * 60 * 1000; // 2 minutes
|
static constexpr int TIMEOUT = 2 * 60 * 1000; // 2 minutes
|
||||||
|
|
||||||
|
namespace msgs = mtx::events::msg;
|
||||||
|
|
||||||
DeviceVerificationFlow::DeviceVerificationFlow(QObject *)
|
DeviceVerificationFlow::DeviceVerificationFlow(QObject *)
|
||||||
{
|
{
|
||||||
|
qRegisterMetaType<mtx::events::collections::DeviceEvents>();
|
||||||
timeout = new QTimer(this);
|
timeout = new QTimer(this);
|
||||||
timeout->setSingleShot(true);
|
timeout->setSingleShot(true);
|
||||||
connect(timeout, &QTimer::timeout, this, [this]() {
|
connect(timeout, &QTimer::timeout, this, [this]() {
|
||||||
emit timedout();
|
emit timedout();
|
||||||
this->deleteLater();
|
this->deleteLater();
|
||||||
});
|
});
|
||||||
|
connect(ChatPage::instance(),
|
||||||
|
&ChatPage::recievedDeviceVerificationAccept,
|
||||||
|
this,
|
||||||
|
[this](const mtx::events::collections::DeviceEvents &message) {
|
||||||
|
auto msg =
|
||||||
|
std::get<mtx::events::DeviceEvent<msgs::KeyVerificationAccept>>(message);
|
||||||
|
if (msg.content.transaction_id == this->transaction_id) {
|
||||||
|
std::cout << "Recieved Event Accept" << std::endl;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
connect(ChatPage::instance(),
|
||||||
|
&ChatPage::recievedDeviceVerificationRequest,
|
||||||
|
this,
|
||||||
|
[this](const mtx::events::collections::DeviceEvents &message) {
|
||||||
|
auto msg =
|
||||||
|
std::get<mtx::events::DeviceEvent<msgs::KeyVerificationRequest>>(message);
|
||||||
|
if (msg.content.transaction_id == this->transaction_id) {
|
||||||
|
std::cout << "Recieved Event Request" << std::endl;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
connect(ChatPage::instance(),
|
||||||
|
&ChatPage::recievedDeviceVerificationCancel,
|
||||||
|
this,
|
||||||
|
[this](const mtx::events::collections::DeviceEvents &message) {
|
||||||
|
auto msg =
|
||||||
|
std::get<mtx::events::DeviceEvent<msgs::KeyVerificationCancel>>(message);
|
||||||
|
if (msg.content.transaction_id == this->transaction_id) {
|
||||||
|
std::cout << "Recieved Event Cancel" << std::endl;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
connect(ChatPage::instance(),
|
||||||
|
&ChatPage::recievedDeviceVerificationKey,
|
||||||
|
this,
|
||||||
|
[this](const mtx::events::collections::DeviceEvents &message) {
|
||||||
|
auto msg =
|
||||||
|
std::get<mtx::events::DeviceEvent<msgs::KeyVerificationKey>>(message);
|
||||||
|
if (msg.content.transaction_id == this->transaction_id) {
|
||||||
|
std::cout << "Recieved Event Key" << std::endl;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
connect(ChatPage::instance(),
|
||||||
|
&ChatPage::recievedDeviceVerificationMac,
|
||||||
|
this,
|
||||||
|
[this](const mtx::events::collections::DeviceEvents &message) {
|
||||||
|
auto msg =
|
||||||
|
std::get<mtx::events::DeviceEvent<msgs::KeyVerificationMac>>(message);
|
||||||
|
if (msg.content.transaction_id == this->transaction_id) {
|
||||||
|
std::cout << "Recieved Event Mac" << std::endl;
|
||||||
|
}
|
||||||
|
});
|
||||||
timeout->start(TIMEOUT);
|
timeout->start(TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString
|
QString
|
||||||
DeviceVerificationFlow::getUserId()
|
DeviceVerificationFlow::getUserId()
|
||||||
{
|
{
|
||||||
toClient = mtx::identifiers::parse<mtx::identifiers::User>((this->userId).toStdString());
|
|
||||||
std::cout << http::client()->device_id() << std::endl;
|
|
||||||
return this->userId;
|
return this->userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,6 +95,7 @@ void
|
|||||||
DeviceVerificationFlow::setUserId(QString userID)
|
DeviceVerificationFlow::setUserId(QString userID)
|
||||||
{
|
{
|
||||||
this->userId = userID;
|
this->userId = userID;
|
||||||
|
this->toClient = mtx::identifiers::parse<mtx::identifiers::User>(userID.toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -101,7 +154,8 @@ DeviceVerificationFlow::startVerificationRequest()
|
|||||||
req.hashes = {};
|
req.hashes = {};
|
||||||
req.message_authentication_codes = {};
|
req.message_authentication_codes = {};
|
||||||
// req.short_authentication_string = "";
|
// req.short_authentication_string = "";
|
||||||
|
qDebug()<<"Inside Start Verification";
|
||||||
|
qDebug()<<this->userId;
|
||||||
body[this->toClient][this->deviceId.toStdString()] = req;
|
body[this->toClient][this->deviceId.toStdString()] = req;
|
||||||
|
|
||||||
http::client()
|
http::client()
|
||||||
@ -168,6 +222,51 @@ DeviceVerificationFlow::cancelVerification()
|
|||||||
this->deleteLater();
|
this->deleteLater();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
//! sends the verification key
|
||||||
|
void
|
||||||
|
DeviceVerificationFlow::sendVerificationKey()
|
||||||
|
{
|
||||||
|
mtx::requests::ToDeviceMessages<mtx::events::msg::KeyVerificationKey> body;
|
||||||
|
mtx::events::msg::KeyVerificationKey req;
|
||||||
|
|
||||||
|
req.key = "";
|
||||||
|
req.transaction_id = this->transaction_id;
|
||||||
|
|
||||||
|
body[this->toClient][deviceId.toStdString()] = req;
|
||||||
|
|
||||||
|
http::client()
|
||||||
|
->send_to_device<mtx::events::msg::KeyVerificationKey,
|
||||||
|
mtx::events::EventType::KeyVerificationKey>(
|
||||||
|
"m.key.verification.cancel", body, [](mtx::http::RequestErr err) {
|
||||||
|
if (err)
|
||||||
|
nhlog::net()->warn("failed to send verification key: {} {}",
|
||||||
|
err->matrix_error.error,
|
||||||
|
static_cast<int>(err->status_code));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
//! sends the mac of the keys
|
||||||
|
void
|
||||||
|
DeviceVerificationFlow::sendVerificationMac()
|
||||||
|
{
|
||||||
|
mtx::requests::ToDeviceMessages<mtx::events::msg::KeyVerificationMac> body;
|
||||||
|
mtx::events::msg::KeyVerificationMac req;
|
||||||
|
|
||||||
|
req.transaction_id = this->transaction_id;
|
||||||
|
// req.mac = "";
|
||||||
|
req.keys = "";
|
||||||
|
|
||||||
|
body[this->toClient][deviceId.toStdString()] = req;
|
||||||
|
|
||||||
|
http::client()
|
||||||
|
->send_to_device<mtx::events::msg::KeyVerificationMac,
|
||||||
|
mtx::events::EventType::KeyVerificationMac>(
|
||||||
|
"m.key.verification.cancel", body, [](mtx::http::RequestErr err) {
|
||||||
|
if (err)
|
||||||
|
nhlog::net()->warn("failed to send verification MAC: {} {}",
|
||||||
|
err->matrix_error.error,
|
||||||
|
static_cast<int>(err->status_code));
|
||||||
|
});
|
||||||
|
}
|
||||||
//! Completes the verification flow
|
//! Completes the verification flow
|
||||||
void
|
void
|
||||||
DeviceVerificationFlow::acceptDevice()
|
DeviceVerificationFlow::acceptDevice()
|
||||||
|
@ -38,6 +38,10 @@ public slots:
|
|||||||
void startVerificationRequest();
|
void startVerificationRequest();
|
||||||
//! cancels a verification flow
|
//! cancels a verification flow
|
||||||
void cancelVerification();
|
void cancelVerification();
|
||||||
|
//! sends the verification key
|
||||||
|
void sendVerificationKey();
|
||||||
|
//! sends the mac of the keys
|
||||||
|
void sendVerificationMac();
|
||||||
//! Completes the verification flow
|
//! Completes the verification flow
|
||||||
void acceptDevice();
|
void acceptDevice();
|
||||||
|
|
||||||
@ -56,3 +60,4 @@ private:
|
|||||||
std::string transaction_id;
|
std::string transaction_id;
|
||||||
mtx::identifiers::User toClient;
|
mtx::identifiers::User toClient;
|
||||||
};
|
};
|
||||||
|
Q_DECLARE_METATYPE(mtx::events::collections::DeviceEvents)
|
23
src/Olm.cpp
23
src/Olm.cpp
@ -1,11 +1,15 @@
|
|||||||
|
#include <QObject>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
|
|
||||||
#include "Olm.h"
|
#include "Olm.h"
|
||||||
|
|
||||||
#include "Cache.h"
|
#include "Cache.h"
|
||||||
|
#include "ChatPage.h"
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
#include "MatrixClient.h"
|
#include "MatrixClient.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
#include <DeviceVerificationFlow.h>
|
||||||
|
#include <iostream> // only for debugging
|
||||||
|
|
||||||
static const std::string STORAGE_SECRET_KEY("secret");
|
static const std::string STORAGE_SECRET_KEY("secret");
|
||||||
constexpr auto MEGOLM_ALGO = "m.megolm.v1.aes-sha2";
|
constexpr auto MEGOLM_ALGO = "m.megolm.v1.aes-sha2";
|
||||||
@ -27,7 +31,6 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven
|
|||||||
{
|
{
|
||||||
if (msgs.empty())
|
if (msgs.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
nhlog::crypto()->info("received {} to_device messages", msgs.size());
|
nhlog::crypto()->info("received {} to_device messages", msgs.size());
|
||||||
nlohmann::json j_msg;
|
nlohmann::json j_msg;
|
||||||
|
|
||||||
@ -74,6 +77,24 @@ handle_to_device_messages(const std::vector<mtx::events::collections::DeviceEven
|
|||||||
e.what(),
|
e.what(),
|
||||||
j_msg.dump(2));
|
j_msg.dump(2));
|
||||||
}
|
}
|
||||||
|
} else if (msg_type == to_string(mtx::events::EventType::KeyVerificationAccept)) {
|
||||||
|
ChatPage::instance()->recievedDeviceVerificationAccept(msg);
|
||||||
|
std::cout << j_msg.dump(2) << std::endl;
|
||||||
|
} else if (msg_type == to_string(mtx::events::EventType::KeyVerificationRequest)) {
|
||||||
|
ChatPage::instance()->recievedDeviceVerificationRequest(msg);
|
||||||
|
std::cout << j_msg.dump(2) << std::endl;
|
||||||
|
} else if (msg_type == to_string(mtx::events::EventType::KeyVerificationCancel)) {
|
||||||
|
ChatPage::instance()->recievedDeviceVerificationCancel(msg);
|
||||||
|
std::cout << j_msg.dump(2) << std::endl;
|
||||||
|
} else if (msg_type == to_string(mtx::events::EventType::KeyVerificationKey)) {
|
||||||
|
ChatPage::instance()->recievedDeviceVerificationKey(msg);
|
||||||
|
std::cout << j_msg.dump(2) << std::endl;
|
||||||
|
} else if (msg_type == to_string(mtx::events::EventType::KeyVerificationMac)) {
|
||||||
|
ChatPage::instance()->recievedDeviceVerificationMac(msg);
|
||||||
|
std::cout << j_msg.dump(2) << std::endl;
|
||||||
|
} else if (msg_type == to_string(mtx::events::EventType::KeyVerificationStart)) {
|
||||||
|
ChatPage::instance()->recievedDeviceVerificationStart(msg);
|
||||||
|
std::cout << j_msg.dump(2) << std::endl;
|
||||||
} else {
|
} else {
|
||||||
nhlog::crypto()->warn("unhandled event: {}", j_msg.dump(2));
|
nhlog::crypto()->warn("unhandled event: {}", j_msg.dump(2));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user