aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-05-14 11:20:43 +0200
committerAlexey Rusakov <Kitsune-Ral@users.sf.net>2022-05-14 11:23:48 +0200
commit572b727b22d66a79431326c924236ef431fd972b (patch)
tree5c60030964cf8ca9d279cd66fcdc22bd1ac92b48 /lib
parentb32c1c27ae412d073a7e98bdaf22678bdc66ab23 (diff)
downloadlibquotient-572b727b22d66a79431326c924236ef431fd972b.tar.gz
libquotient-572b727b22d66a79431326c924236ef431fd972b.zip
Cleanup across the board
Mainly driven by clang-tidy and SonarCloud warnings (sadly, SonarCloud doesn't store historical reports so no link can be provided here).
Diffstat (limited to 'lib')
-rw-r--r--lib/connection.cpp72
-rw-r--r--lib/connection.h6
-rw-r--r--lib/converters.h8
-rw-r--r--lib/e2ee/qolminboundsession.cpp4
-rw-r--r--lib/e2ee/qolminboundsession.h2
-rw-r--r--lib/events/callinviteevent.cpp2
-rw-r--r--lib/events/callinviteevent.h4
-rw-r--r--lib/events/roomkeyevent.h5
-rw-r--r--lib/room.cpp20
-rw-r--r--lib/room.h4
10 files changed, 70 insertions, 57 deletions
diff --git a/lib/connection.cpp b/lib/connection.cpp
index 4418958e..bd4d9251 100644
--- a/lib/connection.cpp
+++ b/lib/connection.cpp
@@ -219,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]) {
@@ -273,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
@@ -310,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()
@@ -950,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
@@ -967,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 {
@@ -2074,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;
}
});
}
@@ -2188,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()
@@ -2202,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
diff --git a/lib/connection.h b/lib/connection.h
index 29731593..b75bd5b5 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -317,8 +317,10 @@ public:
#ifdef Quotient_E2EE_ENABLED
QOlmAccount* olmAccount() const;
Database* database();
- UnorderedMap<QString, QOlmInboundGroupSessionPtr> loadRoomMegolmSessions(Room* room);
- void saveMegolmSession(Room* room, QOlmInboundGroupSession* session);
+ UnorderedMap<QString, QOlmInboundGroupSessionPtr> loadRoomMegolmSessions(
+ const Room* room);
+ void saveMegolmSession(const Room* room,
+ const QOlmInboundGroupSession& session);
#endif // Quotient_E2EE_ENABLED
Q_INVOKABLE Quotient::SyncJob* syncJob() const;
Q_INVOKABLE int millisToReconnect() const;
diff --git a/lib/converters.h b/lib/converters.h
index 6515310a..5e3becb8 100644
--- a/lib/converters.h
+++ b/lib/converters.h
@@ -163,6 +163,14 @@ inline qint64 fromJson(const QJsonValue& jv) { return qint64(jv.toDouble()); }
template <>
inline QString fromJson(const QJsonValue& jv) { return jv.toString(); }
+//! Use fromJson<QString> and use toLatin1()/toUtf8()/... to make QByteArray
+//!
+//! QJsonValue can only convert to QString and there's ambiguity whether
+//! conversion to QByteArray should use (fast but very limited) toLatin1() or
+//! (all encompassing and conforming to the JSON spec but slow) toUtf8().
+template <>
+inline QByteArray fromJson(const QJsonValue& jv) = delete;
+
template <>
inline QJsonArray fromJson(const QJsonValue& jv) { return jv.toArray(); }
diff --git a/lib/e2ee/qolminboundsession.cpp b/lib/e2ee/qolminboundsession.cpp
index 60d871ef..62856831 100644
--- a/lib/e2ee/qolminboundsession.cpp
+++ b/lib/e2ee/qolminboundsession.cpp
@@ -154,9 +154,9 @@ QString QOlmInboundGroupSession::olmSessionId() const
{
return m_olmSessionId;
}
-void QOlmInboundGroupSession::setOlmSessionId(const QString& olmSessionId)
+void QOlmInboundGroupSession::setOlmSessionId(const QString& newOlmSessionId)
{
- m_olmSessionId = olmSessionId;
+ m_olmSessionId = newOlmSessionId;
}
QString QOlmInboundGroupSession::senderId() const
diff --git a/lib/e2ee/qolminboundsession.h b/lib/e2ee/qolminboundsession.h
index 32112b97..13515434 100644
--- a/lib/e2ee/qolminboundsession.h
+++ b/lib/e2ee/qolminboundsession.h
@@ -44,7 +44,7 @@ public:
//! The olm session that this session was received from.
//! Required to get the device this session is from.
QString olmSessionId() const;
- void setOlmSessionId(const QString& setOlmSessionId);
+ void setOlmSessionId(const QString& newOlmSessionId);
//! The sender of this session.
QString senderId() const;
diff --git a/lib/events/callinviteevent.cpp b/lib/events/callinviteevent.cpp
index 11d50768..2f26a1cb 100644
--- a/lib/events/callinviteevent.cpp
+++ b/lib/events/callinviteevent.cpp
@@ -33,7 +33,7 @@ CallInviteEvent::CallInviteEvent(const QJsonObject& obj)
qCDebug(EVENTS) << "Call Invite event";
}
-CallInviteEvent::CallInviteEvent(const QString& callId, const int lifetime,
+CallInviteEvent::CallInviteEvent(const QString& callId, int lifetime,
const QString& sdp)
: CallEventBase(
typeId(), matrixTypeId(), callId, 0,
diff --git a/lib/events/callinviteevent.h b/lib/events/callinviteevent.h
index 1b1f4f0f..5b4ca0df 100644
--- a/lib/events/callinviteevent.h
+++ b/lib/events/callinviteevent.h
@@ -13,10 +13,10 @@ public:
explicit CallInviteEvent(const QJsonObject& obj);
- explicit CallInviteEvent(const QString& callId, const int lifetime,
+ explicit CallInviteEvent(const QString& callId, int lifetime,
const QString& sdp);
- QUO_CONTENT_GETTER(int, lifetime) // FIXME: Omittable<>?
+ QUO_CONTENT_GETTER(int, lifetime)
QString sdp() const
{
return contentPart<QJsonObject>("offer"_ls).value("sdp"_ls).toString();
diff --git a/lib/events/roomkeyevent.h b/lib/events/roomkeyevent.h
index c4df7936..ed4c9440 100644
--- a/lib/events/roomkeyevent.h
+++ b/lib/events/roomkeyevent.h
@@ -16,7 +16,10 @@ public:
QString algorithm() const { return contentPart<QString>("algorithm"_ls); }
QString roomId() const { return contentPart<QString>(RoomIdKeyL); }
QString sessionId() const { return contentPart<QString>("session_id"_ls); }
- QString sessionKey() const { return contentPart<QString>("session_key"_ls); }
+ QByteArray sessionKey() const
+ {
+ return contentPart<QString>("session_key"_ls).toLatin1();
+ }
};
REGISTER_EVENT_TYPE(RoomKeyEvent)
} // namespace Quotient
diff --git a/lib/room.cpp b/lib/room.cpp
index 993455be..0a997b9c 100644
--- a/lib/room.cpp
+++ b/lib/room.cpp
@@ -339,14 +339,16 @@ public:
#ifdef Quotient_E2EE_ENABLED
UnorderedMap<QString, QOlmInboundGroupSessionPtr> groupSessions;
- bool addInboundGroupSession(QString sessionId, QString sessionKey, const QString& senderId, const QString& olmSessionId)
+ bool addInboundGroupSession(QString sessionId, QByteArray sessionKey,
+ const QString& senderId,
+ const QString& olmSessionId)
{
- if (groupSessions.find(sessionId) != groupSessions.end()) {
+ if (groupSessions.contains(sessionId)) {
qCWarning(E2EE) << "Inbound Megolm session" << sessionId << "already exists";
return false;
}
- auto megolmSession = QOlmInboundGroupSession::create(sessionKey.toLatin1());
+ auto megolmSession = QOlmInboundGroupSession::create(sessionKey);
if (megolmSession->sessionId() != sessionId) {
qCWarning(E2EE) << "Session ID mismatch in m.room_key event";
return false;
@@ -354,13 +356,12 @@ public:
megolmSession->setSenderId(senderId);
megolmSession->setOlmSessionId(olmSessionId);
qCWarning(E2EE) << "Adding inbound session";
- connection->saveMegolmSession(q, megolmSession.get());
+ connection->saveMegolmSession(q, *megolmSession);
groupSessions[sessionId] = std::move(megolmSession);
return true;
}
QString groupSessionDecryptMessage(QByteArray cipher,
- const QString& senderKey,
const QString& sessionId,
const QString& eventId,
QDateTime timestamp,
@@ -1478,9 +1479,9 @@ RoomEventPtr Room::decryptMessage(const EncryptedEvent& encryptedEvent)
return {};
}
QString decrypted = d->groupSessionDecryptMessage(
- encryptedEvent.ciphertext(), encryptedEvent.senderKey(),
- encryptedEvent.sessionId(), encryptedEvent.id(),
- encryptedEvent.originTimestamp(), encryptedEvent.senderId());
+ encryptedEvent.ciphertext(), encryptedEvent.sessionId(),
+ encryptedEvent.id(), encryptedEvent.originTimestamp(),
+ encryptedEvent.senderId());
if (decrypted.isEmpty()) {
// qCWarning(E2EE) << "Encrypted message is empty";
return {};
@@ -1509,7 +1510,8 @@ void Room::handleRoomKeyEvent(const RoomKeyEvent& roomKeyEvent,
<< roomKeyEvent.algorithm() << "in m.room_key event";
}
if (d->addInboundGroupSession(roomKeyEvent.sessionId(),
- roomKeyEvent.sessionKey(), senderId, olmSessionId)) {
+ roomKeyEvent.sessionKey(), senderId,
+ olmSessionId)) {
qCWarning(E2EE) << "added new inboundGroupSession:"
<< d->groupSessions.size();
auto undecryptedEvents = d->undecryptedEvents[roomKeyEvent.sessionId()];
diff --git a/lib/room.h b/lib/room.h
index 2e2ebf9a..6e6071f0 100644
--- a/lib/room.h
+++ b/lib/room.h
@@ -871,8 +871,8 @@ public Q_SLOTS:
void inviteCall(const QString& callId, const int lifetime,
const QString& sdp);
void sendCallCandidates(const QString& callId, const QJsonArray& candidates);
- [[deprecated("Lifetime argument is no more in use here; "
- "use 2-arg Room::answerCall() instead")]]
+ //! \deprecated Lifetime argument is no more passed; use 2-arg
+ //! Room::answerCall() instead
void answerCall(const QString& callId, int lifetime, const QString& sdp);
void answerCall(const QString& callId, const QString& sdp);
void hangupCall(const QString& callId);