diff options
| author | Linus Jahn <lnj@kaidan.im> | 2022-05-31 12:22:48 +0200 |
|---|---|---|
| committer | Linus Jahn <lnj@kaidan.im> | 2022-08-13 15:55:03 +0200 |
| commit | f0e0e1cd227c08ffd97aa42813a479b8c3ca6d23 (patch) | |
| tree | 12ca6aefdef9195ee8937406db86e73cf1a5f820 /src/omemo/QXmppOmemoManager.h | |
| parent | 87df8a8dda385558d39639ce09e2717974264ab6 (diff) | |
| download | qxmpp-f0e0e1cd227c08ffd97aa42813a479b8c3ca6d23.tar.gz | |
Split up OMEMO into extra module
Diffstat (limited to 'src/omemo/QXmppOmemoManager.h')
| -rw-r--r-- | src/omemo/QXmppOmemoManager.h | 158 |
1 files changed, 158 insertions, 0 deletions
diff --git a/src/omemo/QXmppOmemoManager.h b/src/omemo/QXmppOmemoManager.h new file mode 100644 index 00000000..cc957e73 --- /dev/null +++ b/src/omemo/QXmppOmemoManager.h @@ -0,0 +1,158 @@ +// SPDX-FileCopyrightText: 2022 Melvin Keskin <melvo@olomono.de> +// +// 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<QXmppOmemoOwnDevicePrivate> 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<QXmppOmemoDevicePrivate> d; +}; + +class QXMPPOMEMO_EXPORT QXmppOmemoManager : public QXmppClientExtension, public QXmppE2eeExtension, public QXmppPubSubEventHandler, public QXmppMessageHandler +{ + Q_OBJECT + +public: + using Result = std::variant<QXmpp::Success, QXmppStanza::Error>; + + struct DevicesResult + { + QString jid; + Result result; + }; + + explicit QXmppOmemoManager(QXmppOmemoStorage *omemoStorage); + ~QXmppOmemoManager() override; + + QFuture<bool> load(); + QFuture<bool> setUp(); + + QFuture<QByteArray> ownKey(); + QFuture<QHash<QXmpp::TrustLevel, QMultiHash<QString, QByteArray>>> keys(QXmpp::TrustLevels trustLevels = {}); + QFuture<QHash<QString, QHash<QByteArray, QXmpp::TrustLevel>>> keys(const QList<QString> &jids, QXmpp::TrustLevels trustLevels = {}); + + QFuture<bool> changeDeviceLabel(const QString &deviceLabel = {}); + + int maximumDevicesPerJid() const; + void setMaximumDevicesPerJid(int maximum); + + int maximumDevicesPerStanza() const; + void setMaximumDevicesPerStanza(int maximum); + + QFuture<DevicesResult> requestDeviceLists(const QList<QString> &jids); + QFuture<DevicesResult> subscribeToDeviceLists(const QList<QString> &jids); + QFuture<DevicesResult> unsubscribeFromDeviceLists(); + + QXmppOmemoOwnDevice ownDevice(); + QFuture<QVector<QXmppOmemoDevice>> devices(); + QFuture<QVector<QXmppOmemoDevice>> devices(const QList<QString> &jids); + QFuture<QXmppPubSubManager::Result> removeContactDevices(const QString &jid); + + void setAcceptedSessionBuildingTrustLevels(QXmpp::TrustLevels trustLevels); + QXmpp::TrustLevels acceptedSessionBuildingTrustLevels(); + + void setNewDeviceAutoSessionBuildingEnabled(bool isNewDeviceAutoSessionBuildingEnabled); + bool isNewDeviceAutoSessionBuildingEnabled(); + + QFuture<void> buildMissingSessions(const QList<QString> &jids); + + QFuture<bool> resetOwnDevice(); + QFuture<bool> resetAll(); + + QFuture<void> setSecurityPolicy(QXmpp::TrustSecurityPolicy securityPolicy); + QFuture<QXmpp::TrustSecurityPolicy> securityPolicy(); + + QFuture<void> setTrustLevel(const QMultiHash<QString, QByteArray> &keyIds, QXmpp::TrustLevel trustLevel); + QFuture<QXmpp::TrustLevel> trustLevel(const QString &keyOwnerJid, const QByteArray &keyId); + + /// \cond + QFuture<MessageEncryptResult> encryptMessage(QXmppMessage &&message, const std::optional<QXmppSendStanzaParams> ¶ms) override; + + QFuture<IqEncryptResult> encryptIq(QXmppIq &&iq, const std::optional<QXmppSendStanzaParams> ¶ms) override; + QFuture<IqDecryptResult> 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<QString, QByteArray> &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<QXmppOmemoManagerPrivate> d; + + friend class QXmppOmemoManagerPrivate; + friend class tst_QXmppOmemoManager; +}; + +#endif // QXMPPOMEMOMANAGER_H |
