Cleanup headers a bit more

pull/1614/head
Nicolas Werner 1 year ago
parent 488a93575a
commit 7824c77234
No known key found for this signature in database
GPG Key ID: C8D75E610773F2D9
  1. 2
      CMakeLists.txt
  2. 2
      im.nheko.Nheko.yaml
  3. 30
      src/Cache.cpp
  4. 7
      src/Cache.h
  5. 6
      src/Cache_p.h
  6. 8
      src/ChatPage.cpp
  7. 3
      src/ChatPage.h
  8. 4
      src/CombinedImagePackModel.cpp
  9. 2
      src/EventAccessors.cpp
  10. 8
      src/EventAccessors.h
  11. 3
      src/GridImagePackModel.cpp
  12. 4
      src/ImagePackListModel.cpp
  13. 52
      src/MainWindow.cpp
  14. 137
      src/Utils.cpp
  15. 145
      src/Utils.h
  16. 30
      src/encryption/DeviceVerificationFlow.cpp
  17. 32
      src/encryption/DeviceVerificationFlow.h
  18. 16
      src/encryption/Olm.cpp
  19. 2
      src/encryption/SelfVerificationStatus.cpp
  20. 2
      src/timeline/InputBar.h

@ -595,7 +595,7 @@ if(USE_BUNDLED_MTXCLIENT)
FetchContent_Declare(
MatrixClient
GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
GIT_TAG 9876a75f46cc829beaa630d49dc8c5279a940b0d
GIT_TAG f7734a6f26eddc74fb59c4e4bd0be28b632af9fd
)
set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")

@ -214,7 +214,7 @@ modules:
buildsystem: cmake-ninja
name: mtxclient
sources:
- commit: 9876a75f46cc829beaa630d49dc8c5279a940b0d
- commit: f7734a6f26eddc74fb59c4e4bd0be28b632af9fd
#tag: v0.9.2
type: git
url: https://github.com/Nheko-Reborn/mtxclient.git

@ -463,14 +463,14 @@ fatalSecretError()
}
static QString
secretName(std::string name, bool internal)
secretName(std::string_view name, bool internal)
{
auto settings = UserSettings::instance();
return (internal ? "nheko." : "matrix.") +
QString(
QCryptographicHash::hash(settings->profile().toUtf8(), QCryptographicHash::Sha256)
.toBase64()) +
"." + QString::fromStdString(name);
"." + QString::fromUtf8(name);
}
void
@ -560,7 +560,7 @@ Cache::loadSecretsFromStore(
}
std::optional<std::string>
Cache::secret(const std::string &name_, bool internal)
Cache::secret(std::string_view name_, bool internal)
{
auto name = secretName(name_, internal);
@ -580,7 +580,7 @@ Cache::secret(const std::string &name_, bool internal)
}
void
Cache::storeSecret(const std::string &name_, const std::string &secret, bool internal)
Cache::storeSecret(std::string_view name_, const std::string &secret, bool internal)
{
auto name = secretName(name_, internal);
@ -592,11 +592,11 @@ Cache::storeSecret(const std::string &name_, const std::string &secret, bool int
auto db_name = "secret." + name.toStdString();
syncStateDb_.put(txn, db_name, nlohmann::json(encrypted).dump());
txn.commit();
emit secretChanged(name_);
emit secretChanged(std::string(name_));
}
void
Cache::deleteSecret(const std::string &name_, bool internal)
Cache::deleteSecret(std::string_view name_, bool internal)
{
auto name = secretName(name_, internal);
@ -1631,10 +1631,10 @@ Cache::runMigrations()
this->databaseReady_ = false;
loadSecretsFromStore(
{
{mtx::secret_storage::secrets::cross_signing_master, false},
{mtx::secret_storage::secrets::cross_signing_self_signing, false},
{mtx::secret_storage::secrets::cross_signing_user_signing, false},
{mtx::secret_storage::secrets::megolm_backup_v1, false},
{std::string(mtx::secret_storage::secrets::cross_signing_master), false},
{std::string(mtx::secret_storage::secrets::cross_signing_self_signing), false},
{std::string(mtx::secret_storage::secrets::cross_signing_user_signing), false},
{std::string(mtx::secret_storage::secrets::megolm_backup_v1), false},
},
[this,
count = 1](const std::string &name, bool internal, const std::string &value) mutable {
@ -6147,15 +6147,21 @@ restoreOlmAccount()
}
void
storeSecret(const std::string &name, const std::string &secret)
storeSecret(std::string_view name, const std::string &secret)
{
instance_->storeSecret(name, secret);
}
std::optional<std::string>
secret(const std::string &name)
secret(std::string_view name)
{
return instance_->secret(name);
}
std::vector<ImagePackInfo>
getImagePacks(const std::string &room_id, std::optional<bool> stickers)
{
return instance_->getImagePacks(room_id, stickers);
}
} // namespace cache
#define NHEKO_CACHE_GET_STATE_EVENT_DEFINITION(Content) \

@ -253,7 +253,10 @@ std::string
restoreOlmAccount();
void
storeSecret(const std::string &name, const std::string &secret);
storeSecret(std::string_view name, const std::string &secret);
std::optional<std::string>
secret(const std::string &name);
secret(std::string_view name);
std::vector<ImagePackInfo>
getImagePacks(const std::string &room_id, std::optional<bool> stickers);
}

@ -291,9 +291,9 @@ public:
void deleteBackupVersion();
std::optional<OnlineBackupVersion> backupVersion();
void storeSecret(const std::string &name, const std::string &secret, bool internal = false);
void deleteSecret(const std::string &name, bool internal = false);
std::optional<std::string> secret(const std::string &name, bool internal = false);
void storeSecret(std::string_view name, const std::string &secret, bool internal = false);
void deleteSecret(std::string_view name, bool internal = false);
std::optional<std::string> secret(std::string_view name, bool internal = false);
std::string pickleSecret();

@ -778,7 +778,9 @@ ChatPage::handleSyncResponse(const mtx::responses::Sync &res, const std::string
nhlog::net()->debug("sync completed: {}", res.next_batch);
// Ensure that we have enough one-time keys available.
ensureOneTimeKeyCount(res.device_one_time_keys_count, res.device_unused_fallback_key_types);
std::map<std::string_view, std::uint16_t> counts{res.device_one_time_keys_count.begin(),
res.device_one_time_keys_count.end()};
ensureOneTimeKeyCount(counts, res.device_unused_fallback_key_types);
std::optional<mtx::events::account_data::IgnoredUsers> oldIgnoredUsers;
if (auto ignoreEv = std::ranges::find_if(
@ -1194,7 +1196,7 @@ ChatPage::verifyOneTimeKeyCountAfterStartup()
return;
}
std::map<std::string, uint16_t> key_counts;
std::map<std::string_view, uint16_t> key_counts;
std::uint64_t count = 0;
if (auto c = res.one_time_key_counts.find(mtx::crypto::SIGNED_CURVE25519);
c == res.one_time_key_counts.end()) {
@ -1215,7 +1217,7 @@ ChatPage::verifyOneTimeKeyCountAfterStartup()
}
void
ChatPage::ensureOneTimeKeyCount(const std::map<std::string, uint16_t> &counts,
ChatPage::ensureOneTimeKeyCount(const std::map<std::string_view, uint16_t> &counts,
const std::optional<std::vector<std::string>> &unused_fallback_keys)
{
if (auto count = counts.find(mtx::crypto::SIGNED_CURVE25519); count != counts.end()) {

@ -6,7 +6,6 @@
#include <atomic>
#include <optional>
#include <variant>
#include <mtx/common.hpp>
#include <mtx/events.hpp>
@ -191,7 +190,7 @@ private:
void tryInitialSync();
void trySync();
void verifyOneTimeKeyCountAfterStartup();
void ensureOneTimeKeyCount(const std::map<std::string, uint16_t> &counts,
void ensureOneTimeKeyCount(const std::map<std::string_view, uint16_t> &counts,
const std::optional<std::vector<std::string>> &fallback_keys);
void removeOldFallbackKey();
void getProfileInfo();

@ -4,7 +4,7 @@
#include "CombinedImagePackModel.h"
#include "Cache_p.h"
#include "Cache.h"
#include "CompletionModelRoles.h"
#include "emoji/Provider.h"
@ -12,7 +12,7 @@ CombinedImagePackModel::CombinedImagePackModel(const std::string &roomId, QObjec
: QAbstractListModel(parent)
, room_id(roomId)
{
auto packs = cache::client()->getImagePacks(room_id, false);
auto packs = cache::getImagePacks(room_id, false);
for (const auto &pack : packs) {
QString packname =

@ -10,6 +10,8 @@
#include <cctype>
#include <type_traits>
#include <mtx/events/collections.hpp>
namespace {
struct IsStateEvent

@ -9,7 +9,13 @@
#include <QDateTime>
#include <QString>
#include <mtx/events/collections.hpp>
#include <mtx/common.hpp>
#include <mtx/events.hpp>
namespace mtx::events::collections {
struct TimelineEvents;
struct StateEvents;
}
namespace nheko {
struct nonesuch

@ -10,7 +10,6 @@
#include <algorithm>
#include "Cache.h"
#include "Cache_p.h"
#include "emoji/Provider.h"
QString
@ -102,7 +101,7 @@ GridImagePackModel::GridImagePackModel(const std::string &roomId, bool stickers,
}
}
auto originalPacks = cache::client()->getImagePacks(room_id, stickers);
auto originalPacks = cache::getImagePacks(room_id, stickers);
for (auto &pack : originalPacks) {
PackDesc newPack{};

@ -6,14 +6,14 @@
#include <QQmlEngine>
#include "Cache_p.h"
#include "Cache.h"
#include "SingleImagePackModel.h"
ImagePackListModel::ImagePackListModel(const std::string &roomId, QObject *parent)
: QAbstractListModel(parent)
, room_id(roomId)
{
auto packs_ = cache::client()->getImagePacks(room_id, std::nullopt);
auto packs_ = cache::getImagePacks(room_id, std::nullopt);
packs.reserve(packs_.size());
for (const auto &pack : packs_) {

@ -101,58 +101,6 @@ MainWindow::MainWindow(QWindow *parent)
void
MainWindow::registerQmlTypes()
{
// qmlRegisterUncreatableType<DeviceVerificationFlow>(
// "im.nheko",
// 1,
// 0,
// "DeviceVerificationFlow",
// QStringLiteral("Can't create verification flow from QML!"));
// qmlRegisterUncreatableType<UserProfile>(
// "im.nheko",
// 1,
// 0,
// "UserProfileModel",
// QStringLiteral("UserProfile needs to be instantiated on the C++ side"));
// qmlRegisterUncreatableType<MemberList>(
// "im.nheko",
// 1,
// 0,
// "MemberList",
// QStringLiteral("MemberList needs to be instantiated on the C++ side"));
// qmlRegisterUncreatableType<RoomSettings>(
// "im.nheko",
// 1,
// 0,
// "RoomSettingsModel",
// QStringLiteral("Room Settings needs to be instantiated on the C++ side"));
// qmlRegisterUncreatableType<TimelineModel>(
// "im.nheko", 1, 0, "Room", QStringLiteral("Room needs to be instantiated on the C++ side"));
// qmlRegisterUncreatableType<ImagePackListModel>(
// "im.nheko",
// 1,
// 0,
// "ImagePackListModel",
// QStringLiteral("ImagePackListModel needs to be instantiated on the C++ side"));
// qmlRegisterUncreatableType<SingleImagePackModel>(
// "im.nheko",
// 1,
// 0,
// "SingleImagePackModel",
// QStringLiteral("SingleImagePackModel needs to be instantiated on the C++ side"));
// qmlRegisterUncreatableType<InviteesModel>(
// "im.nheko",
// 1,
// 0,
// "InviteesModel",
// QStringLiteral("InviteesModel needs to be instantiated on the C++ side"));
// qmlRegisterUncreatableMetaObject(emoji::staticMetaObject,
// "im.nheko.EmojiModel",
// 1,
// 0,
// "EmojiCategory",
// QStringLiteral("Error: Only enums"));
imgProvider = new MxcImageProvider();
engine()->addImageProvider(QStringLiteral("MxcImage"), imgProvider);
engine()->addImageProvider(QStringLiteral("colorimage"), new ColorImageProvider());

@ -40,6 +40,133 @@
#include "MatrixClient.h"
#include "UserSettingsPage.h"
//! Match widgets/events with a description message.
namespace {
template<class T>
QString
messageDescription(const QString &username = QString(),
const QString &body = QString(),
const bool isLocal = false)
{
using Audio = mtx::events::RoomEvent<mtx::events::msg::Audio>;
using Emote = mtx::events::RoomEvent<mtx::events::msg::Emote>;
using File = mtx::events::RoomEvent<mtx::events::msg::File>;
using Image = mtx::events::RoomEvent<mtx::events::msg::Image>;
using Notice = mtx::events::RoomEvent<mtx::events::msg::Notice>;
using Sticker = mtx::events::Sticker;
using Text = mtx::events::RoomEvent<mtx::events::msg::Text>;
using Unknown = mtx::events::RoomEvent<mtx::events::msg::Unknown>;
using Video = mtx::events::RoomEvent<mtx::events::msg::Video>;
using ElementEffect = mtx::events::RoomEvent<mtx::events::msg::ElementEffect>;
using CallInvite = mtx::events::RoomEvent<mtx::events::voip::CallInvite>;
using CallAnswer = mtx::events::RoomEvent<mtx::events::voip::CallAnswer>;
using CallHangUp = mtx::events::RoomEvent<mtx::events::voip::CallHangUp>;
using CallReject = mtx::events::RoomEvent<mtx::events::voip::CallReject>;
using Encrypted = mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>;
if (std::is_same<T, Audio>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent an audio clip");
else
return QCoreApplication::translate("message-description sent:", "%1 sent an audio clip")
.arg(username);
} else if (std::is_same<T, Image>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent an image");
else
return QCoreApplication::translate("message-description sent:", "%1 sent an image")
.arg(username);
} else if (std::is_same<T, File>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent a file");
else
return QCoreApplication::translate("message-description sent:", "%1 sent a file")
.arg(username);
} else if (std::is_same<T, Video>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent a video");
else
return QCoreApplication::translate("message-description sent:", "%1 sent a video")
.arg(username);
} else if (std::is_same<T, Sticker>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent a sticker");
else
return QCoreApplication::translate("message-description sent:", "%1 sent a sticker")
.arg(username);
} else if (std::is_same<T, Notice>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent a notification");
else
return QCoreApplication::translate("message-description sent:",
"%1 sent a notification")
.arg(username);
} else if (std::is_same<T, Text>::value || std::is_same<T, Unknown>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You: %1").arg(body);
else
return QCoreApplication::translate("message-description sent:", "%1: %2")
.arg(username, body);
} else if (std::is_same<T, ElementEffect>::value) {
if (body.isEmpty()) {
// TODO: what is the best way to handle this?
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent a chat effect");
else
return QCoreApplication::translate("message-description sent:",
"%1 sent a chat effect")
.arg(username);
} else {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You: %1")
.arg(body);
else
return QCoreApplication::translate("message-description sent:", "%1: %2")
.arg(username, body);
}
} else if (std::is_same<T, Emote>::value) {
return QStringLiteral("* %1 %2").arg(username, body);
} else if (std::is_same<T, Encrypted>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent an encrypted message");
else
return QCoreApplication::translate("message-description sent:",
"%1 sent an encrypted message")
.arg(username);
} else if (std::is_same<T, CallInvite>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You placed a call");
else
return QCoreApplication::translate("message-description sent:", "%1 placed a call")
.arg(username);
} else if (std::is_same<T, CallAnswer>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You answered a call");
else
return QCoreApplication::translate("message-description sent:", "%1 answered a call")
.arg(username);
} else if (std::is_same<T, CallHangUp>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You ended a call");
else
return QCoreApplication::translate("message-description sent:", "%1 ended a call")
.arg(username);
} else if (std::is_same<T, CallReject>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You rejected a call");
else
return QCoreApplication::translate("message-description sent:", "%1 rejected a call")
.arg(username);
} else {
return QCoreApplication::translate("utils", "Unknown Message Type");
}
}
}
template<class T, class Event>
static DescInfo
createDescriptionInfo(const Event &event, const QString &localUser, const QString &displayName)
@ -56,7 +183,7 @@ createDescriptionInfo(const Event &event, const QString &localUser, const QStrin
return DescInfo{
QString::fromStdString(msg.event_id),
sender,
utils::messageDescription<T>(username, QString::fromStdString(body), sender == localUser),
messageDescription<T>(username, QString::fromStdString(body), sender == localUser),
utils::descriptiveTime(ts),
msg.origin_server_ts,
ts};
@ -389,13 +516,9 @@ utils::mxcToHttp(const QUrl &url, const QString &server, int port)
}
QString
utils::humanReadableFingerprint(const std::string &ed25519)
{
return humanReadableFingerprint(QString::fromStdString(ed25519));
}
QString
utils::humanReadableFingerprint(const QString &ed25519)
utils::humanReadableFingerprint(const std::string &ed25519_)
{
auto ed25519 = QString::fromStdString(ed25519_);
QString fingerprint;
for (int i = 0; i < ed25519.length(); i = i + 4) {
fingerprint.append(QStringView(ed25519).mid(i, 4));

@ -5,14 +5,14 @@
#pragma once
#include <CacheStructs.h>
#include <QCoreApplication>
#include <QDateTime>
#include <QPixmap>
#include <QRegularExpression>
#include <mtx/events/collections.hpp>
#include <mtx/events/common.hpp>
#include <mtx/events.hpp>
#include <qmath.h>
namespace mtx::events::collections {
struct TimelineEvents;
struct StateEvents;
}
struct DescInfo;
@ -85,131 +85,6 @@ firstChar(const QString &input);
QString
humanReadableFileSize(uint64_t bytes);
//! Match widgets/events with a description message.
template<class T>
QString
messageDescription(const QString &username = QString(),
const QString &body = QString(),
const bool isLocal = false)
{
using Audio = mtx::events::RoomEvent<mtx::events::msg::Audio>;
using Emote = mtx::events::RoomEvent<mtx::events::msg::Emote>;
using File = mtx::events::RoomEvent<mtx::events::msg::File>;
using Image = mtx::events::RoomEvent<mtx::events::msg::Image>;
using Notice = mtx::events::RoomEvent<mtx::events::msg::Notice>;
using Sticker = mtx::events::Sticker;
using Text = mtx::events::RoomEvent<mtx::events::msg::Text>;
using Unknown = mtx::events::RoomEvent<mtx::events::msg::Unknown>;
using Video = mtx::events::RoomEvent<mtx::events::msg::Video>;
using ElementEffect = mtx::events::RoomEvent<mtx::events::msg::ElementEffect>;
using CallInvite = mtx::events::RoomEvent<mtx::events::voip::CallInvite>;
using CallAnswer = mtx::events::RoomEvent<mtx::events::voip::CallAnswer>;
using CallHangUp = mtx::events::RoomEvent<mtx::events::voip::CallHangUp>;
using CallReject = mtx::events::RoomEvent<mtx::events::voip::CallReject>;
using Encrypted = mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>;
if (std::is_same<T, Audio>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent an audio clip");
else
return QCoreApplication::translate("message-description sent:", "%1 sent an audio clip")
.arg(username);
} else if (std::is_same<T, Image>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent an image");
else
return QCoreApplication::translate("message-description sent:", "%1 sent an image")
.arg(username);
} else if (std::is_same<T, File>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent a file");
else
return QCoreApplication::translate("message-description sent:", "%1 sent a file")
.arg(username);
} else if (std::is_same<T, Video>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent a video");
else
return QCoreApplication::translate("message-description sent:", "%1 sent a video")
.arg(username);
} else if (std::is_same<T, Sticker>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You sent a sticker");
else
return QCoreApplication::translate("message-description sent:", "%1 sent a sticker")
.arg(username);
} else if (std::is_same<T, Notice>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent a notification");
else
return QCoreApplication::translate("message-description sent:",
"%1 sent a notification")
.arg(username);
} else if (std::is_same<T, Text>::value || std::is_same<T, Unknown>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You: %1").arg(body);
else
return QCoreApplication::translate("message-description sent:", "%1: %2")
.arg(username, body);
} else if (std::is_same<T, ElementEffect>::value) {
if (body.isEmpty()) {
// TODO: what is the best way to handle this?
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent a chat effect");
else
return QCoreApplication::translate("message-description sent:",
"%1 sent a chat effect")
.arg(username);
} else {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You: %1")
.arg(body);
else
return QCoreApplication::translate("message-description sent:", "%1: %2")
.arg(username, body);
}
} else if (std::is_same<T, Emote>::value) {
return QStringLiteral("* %1 %2").arg(username, body);
} else if (std::is_same<T, Encrypted>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:",
"You sent an encrypted message");
else
return QCoreApplication::translate("message-description sent:",
"%1 sent an encrypted message")
.arg(username);
} else if (std::is_same<T, CallInvite>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You placed a call");
else
return QCoreApplication::translate("message-description sent:", "%1 placed a call")
.arg(username);
} else if (std::is_same<T, CallAnswer>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You answered a call");
else
return QCoreApplication::translate("message-description sent:", "%1 answered a call")
.arg(username);
} else if (std::is_same<T, CallHangUp>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You ended a call");
else
return QCoreApplication::translate("message-description sent:", "%1 ended a call")
.arg(username);
} else if (std::is_same<T, CallReject>::value) {
if (isLocal)
return QCoreApplication::translate("message-description sent:", "You rejected a call");
else
return QCoreApplication::translate("message-description sent:", "%1 rejected a call")
.arg(username);
} else {
return QCoreApplication::translate("utils", "Unknown Message Type");
}
}
//! Scale down an image to fit to the given width & height limitations.
QPixmap
scaleDown(uint64_t maxWidth, uint64_t maxHeight, const QPixmap &source);
@ -227,13 +102,6 @@ erase_if(ContainerT &items, const PredicateT &predicate)
}
}
template<class T>
QString
message_body(const mtx::events::collections::TimelineEvents &event)
{
return QString::fromStdString(std::get<T>(event).content.body);
}
//! Calculate the Levenshtein distance between two strings with character skipping.
int
levenshtein_distance(const std::string &s1, const std::string &s2);
@ -249,9 +117,6 @@ mxcToHttp(const QUrl &url, const QString &server, int port);
QString
humanReadableFingerprint(const std::string &ed25519);
QString
humanReadableFingerprint(const QString &ed25519);
//! Retrieve the message body taking into account the `formatted_body` field.
//! If the `format` of the message is not supported we fallback to `body`.
template<typename RoomMessageT>

@ -944,3 +944,33 @@ DeviceVerificationFlow::InitiateDeviceVerification(QObject *parent_,
return flow;
}
template<typename T>
void
DeviceVerificationFlow::send(T msg)
{
if (this->type == DeviceVerificationFlow::Type::ToDevice) {
mtx::requests::ToDeviceMessages<T> body;
msg.transaction_id = this->transaction_id;
for (const auto &d : deviceIds)
body[this->toClient][d.toStdString()] = msg;
http::client()->send_to_device<T>(
http::client()->generate_txn_id(), body, [](mtx::http::RequestErr err) {
if (err)
nhlog::net()->warn("failed to send verification to_device message: {} {}",
err->matrix_error.error,
static_cast<int>(err->status_code));
});
} else if (this->type == DeviceVerificationFlow::Type::RoomMsg && model_) {
if constexpr (!std::is_same_v<T, mtx::events::msg::KeyVerificationRequest>) {
msg.relations.relations.push_back(this->relation);
// Set synthesized to surpress the nheko relation extensions
msg.relations.synthesized = true;
}
(model_)->sendMessageEvent(msg, mtx::events::to_device_content_to_type<T>);
}
nhlog::net()->debug("Sent verification step: {} in state: {}",
mtx::events::to_string(mtx::events::to_device_content_to_type<T>),
state().toStdString());
}

@ -7,13 +7,14 @@
#include <QObject>
#include <mtx/responses/crypto.hpp>
#include <mtxclient/crypto/client.hpp>
#include "CacheCryptoStructs.h"
#include "Logging.h"
#include "MatrixClient.h"
#include "timeline/TimelineModel.h"
class QTimer;
class TimelineModel;
using sas_ptr = std::unique_ptr<mtx::crypto::SAS>;
@ -230,32 +231,5 @@ private:
bool keySent = false, macSent = false, acceptSent = false, startSent = false;
template<typename T>
void send(T msg)
{
if (this->type == DeviceVerificationFlow::Type::ToDevice) {
mtx::requests::ToDeviceMessages<T> body;
msg.transaction_id = this->transaction_id;
for (const auto &d : deviceIds)
body[this->toClient][d.toStdString()] = msg;
http::client()->send_to_device<T>(
http::client()->generate_txn_id(), body, [](mtx::http::RequestErr err) {
if (err)
nhlog::net()->warn("failed to send verification to_device message: {} {}",
err->matrix_error.error,
static_cast<int>(err->status_code));
});
} else if (this->type == DeviceVerificationFlow::Type::RoomMsg && model_) {
if constexpr (!std::is_same_v<T, mtx::events::msg::KeyVerificationRequest>) {
msg.relations.relations.push_back(this->relation);
// Set synthesized to surpress the nheko relation extensions
msg.relations.synthesized = true;
}
(model_)->sendMessageEvent(msg, mtx::events::to_device_content_to_type<T>);
}
nhlog::net()->debug("Sent verification step: {} in state: {}",
mtx::events::to_string(mtx::events::to_device_content_to_type<T>),
state().toStdString());
}
void send(T msg);
};

@ -1665,10 +1665,10 @@ request_cross_signing_keys()
});
};
request(mtx::secret_storage::secrets::cross_signing_master);
request(mtx::secret_storage::secrets::cross_signing_self_signing);
request(mtx::secret_storage::secrets::cross_signing_user_signing);
request(mtx::secret_storage::secrets::megolm_backup_v1);
request(std::string(mtx::secret_storage::secrets::cross_signing_master));
request(std::string(mtx::secret_storage::secrets::cross_signing_self_signing));
request(std::string(mtx::secret_storage::secrets::cross_signing_user_signing));
request(std::string(mtx::secret_storage::secrets::megolm_backup_v1));
}
namespace {
@ -1725,22 +1725,22 @@ download_cross_signing_keys()
if (backup_key && !backup_key->encrypted.empty())
secrets[backup_key->encrypted.begin()->first]
[secrets::megolm_backup_v1] =
[std::string(secrets::megolm_backup_v1)] =
backup_key->encrypted.begin()->second;
if (master_key && !master_key->encrypted.empty())
secrets[master_key->encrypted.begin()->first]
[secrets::cross_signing_master] =
[std::string(secrets::cross_signing_master)] =
master_key->encrypted.begin()->second;
if (self_signing_key && !self_signing_key->encrypted.empty())
secrets[self_signing_key->encrypted.begin()->first]
[secrets::cross_signing_self_signing] =
[std::string(secrets::cross_signing_self_signing)] =
self_signing_key->encrypted.begin()->second;
if (user_signing_key && !user_signing_key->encrypted.empty())
secrets[user_signing_key->encrypted.begin()->first]
[secrets::cross_signing_user_signing] =
[std::string(secrets::cross_signing_user_signing)] =
user_signing_key->encrypted.begin()->second;
for (const auto &[key, secret_] : secrets)

@ -110,7 +110,7 @@ SelfVerificationStatus::setupCrosssigning(bool useSSSS,
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) {
auto uploadSecret = [ssss](std::string_view key_name, const std::string &secret) {
mtx::secret_storage::Secret s;
s.encrypted[ssss->keyDescription.name] =
mtx::crypto::encrypt(secret, ssss->privateKey, key_name);

@ -18,7 +18,7 @@
#include <memory>
#include <mtx/common.hpp>
#include <mtx/responses/messages.hpp>
#include <mtx/events/common.hpp>
class TimelineModel;
class CombinedImagePackModel;

Loading…
Cancel
Save