Properly handle glare when verifying

This commit is contained in:
Nicolas Werner 2022-06-12 17:53:17 +02:00
parent 051545a851
commit 00740a7e65
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9

View file

@ -157,7 +157,8 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
&ChatPage::receivedDeviceVerificationKey, &ChatPage::receivedDeviceVerificationKey,
this, this,
[this](const mtx::events::msg::KeyVerificationKey &msg) { [this](const mtx::events::msg::KeyVerificationKey &msg) {
nhlog::crypto()->info("verification: received key"); nhlog::crypto()->info(
"verification: received key, sender {}, state {}", sender, state().toStdString());
if (msg.transaction_id.has_value()) { if (msg.transaction_id.has_value()) {
if (msg.transaction_id.value() != this->transaction_id) if (msg.transaction_id.value() != this->transaction_id)
return; return;
@ -167,7 +168,7 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
} }
if (sender) { if (sender) {
if (state_ != WaitingForOtherToAccept) { if (state_ != WaitingForOtherToAccept && state_ != WaitingForKeys) {
this->cancelVerification(OutOfOrder); this->cancelVerification(OutOfOrder);
return; return;
} }
@ -567,12 +568,24 @@ DeviceVerificationFlow::handleStartMessage(const mtx::events::msg::KeyVerificati
if (!sender) if (!sender)
this->canonical_json = nlohmann::json(msg); this->canonical_json = nlohmann::json(msg);
else { else {
if (utils::localUser().toStdString() < this->toClient.to_string()) { // resolve glare
if (utils::localUser().toStdString() > this->toClient.to_string() &&
http::client()->device_id() > this->deviceId.toStdString()) {
// treat this as if the user with the smaller mxid and deviceid was the sender of
// "start"
this->canonical_json = nlohmann::json(msg); this->canonical_json = nlohmann::json(msg);
this->sender = false;
}
if (msg.method != mtx::events::msg::VerificationMethods::SASv1) {
cancelVerification(DeviceVerificationFlow::Error::OutOfOrder);
return;
} }
} }
if (state_ != PromptStartVerification) // If we didn't send "start", accept the verification (otherwise wait for the other side to
// accept
if (state_ != PromptStartVerification && !sender)
this->acceptVerificationRequest(); this->acceptVerificationRequest();
} else { } else {
this->cancelVerification(DeviceVerificationFlow::Error::UnknownMethod); this->cancelVerification(DeviceVerificationFlow::Error::UnknownMethod);