diff options
| author | Melvin Keskin <melvo@olomono.de> | 2022-05-09 21:45:49 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-08-13 15:55:03 +0200 |
| commit | ceb62dd9d0d86bc8327ace116930962cf7fad1e9 (patch) | |
| tree | 35bdcccf3e1bebddadcdab6205383975ca66e4c4 /src/client/QXmppOmemoMemoryStorage.cpp | |
| parent | ec0669845b9072ea6cdc0fefb66f1d07511386a4 (diff) | |
| download | qxmpp-ceb62dd9d0d86bc8327ace116930962cf7fad1e9.tar.gz | |
Implement XEP-0384: OMEMO Encryption v0.8
This implements XEP-0384 in version v0.8 with a manager and storage
classes to be user-implemented for persistant storage.
The license of the code is LGPL-2.1-or-later as usual. However since
libomemo-c (libsignal-protocol-c) is GPL-3.0, the built binary is always
licensed under GPL-3.0. Having our code LGPL licensed will make it
avoids relicensing in the future in case we port it to an LGPL
compatible omemo library.
Closes #133.
Co-authored-by: Linus Jahn <lnj@kaidan.im>
Diffstat (limited to 'src/client/QXmppOmemoMemoryStorage.cpp')
| -rw-r--r-- | src/client/QXmppOmemoMemoryStorage.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/src/client/QXmppOmemoMemoryStorage.cpp b/src/client/QXmppOmemoMemoryStorage.cpp new file mode 100644 index 00000000..6ff81002 --- /dev/null +++ b/src/client/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 |
