aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Jahn <lnj@kaidan.im>2020-07-01 21:09:34 +0200
committerLinus Jahn <lnj@kaidan.im>2020-07-20 17:18:23 +0200
commit86a1888e39765dd57762c4422e6ede0c4a408935 (patch)
tree9bc52c2416f4d93085e43d249d783712c2f01e00
parenteaf0c052a7218951385f9f4d5da8b669d92102ca (diff)
downloadqxmpp-86a1888e39765dd57762c4422e6ede0c4a408935.tar.gz
QXmppMessageReceiptManager: Ignore all error messages
Not only receipt requests, but also receipts from error messages should not be used.
-rw-r--r--src/client/QXmppMessageReceiptManager.cpp5
-rw-r--r--tests/qxmppmessagereceiptmanager/tst_qxmppmessagereceiptmanager.cpp21
2 files changed, 24 insertions, 2 deletions
diff --git a/src/client/QXmppMessageReceiptManager.cpp b/src/client/QXmppMessageReceiptManager.cpp
index 27d96d11..ea4bef96 100644
--- a/src/client/QXmppMessageReceiptManager.cpp
+++ b/src/client/QXmppMessageReceiptManager.cpp
@@ -53,6 +53,9 @@ bool QXmppMessageReceiptManager::handleStanza(const QDomElement &stanza)
QXmppMessage message;
message.parse(stanza);
+ if (message.type() == QXmppMessage::Error)
+ return false;
+
// Handle receipts and cancel any further processing.
if (!message.receiptId().isEmpty()) {
// Buggy clients also mark carbon messages as received; to avoid this
@@ -64,7 +67,7 @@ bool QXmppMessageReceiptManager::handleStanza(const QDomElement &stanza)
}
// If requested, send a receipt.
- if (message.isReceiptRequested() && !message.from().isEmpty() && !message.id().isEmpty() && message.type() != QXmppMessage::Error) {
+ if (message.isReceiptRequested() && !message.from().isEmpty() && !message.id().isEmpty()) {
QXmppMessage receipt;
receipt.setTo(message.from());
receipt.setReceiptId(message.id());
diff --git a/tests/qxmppmessagereceiptmanager/tst_qxmppmessagereceiptmanager.cpp b/tests/qxmppmessagereceiptmanager/tst_qxmppmessagereceiptmanager.cpp
index 0aff489c..4095f6a8 100644
--- a/tests/qxmppmessagereceiptmanager/tst_qxmppmessagereceiptmanager.cpp
+++ b/tests/qxmppmessagereceiptmanager/tst_qxmppmessagereceiptmanager.cpp
@@ -99,7 +99,7 @@ void tst_QXmppMessageReceiptManager::testReceipt_data()
<< false
<< false
<< true;
- QTest::newRow("error")
+ QTest::newRow("error-request")
<< QByteArray(
"<message xml:lang=\"en\" "
"to=\"northumberland@shakespeare.lit/westminster\" "
@@ -121,6 +121,25 @@ void tst_QXmppMessageReceiptManager::testReceipt_data()
<< false
<< false
<< false;
+ QTest::newRow("error-receipt")
+ << QByteArray(
+ "<message xml:lang=\"en\" "
+ "to=\"northumberland@shakespeare.lit/westminster\" "
+ "from=\"kingrichard@royalty.england.lit/throne\" "
+ "type=\"error\" id=\"bi29sg183b4v\" "
+ "> "
+ "<received xmlns=\"urn:xmpp:receipts\" id=\"richard2-4.1.247\"/>"
+ "<error code=\"500\" type=\"wait\"> "
+ "<resource-constraint xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/> "
+ "<text xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\" xml:lang=\"en\">"
+ "Your contact offline message queue is full. The message has been discarded."
+ "</text>"
+ "</error>"
+ "<body>1</body> "
+ "</message>")
+ << false
+ << false
+ << false;
QTest::newRow("message with receipt request")
<< QByteArray(
"<message xml:lang=\"en\" "