aboutsummaryrefslogtreecommitdiff
path: root/src/client
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2023-03-11 00:29:02 +0100
committerLinus Jahn <lnj@kaidan.im>2023-03-11 00:29:02 +0100
commit463111576fb1476192acd2d8fe415b8482a8a696 (patch)
treee87e3bb8f8724f019954692ac22b0d6386dfa5e7 /src/client
parent6ea3edfd83a0bf1558d43e48eac563730276c175 (diff)
parent4897c9b6a36e961fb44d2bce04a698f979a423d5 (diff)
downloadqxmpp-463111576fb1476192acd2d8fe415b8482a8a696.tar.gz
Merge branch '1.5'
Diffstat (limited to 'src/client')
-rw-r--r--src/client/QXmppCarbonManagerV2.cpp8
-rw-r--r--src/client/QXmppDiscoveryManager.h2
-rw-r--r--src/client/QXmppEntityTimeManager.h2
-rw-r--r--src/client/QXmppFileEncryption.cpp2
-rw-r--r--src/client/QXmppFileEncryption.h8
-rw-r--r--src/client/QXmppMamManager.cpp9
-rw-r--r--src/client/QXmppPubSubManager.cpp10
-rw-r--r--src/client/QXmppPubSubManager.h14
-rw-r--r--src/client/QXmppSceEnvelope_p.h6
9 files changed, 37 insertions, 24 deletions
diff --git a/src/client/QXmppCarbonManagerV2.cpp b/src/client/QXmppCarbonManagerV2.cpp
index 0f48370e..7959cab3 100644
--- a/src/client/QXmppCarbonManagerV2.cpp
+++ b/src/client/QXmppCarbonManagerV2.cpp
@@ -18,9 +18,10 @@ using namespace QXmpp::Private;
class CarbonEnableIq : public QXmppIq
{
public:
- CarbonEnableIq()
+ CarbonEnableIq(const QString &jid)
: QXmppIq()
{
+ setTo(jid);
setType(QXmppIq::Set);
}
@@ -30,7 +31,8 @@ public:
}
void toXmlElementFromChild(QXmlStreamWriter *writer) const override
{
- writer->writeStartElement(ns_carbons, "enable");
+ writer->writeStartElement(QStringLiteral("enable"));
+ writer->writeDefaultNamespace(ns_carbons);
writer->writeEndElement();
}
};
@@ -163,7 +165,7 @@ void QXmppCarbonManagerV2::enableCarbons()
return;
}
- client()->sendIq(CarbonEnableIq()).then(this, [this](QXmppClient::IqResult domResult) {
+ client()->sendIq(CarbonEnableIq(client()->configuration().jidBare())).then(this, [this](QXmppClient::IqResult domResult) {
if (auto err = parseIq(std::move(domResult))) {
warning("Could not enable message carbons: " % err->description);
} else {
diff --git a/src/client/QXmppDiscoveryManager.h b/src/client/QXmppDiscoveryManager.h
index 10744a0d..d45e63a4 100644
--- a/src/client/QXmppDiscoveryManager.h
+++ b/src/client/QXmppDiscoveryManager.h
@@ -15,7 +15,7 @@ class QXmppTask;
class QXmppDataForm;
class QXmppDiscoveryIq;
class QXmppDiscoveryManagerPrivate;
-class QXmppError;
+struct QXmppError;
/// \brief The QXmppDiscoveryManager class makes it possible to discover information
/// about other entities as defined by \xep{0030}: Service Discovery.
diff --git a/src/client/QXmppEntityTimeManager.h b/src/client/QXmppEntityTimeManager.h
index 3b090feb..87219122 100644
--- a/src/client/QXmppEntityTimeManager.h
+++ b/src/client/QXmppEntityTimeManager.h
@@ -13,7 +13,7 @@
template<class T>
class QXmppTask;
class QXmppEntityTimeIq;
-class QXmppError;
+struct QXmppError;
///
/// \brief The QXmppEntityTimeManager class provided the functionality to get
diff --git a/src/client/QXmppFileEncryption.cpp b/src/client/QXmppFileEncryption.cpp
index ba78821e..e767769a 100644
--- a/src/client/QXmppFileEncryption.cpp
+++ b/src/client/QXmppFileEncryption.cpp
@@ -7,6 +7,8 @@
#include <QByteArray>
#include <QtCrypto>
+#undef min
+
using namespace QCA;
constexpr std::size_t AES128_BLOCK_SIZE = 128 / 8;
diff --git a/src/client/QXmppFileEncryption.h b/src/client/QXmppFileEncryption.h
index 5bd52c7e..e50bf83c 100644
--- a/src/client/QXmppFileEncryption.h
+++ b/src/client/QXmppFileEncryption.h
@@ -23,9 +23,9 @@ enum Direction {
Decode,
};
-QByteArray process(const QByteArray &data, Cipher cipherConfig, Direction direction, const QByteArray &key, const QByteArray &iv);
-QByteArray generateKey(Cipher cipher);
-QByteArray generateInitializationVector(Cipher);
+QXMPP_EXPORT QByteArray process(const QByteArray &data, Cipher cipherConfig, Direction direction, const QByteArray &key, const QByteArray &iv);
+QXMPP_EXPORT QByteArray generateKey(Cipher cipher);
+QXMPP_EXPORT QByteArray generateInitializationVector(Cipher);
// export for tests
class QXMPP_EXPORT EncryptionDevice : public QIODevice
@@ -50,7 +50,7 @@ private:
std::unique_ptr<QCA::Cipher> m_cipher;
};
-class DecryptionDevice : public QIODevice
+class QXMPP_EXPORT DecryptionDevice : public QIODevice
{
public:
DecryptionDevice(std::unique_ptr<QIODevice> output, Cipher config, const QByteArray &key, const QByteArray &iv);
diff --git a/src/client/QXmppMamManager.cpp b/src/client/QXmppMamManager.cpp
index f173aa01..c39a3411 100644
--- a/src/client/QXmppMamManager.cpp
+++ b/src/client/QXmppMamManager.cpp
@@ -264,11 +264,14 @@ QXmppTask<QXmppMamManager::RetrieveResult> QXmppMamManager::retrieveMessages(con
if (auto *e2eeExt = client()->encryptionExtension()) {
auto &messages = itr->second.messages;
auto running = std::make_shared<uint>(0);
+ // handle case when no message is encrypted
+ auto hasEncryptedMessages = false;
for (auto i = 0; i < messages.size(); i++) {
if (!e2eeExt->isEncrypted(messages.at(i))) {
continue;
}
+ hasEncryptedMessages = true;
auto message = messages.at(i);
(*running)++;
@@ -290,6 +293,12 @@ QXmppTask<QXmppMamManager::RetrieveResult> QXmppMamManager::retrieveMessages(con
}
});
}
+
+ if (!hasEncryptedMessages) {
+ // finish here, no decryptMessage callback will do it
+ itr->second.finish();
+ d->ongoingRequests.erase(itr);
+ }
} else {
itr->second.finish();
d->ongoingRequests.erase(itr);
diff --git a/src/client/QXmppPubSubManager.cpp b/src/client/QXmppPubSubManager.cpp
index 18ad9d7a..de7a9db0 100644
--- a/src/client/QXmppPubSubManager.cpp
+++ b/src/client/QXmppPubSubManager.cpp
@@ -10,7 +10,7 @@
#include "QXmppConstants_p.h"
#include "QXmppPubSubAffiliation.h"
#include "QXmppPubSubEventHandler.h"
-#include "QXmppPubSubItem.h"
+#include "QXmppPubSubBaseItem.h"
#include "QXmppPubSubSubscribeOptions.h"
#include "QXmppPubSubSubscription.h"
#include "QXmppStanza.h"
@@ -435,7 +435,7 @@ auto QXmppPubSubManager::retractItem(const QString &jid, const QString &nodeName
request.setType(QXmppIq::Set);
request.setQueryType(PubSubIq<>::Retract);
request.setQueryNode(nodeName);
- request.setItems({ QXmppPubSubItem(itemId) });
+ request.setItems({ QXmppPubSubBaseItem(itemId) });
request.setTo(jid);
return client()->sendGenericIq(std::move(request));
@@ -1006,10 +1006,10 @@ PubSubIq<> QXmppPubSubManager::requestItemsIq(const QString &jid, const QString
request.setQueryNode(nodeName);
if (!itemIds.isEmpty()) {
- QVector<QXmppPubSubItem> items;
+ QVector<QXmppPubSubBaseItem> items;
items.reserve(itemIds.size());
for (const auto &id : itemIds) {
- items << QXmppPubSubItem(id);
+ items << QXmppPubSubBaseItem(id);
}
request.setItems(items);
}
@@ -1038,7 +1038,7 @@ auto QXmppPubSubManager::publishItems(PubSubIqBase &&request) -> QXmppTask<Publi
return chainIq(client()->sendIq(std::move(request)), this,
[](const PubSubIq<> &iq) -> PublishItemsResult {
- const auto itemToId = [](const QXmppPubSubItem &item) {
+ const auto itemToId = [](const QXmppPubSubBaseItem &item) {
return item.id();
};
diff --git a/src/client/QXmppPubSubManager.h b/src/client/QXmppPubSubManager.h
index 73a5b4d4..154f585d 100644
--- a/src/client/QXmppPubSubManager.h
+++ b/src/client/QXmppPubSubManager.h
@@ -79,13 +79,13 @@ public:
QXmppTask<InstantNodeResult> createInstantNode(const QString &jid, const QXmppPubSubNodeConfig &config);
QXmppTask<Result> deleteNode(const QString &jid, const QString &nodeName);
QXmppTask<ItemIdsResult> requestItemIds(const QString &serviceJid, const QString &nodeName);
- template<typename T = QXmppPubSubItem>
+ template<typename T = QXmppPubSubBaseItem>
QXmppTask<ItemResult<T>> requestItem(const QString &jid, const QString &nodeName, const QString &itemId);
- template<typename T = QXmppPubSubItem>
+ template<typename T = QXmppPubSubBaseItem>
QXmppTask<ItemResult<T>> requestItem(const QString &jid, const QString &nodeName, StandardItemId itemId);
- template<typename T = QXmppPubSubItem>
+ template<typename T = QXmppPubSubBaseItem>
QXmppTask<ItemsResult<T>> requestItems(const QString &jid, const QString &nodeName);
- template<typename T = QXmppPubSubItem>
+ template<typename T = QXmppPubSubBaseItem>
QXmppTask<ItemsResult<T>> requestItems(const QString &jid, const QString &nodeName, const QStringList &itemIds);
template<typename T>
QXmppTask<PublishItemResult> publishItem(const QString &jid, const QString &nodeName, const T &item);
@@ -118,11 +118,11 @@ public:
QXmppTask<Result> createOwnPepNode(const QString &nodeName) { return createNode(client()->configuration().jidBare(), nodeName); }
QXmppTask<Result> createOwnPepNode(const QString &nodeName, const QXmppPubSubNodeConfig &config) { return createNode(client()->configuration().jidBare(), nodeName, config); }
QXmppTask<Result> deleteOwnPepNode(const QString &nodeName) { return deleteNode(client()->configuration().jidBare(), nodeName); }
- template<typename T = QXmppPubSubItem>
+ template<typename T = QXmppPubSubBaseItem>
QXmppTask<ItemResult<T>> requestOwnPepItem(const QString &nodeName, const QString &itemId) { return requestItem<T>(client()->configuration().jidBare(), nodeName, itemId); }
- template<typename T = QXmppPubSubItem>
+ template<typename T = QXmppPubSubBaseItem>
QXmppTask<ItemResult<T>> requestOwnPepItem(const QString &nodeName, StandardItemId itemId) { return requestItem<T>(client()->configuration().jidBare(), nodeName, itemId); }
- template<typename T = QXmppPubSubItem>
+ template<typename T = QXmppPubSubBaseItem>
QXmppTask<ItemsResult<T>> requestOwnPepItems(const QString &nodeName) { return requestItems(client()->configuration().jidBare(), nodeName); }
QXmppTask<ItemIdsResult> requestOwnPepItemIds(const QString &nodeName) { return requestItemIds(client()->configuration().jidBare(), nodeName); }
template<typename T>
diff --git a/src/client/QXmppSceEnvelope_p.h b/src/client/QXmppSceEnvelope_p.h
index 4a92378d..b40da9fd 100644
--- a/src/client/QXmppSceEnvelope_p.h
+++ b/src/client/QXmppSceEnvelope_p.h
@@ -25,8 +25,8 @@
class QXmppSceEnvelopeReader
{
public:
- QXmppSceEnvelopeReader(const QDomElement &element)
- : element(element)
+ QXmppSceEnvelopeReader(QDomElement &&element)
+ : element(std::move(element))
{
}
@@ -51,7 +51,7 @@ public:
// rpad is usually not needed (but can be parsed manually if really needed)
private:
- const QDomElement &element;
+ QDomElement element;
};
class QXmppSceEnvelopeWriter