// SPDX-FileCopyrightText: 2022 Melvin Keskin // // 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 ownDevice; // IDs of pre key pairs mapped to pre key pairs QHash preKeyPairs; // IDs of signed pre key pairs mapped to signed pre key pairs QHash signedPreKeyPairs; // recipient JID mapped to device ID mapped to device QHash> devices; }; /// /// Constructs an OMEMO memory storage. /// QXmppOmemoMemoryStorage::QXmppOmemoMemoryStorage() : d(new QXmppOmemoMemoryStoragePrivate) { } QXmppOmemoMemoryStorage::~QXmppOmemoMemoryStorage() = default; /// \cond QXmppTask QXmppOmemoMemoryStorage::allData() { return makeReadyTask(std::move(OmemoData { d->ownDevice, d->signedPreKeyPairs, d->preKeyPairs, d->devices })); } QXmppTask QXmppOmemoMemoryStorage::setOwnDevice(const std::optional &device) { d->ownDevice = device; return makeReadyTask(); } QXmppTask QXmppOmemoMemoryStorage::addSignedPreKeyPair(const uint32_t keyId, const SignedPreKeyPair &keyPair) { d->signedPreKeyPairs.insert(keyId, keyPair); return makeReadyTask(); } QXmppTask QXmppOmemoMemoryStorage::removeSignedPreKeyPair(const uint32_t keyId) { d->signedPreKeyPairs.remove(keyId); return makeReadyTask(); } QXmppTask QXmppOmemoMemoryStorage::addPreKeyPairs(const QHash &keyPairs) { d->preKeyPairs.insert(keyPairs); return makeReadyTask(); } QXmppTask QXmppOmemoMemoryStorage::removePreKeyPair(const uint32_t keyId) { d->preKeyPairs.remove(keyId); return makeReadyTask(); } QXmppTask QXmppOmemoMemoryStorage::addDevice(const QString &jid, const uint32_t deviceId, const QXmppOmemoStorage::Device &device) { d->devices[jid].insert(deviceId, device); return makeReadyTask(); } QXmppTask 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 makeReadyTask(); } QXmppTask QXmppOmemoMemoryStorage::removeDevices(const QString &jid) { d->devices.remove(jid); return makeReadyTask(); } QXmppTask QXmppOmemoMemoryStorage::resetAll() { d.reset(new QXmppOmemoMemoryStoragePrivate()); return makeReadyTask(); } /// \endcond