summary refs log tree commit diff
path: root/src/DeviceVerificationFlow.cpp
diff options
context:
space:
mode:
authorCH Chethan Reddy <40890937+Chethan2k1@users.noreply.github.com>2020-06-26 15:10:37 +0530
committerCH Chethan Reddy <40890937+Chethan2k1@users.noreply.github.com>2020-07-30 22:10:27 +0530
commitffa61095b8be7c61c3b4cdd693e59239ab668516 (patch)
tree4223b877e5e55d484f443ed4d9dd4c0aaaf7abb3 /src/DeviceVerificationFlow.cpp
parentAdd some Userprofile buttons (diff)
downloadnheko-ffa61095b8be7c61c3b4cdd693e59239ab668516.tar.xz
Error Handling and some fixes
Diffstat (limited to 'src/DeviceVerificationFlow.cpp')
-rw-r--r--src/DeviceVerificationFlow.cpp109
1 files changed, 70 insertions, 39 deletions
diff --git a/src/DeviceVerificationFlow.cpp b/src/DeviceVerificationFlow.cpp

index 2c6e9c1e..b5134a3b 100644 --- a/src/DeviceVerificationFlow.cpp +++ b/src/DeviceVerificationFlow.cpp
@@ -17,42 +17,53 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) this->isMacVerified = false; connect(timeout, &QTimer::timeout, this, [this]() { emit timedout(); + this->cancelVerification(DeviceVerificationFlow::Error::Timeout); this->deleteLater(); }); - connect(ChatPage::instance(), - &ChatPage::recievedDeviceVerificationStart, - this, - [this](const mtx::events::collections::DeviceEvents &message) { - auto msg = - std::get<mtx::events::DeviceEvent<msgs::KeyVerificationStart>>(message); - if (msg.content.transaction_id == this->transaction_id) { - if ((std::find(msg.content.key_agreement_protocols.begin(), - msg.content.key_agreement_protocols.end(), - "curve25519-hkdf-sha256") != - msg.content.key_agreement_protocols.end()) && - (std::find(msg.content.hashes.begin(), - msg.content.hashes.end(), - "sha256") != msg.content.hashes.end()) && - (std::find(msg.content.message_authentication_codes.begin(), - msg.content.message_authentication_codes.end(), - "hmac-sha256") != - msg.content.message_authentication_codes.end()) && - ((std::find(msg.content.short_authentication_string.begin(), + connect( + ChatPage::instance(), + &ChatPage::recievedDeviceVerificationStart, + this, + [this](const mtx::events::collections::DeviceEvents &message) { + auto msg = + std::get<mtx::events::DeviceEvent<msgs::KeyVerificationStart>>(message); + if (msg.content.transaction_id == this->transaction_id) { + if ((std::find(msg.content.key_agreement_protocols.begin(), + msg.content.key_agreement_protocols.end(), + "curve25519-hkdf-sha256") != + msg.content.key_agreement_protocols.end()) && + (std::find(msg.content.hashes.begin(), + msg.content.hashes.end(), + "sha256") != msg.content.hashes.end()) && + (std::find(msg.content.message_authentication_codes.begin(), + msg.content.message_authentication_codes.end(), + "hmac-sha256") != + msg.content.message_authentication_codes.end())) { + if (std::find(msg.content.short_authentication_string.begin(), msg.content.short_authentication_string.end(), mtx::events::msg::SASMethods::Decimal) != - msg.content.short_authentication_string.end()) || - (std::find(msg.content.short_authentication_string.begin(), - msg.content.short_authentication_string.end(), - mtx::events::msg::SASMethods::Emoji) != - msg.content.short_authentication_string.end()))) { - this->acceptVerificationRequest(); - this->canonical_json = nlohmann::json(msg.content); - } else { - this->cancelVerification(); - } - } - }); + msg.content.short_authentication_string.end()) { + this->method = DeviceVerificationFlow::Method::Emoji; + } else if (std::find( + msg.content.short_authentication_string.begin(), + msg.content.short_authentication_string.end(), + mtx::events::msg::SASMethods::Emoji) != + msg.content.short_authentication_string.end()) { + this->method = DeviceVerificationFlow::Method::Decimal; + } else { + this->cancelVerification( + DeviceVerificationFlow::Error::UnknownMethod); + return; + } + this->acceptVerificationRequest(); + this->canonical_json = nlohmann::json(msg.content); + } else { + this->cancelVerification( + DeviceVerificationFlow::Error::UnknownMethod); + } + } + }); connect( ChatPage::instance(), &ChatPage::recievedDeviceVerificationAccept, @@ -76,7 +87,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) this->mac_method = msg.content.message_authentication_code; this->sendVerificationKey(); } else { - this->cancelVerification(); + this->cancelVerification( + DeviceVerificationFlow::Error::UnknownMethod); } } }); @@ -130,7 +142,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) msg.content.key + this->canonical_json.dump()))) { emit this->verificationRequestAccepted(this->method); } else { - this->cancelVerification(); + this->cancelVerification( + DeviceVerificationFlow::Error::MismatchedCommitment); } } } @@ -156,7 +169,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) this->sas->calculate_mac(this->device_keys[mac.first], info + mac.first)) { } else { - this->cancelVerification(); + this->cancelVerification( + DeviceVerificationFlow::Error::KeyMismatch); return; } } @@ -172,7 +186,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *) else this->isMacVerified = true; } else { - this->cancelVerification(); + this->cancelVerification( + DeviceVerificationFlow::Error::KeyMismatch); } } }); @@ -429,15 +444,31 @@ DeviceVerificationFlow::sendVerificationRequest() } //! cancels a verification flow void -DeviceVerificationFlow::cancelVerification() +DeviceVerificationFlow::cancelVerification(DeviceVerificationFlow::Error error_code) { mtx::requests::ToDeviceMessages<mtx::events::msg::KeyVerificationCancel> body; mtx::events::msg::KeyVerificationCancel req; req.transaction_id = this->transaction_id; - // TODO: Add Proper Error Messages and Code - req.reason = "Device Verification Cancelled"; - req.code = "400"; + if (error_code == DeviceVerificationFlow::Error::UnknownMethod) { + req.code = "m.unknown_method"; + req.reason = "unknown method recieved"; + } else if (error_code == DeviceVerificationFlow::Error::MismatchedCommitment) { + req.code = "m.mismatched_commitment"; + req.reason = "commitment didn't match"; + } else if (error_code == DeviceVerificationFlow::Error::MismatchedSAS) { + req.code = "m.mismatched_sas"; + req.reason = "sas didn't match"; + } else if (error_code == DeviceVerificationFlow::Error::KeyMismatch) { + req.code = "m.key_match"; + req.reason = "keys did not match"; + } else if (error_code == DeviceVerificationFlow::Error::Timeout) { + req.code = "m.timeout"; + req.reason = "timed out"; + } else if (error_code == DeviceVerificationFlow::Error::User) { + req.code = "m.user"; + req.reason = "user cancelled the verification"; + } body[this->toClient][deviceId.toStdString()] = req;