diff --git a/CMakeLists.txt b/CMakeLists.txt
index bdfc7798..9280f7aa 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -341,7 +341,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
- GIT_TAG f84611f129b46746a4b586acaba54fc31a303bc6
+ GIT_TAG ad5575bc24089dc385e97d9ace026414b618775c
)
FetchContent_MakeAvailable(MatrixClient)
else()
diff --git a/io.github.NhekoReborn.Nheko.json b/io.github.NhekoReborn.Nheko.json
index da1b5a37..930b39ea 100644
--- a/io.github.NhekoReborn.Nheko.json
+++ b/io.github.NhekoReborn.Nheko.json
@@ -146,7 +146,7 @@
"name": "mtxclient",
"sources": [
{
- "commit": "f84611f129b46746a4b586acaba54fc31a303bc6",
+ "commit": "ad5575bc24089dc385e97d9ace026414b618775c",
"type": "git",
"url": "https://github.com/Nheko-Reborn/mtxclient.git"
}
diff --git a/src/Cache.cpp b/src/Cache.cpp
index d6da03c6..d1afa2a1 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -3591,6 +3591,7 @@ init(const QString &user_id)
qRegisterMetaType<QMap<QString, RoomInfo>>();
qRegisterMetaType<std::map<QString, RoomInfo>>();
qRegisterMetaType<std::map<QString, mtx::responses::Timeline>>();
+ qRegisterMetaType<mtx::responses::QueryKeys>();
instance_ = std::make_unique<Cache>(user_id);
}
diff --git a/src/DeviceVerificationFlow.cpp b/src/DeviceVerificationFlow.cpp
index 549569f4..97f42592 100644
--- a/src/DeviceVerificationFlow.cpp
+++ b/src/DeviceVerificationFlow.cpp
@@ -234,6 +234,55 @@ DeviceVerificationFlow::DeviceVerificationFlow(QObject *,
}
if (msg.keys == macs.keys) {
+ mtx::requests::KeySignaturesUpload req;
+ if (utils::localUser().toStdString() == this->toClient.to_string()) {
+ // self verification, sign master key with device key, if we
+ // verified it
+ for (const auto &mac : msg.mac) {
+ if (their_keys.master_keys.keys.count(mac.first)) {
+ json j = their_keys.master_keys;
+ j.erase("signatures");
+ j.erase("unsigned");
+ mtx::crypto::CrossSigningKeys master_key = j;
+ master_key
+ .signatures[utils::localUser().toStdString()]
+ ["ed25519:" +
+ http::client()->device_id()] =
+ olm::client()->sign_message(j.dump());
+ req.signatures[utils::localUser().toStdString()]
+ [master_key.keys.at(mac.first)] =
+ master_key;
+ }
+ }
+ // TODO(Nico): Sign their device key with self signing key
+ } else {
+ // TODO(Nico): Sign their master key with user signing key
+ }
+
+ if (!req.signatures.empty()) {
+ http::client()->keys_signatures_upload(
+ req,
+ [](const mtx::responses::KeySignaturesUpload &res,
+ mtx::http::RequestErr err) {
+ if (err) {
+ nhlog::net()->error(
+ "failed to upload signatures: {},{}",
+ err->matrix_error.errcode,
+ static_cast<int>(err->status_code));
+ }
+
+ for (const auto &[user_id, tmp] : res.errors)
+ for (const auto &[key_id, e] : tmp)
+ nhlog::net()->error(
+ "signature error for user {} and key "
+ "id {}: {}, {}",
+ user_id,
+ key_id,
+ e.errcode,
+ e.error);
+ });
+ }
+
this->isMacVerified = true;
this->acceptDevice();
} else {
|