aboutsummaryrefslogtreecommitdiff
path: root/src/omemo/QXmppOmemoMemoryStorage.cpp
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2022-05-31 12:22:48 +0200
committerLinus Jahn <lnj@kaidan.im>2022-08-13 15:55:03 +0200
commitf0e0e1cd227c08ffd97aa42813a479b8c3ca6d23 (patch)
tree12ca6aefdef9195ee8937406db86e73cf1a5f820 /src/omemo/QXmppOmemoMemoryStorage.cpp
parent87df8a8dda385558d39639ce09e2717974264ab6 (diff)
downloadqxmpp-f0e0e1cd227c08ffd97aa42813a479b8c3ca6d23.tar.gz
Split up OMEMO into extra module
Diffstat (limited to 'src/omemo/QXmppOmemoMemoryStorage.cpp')
-rw-r--r--src/omemo/QXmppOmemoMemoryStorage.cpp119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/omemo/QXmppOmemoMemoryStorage.cpp b/src/omemo/QXmppOmemoMemoryStorage.cpp
new file mode 100644
index 00000000..6ff81002
--- /dev/null
+++ b/src/omemo/QXmppOmemoMemoryStorage.cpp
@@ -0,0 +1,119 @@
+// SPDX-FileCopyrightText: 2022 Melvin Keskin <melvo@olomono.de>
+//
+// SPDX-License-Identifier: LGPL-2.1-or-later
+
+#include "QXmppOmemoMemoryStorage.h"
+
+#include "QXmppFutureUtils_p.h"
+
+using namespace QXmpp::Private;
+
+///
+/// \class QXmppOmemoMemoryStorage
+///
+/// \brief The QXmppOmemoMemoryStorage class stores data used by
+/// \xep{0384, OMEMO Encryption} in the memory.
+///
+/// \warning THIS API IS NOT FINALIZED YET!
+///
+/// \since QXmpp 1.5
+///
+
+class QXmppOmemoMemoryStoragePrivate
+{
+public:
+ bool isSetUp = false;
+
+ std::optional<QXmppOmemoStorage::OwnDevice> ownDevice;
+
+ // IDs of pre key pairs mapped to pre key pairs
+ QHash<uint32_t, QByteArray> preKeyPairs;
+
+ // IDs of signed pre key pairs mapped to signed pre key pairs
+ QHash<uint32_t, QXmppOmemoStorage::SignedPreKeyPair> signedPreKeyPairs;
+
+ // recipient JID mapped to device ID mapped to device
+ QHash<QString, QHash<uint32_t, QXmppOmemoStorage::Device>> devices;
+};
+
+///
+/// Constructs an OMEMO memory storage.
+///
+QXmppOmemoMemoryStorage::QXmppOmemoMemoryStorage()
+ : d(new QXmppOmemoMemoryStoragePrivate)
+{
+}
+
+QXmppOmemoMemoryStorage::~QXmppOmemoMemoryStorage() = default;
+
+/// \cond
+QFuture<QXmppOmemoStorage::OmemoData> QXmppOmemoMemoryStorage::allData()
+{
+ return makeReadyFuture(std::move(OmemoData { d->ownDevice,
+ d->signedPreKeyPairs,
+ d->preKeyPairs,
+ d->devices }));
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::setOwnDevice(const std::optional<OwnDevice> &device)
+{
+ d->ownDevice = device;
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::addSignedPreKeyPair(const uint32_t keyId, const SignedPreKeyPair &keyPair)
+{
+ d->signedPreKeyPairs.insert(keyId, keyPair);
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::removeSignedPreKeyPair(const uint32_t keyId)
+{
+ d->signedPreKeyPairs.remove(keyId);
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::addPreKeyPairs(const QHash<uint32_t, QByteArray> &keyPairs)
+{
+ d->preKeyPairs.insert(keyPairs);
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::removePreKeyPair(const uint32_t keyId)
+{
+ d->preKeyPairs.remove(keyId);
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::addDevice(const QString &jid, const uint32_t deviceId, const QXmppOmemoStorage::Device &device)
+{
+ d->devices[jid].insert(deviceId, device);
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::removeDevice(const QString &jid, const uint32_t deviceId)
+{
+ auto &devices = d->devices[jid];
+ devices.remove(deviceId);
+
+ // Remove the container for the passed JID if the container stores no
+ // devices anymore.
+ if (devices.isEmpty()) {
+ d->devices.remove(jid);
+ }
+
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::removeDevices(const QString &jid)
+{
+ d->devices.remove(jid);
+ return makeReadyFuture();
+}
+
+QFuture<void> QXmppOmemoMemoryStorage::resetAll()
+{
+ d.reset(new QXmppOmemoMemoryStoragePrivate());
+ return makeReadyFuture();
+}
+/// \endcond