From bca29a4227a871caac21236c29430b69264018ce Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Mon, 5 Oct 2020 22:12:10 +0200 Subject: Make steps in verification flow explicit --- resources/qml/TimelineView.qml | 14 +--- resources/qml/UserProfile.qml | 31 +-------- .../AcceptNewVerificationRequest.qml | 49 ------------- .../AwaitingVerificationConfirmation.qml | 5 +- .../AwaitingVerificationRequest.qml | 40 ----------- .../qml/device-verification/DeviceVerification.qml | 80 +++++++++++++--------- .../qml/device-verification/DigitVerification.qml | 12 ++-- .../qml/device-verification/EmojiVerification.qml | 12 ++-- resources/qml/device-verification/Failed.qml | 42 ++++++++++++ .../device-verification/NewVerificationRequest.qml | 37 ++++------ .../qml/device-verification/PartnerAborted.qml | 34 --------- resources/qml/device-verification/Success.qml | 31 +++++++++ resources/qml/device-verification/TimedOut.qml | 35 ---------- .../device-verification/VerificationSuccess.qml | 35 ---------- resources/qml/device-verification/Waiting.qml | 45 ++++++++++++ 15 files changed, 194 insertions(+), 308 deletions(-) delete mode 100644 resources/qml/device-verification/AcceptNewVerificationRequest.qml delete mode 100644 resources/qml/device-verification/AwaitingVerificationRequest.qml create mode 100644 resources/qml/device-verification/Failed.qml delete mode 100644 resources/qml/device-verification/PartnerAborted.qml create mode 100644 resources/qml/device-verification/Success.qml delete mode 100644 resources/qml/device-verification/TimedOut.qml delete mode 100644 resources/qml/device-verification/VerificationSuccess.qml create mode 100644 resources/qml/device-verification/Waiting.qml (limited to 'resources/qml') diff --git a/resources/qml/TimelineView.qml b/resources/qml/TimelineView.qml index 3f72a7dd..1dbe7c1a 100644 --- a/resources/qml/TimelineView.qml +++ b/resources/qml/TimelineView.qml @@ -106,19 +106,7 @@ Page { Connections { target: TimelineManager function onNewDeviceVerificationRequest(flow,transactionId,userId,deviceId,isRequest) { - flow.userId = userId; - flow.sender = false; - flow.deviceId = deviceId; - switch(flow.type){ - case DeviceVerificationFlow.ToDevice: - flow.tranId = transactionId; - deviceVerificationList.add(flow.tranId); - break; - case DeviceVerificationFlow.RoomMsg: - deviceVerificationList.add(flow.tranId); - break; - } - var dialog = deviceVerificationDialog.createObject(timelineRoot, {flow: flow,isRequest: isRequest,tran_id: flow.tranId}); + var dialog = deviceVerificationDialog.createObject(timelineRoot, {flow: flow}); dialog.show(); } } diff --git a/resources/qml/UserProfile.qml b/resources/qml/UserProfile.qml index dc6bc165..e7dcc777 100644 --- a/resources/qml/UserProfile.qml +++ b/resources/qml/UserProfile.qml @@ -15,24 +15,12 @@ ApplicationWindow{ width: 420 minimumHeight: 420 - modality: Qt.WindowModal palette: colors - Connections{ - target: deviceVerificationList - function onUpdateProfile() { - profile.fetchDeviceList(profile.userid) - } - } - Component { id: deviceVerificationDialog DeviceVerification {} } - Component{ - id: deviceVerificationFlow - DeviceVerificationFlow {} - } ColumnLayout{ id: contentL @@ -73,14 +61,7 @@ ApplicationWindow{ enabled: !profile.isUserVerified visible: !profile.isUserVerified - onClicked: { - var newFlow = profile.createFlow(true); - newFlow.userId = profile.userid; - newFlow.sender = true; - deviceVerificationList.add(newFlow.tranId); - var dialog = deviceVerificationDialog.createObject(userProfileDialog, {flow: newFlow,isRequest: true,tran_id: newFlow.tranId}); - dialog.show(); - } + onClicked: profile.verify() } RowLayout { @@ -172,17 +153,11 @@ ApplicationWindow{ id: verifyButton text: (model.verificationStatus != VerificationStatus.VERIFIED)?"Verify":"Unverify" onClicked: { - var newFlow = profile.createFlow(false); - newFlow.userId = profile.userid; - newFlow.sender = true; - newFlow.deviceId = model.deviceId; if(model.verificationStatus == VerificationStatus.VERIFIED){ - newFlow.unverify(); + profile.unverify(model.deviceId) deviceVerificationList.updateProfile(newFlow.userId); }else{ - deviceVerificationList.add(newFlow.tranId); - var dialog = deviceVerificationDialog.createObject(userProfileDialog, {flow: newFlow,isRequest:false,tran_id: newFlow.tranId}); - dialog.show(); + profile.verify(model.deviceId); } } } diff --git a/resources/qml/device-verification/AcceptNewVerificationRequest.qml b/resources/qml/device-verification/AcceptNewVerificationRequest.qml deleted file mode 100644 index 5bdbc4a6..00000000 --- a/resources/qml/device-verification/AcceptNewVerificationRequest.qml +++ /dev/null @@ -1,49 +0,0 @@ -import QtQuick 2.3 -import QtQuick.Controls 2.10 -import QtQuick.Layouts 1.10 - -import im.nheko 1.0 - -Pane { - property string title: qsTr("Recieving Device Verification Request") - Component { - id: awaitingVerificationRequestAccept - AwaitingVerificationRequest {} - } - ColumnLayout { - spacing: 16 - Label { - Layout.maximumWidth: 400 - Layout.fillHeight: true - Layout.fillWidth: true - wrapMode: Text.Wrap - text: qsTr("The device was requested to be verified") - color:colors.text - verticalAlignment: Text.AlignVCenter - } - RowLayout { - Button { - Layout.alignment: Qt.AlignLeft - text: qsTr("Deny") - - onClicked: { - flow.cancelVerification(DeviceVerificationFlow.User); - deviceVerificationList.remove(tran_id); - dialog.destroy(); - } - } - Item { - Layout.fillWidth: true - } - Button { - Layout.alignment: Qt.AlignRight - text: qsTr("Accept") - - onClicked: { - stack.replace(awaitingVerificationRequestAccept); - flow.sender ?flow.sendVerificationReady():flow.acceptVerificationRequest(); - } - } - } - } -} diff --git a/resources/qml/device-verification/AwaitingVerificationConfirmation.qml b/resources/qml/device-verification/AwaitingVerificationConfirmation.qml index aaebba6a..cd8ccfd9 100644 --- a/resources/qml/device-verification/AwaitingVerificationConfirmation.qml +++ b/resources/qml/device-verification/AwaitingVerificationConfirmation.qml @@ -27,9 +27,8 @@ Pane { text: qsTr("Cancel") onClicked: { - flow.cancelVerification(DeviceVerificationFlow.User); - deviceVerificationList.remove(tran_id); - dialog.destroy(); + flow.cancel(); + dialog.close(); } } Item { diff --git a/resources/qml/device-verification/AwaitingVerificationRequest.qml b/resources/qml/device-verification/AwaitingVerificationRequest.qml deleted file mode 100644 index b4b9178a..00000000 --- a/resources/qml/device-verification/AwaitingVerificationRequest.qml +++ /dev/null @@ -1,40 +0,0 @@ -import QtQuick 2.3 -import QtQuick.Controls 2.10 -import QtQuick.Layouts 1.10 - -import im.nheko 1.0 - -Pane { - property string title: qsTr("Waiting for other party") - ColumnLayout { - spacing: 16 - Label { - Layout.maximumWidth: 400 - Layout.fillHeight: true - Layout.fillWidth: true - wrapMode: Text.Wrap - id: content - text: qsTr("Waiting for other side to accept the verification request.") - color:colors.text - verticalAlignment: Text.AlignVCenter - } - BusyIndicator { - Layout.alignment: Qt.AlignHCenter - } - RowLayout { - Button { - Layout.alignment: Qt.AlignLeft - text: qsTr("Cancel") - - onClicked: { - flow.cancelVerification(DeviceVerificationFlow.User); - deviceVerificationList.remove(tran_id); - dialog.destroy(); - } - } - Item { - Layout.fillWidth: true - } - } - } -} diff --git a/resources/qml/device-verification/DeviceVerification.qml b/resources/qml/device-verification/DeviceVerification.qml index ca980987..4e93df06 100644 --- a/resources/qml/device-verification/DeviceVerification.qml +++ b/resources/qml/device-verification/DeviceVerification.qml @@ -18,36 +18,31 @@ ApplicationWindow { height: stack.implicitHeight width: stack.implicitWidth - Component{ - id: newVerificationRequest - NewVerificationRequest {} - } - - Component{ - id: acceptNewVerificationRequest - AcceptNewVerificationRequest {} - } - StackView { id: stack - initialItem: flow.sender == true?newVerificationRequest:acceptNewVerificationRequest + initialItem: newVerificationRequest implicitWidth: currentItem.implicitWidth implicitHeight: currentItem.implicitHeight } + Component{ + id: newVerificationRequest + NewVerificationRequest {} + } + Component { - id: partnerAborted - PartnerAborted {} + id: waiting + Waiting {} } Component { - id: timedout - TimedOut {} + id: success + Success {} } Component { - id: verificationSuccess - VerificationSuccess {} + id: failed + Failed {} } Component { @@ -60,19 +55,42 @@ ApplicationWindow { EmojiVerification {} } - Connections { - target: flow - onVerificationCanceled: stack.replace(partnerAborted) - onTimedout: stack.replace(timedout) - onDeviceVerified: stack.replace(verificationSuccess) - - onVerificationRequestAccepted: switch(method) { - case DeviceVerificationFlow.Decimal: stack.replace(digitVerification); break; - case DeviceVerificationFlow.Emoji: stack.replace(emojiVerification); break; + Item { + state: flow.state + + states: [ + State { + name: "PromptStartVerification" + StateChangeScript { script: stack.replace(newVerificationRequest) } + }, + State { + name: "CompareEmoji" + StateChangeScript { script: stack.replace(emojiVerification) } + }, + State { + name: "CompareNumber" + StateChangeScript { script: stack.replace(digitVerification) } + }, + State { + name: "WaitingForKeys" + StateChangeScript { script: stack.replace(waiting) } + }, + State { + name: "WaitingForOtherToAccept" + StateChangeScript { script: stack.replace(waiting) } + }, + State { + name: "WaitingForMac" + StateChangeScript { script: stack.replace(waiting) } + }, + State { + name: "Success" + StateChangeScript { script: stack.replace(success) } + }, + State { + name: "Failed" + StateChangeScript { script: stack.replace(failed); } } - - onRefreshProfile: { - deviceVerificationList.updateProfile(flow.userId); - } - } + ] +} } diff --git a/resources/qml/device-verification/DigitVerification.qml b/resources/qml/device-verification/DigitVerification.qml index f3b1f5cf..ff878a50 100644 --- a/resources/qml/device-verification/DigitVerification.qml +++ b/resources/qml/device-verification/DigitVerification.qml @@ -6,10 +6,7 @@ import im.nheko 1.0 Pane { property string title: qsTr("Verification Code") - Component { - id: awaitingVerificationConfirmation - AwaitingVerificationConfirmation {} - } + ColumnLayout { spacing: 16 Label { @@ -45,9 +42,8 @@ Pane { text: qsTr("They do not match!") onClicked: { - flow.cancelVerification(DeviceVerificationFlow.MismatchedSAS); - deviceVerificationList.remove(tran_id); - dialog.destroy(); + flow.cancel(); + dialog.close(); } } Item { @@ -57,7 +53,7 @@ Pane { Layout.alignment: Qt.AlignRight text: qsTr("They match!") - onClicked: { stack.replace(awaitingVerificationConfirmation); flow.sendVerificationMac(); } + onClicked: flow.next(); } } } diff --git a/resources/qml/device-verification/EmojiVerification.qml b/resources/qml/device-verification/EmojiVerification.qml index 19faf1b7..ed7727aa 100644 --- a/resources/qml/device-verification/EmojiVerification.qml +++ b/resources/qml/device-verification/EmojiVerification.qml @@ -6,10 +6,7 @@ import im.nheko 1.0 Pane { property string title: qsTr("Verification Code") - Component { - id: awaitingVerificationConfirmation - AwaitingVerificationConfirmation{} - } + ColumnLayout { spacing: 16 Label { @@ -125,9 +122,8 @@ Pane { text: qsTr("They do not match!") onClicked: { - flow.cancelVerification(DeviceVerificationFlow.MismatchedSAS); - deviceVerificationList.remove(tran_id); - dialog.destroy(); + flow.cancel(); + dialog.close(); } } Item { @@ -137,7 +133,7 @@ Pane { Layout.alignment: Qt.AlignRight text: qsTr("They match!") - onClicked: { stack.replace(awaitingVerificationConfirmation); flow.sendVerificationMac(); } + onClicked: flow.next() } } } diff --git a/resources/qml/device-verification/Failed.qml b/resources/qml/device-verification/Failed.qml new file mode 100644 index 00000000..6b5d57ef --- /dev/null +++ b/resources/qml/device-verification/Failed.qml @@ -0,0 +1,42 @@ +import QtQuick 2.3 +import QtQuick.Controls 2.10 +import QtQuick.Layouts 1.10 + +Pane { + property string title: qsTr("Verification timed out") + ColumnLayout { + spacing: 16 + Text { + 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.") + } + color:colors.text + verticalAlignment: Text.AlignVCenter + } + RowLayout { + Item { + Layout.fillWidth: true + } + Button { + Layout.alignment: Qt.AlignRight + text: qsTr("Close") + + onClicked: { + deviceVerificationList.remove(tran_id); + flow.deleteFlow(); + dialog.close() + } + } + } + } +} diff --git a/resources/qml/device-verification/NewVerificationRequest.qml b/resources/qml/device-verification/NewVerificationRequest.qml index ef730b13..bd25bb90 100644 --- a/resources/qml/device-verification/NewVerificationRequest.qml +++ b/resources/qml/device-verification/NewVerificationRequest.qml @@ -2,12 +2,11 @@ import QtQuick 2.3 import QtQuick.Controls 2.10 import QtQuick.Layouts 1.10 +import im.nheko 1.0 + Pane { - property string title: qsTr("Sending Device Verification Request") - Component { - id: awaitingVerificationRequestAccept - AwaitingVerificationRequest {} - } + property string title: flow.sender ? qsTr("Send Device Verification Request") : qsTr("Recieved Device Verification Request") + ColumnLayout { spacing: 16 Label { @@ -15,28 +14,20 @@ Pane { Layout.fillHeight: true Layout.fillWidth: true wrapMode: Text.Wrap - text: qsTr("A new device was added.") - color:colors.text - verticalAlignment: Text.AlignVCenter - } - Label { - Layout.maximumWidth: 400 - Layout.fillHeight: true - Layout.fillWidth: true - wrapMode: Text.Wrap - text: qsTr("The device may have been added by you signing in from another client or physical device. To ensure that no malicious user can eavesdrop on your encrypted communications, you should verify the new device.") + text: flow.sender ? + qsTr("To ensure that no malicious user can eavesdrop on your encrypted communications, you can verify this device.") + : qsTr("The device was requested to be verified") color:colors.text verticalAlignment: Text.AlignVCenter } RowLayout { Button { Layout.alignment: Qt.AlignLeft - text: qsTr("Cancel") + text: flow.sender ? qsTr("Cancel") : qsTr("Deny") onClicked: { - deviceVerificationList.remove(tran_id); - flow.deleteFlow(); - dialog.destroy(); + flow.cancel(); + dialog.close(); } } Item { @@ -44,12 +35,10 @@ Pane { } Button { Layout.alignment: Qt.AlignRight - text: qsTr("Start verification") + text: flow.sender ? qsTr("Start verification") : qsTr("Accept") - onClicked: { - stack.replace(awaitingVerificationRequestAccept); - flow.sender ?flow.sendVerificationRequest():flow.startVerificationRequest(); } - } + onClicked: flow.next(); } } } +} diff --git a/resources/qml/device-verification/PartnerAborted.qml b/resources/qml/device-verification/PartnerAborted.qml deleted file mode 100644 index 6174477d..00000000 --- a/resources/qml/device-verification/PartnerAborted.qml +++ /dev/null @@ -1,34 +0,0 @@ -import QtQuick 2.3 -import QtQuick.Controls 2.10 -import QtQuick.Layouts 1.10 - -Pane { - property string title: qsTr("Verification aborted!") - ColumnLayout { - spacing: 16 - Label { - Layout.maximumWidth: 400 - Layout.fillHeight: true - Layout.fillWidth: true - wrapMode: Text.Wrap - id: content - text: qsTr("Verification canceled by the other party!") - color:colors.text - verticalAlignment: Text.AlignVCenter - } - RowLayout { - Item { - Layout.fillWidth: true - } - Button { - Layout.alignment: Qt.AlignRight - text: qsTr("Close") - - onClicked: { - deviceVerificationList.remove(tran_id); - dialog.destroy(); - } - } - } - } -} diff --git a/resources/qml/device-verification/Success.qml b/resources/qml/device-verification/Success.qml new file mode 100644 index 00000000..b17b293c --- /dev/null +++ b/resources/qml/device-verification/Success.qml @@ -0,0 +1,31 @@ +import QtQuick 2.3 +import QtQuick.Controls 2.10 +import QtQuick.Layouts 1.10 + +Pane { + property string title: qsTr("Successful Verification") + ColumnLayout { + spacing: 16 + Label { + Layout.maximumWidth: 400 + Layout.fillHeight: true + Layout.fillWidth: true + wrapMode: Text.Wrap + id: content + text: qsTr("Verification successful! Both sides verified their devices!") + color:colors.text + verticalAlignment: Text.AlignVCenter + } + RowLayout { + Item { + Layout.fillWidth: true + } + Button { + Layout.alignment: Qt.AlignRight + text: qsTr("Close") + + onClicked: dialog.close(); + } + } + } +} diff --git a/resources/qml/device-verification/TimedOut.qml b/resources/qml/device-verification/TimedOut.qml deleted file mode 100644 index 7dd0ab69..00000000 --- a/resources/qml/device-verification/TimedOut.qml +++ /dev/null @@ -1,35 +0,0 @@ -import QtQuick 2.3 -import QtQuick.Controls 2.10 -import QtQuick.Layouts 1.10 - -Pane { - property string title: qsTr("Verification timed out") - ColumnLayout { - spacing: 16 - Text { - Layout.maximumWidth: 400 - Layout.fillHeight: true - Layout.fillWidth: true - wrapMode: Text.Wrap - id: content - text: qsTr("Device verification timed out.") - color:colors.text - verticalAlignment: Text.AlignVCenter - } - RowLayout { - Item { - Layout.fillWidth: true - } - Button { - Layout.alignment: Qt.AlignRight - text: qsTr("Close") - - onClicked: { - deviceVerificationList.remove(tran_id); - flow.deleteFlow(); - dialog.destroy() - } - } - } - } -} diff --git a/resources/qml/device-verification/VerificationSuccess.qml b/resources/qml/device-verification/VerificationSuccess.qml deleted file mode 100644 index bc1e64f7..00000000 --- a/resources/qml/device-verification/VerificationSuccess.qml +++ /dev/null @@ -1,35 +0,0 @@ -import QtQuick 2.3 -import QtQuick.Controls 2.10 -import QtQuick.Layouts 1.10 - -Pane { - property string title: qsTr("Successful Verification") - ColumnLayout { - spacing: 16 - Label { - Layout.maximumWidth: 400 - Layout.fillHeight: true - Layout.fillWidth: true - wrapMode: Text.Wrap - id: content - text: qsTr("Verification successful! Both sides verified their devices!") - color:colors.text - verticalAlignment: Text.AlignVCenter - } - RowLayout { - Item { - Layout.fillWidth: true - } - Button { - Layout.alignment: Qt.AlignRight - text: qsTr("Close") - - onClicked: { - deviceVerificationList.remove(tran_id); - if(flow) flow.deleteFlow(); - dialog.destroy(); - } - } - } - } -} diff --git a/resources/qml/device-verification/Waiting.qml b/resources/qml/device-verification/Waiting.qml new file mode 100644 index 00000000..f36910e7 --- /dev/null +++ b/resources/qml/device-verification/Waiting.qml @@ -0,0 +1,45 @@ +import QtQuick 2.3 +import QtQuick.Controls 2.10 +import QtQuick.Layouts 1.10 + +import im.nheko 1.0 + +Pane { + property string title: qsTr("Waiting for other party") + ColumnLayout { + spacing: 16 + Label { + Layout.maximumWidth: 400 + Layout.fillHeight: true + Layout.fillWidth: true + wrapMode: Text.Wrap + id: content + text: switch (flow.state) { + case "WaitingForOtherToAccept": return qsTr("Waiting for other side to accept the verification request.") + case "WaitingForKeys": return qsTr("Waiting for other side to continue the verification request.") + case "WaitingForMac": return qsTr("Waiting for other side to complete the verification request.") + } + + color:colors.text + verticalAlignment: Text.AlignVCenter + } + BusyIndicator { + Layout.alignment: Qt.AlignHCenter + palette: color + } + RowLayout { + Button { + Layout.alignment: Qt.AlignLeft + text: qsTr("Cancel") + + onClicked: { + flow.cancel(); + dialog.close(); + } + } + Item { + Layout.fillWidth: true + } + } + } +} -- cgit 1.5.1