aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/connection.cpp10
-rw-r--r--lib/crypto/qolmaccount.cpp14
-rw-r--r--lib/crypto/qolmaccount.h10
-rw-r--r--lib/crypto/qolmsession.cpp10
-rw-r--r--lib/crypto/qolmsession.h3
-rw-r--r--lib/encryptionmanager.cpp12
-rw-r--r--lib/room.cpp4
7 files changed, 33 insertions, 30 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index df9ff445..a7af1477 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -509,7 +509,7 @@ void Connection::Private::completeSetup(const QString& mxId)
// create new account and save unpickle data
olmAccount->createNewAccount();
auto job = q->callApi<UploadKeysJob>(olmAccount->deviceKeys());
- connect(job, &BaseJob::failure, q, [=]{
+ connect(job, &BaseJob::failure, q, [job]{
qCWarning(E2EE) << "Failed to upload device keys:" << job->errorString();
});
} else {
@@ -677,10 +677,10 @@ void Connection::onSyncSuccess(SyncData&& data, bool fromCache)
auto keys = d->olmAccount->oneTimeKeys();
auto job = d->olmAccount->createUploadKeyRequest(keys);
run(job, ForegroundRequest);
- connect(job, &BaseJob::success, this, [=](){
+ connect(job, &BaseJob::success, this, [this](){
d->olmAccount->markKeysAsPublished();
});
- connect(job, &BaseJob::result, this, [=](){
+ connect(job, &BaseJob::result, this, [this](){
d->isUploadingKeys = false;
});
}
@@ -1903,7 +1903,7 @@ void Connection::Private::loadOutdatedUserDevices()
}
auto queryKeysJob = q->callApi<QueryKeysJob>(users);
currentQueryKeysJob = queryKeysJob;
- connect(queryKeysJob, &BaseJob::success, q, [=](){
+ connect(queryKeysJob, &BaseJob::success, q, [this, queryKeysJob](){
currentQueryKeysJob = nullptr;
const auto data = queryKeysJob->deviceKeys();
for(const auto &[user, keys] : asKeyValueRange(data)) {
@@ -2024,7 +2024,7 @@ void Connection::Private::loadDevicesList()
deviceKeys = fromJson<QHash<QString, QHash<QString, QueryKeysJob::DeviceInformation>>>(json["devices_list"].toObject());
auto oldToken = json["sync_token"].toString();
auto changesJob = q->callApi<GetKeysChangesJob>(oldToken, q->nextBatchToken());
- connect(changesJob, &BaseJob::success, q, [=](){
+ connect(changesJob, &BaseJob::success, q, [this, changesJob](){
bool hasNewOutdatedUser = false;
for(const auto &user : changesJob->changed()) {
outdatedUsers += user;
diff --git a/lib/crypto/qolmaccount.cpp b/lib/crypto/qolmaccount.cpp
index 1de8a0dc..5c9f5db4 100644
--- a/lib/crypto/qolmaccount.cpp
+++ b/lib/crypto/qolmaccount.cpp
@@ -179,13 +179,13 @@ OneTimeKeys QOlmAccount::oneTimeKeys() const
const auto json = QJsonDocument::fromJson(oneTimeKeysBuffer).object();
OneTimeKeys oneTimeKeys;
- for (const QJsonValue &key1 : json.keys()) {
- auto oneTimeKeyObject = json[key1.toString()].toObject();
+ for (const QString& key1 : json.keys()) {
+ auto oneTimeKeyObject = json[key1].toObject();
auto keyMap = QMap<QString, QString>();
for (const QString &key2 : oneTimeKeyObject.keys()) {
keyMap[key2] = oneTimeKeyObject[key2].toString();
}
- oneTimeKeys.keys[key1.toString()] = keyMap;
+ oneTimeKeys.keys[key1] = keyMap;
}
return oneTimeKeys;
}
@@ -215,7 +215,7 @@ QByteArray QOlmAccount::signOneTimeKey(const QString &key) const
return sign(j.toJson(QJsonDocument::Compact));
}
-std::optional<QOlmError> QOlmAccount::removeOneTimeKeys(const std::unique_ptr<QOlmSession> &session) const
+std::optional<QOlmError> QOlmAccount::removeOneTimeKeys(const QOlmSessionPtr &session) const
{
const auto error = olm_remove_one_time_keys(m_account, session->raw());
@@ -266,19 +266,19 @@ UploadKeysJob *QOlmAccount::createUploadKeyRequest(const OneTimeKeys &oneTimeKey
return new UploadKeysJob(keys, oneTimeKeysSigned);
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmAccount::createInboundSession(const QOlmMessage &preKeyMessage)
+std::variant<QOlmSessionPtr, QOlmError> QOlmAccount::createInboundSession(const QOlmMessage &preKeyMessage)
{
Q_ASSERT(preKeyMessage.type() == QOlmMessage::PreKey);
return QOlmSession::createInboundSession(this, preKeyMessage);
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmAccount::createInboundSessionFrom(const QByteArray &theirIdentityKey, const QOlmMessage &preKeyMessage)
+std::variant<QOlmSessionPtr, QOlmError> QOlmAccount::createInboundSessionFrom(const QByteArray &theirIdentityKey, const QOlmMessage &preKeyMessage)
{
Q_ASSERT(preKeyMessage.type() == QOlmMessage::PreKey);
return QOlmSession::createInboundSessionFrom(this, theirIdentityKey, preKeyMessage);
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmAccount::createOutboundSession(const QByteArray &theirIdentityKey, const QByteArray &theirOneTimeKey)
+std::variant<QOlmSessionPtr, QOlmError> QOlmAccount::createOutboundSession(const QByteArray &theirIdentityKey, const QByteArray &theirOneTimeKey)
{
return QOlmSession::createOutboundSession(this, theirIdentityKey, theirOneTimeKey);
}
diff --git a/lib/crypto/qolmaccount.h b/lib/crypto/qolmaccount.h
index 1f94ab2b..dd461e8b 100644
--- a/lib/crypto/qolmaccount.h
+++ b/lib/crypto/qolmaccount.h
@@ -19,6 +19,8 @@ namespace Quotient {
class QOlmSession;
class Connection;
+using QOlmSessionPtr = std::unique_ptr<QOlmSession>;
+
//! An olm account manages all cryptographic keys used on a device.
//! \code{.cpp}
//! const auto olmAccount = new QOlmAccount(this);
@@ -77,22 +79,22 @@ public:
DeviceKeys deviceKeys() const;
//! Remove the one time key used to create the supplied session.
- [[nodiscard]] std::optional<QOlmError> removeOneTimeKeys(const std::unique_ptr<QOlmSession> &session) const;
+ [[nodiscard]] std::optional<QOlmError> removeOneTimeKeys(const QOlmSessionPtr &session) const;
//! Creates an inbound session for sending/receiving messages from a received 'prekey' message.
//!
//! \param message An Olm pre-key message that was encrypted for this account.
- std::variant<std::unique_ptr<QOlmSession>, QOlmError> createInboundSession(const QOlmMessage &preKeyMessage);
+ std::variant<QOlmSessionPtr, QOlmError> createInboundSession(const QOlmMessage &preKeyMessage);
//! Creates an inbound session for sending/receiving messages from a received 'prekey' message.
//!
//! \param theirIdentityKey - The identity key of the Olm account that
//! encrypted this Olm message.
- std::variant<std::unique_ptr<QOlmSession>, QOlmError> createInboundSessionFrom(const QByteArray &theirIdentityKey, const QOlmMessage &preKeyMessage);
+ std::variant<QOlmSessionPtr, QOlmError> createInboundSessionFrom(const QByteArray &theirIdentityKey, const QOlmMessage &preKeyMessage);
//! Creates an outbound session for sending messages to a specific
/// identity and one time key.
- std::variant<std::unique_ptr<QOlmSession>, QOlmError> createOutboundSession(const QByteArray &theirIdentityKey, const QByteArray &theirOneTimeKey);
+ std::variant<QOlmSessionPtr, QOlmError> createOutboundSession(const QByteArray &theirIdentityKey, const QByteArray &theirOneTimeKey);
void markKeysAsPublished();
diff --git a/lib/crypto/qolmsession.cpp b/lib/crypto/qolmsession.cpp
index a327a643..a0386613 100644
--- a/lib/crypto/qolmsession.cpp
+++ b/lib/crypto/qolmsession.cpp
@@ -27,7 +27,7 @@ OlmSession* QOlmSession::create()
return olm_session(new uint8_t[olm_session_size()]);
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmSession::createInbound(QOlmAccount *account, const QOlmMessage &preKeyMessage, bool from, const QString &theirIdentityKey)
+std::variant<QOlmSessionPtr, QOlmError> QOlmSession::createInbound(QOlmAccount *account, const QOlmMessage &preKeyMessage, bool from, const QString &theirIdentityKey)
{
if (preKeyMessage.type() != QOlmMessage::PreKey) {
qCCritical(E2EE) << "The message is not a pre-key in when creating inbound session" << BadMessageFormat;
@@ -53,17 +53,17 @@ std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmSession::createInbound
return std::make_unique<QOlmSession>(olmSession);
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmSession::createInboundSession(QOlmAccount *account, const QOlmMessage &preKeyMessage)
+std::variant<QOlmSessionPtr, QOlmError> QOlmSession::createInboundSession(QOlmAccount *account, const QOlmMessage &preKeyMessage)
{
return createInbound(account, preKeyMessage);
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmSession::createInboundSessionFrom(QOlmAccount *account, const QString &theirIdentityKey, const QOlmMessage &preKeyMessage)
+std::variant<QOlmSessionPtr, QOlmError> QOlmSession::createInboundSessionFrom(QOlmAccount *account, const QString &theirIdentityKey, const QOlmMessage &preKeyMessage)
{
return createInbound(account, preKeyMessage, true, theirIdentityKey);
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmSession::createOutboundSession(QOlmAccount *account, const QString &theirIdentityKey, const QString &theirOneTimeKey)
+std::variant<QOlmSessionPtr, QOlmError> QOlmSession::createOutboundSession(QOlmAccount *account, const QString &theirIdentityKey, const QString &theirOneTimeKey)
{
auto *olmOutboundSession = create();
const auto randomLen = olm_create_outbound_session_random_length(olmOutboundSession);
@@ -105,7 +105,7 @@ std::variant<QByteArray, QOlmError> QOlmSession::pickle(const PicklingMode &mode
return pickledBuf;
}
-std::variant<std::unique_ptr<QOlmSession>, QOlmError> QOlmSession::unpickle(const QByteArray &pickled, const PicklingMode &mode)
+std::variant<QOlmSessionPtr, QOlmError> QOlmSession::unpickle(const QByteArray &pickled, const PicklingMode &mode)
{
QByteArray pickledBuf = pickled;
auto *olmSession = create();
diff --git a/lib/crypto/qolmsession.h b/lib/crypto/qolmsession.h
index 959c77d0..7a040b3d 100644
--- a/lib/crypto/qolmsession.h
+++ b/lib/crypto/qolmsession.h
@@ -74,7 +74,6 @@ private:
OlmSession* m_session;
};
-
-//using QOlmSessionPtr = std::unique_ptr<QOlmSession>;
+using QOlmSessionPtr = std::unique_ptr<QOlmSession>;
} //namespace Quotient
diff --git a/lib/encryptionmanager.cpp b/lib/encryptionmanager.cpp
index 84282dbf..ed6ad20b 100644
--- a/lib/encryptionmanager.cpp
+++ b/lib/encryptionmanager.cpp
@@ -38,7 +38,7 @@ public:
EncryptionManager* q;
// A map from senderKey to InboundSession
- UnorderedMap<QString, std::unique_ptr<QOlmSession>> sessions; // TODO: cache
+ UnorderedMap<QString, QOlmSessionPtr> sessions;
void updateDeviceKeys(
const QHash<QString,
QHash<QString, QueryKeysJob::DeviceInformation>>& deviceKeys)
@@ -76,7 +76,7 @@ public:
qCWarning(E2EE) << "Failed to unpickle olm session";
continue;
}
- sessions[senderKey] = std::move(std::get<std::unique_ptr<QOlmSession>>(sessionResult));
+ sessions[senderKey] = std::move(std::get<QOlmSessionPtr>(sessionResult));
}
}
void saveSessions() {
@@ -135,9 +135,11 @@ public:
qCWarning(E2EE) << "Failed to create inbound session for" << senderKey << std::get<QOlmError>(newSessionResult);
return {};
}
- std::unique_ptr<QOlmSession> newSession = std::move(std::get<std::unique_ptr<QOlmSession>>(newSessionResult));
- // TODO Error handling?
- olmAccount->removeOneTimeKeys(newSession);
+ auto newSession = std::move(std::get<QOlmSessionPtr>(newSessionResult));
+ auto error = olmAccount->removeOneTimeKeys(newSession);
+ if (error) {
+ qWarning(E2EE) << "Failed to remove one time key for session" << newSession->sessionId();
+ }
const auto result = newSession->decrypt(message);
sessions[senderKey] = std::move(newSession);
saveSessions();
diff --git a/lib/room.cpp b/lib/room.cpp
index 07ffd0cd..e4fe2fb8 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -514,10 +514,10 @@ Room::Room(Connection* connection, QString id, JoinState initialJoinState)
return this == r; // loadedRoomState fires only once per room
});
#ifdef Quotient_E2EE_ENABLED
- connectSingleShot(this, &Room::encryption, this, [=](){
+ connectSingleShot(this, &Room::encryption, this, [this, connection](){
connection->encryptionUpdate(this);
});
- connect(this, &Room::userAdded, this, [=](){
+ connect(this, &Room::userAdded, this, [this, connection](){
if(usesEncryption()) {
connection->encryptionUpdate(this);
}