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;
|