From 8a4d85f801368137a0b1c17621947b334e280257 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 5 Oct 2020 22:58:07 +0200 Subject: [PATCH] Show different verification errors --- .../DeviceVerification.qml | 1 - resources/qml/device-verification/Failed.qml | 28 ++++++++++--------- resources/qml/device-verification/Waiting.qml | 4 +-- src/DeviceVerificationFlow.cpp | 5 ++-- src/DeviceVerificationFlow.h | 4 +-- src/timeline/TimelineViewManager.cpp | 12 ++++++++ src/timeline/TimelineViewManager.h | 1 + 7 files changed, 35 insertions(+), 20 deletions(-) diff --git a/resources/qml/device-verification/DeviceVerification.qml b/resources/qml/device-verification/DeviceVerification.qml index 4e93df0..64f10b3 100644 --- a/resources/qml/device-verification/DeviceVerification.qml +++ b/resources/qml/device-verification/DeviceVerification.qml @@ -6,7 +6,6 @@ import im.nheko 1.0 ApplicationWindow { property var flow - property var tran_id title: stack.currentItem.title id: dialog diff --git a/resources/qml/device-verification/Failed.qml b/resources/qml/device-verification/Failed.qml index 6b5d57e..fcff789 100644 --- a/resources/qml/device-verification/Failed.qml +++ b/resources/qml/device-verification/Failed.qml @@ -2,23 +2,29 @@ import QtQuick 2.3 import QtQuick.Controls 2.10 import QtQuick.Layouts 1.10 +import im.nheko 1.0 + Pane { - property string title: qsTr("Verification timed out") + property string title: qsTr("Verification failed") ColumnLayout { spacing: 16 Text { + id: content + Layout.maximumWidth: 400 Layout.fillHeight: true Layout.fillWidth: true + wrapMode: Text.Wrap - id: content text: switch (flow.error) { - case VerificationStatus.UnknownMethod: return qsTr("Device verification timed out.") - case VerificationStatus.MismatchedCommitment: return qsTr("Device verification timed out.") - case VerificationStatus.MismatchedSAS: return qsTr("Device verification timed out.") - case VerificationStatus.KeyMismatch: return qsTr("Device verification timed out.") - case VerificationStatus.Timeout: return qsTr("Device verification timed out.") - case VerificationStatus.OutOfOrder: return qsTr("Device verification timed out.") + case DeviceVerificationFlow.UnknownMethod: return qsTr("Other client does not support our verification protocol.") + case DeviceVerificationFlow.MismatchedCommitment: + case DeviceVerificationFlow.MismatchedSAS: + case DeviceVerificationFlow.KeyMismatch: return qsTr("Key mismatch detected!") + case DeviceVerificationFlow.Timeout: return qsTr("Device verification timed out.") + case DeviceVerificationFlow.User: return qsTr("Other party canceled the verification.") + case DeviceVerificationFlow.OutOfOrder: return qsTr("Device verification timed out.") + default: return "Unknown verification error."; } color:colors.text verticalAlignment: Text.AlignVCenter @@ -31,11 +37,7 @@ Pane { Layout.alignment: Qt.AlignRight text: qsTr("Close") - onClicked: { - deviceVerificationList.remove(tran_id); - flow.deleteFlow(); - dialog.close() - } + onClicked: dialog.close() } } } diff --git a/resources/qml/device-verification/Waiting.qml b/resources/qml/device-verification/Waiting.qml index f36910e..38abf76 100644 --- a/resources/qml/device-verification/Waiting.qml +++ b/resources/qml/device-verification/Waiting.qml @@ -20,12 +20,12 @@ Pane { case "WaitingForMac": return qsTr("Waiting for other side to complete the verification request.") } - color:colors.text + color: colors.text verticalAlignment: Text.AlignVCenter } BusyIndicator { Layout.alignment: Qt.AlignHCenter - palette: color + palette: colors } RowLayout { Button { diff --git a/src/DeviceVerificationFlow.cpp b/src/DeviceVerificationFlow.cpp index 99fd7be..79f1de8 100644 --- a/src/DeviceVerificationFlow.cpp +++ b/src/DeviceVerificationFlow.cpp @@ -64,7 +64,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *, } connect(timeout, &QTimer::timeout, this, [this]() { - this->cancelVerification(DeviceVerificationFlow::Error::Timeout); + if (state_ != Success && state_ != Failed) + this->cancelVerification(DeviceVerificationFlow::Error::Timeout); }); connect(ChatPage::instance(), @@ -114,7 +115,7 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *, return; } error_ = User; - emit errorChanged(); + Emit errorChanged(); setState(Failed); }); diff --git a/src/DeviceVerificationFlow.h b/src/DeviceVerificationFlow.h index 1fe3919..a1ceaf8 100644 --- a/src/DeviceVerificationFlow.h +++ b/src/DeviceVerificationFlow.h @@ -58,7 +58,7 @@ class DeviceVerificationFlow : public QObject Q_OBJECT // Q_CLASSINFO("RegisterEnumClassesUnscoped", "false") Q_PROPERTY(QString state READ state NOTIFY stateChanged) - Q_PROPERTY(Error error READ error CONSTANT) + Q_PROPERTY(Error error READ error NOTIFY errorChanged) Q_PROPERTY(QString userId READ getUserId CONSTANT) Q_PROPERTY(QString deviceId READ getDeviceId CONSTANT) Q_PROPERTY(bool sender READ getSender CONSTANT) @@ -203,7 +203,7 @@ private: mtx::common::RelatesTo relation; State state_ = PromptStartVerification; - Error error_; + Error error_ = UnknownMethod; bool isMacVerified = false; diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp index 250cd5f..ed72005 100644 --- a/src/timeline/TimelineViewManager.cpp +++ b/src/timeline/TimelineViewManager.cpp @@ -396,6 +396,18 @@ TimelineViewManager::verifyUser(QString userid) tr("No share room with this user found. Create an " "encrypted room with this user and try again.")); } + +void +TimelineViewManager::removeVerificationFlow(DeviceVerificationFlow *flow) +{ + for (auto it = dvList.keyValueBegin(); it != dvList.keyValueEnd(); ++it) { + if (it->second == flow) { + dvList.remove(it->first); + return; + } + } +} + void TimelineViewManager::verifyDevice(QString userid, QString deviceid) { diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h index 12e4908..a8bd2e0 100644 --- a/src/timeline/TimelineViewManager.h +++ b/src/timeline/TimelineViewManager.h @@ -62,6 +62,7 @@ public: Q_INVOKABLE void openMemberListDialog() const; Q_INVOKABLE void openLeaveRoomDialog() const; Q_INVOKABLE void openRoomSettings() const; + Q_INVOKABLE void removeVerificationFlow(DeviceVerificationFlow *flow); void verifyUser(QString userid); void verifyDevice(QString userid, QString deviceid);