summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt2
-rw-r--r--io.github.NhekoReborn.Nheko.json2
-rw-r--r--src/Cache.cpp1
-rw-r--r--src/DeviceVerificationFlow.cpp49
4 files changed, 52 insertions, 2 deletions
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 {