aboutsummaryrefslogtreecommitdiff
path: root/lib/connection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/connection.cpp')
-rw-r--r--lib/connection.cpp42
1 files changed, 24 insertions, 18 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index d7460f08..0bdc0489 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -220,7 +220,7 @@ public:
}
q->database()->saveOlmSession(senderKey, session->sessionId(), std::get<QByteArray>(pickleResult), QDateTime::currentDateTime());
}
- QString sessionDecryptPrekey(const QOlmMessage& message, const QString &senderKey, std::unique_ptr<QOlmAccount>& olmAccount)
+ std::pair<QString, QString> sessionDecryptPrekey(const QOlmMessage& message, const QString &senderKey, std::unique_ptr<QOlmAccount>& olmAccount)
{
Q_ASSERT(message.type() == QOlmMessage::PreKey);
for(auto& session : olmSessions[senderKey]) {
@@ -230,7 +230,7 @@ public:
const auto result = session->decrypt(message);
if(std::holds_alternative<QString>(result)) {
q->database()->setOlmSessionLastReceived(QString(session->sessionId()), QDateTime::currentDateTime());
- return std::get<QString>(result);
+ return { std::get<QString>(result), session->sessionId() };
} else {
qCDebug(E2EE) << "Failed to decrypt prekey message";
return {};
@@ -249,47 +249,53 @@ public:
qWarning(E2EE) << "Failed to remove one time key for session" << newSession->sessionId();
}
const auto result = newSession->decrypt(message);
+ QString sessionId = newSession->sessionId();
saveSession(newSession, senderKey);
olmSessions[senderKey].push_back(std::move(newSession));
if(std::holds_alternative<QString>(result)) {
- return std::get<QString>(result);
+ return { std::get<QString>(result), sessionId };
} else {
qCDebug(E2EE) << "Failed to decrypt prekey message with new session";
return {};
}
}
- QString sessionDecryptGeneral(const QOlmMessage& message, const QString &senderKey)
+ std::pair<QString, QString> sessionDecryptGeneral(const QOlmMessage& message, const QString &senderKey)
{
Q_ASSERT(message.type() == QOlmMessage::General);
for(auto& session : olmSessions[senderKey]) {
const auto result = session->decrypt(message);
if(std::holds_alternative<QString>(result)) {
q->database()->setOlmSessionLastReceived(QString(session->sessionId()), QDateTime::currentDateTime());
- return std::get<QString>(result);
+ return { std::get<QString>(result), session->sessionId() };
}
}
qCWarning(E2EE) << "Failed to decrypt message";
return {};
}
- QString sessionDecryptMessage(
+ std::pair<QString, QString> sessionDecryptMessage(
const QJsonObject& personalCipherObject, const QByteArray& senderKey, std::unique_ptr<QOlmAccount>& account)
{
QString decrypted;
+ QString olmSessionId;
int type = personalCipherObject.value(TypeKeyL).toInt(-1);
QByteArray body = personalCipherObject.value(BodyKeyL).toString().toLatin1();
if (type == QOlmMessage::PreKey) {
QOlmMessage preKeyMessage(body, QOlmMessage::PreKey);
- decrypted = sessionDecryptPrekey(preKeyMessage, senderKey, account);
+ auto result = sessionDecryptPrekey(preKeyMessage, senderKey, account);
+ decrypted = result.first;
+ olmSessionId = result.second;
} else if (type == QOlmMessage::General) {
QOlmMessage message(body, QOlmMessage::General);
- decrypted = sessionDecryptGeneral(message, senderKey);
+ auto result = sessionDecryptGeneral(message, senderKey);
+ decrypted = result.first;
+ olmSessionId = result.second;
}
- return decrypted;
+ return { decrypted, olmSessionId };
}
#endif
- EventPtr sessionDecryptMessage(const EncryptedEvent& encryptedEvent)
+ std::pair<EventPtr, QString> sessionDecryptMessage(const EncryptedEvent& encryptedEvent)
{
#ifndef Quotient_E2EE_ENABLED
qCWarning(E2EE) << "End-to-end encryption (E2EE) support is turned off.";
@@ -305,7 +311,7 @@ public:
qCDebug(E2EE) << "Encrypted event is not for the current device";
return {};
}
- const auto decrypted = sessionDecryptMessage(
+ const auto [decrypted, olmSessionId] = sessionDecryptMessage(
personalCipherObject, encryptedEvent.senderKey().toLatin1(), olmAccount);
if (decrypted.isEmpty()) {
qCDebug(E2EE) << "Problem with new session from senderKey:"
@@ -356,7 +362,7 @@ public:
return {};
}
- return std::move(decryptedEvent);
+ return { std::move(decryptedEvent), olmSessionId };
#endif // Quotient_E2EE_ENABLED
}
#ifdef Quotient_E2EE_ENABLED
@@ -956,16 +962,16 @@ void Connection::Private::consumeToDeviceEvents(Events&& toDeviceEvents)
void Connection::Private::handleEncryptedToDeviceEvent(const EncryptedEvent& event)
{
- const auto decryptedEvent = sessionDecryptMessage(event);
+ const auto [decryptedEvent, olmSessionId] = sessionDecryptMessage(event);
if(!decryptedEvent) {
qCWarning(E2EE) << "Failed to decrypt event" << event.id();
return;
}
switchOnType(*decryptedEvent,
- [this, senderKey = event.senderKey()](const RoomKeyEvent& roomKeyEvent) {
+ [this, senderKey = event.senderKey(), &event, olmSessionId](const RoomKeyEvent& roomKeyEvent) {
if (auto* detectedRoom = q->room(roomKeyEvent.roomId())) {
- detectedRoom->handleRoomKeyEvent(roomKeyEvent, senderKey);
+ detectedRoom->handleRoomKeyEvent(roomKeyEvent, event.senderId(), olmSessionId);
} else {
qCDebug(E2EE) << "Encrypted event room id" << roomKeyEvent.roomId()
<< "is not found at the connection" << q->objectName();
@@ -2192,14 +2198,14 @@ Database* Connection::database()
return d->database;
}
-UnorderedMap<std::pair<QString, QString>, QOlmInboundGroupSessionPtr> Connection::loadRoomMegolmSessions(Room* room)
+UnorderedMap<QString, QOlmInboundGroupSessionPtr> Connection::loadRoomMegolmSessions(Room* room)
{
return database()->loadMegolmSessions(room->id(), picklingMode());
}
-void Connection::saveMegolmSession(Room* room, const QString& senderKey, QOlmInboundGroupSession* session, const QString& ed25519Key)
+void Connection::saveMegolmSession(Room* room, QOlmInboundGroupSession* session)
{
- database()->saveMegolmSession(room->id(), senderKey, session->sessionId(), ed25519Key, session->pickle(picklingMode()));
+ database()->saveMegolmSession(room->id(), session->sessionId(), session->pickle(picklingMode()), session->senderId(), session->olmSessionId());
}
QStringList Connection::devicesForUser(User* user) const