aboutsummaryrefslogtreecommitdiff
path: root/lib/connection.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/connection.cpp')
-rw-r--r--lib/connection.cpp96
1 files changed, 48 insertions, 48 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index 1ea394a1..bd4d9251 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -96,7 +96,6 @@ public:
/// as of the last sync
QHash<QString, QString> roomAliasMap;
QVector<QString> roomIdsToForget;
- QVector<Room*> firstTimeRooms;
QVector<QString> pendingStateRoomIds;
QMap<QString, User*> userMap;
DirectChatsMap directChats;
@@ -220,7 +219,9 @@ public:
}
q->database()->saveOlmSession(senderKey, session->sessionId(), std::get<QByteArray>(pickleResult), QDateTime::currentDateTime());
}
- std::pair<QString, QString> sessionDecryptPrekey(const QOlmMessage& message, const QString &senderKey, std::unique_ptr<QOlmAccount>& olmAccount)
+
+ std::pair<QString, QString> sessionDecryptPrekey(const QOlmMessage& message,
+ const QString& senderKey)
{
Q_ASSERT(message.type() == QOlmMessage::PreKey);
for(auto& session : olmSessions[senderKey]) {
@@ -274,24 +275,19 @@ public:
}
std::pair<QString, QString> sessionDecryptMessage(
- const QJsonObject& personalCipherObject, const QByteArray& senderKey, std::unique_ptr<QOlmAccount>& account)
+ const QJsonObject& personalCipherObject, const QByteArray& senderKey)
{
- 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);
- auto result = sessionDecryptPrekey(preKeyMessage, senderKey, account);
- decrypted = result.first;
- olmSessionId = result.second;
- } else if (type == QOlmMessage::General) {
- QOlmMessage message(body, QOlmMessage::General);
- auto result = sessionDecryptGeneral(message, senderKey);
- decrypted = result.first;
- olmSessionId = result.second;
- }
- return { decrypted, olmSessionId };
+ QOlmMessage message {
+ personalCipherObject.value(BodyKeyL).toString().toLatin1(),
+ static_cast<QOlmMessage::Type>(
+ personalCipherObject.value(TypeKeyL).toInt(-1))
+ };
+ if (message.type() == QOlmMessage::PreKey)
+ return sessionDecryptPrekey(message, senderKey);
+ if (message.type() == QOlmMessage::General)
+ return sessionDecryptGeneral(message, senderKey);
+ qCWarning(E2EE) << "Olm message has incorrect type" << message.type();
+ return {};
}
#endif
@@ -311,8 +307,9 @@ public:
qCDebug(E2EE) << "Encrypted event is not for the current device";
return {};
}
- const auto [decrypted, olmSessionId] = sessionDecryptMessage(
- personalCipherObject, encryptedEvent.senderKey().toLatin1(), olmAccount);
+ const auto [decrypted, olmSessionId] =
+ sessionDecryptMessage(personalCipherObject,
+ encryptedEvent.senderKey().toLatin1());
if (decrypted.isEmpty()) {
qCDebug(E2EE) << "Problem with new session from senderKey:"
<< encryptedEvent.senderKey()
@@ -833,16 +830,14 @@ void Connection::Private::consumeRoomData(SyncDataList&& roomDataList,
}
if (auto* r = q->provideRoom(roomData.roomId, roomData.joinState)) {
pendingStateRoomIds.removeOne(roomData.roomId);
- r->updateData(std::move(roomData), fromCache);
- if (firstTimeRooms.removeOne(r)) {
- emit q->loadedRoomState(r);
- if (capabilities.roomVersions)
- r->checkVersion();
- // Otherwise, the version will be checked in reloadCapabilities()
- }
+ // Update rooms one by one, giving time to update the UI.
+ QMetaObject::invokeMethod(
+ r,
+ [r, rd = std::move(roomData), fromCache] () mutable {
+ r->updateData(std::move(rd), fromCache);
+ },
+ Qt::QueuedConnection);
}
- // Let UI update itself after updating each room
- QCoreApplication::processEvents();
}
}
@@ -953,8 +948,6 @@ void Connection::Private::consumeToDeviceEvents(Events&& toDeviceEvents)
outdatedUsers += event.senderId();
encryptionUpdateRequired = true;
pendingEncryptedEvents.push_back(std::make_unique<EncryptedEvent>(event.fullJson()));
- }, [](const Event& e){
- // Unhandled
});
}
#endif
@@ -970,7 +963,7 @@ void Connection::Private::handleEncryptedToDeviceEvent(const EncryptedEvent& eve
}
switchOnType(*decryptedEvent,
- [this, senderKey = event.senderKey(), &event, olmSessionId = olmSessionId](const RoomKeyEvent& roomKeyEvent) {
+ [this, &event, olmSessionId = olmSessionId](const RoomKeyEvent& roomKeyEvent) {
if (auto* detectedRoom = q->room(roomKeyEvent.roomId())) {
detectedRoom->handleRoomKeyEvent(roomKeyEvent, event.senderId(), olmSessionId);
} else {
@@ -1707,9 +1700,14 @@ Room* Connection::provideRoom(const QString& id, Omittable<JoinState> joinState)
return nullptr;
}
d->roomMap.insert(roomKey, room);
- d->firstTimeRooms.push_back(room);
connect(room, &Room::beforeDestruction, this,
&Connection::aboutToDeleteRoom);
+ connect(room, &Room::baseStateLoaded, this, [this, room] {
+ emit loadedRoomState(room);
+ if (d->capabilities.roomVersions)
+ room->checkVersion();
+ // Otherwise, the version will be checked in reloadCapabilities()
+ });
emit newRoom(room);
}
if (!joinState)
@@ -2072,12 +2070,13 @@ void Connection::Private::loadOutdatedUserDevices()
saveDevicesList();
for(size_t i = 0; i < pendingEncryptedEvents.size();) {
- if (q->isKnownCurveKey(pendingEncryptedEvents[i]->fullJson()[SenderKeyL].toString(), pendingEncryptedEvents[i]->contentJson()["sender_key"].toString())) {
- handleEncryptedToDeviceEvent(*(pendingEncryptedEvents[i].get()));
+ if (q->isKnownCurveKey(
+ pendingEncryptedEvents[i]->fullJson()[SenderKeyL].toString(),
+ pendingEncryptedEvents[i]->contentPart<QString>("sender_key"_ls))) {
+ handleEncryptedToDeviceEvent(*pendingEncryptedEvents[i]);
pendingEncryptedEvents.erase(pendingEncryptedEvents.begin() + i);
- } else {
- i++;
- }
+ } else
+ ++i;
}
});
}
@@ -2186,13 +2185,10 @@ void Connection::saveOlmAccount()
#ifdef Quotient_E2EE_ENABLED
QJsonObject Connection::decryptNotification(const QJsonObject &notification)
{
- auto room = this->room(notification["room_id"].toString());
+ auto r = room(notification["room_id"].toString());
auto event = makeEvent<EncryptedEvent>(notification["event"].toObject());
- auto decrypted = room->decryptMessage(*event);
- if(!decrypted) {
- return QJsonObject();
- }
- return decrypted->fullJson();
+ const auto decrypted = r->decryptMessage(*event);
+ return decrypted ? decrypted->fullJson() : QJsonObject();
}
Database* Connection::database()
@@ -2200,14 +2196,18 @@ Database* Connection::database()
return d->database;
}
-UnorderedMap<QString, QOlmInboundGroupSessionPtr> Connection::loadRoomMegolmSessions(Room* room)
+UnorderedMap<QString, QOlmInboundGroupSessionPtr>
+Connection::loadRoomMegolmSessions(const Room* room)
{
return database()->loadMegolmSessions(room->id(), picklingMode());
}
-void Connection::saveMegolmSession(Room* room, QOlmInboundGroupSession* session)
+void Connection::saveMegolmSession(const Room* room,
+ const QOlmInboundGroupSession& session)
{
- database()->saveMegolmSession(room->id(), session->sessionId(), session->pickle(picklingMode()), session->senderId(), session->olmSessionId());
+ database()->saveMegolmSession(room->id(), session.sessionId(),
+ session.pickle(picklingMode()),
+ session.senderId(), session.olmSessionId());
}
QStringList Connection::devicesForUser(User* user) const