mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 19:08:58 +03:00
Properly handle glare when verifying
This commit is contained in:
parent
051545a851
commit
00740a7e65
1 changed files with 17 additions and 4 deletions
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue