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/QXmppOmemoManager.h | |
| 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/QXmppOmemoManager.h')
| -rw-r--r-- | src/client/QXmppOmemoManager.h | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/src/client/QXmppOmemoManager.h b/src/client/QXmppOmemoManager.h new file mode 100644 index 00000000..91d57799 --- /dev/null +++ b/src/client/QXmppOmemoManager.h @@ -0,0 +1,157 @@ +// 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" + +class QXmppOmemoDevicePrivate; +class QXmppOmemoManagerPrivate; +class QXmppOmemoOwnDevicePrivate; +class QXmppOmemoStorage; + +class QXMPP_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 QXMPP_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 QXMPP_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 |
