// SPDX-FileCopyrightText: 2022 Melvin Keskin // // SPDX-License-Identifier: LGPL-2.1-or-later #ifndef QXMPPOMEMOMANAGER_H #define QXMPPOMEMOMANAGER_H #include "QXmppClientExtension.h" #include "QXmppE2eeExtension.h" #include "QXmppMessageHandler.h" #include "QXmppPubSubEventHandler.h" #include "QXmppPubSubManager.h" #include "QXmppTrustSecurityPolicy.h" #include "qxmppomemo_export.h" class QXmppOmemoDevicePrivate; class QXmppOmemoManagerPrivate; class QXmppOmemoOwnDevicePrivate; class QXmppOmemoStorage; class QXMPPOMEMO_EXPORT QXmppOmemoOwnDevice { public: QXmppOmemoOwnDevice(); QXmppOmemoOwnDevice(const QXmppOmemoOwnDevice &other); QXmppOmemoOwnDevice(QXmppOmemoOwnDevice &&) noexcept; ~QXmppOmemoOwnDevice(); QXmppOmemoOwnDevice &operator=(const QXmppOmemoOwnDevice &); QXmppOmemoOwnDevice &operator=(QXmppOmemoOwnDevice &&); QString label() const; void setLabel(const QString &label); QByteArray keyId() const; void setKeyId(const QByteArray &keyId); private: QSharedDataPointer d; }; class QXMPPOMEMO_EXPORT QXmppOmemoDevice { public: QXmppOmemoDevice(); QXmppOmemoDevice(const QXmppOmemoDevice &other); QXmppOmemoDevice(QXmppOmemoDevice &&) noexcept; ~QXmppOmemoDevice(); QXmppOmemoDevice &operator=(const QXmppOmemoDevice &); QXmppOmemoDevice &operator=(QXmppOmemoDevice &&); QString jid() const; void setJid(const QString &jid); QString label() const; void setLabel(const QString &label); QByteArray keyId() const; void setKeyId(const QByteArray &keyId); QXmpp::TrustLevel trustLevel() const; void setTrustLevel(QXmpp::TrustLevel trustLevel); private: QSharedDataPointer d; }; class QXMPPOMEMO_EXPORT QXmppOmemoManager : public QXmppClientExtension, public QXmppE2eeExtension, public QXmppPubSubEventHandler, public QXmppMessageHandler { Q_OBJECT public: using Result = std::variant; struct DevicesResult { QString jid; Result result; }; explicit QXmppOmemoManager(QXmppOmemoStorage *omemoStorage); ~QXmppOmemoManager() override; QFuture load(); QFuture setUp(); QFuture ownKey(); QFuture>> keys(QXmpp::TrustLevels trustLevels = {}); QFuture>> keys(const QList &jids, QXmpp::TrustLevels trustLevels = {}); QFuture changeDeviceLabel(const QString &deviceLabel = {}); int maximumDevicesPerJid() const; void setMaximumDevicesPerJid(int maximum); int maximumDevicesPerStanza() const; void setMaximumDevicesPerStanza(int maximum); QFuture requestDeviceLists(const QList &jids); QFuture subscribeToDeviceLists(const QList &jids); QFuture unsubscribeFromDeviceLists(); QXmppOmemoOwnDevice ownDevice(); QFuture> devices(); QFuture> devices(const QList &jids); QFuture removeContactDevices(const QString &jid); void setAcceptedSessionBuildingTrustLevels(QXmpp::TrustLevels trustLevels); QXmpp::TrustLevels acceptedSessionBuildingTrustLevels(); void setNewDeviceAutoSessionBuildingEnabled(bool isNewDeviceAutoSessionBuildingEnabled); bool isNewDeviceAutoSessionBuildingEnabled(); QFuture buildMissingSessions(const QList &jids); QFuture resetOwnDevice(); QFuture resetAll(); QFuture setSecurityPolicy(QXmpp::TrustSecurityPolicy securityPolicy); QFuture securityPolicy(); QFuture setTrustLevel(const QMultiHash &keyIds, QXmpp::TrustLevel trustLevel); QFuture trustLevel(const QString &keyOwnerJid, const QByteArray &keyId); /// \cond QFuture encryptMessage(QXmppMessage &&message, const std::optional ¶ms) override; QFuture encryptIq(QXmppIq &&iq, const std::optional ¶ms) override; QFuture decryptIq(const QDomElement &element) override; QStringList discoveryFeatures() const override; bool handleStanza(const QDomElement &stanza) override; bool handleMessage(const QXmppMessage &message) override; /// \endcond Q_SIGNAL void trustLevelsChanged(const QMultiHash &modifiedKeys); Q_SIGNAL void deviceAdded(const QString &jid, uint32_t deviceId); Q_SIGNAL void deviceChanged(const QString &jid, uint32_t deviceId); Q_SIGNAL void deviceRemoved(const QString &jid, uint32_t deviceId); Q_SIGNAL void devicesRemoved(const QString &jid); Q_SIGNAL void allDevicesRemoved(); protected: /// \cond void setClient(QXmppClient *client) override; bool handlePubSubEvent(const QDomElement &element, const QString &pubSubService, const QString &nodeName) override; /// \endcond private: std::unique_ptr d; friend class QXmppOmemoManagerPrivate; friend class tst_QXmppOmemoManager; }; #endif // QXMPPOMEMOMANAGER_H