// 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 "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; QXmppTask load(); QXmppTask setUp(); QXmppTask ownKey(); QXmppTask>> keys(QXmpp::TrustLevels trustLevels = {}); QXmppTask>> keys(const QList &jids, QXmpp::TrustLevels trustLevels = {}); QXmppTask changeDeviceLabel(const QString &deviceLabel = {}); int maximumDevicesPerJid() const; void setMaximumDevicesPerJid(int maximum); int maximumDevicesPerStanza() const; void setMaximumDevicesPerStanza(int maximum); QXmppTask> requestDeviceLists(const QList &jids); QXmppTask> subscribeToDeviceLists(const QList &jids); QXmppTask> unsubscribeFromDeviceLists(); QXmppOmemoOwnDevice ownDevice(); QXmppTask> devices(); QXmppTask> devices(const QList &jids); QXmppTask removeContactDevices(const QString &jid); void setAcceptedSessionBuildingTrustLevels(QXmpp::TrustLevels trustLevels); QXmpp::TrustLevels acceptedSessionBuildingTrustLevels(); void setNewDeviceAutoSessionBuildingEnabled(bool isNewDeviceAutoSessionBuildingEnabled); bool isNewDeviceAutoSessionBuildingEnabled(); QXmppTask buildMissingSessions(const QList &jids); QXmppTask resetOwnDevice(); QXmppTask resetAll(); QXmppTask setSecurityPolicy(QXmpp::TrustSecurityPolicy securityPolicy); QXmppTask securityPolicy(); QXmppTask setTrustLevel(const QMultiHash &keyIds, QXmpp::TrustLevel trustLevel); QXmppTask trustLevel(const QString &keyOwnerJid, const QByteArray &keyId); /// \cond QXmppTask encryptMessage(QXmppMessage &&message, const std::optional ¶ms) override; QXmppTask decryptMessage(QXmppMessage &&message) override; QXmppTask encryptIq(QXmppIq &&iq, const std::optional ¶ms) override; QXmppTask decryptIq(const QDomElement &element) override; bool isEncrypted(const QDomElement &) override; bool isEncrypted(const QXmppMessage &) 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