summary refs log tree commit diff
path: root/src/SelfVerificationStatus.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/SelfVerificationStatus.cpp')
-rw-r--r--src/SelfVerificationStatus.cpp249
1 files changed, 0 insertions, 249 deletions
diff --git a/src/SelfVerificationStatus.cpp b/src/SelfVerificationStatus.cpp
deleted file mode 100644

index d75a2109..00000000 --- a/src/SelfVerificationStatus.cpp +++ /dev/null
@@ -1,249 +0,0 @@ -// SPDX-FileCopyrightText: 2021 Nheko Contributors -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "SelfVerificationStatus.h" - -#include "Cache_p.h" -#include "Logging.h" -#include "MainWindow.h" -#include "MatrixClient.h" -#include "Olm.h" -#include "ui/UIA.h" - -#include <mtx/responses/common.hpp> - -SelfVerificationStatus::SelfVerificationStatus(QObject *o) - : QObject(o) -{ - connect(MainWindow::instance(), &MainWindow::reload, this, [this] { - connect(cache::client(), - &Cache::selfUnverified, - this, - &SelfVerificationStatus::invalidate, - Qt::UniqueConnection); - invalidate(); - }); -} - -void -SelfVerificationStatus::setupCrosssigning(bool useSSSS, QString password, bool useOnlineKeyBackup) -{ - nhlog::db()->info("Clicked setup crossigning"); - - auto xsign_keys = olm::client()->create_crosssigning_keys(); - - if (!xsign_keys) { - nhlog::crypto()->critical("Failed to setup cross-signing keys!"); - emit setupFailed(tr("Failed to create keys for cross-signing!")); - return; - } - - cache::client()->storeSecret(mtx::secret_storage::secrets::cross_signing_master, - xsign_keys->private_master_key); - cache::client()->storeSecret(mtx::secret_storage::secrets::cross_signing_self_signing, - xsign_keys->private_self_signing_key); - cache::client()->storeSecret(mtx::secret_storage::secrets::cross_signing_user_signing, - xsign_keys->private_user_signing_key); - - std::optional<mtx::crypto::OlmClient::OnlineKeyBackupSetup> okb; - if (useOnlineKeyBackup) { - okb = olm::client()->create_online_key_backup(xsign_keys->private_master_key); - if (!okb) { - nhlog::crypto()->critical("Failed to setup online key backup!"); - emit setupFailed(tr("Failed to create keys for online key backup!")); - return; - } - - cache::client()->storeSecret( - mtx::secret_storage::secrets::megolm_backup_v1, - mtx::crypto::bin2base64(mtx::crypto::to_string(okb->privateKey))); - - http::client()->post_backup_version( - okb->backupVersion.algorithm, - okb->backupVersion.auth_data, - [](const mtx::responses::Version &v, mtx::http::RequestErr e) { - if (e) { - nhlog::net()->error("error setting up online key backup: {} {} {} {}", - e->parse_error, - e->status_code, - e->error_code, - e->matrix_error.error); - } else { - nhlog::crypto()->info("Set up online key backup: '{}'", v.version); - } - }); - } - - std::optional<mtx::crypto::OlmClient::SSSSSetup> ssss; - if (useSSSS) { - ssss = olm::client()->create_ssss_key(password.toStdString()); - if (!ssss) { - nhlog::crypto()->critical("Failed to setup secure server side secret storage!"); - emit setupFailed(tr("Failed to create keys secure server side secret storage!")); - return; - } - - auto master = mtx::crypto::PkSigning::from_seed(xsign_keys->private_master_key); - nlohmann::json j = ssss->keyDescription; - j.erase("signatures"); - ssss->keyDescription - .signatures[http::client()->user_id().to_string()]["ed25519:" + master.public_key()] = - master.sign(j.dump()); - - http::client()->upload_secret_storage_key( - ssss->keyDescription.name, ssss->keyDescription, [](mtx::http::RequestErr) {}); - http::client()->set_secret_storage_default_key(ssss->keyDescription.name, - [](mtx::http::RequestErr) {}); - - auto uploadSecret = [ssss](const std::string &key_name, const std::string &secret) { - mtx::secret_storage::Secret s; - s.encrypted[ssss->keyDescription.name] = - mtx::crypto::encrypt(secret, ssss->privateKey, key_name); - http::client()->upload_secret_storage_secret( - key_name, s, [key_name](mtx::http::RequestErr) { - nhlog::crypto()->info("Uploaded secret: {}", key_name); - }); - }; - - uploadSecret(mtx::secret_storage::secrets::cross_signing_master, - xsign_keys->private_master_key); - uploadSecret(mtx::secret_storage::secrets::cross_signing_self_signing, - xsign_keys->private_self_signing_key); - uploadSecret(mtx::secret_storage::secrets::cross_signing_user_signing, - xsign_keys->private_user_signing_key); - - if (okb) - uploadSecret(mtx::secret_storage::secrets::megolm_backup_v1, - mtx::crypto::bin2base64(mtx::crypto::to_string(okb->privateKey))); - } - - mtx::requests::DeviceSigningUpload device_sign{}; - device_sign.master_key = xsign_keys->master_key; - device_sign.self_signing_key = xsign_keys->self_signing_key; - device_sign.user_signing_key = xsign_keys->user_signing_key; - http::client()->device_signing_upload( - device_sign, - UIA::instance()->genericHandler(tr("Encryption Setup")), - [this, ssss, xsign_keys](mtx::http::RequestErr e) { - if (e) { - nhlog::crypto()->critical("Failed to upload cross signing keys: {}", - e->matrix_error.error); - - emit setupFailed(tr("Encryption setup failed: %1") - .arg(QString::fromStdString(e->matrix_error.error))); - return; - } - nhlog::crypto()->info("Crosssigning keys uploaded!"); - - auto deviceKeys = cache::client()->userKeys(http::client()->user_id().to_string()); - if (deviceKeys) { - auto myKey = deviceKeys->device_keys.at(http::client()->device_id()); - if (myKey.user_id == http::client()->user_id().to_string() && - myKey.device_id == http::client()->device_id() && - myKey.keys["ed25519:" + http::client()->device_id()] == - olm::client()->identity_keys().ed25519 && - myKey.keys["curve25519:" + http::client()->device_id()] == - olm::client()->identity_keys().curve25519) { - json j = myKey; - j.erase("signatures"); - j.erase("unsigned"); - - auto ssk = - mtx::crypto::PkSigning::from_seed(xsign_keys->private_self_signing_key); - myKey.signatures[http::client()->user_id().to_string()] - ["ed25519:" + ssk.public_key()] = ssk.sign(j.dump()); - mtx::requests::KeySignaturesUpload req; - req.signatures[http::client()->user_id().to_string()] - [http::client()->device_id()] = myKey; - - http::client()->keys_signatures_upload( - req, - [](const mtx::responses::KeySignaturesUpload &res, mtx::http::RequestErr err) { - if (err) { - nhlog::net()->error("failed to upload signatures: {},{}", - mtx::errors::to_string(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, - mtx::errors::to_string(e.errcode), - e.error); - }); - } - } - - if (ssss) { - auto k = QString::fromStdString(mtx::crypto::key_to_recoverykey(ssss->privateKey)); - - QString r; - for (int i = 0; i < k.size(); i += 4) - r += k.mid(i, 4) + " "; - - emit showRecoveryKey(r.trimmed()); - } else { - emit setupCompleted(); - } - }); -} - -void -SelfVerificationStatus::verifyMasterKey() -{ - nhlog::db()->info("Clicked verify master key"); -} - -void -SelfVerificationStatus::verifyUnverifiedDevices() -{ - nhlog::db()->info("Clicked verify unverified devices"); -} - -void -SelfVerificationStatus::invalidate() -{ - nhlog::db()->info("Invalidating self verification status"); - auto keys = cache::client()->userKeys(http::client()->user_id().to_string()); - if (!keys) { - cache::client()->query_keys(http::client()->user_id().to_string(), - [](const UserKeyCache &, mtx::http::RequestErr) {}); - return; - } - - if (keys->master_keys.keys.empty()) { - if (status_ != SelfVerificationStatus::NoMasterKey) { - this->status_ = SelfVerificationStatus::NoMasterKey; - emit statusChanged(); - } - return; - } - - auto verifStatus = cache::client()->verificationStatus(http::client()->user_id().to_string()); - - if (!verifStatus.user_verified) { - if (status_ != SelfVerificationStatus::UnverifiedMasterKey) { - this->status_ = SelfVerificationStatus::UnverifiedMasterKey; - emit statusChanged(); - } - return; - } - - if (verifStatus.unverified_device_count > 0) { - if (status_ != SelfVerificationStatus::UnverifiedDevices) { - this->status_ = SelfVerificationStatus::UnverifiedDevices; - emit statusChanged(); - } - return; - } - - if (status_ != SelfVerificationStatus::AllVerified) { - this->status_ = SelfVerificationStatus::AllVerified; - emit statusChanged(); - return; - } -}