1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
// 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 "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, QXmppError>;
struct DevicesResult
{
QString jid;
Result result;
};
explicit QXmppOmemoManager(QXmppOmemoStorage *omemoStorage);
~QXmppOmemoManager() override;
QXmppTask<bool> load();
QXmppTask<bool> setUp();
QXmppTask<QByteArray> ownKey();
QXmppTask<QHash<QXmpp::TrustLevel, QMultiHash<QString, QByteArray>>> keys(QXmpp::TrustLevels trustLevels = {});
QXmppTask<QHash<QString, QHash<QByteArray, QXmpp::TrustLevel>>> keys(const QList<QString> &jids, QXmpp::TrustLevels trustLevels = {});
QXmppTask<bool> changeDeviceLabel(const QString &deviceLabel = {});
int maximumDevicesPerJid() const;
void setMaximumDevicesPerJid(int maximum);
int maximumDevicesPerStanza() const;
void setMaximumDevicesPerStanza(int maximum);
QXmppTask<QVector<DevicesResult>> requestDeviceLists(const QList<QString> &jids);
QXmppTask<QVector<DevicesResult>> subscribeToDeviceLists(const QList<QString> &jids);
QXmppTask<QVector<DevicesResult>> unsubscribeFromDeviceLists();
QXmppOmemoOwnDevice ownDevice();
QXmppTask<QVector<QXmppOmemoDevice>> devices();
QXmppTask<QVector<QXmppOmemoDevice>> devices(const QList<QString> &jids);
QXmppTask<Result> removeContactDevices(const QString &jid);
void setAcceptedSessionBuildingTrustLevels(QXmpp::TrustLevels trustLevels);
QXmpp::TrustLevels acceptedSessionBuildingTrustLevels();
void setNewDeviceAutoSessionBuildingEnabled(bool isNewDeviceAutoSessionBuildingEnabled);
bool isNewDeviceAutoSessionBuildingEnabled();
QXmppTask<void> buildMissingSessions(const QList<QString> &jids);
QXmppTask<bool> resetOwnDevice();
QXmppTask<bool> resetAll();
QXmppTask<void> setSecurityPolicy(QXmpp::TrustSecurityPolicy securityPolicy);
QXmppTask<QXmpp::TrustSecurityPolicy> securityPolicy();
QXmppTask<void> setTrustLevel(const QMultiHash<QString, QByteArray> &keyIds, QXmpp::TrustLevel trustLevel);
QXmppTask<QXmpp::TrustLevel> trustLevel(const QString &keyOwnerJid, const QByteArray &keyId);
/// \cond
QXmppTask<MessageEncryptResult> encryptMessage(QXmppMessage &&message, const std::optional<QXmppSendStanzaParams> ¶ms) override;
QXmppTask<MessageDecryptResult> decryptMessage(QXmppMessage &&message) override;
QXmppTask<IqEncryptResult> encryptIq(QXmppIq &&iq, const std::optional<QXmppSendStanzaParams> ¶ms) override;
QXmppTask<IqDecryptResult> 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<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
|