diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml index f29fb4c1..a85c41c3 100644 --- a/resources/qml/UserProfile.qml +++ b/resources/qml/UserProfile.qml @@ -5,6 +5,8 @@ import QtQuick.Window 2.3 import im.nheko 1.0 +import "./device-verification" + ApplicationWindow{ property var user_data property var colors: currentActivePalette @@ -20,7 +22,6 @@ ApplicationWindow{ id: userProfileList userId: user_data.userId onUserIdChanged : { - console.log(userId) userProfileList.updateDeviceList() } onDeviceListUpdated : { @@ -84,15 +85,34 @@ ApplicationWindow{ delegate: RowLayout{ width: parent.width - Text{ - Layout.fillWidth: true - color: colors.text - text: deviceID + ColumnLayout{ + Text{ + Layout.fillWidth: true + color: colors.text + Layout.alignment: Qt.AlignRight + text: deviceID + } + Text{ + Layout.fillWidth: true + color:colors.text + Layout.alignment: Qt.AlignRight + text: displayName + } + Component { + id: deviceVerificationDialog + DeviceVerification {} + } + DeviceVerificationFlow { + id: deviceVerificationFlow + } } - Text{ - Layout.fillWidth: true - color:colors.text - text: displayName + Button{ + text:"Verify" + onClicked: { + var dialog = deviceVerificationDialog.createObject(userProfileDialog, + {flow: deviceVerificationFlow,sender: true}); + dialog.show(); + } } } } diff --git a/resources/qml/device-verification/DeviceVerification.qml b/resources/qml/device-verification/DeviceVerification.qml index dd637e59..ce2485ff 100644 --- a/resources/qml/device-verification/DeviceVerification.qml +++ b/resources/qml/device-verification/DeviceVerification.qml @@ -7,6 +7,7 @@ import Qt.labs.settings 1.0 import im.nheko 1.0 ApplicationWindow { + property bool sender: true title: stack.currentItem.title id: dialog @@ -24,7 +25,7 @@ ApplicationWindow { width: stack.implicitWidth StackView { id: stack - initialItem: newVerificationRequest + initialItem: sender == true?newVerificationRequest:acceptNewVerificationRequest implicitWidth: currentItem.implicitWidth implicitHeight: currentItem.implicitHeight } @@ -47,7 +48,7 @@ ApplicationWindow { Component { id: newVerificationRequest Pane { - property string title: "Device Verification Request" + property string title: "Sending Device Verification Request" ColumnLayout { spacing: 16 Label { @@ -82,6 +83,42 @@ ApplicationWindow { Button { Layout.alignment: Qt.AlignRight text: "Start verification" + onClicked: { stack.replace(awaitingVerificationRequestAccept); flow.sendVerificationRequest(); } + } + } + } + } + } + + Component { + id: acceptNewVerificationRequest + Pane { + property string title: "Recieving Device Verification Request" + ColumnLayout { + spacing: 16 + + Label { + Layout.maximumWidth: 400 + Layout.fillHeight: true + Layout.fillWidth: true + wrapMode: Text.Wrap + text: "The device was requested to be verified" + + verticalAlignment: Text.AlignVCenter + } + + RowLayout { + Button { + Layout.alignment: Qt.AlignLeft + text: "Deny" + onClicked: { dialog.close(); flow.cancelVerification(); } + } + Item { + Layout.fillWidth: true + } + Button { + Layout.alignment: Qt.AlignRight + text: "Accept" onClicked: { stack.replace(awaitingVerificationRequestAccept); flow.acceptVerificationRequest(); } } } diff --git a/src/DeviceVerificationFlow.cpp b/src/DeviceVerificationFlow.cpp index 69d6ab9c..12e31c04 100644 --- a/src/DeviceVerificationFlow.cpp +++ b/src/DeviceVerificationFlow.cpp @@ -1,5 +1,8 @@ #include "DeviceVerificationFlow.h" +#include +#include +#include // only for debugging #include static constexpr int TIMEOUT = 2 * 60 * 1000; // 2 minutes @@ -15,17 +18,80 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) timeout->start(TIMEOUT); } -//! accepts a verification and starts the verification flow +std::string +DeviceVerificationFlow::generate_txn_id() +{ + this->transaction_id = mtx::client::utils::random_token(32, false); + return this->transaction_id; +} + +//! accepts a verification void DeviceVerificationFlow::acceptVerificationRequest() { + mtx::requests::ToDeviceMessages body; + mtx::events::msg::KeyVerificationAccept req; + + req.transaction_id = this->transaction_id; + req.method = mtx::events::msg::VerificationMethods::SASv1; + req.key_agreement_protocol = ""; + req.hash = ""; + req.message_authentication_code = ""; + // req.short_authentication_string = ""; + req.commitment = ""; + emit verificationRequestAccepted(rand() % 2 ? Emoji : Decimal); + + // Yet to add send to_device message +} +//! starts the verification flow +void +DeviceVerificationFlow::startVerificationRequest() +{ + mtx::requests::ToDeviceMessages body; + mtx::events::msg::KeyVerificationAccept req; + + // req.from_device = ""; + req.transaction_id = this->transaction_id; + req.method = mtx::events::msg::VerificationMethods::SASv1; + req.key_agreement_protocol = {}; + // req.hashes = {}; + req.message_authentication_code = {}; + // req.short_authentication_string = ""; + + // Yet to add send to_device message +} +//! sends a verification request +void +DeviceVerificationFlow::sendVerificationRequest() +{ + QDateTime CurrentTime = QDateTime::currentDateTimeUtc(); + + mtx::requests::ToDeviceMessages body; + mtx::events::msg::KeyVerificationRequest req; + + req.from_device = ""; + req.transaction_id = generate_txn_id(); + req.methods.resize(1); + req.methods[0] = mtx::events::msg::VerificationMethods::SASv1; + req.timestamp = (uint64_t)CurrentTime.toTime_t(); + + // Yet to add send to_device message } //! cancels a verification flow void DeviceVerificationFlow::cancelVerification() { + mtx::requests::ToDeviceMessages body; + mtx::events::msg::KeyVerificationCancel req; + + req.transaction_id = this->transaction_id; + req.reason = ""; + req.code = ""; + this->deleteLater(); + + // Yet to add send to_device message } //! Completes the verification flow void @@ -33,4 +99,6 @@ DeviceVerificationFlow::acceptDevice() { emit deviceVerified(); this->deleteLater(); + + // Yet to add send to_device message } diff --git a/src/DeviceVerificationFlow.h b/src/DeviceVerificationFlow.h index 038f1e13..71c40cd5 100644 --- a/src/DeviceVerificationFlow.h +++ b/src/DeviceVerificationFlow.h @@ -20,8 +20,12 @@ public: DeviceVerificationFlow(QObject *parent = nullptr); public slots: - //! accepts a verification and starts the verification flow + //! sends a verification request + void sendVerificationRequest(); + //! accepts a verification void acceptVerificationRequest(); + //! starts the verification flow + void startVerificationRequest(); //! cancels a verification flow void cancelVerification(); //! Completes the verification flow @@ -34,5 +38,9 @@ signals: void verificationCanceled(); private: + //! generates a unique transaction id + std::string generate_txn_id(); + QTimer *timeout = nullptr; + std::string transaction_id; };