From 0b616178800ccb4e5d344cd66b8f1ab9f5d3b698 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Mon, 24 Feb 2020 11:20:30 +0100 Subject: Fix switch statement when handling IQ stanza for registration --- src/client/QXmppRegistrationManager.cpp | 2 ++ .../tst_qxmppregistrationmanager.cpp | 24 ++++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/client/QXmppRegistrationManager.cpp b/src/client/QXmppRegistrationManager.cpp index d43a82e5..da220bf0 100644 --- a/src/client/QXmppRegistrationManager.cpp +++ b/src/client/QXmppRegistrationManager.cpp @@ -228,9 +228,11 @@ bool QXmppRegistrationManager::handleStanza(const QDomElement &stanza) case QXmppIq::Result: info(QStringLiteral("Successfully registered with the service.")); emit registrationSucceeded(); + break; case QXmppIq::Error: warning(QStringLiteral("Registering with the service failed: ").append(iq.error().text())); emit registrationFailed(iq.error()); + break; default: break; // should never occur } diff --git a/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp b/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp index 077b65d4..15ecde95 100644 --- a/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp +++ b/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp @@ -350,17 +350,17 @@ void tst_QXmppRegistrationManager::testRegistrationResult() registrationRequestForm.setEmail(QStringLiteral("1234@example.org")); registrationRequestForm.setId(QStringLiteral("register1")); - bool signalCalled = false; + bool succeededSignalCalled = false; + bool failedSignalCalled = false; + QObject *context = new QObject(this); - if (isSuccess) { - connect(manager, &QXmppRegistrationManager::registrationSucceeded, context, [&]() { - signalCalled = true; - }); - } else { - connect(manager, &QXmppRegistrationManager::registrationFailed, context, [&](const QXmppStanza::Error &) { - signalCalled = true; - }); - } + + connect(manager, &QXmppRegistrationManager::registrationSucceeded, context, [&]() { + succeededSignalCalled = true; + }); + connect(manager, &QXmppRegistrationManager::registrationFailed, context, [&](const QXmppStanza::Error &) { + failedSignalCalled = true; + }); manager->setRegistrationFormToSend(registrationRequestForm); manager->sendCachedRegistrationForm(); @@ -370,7 +370,9 @@ void tst_QXmppRegistrationManager::testRegistrationResult() manager->handleStanza(writePacketToDom(serverResult)); - QVERIFY(signalCalled); + QCOMPARE(succeededSignalCalled, isSuccess); + QCOMPARE(failedSignalCalled, !isSuccess); + delete context; } -- cgit v1.2.3 From 7d128f179487a68ba975275996b8efadbd143721 Mon Sep 17 00:00:00 2001 From: Blue Date: Fri, 27 Mar 2020 15:17:42 +0300 Subject: QXmppMessageReceiptManager: Fix receipts are sent on error messages (#269) This fixes that behaviour and extends the tests for QXmppMessageReceiptManager. --- src/client/QXmppMessageReceiptManager.cpp | 2 +- .../tst_qxmppmessagereceiptmanager.cpp | 85 +++++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/client/QXmppMessageReceiptManager.cpp b/src/client/QXmppMessageReceiptManager.cpp index 3b5c0159..27d96d11 100644 --- a/src/client/QXmppMessageReceiptManager.cpp +++ b/src/client/QXmppMessageReceiptManager.cpp @@ -64,7 +64,7 @@ bool QXmppMessageReceiptManager::handleStanza(const QDomElement &stanza) } // If requested, send a receipt. - if (message.isReceiptRequested() && !message.from().isEmpty() && !message.id().isEmpty()) { + if (message.isReceiptRequested() && !message.from().isEmpty() && !message.id().isEmpty() && message.type() != QXmppMessage::Error) { 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 750628dc..0aff489c 100644 --- a/tests/qxmppmessagereceiptmanager/tst_qxmppmessagereceiptmanager.cpp +++ b/tests/qxmppmessagereceiptmanager/tst_qxmppmessagereceiptmanager.cpp @@ -41,15 +41,32 @@ private slots: { m_messageDelivered = true; } + void onLoggerMessage(QXmppLogger::MessageType type, const QString& text) + { + m_receiptSent = true; + } private: - QXmppMessageReceiptManager m_manager; + QXmppMessageReceiptManager* m_manager; + QXmppClient m_client; + QXmppLogger* m_logger; bool m_messageDelivered = false; + bool m_receiptSent = false; }; void tst_QXmppMessageReceiptManager::initTestCase() { - connect(&m_manager, &QXmppMessageReceiptManager::messageDelivered, + m_manager = new QXmppMessageReceiptManager(); + m_logger = new QXmppLogger(); + + m_client.addExtension(m_manager); + m_logger->setLoggingType(QXmppLogger::SignalLogging); + m_client.setLogger(m_logger); + + connect(m_logger, &QXmppLogger::message, + this, &tst_QXmppMessageReceiptManager::onLoggerMessage); + + connect(m_manager, &QXmppMessageReceiptManager::messageDelivered, this, &tst_QXmppMessageReceiptManager::handleMessageDelivered); } @@ -57,6 +74,8 @@ void tst_QXmppMessageReceiptManager::testReceipt_data() { QTest::addColumn("xml"); QTest::addColumn("accept"); + QTest::addColumn("sent"); + QTest::addColumn("handled"); QTest::newRow("correct") << QByteArray( @@ -66,6 +85,8 @@ void tst_QXmppMessageReceiptManager::testReceipt_data() "type=\"normal\">" "" "") + << true + << false << true; QTest::newRow("from-to-equal") << QByteArray( @@ -75,22 +96,80 @@ void tst_QXmppMessageReceiptManager::testReceipt_data() "type=\"normal\">" "" "") + << false + << false + << true; + QTest::newRow("error") + << QByteArray( + " " + " " + " " + " " + " " + " " + " " + "" + "Your contact offline message queue is full. The message has been discarded." + "" + "" + "1 " + "") + << false + << false + << false; + QTest::newRow("message with receipt request") + << QByteArray( + " " + " " + " " + " " + "1 " + "") + << false + << true + << false; + + QTest::newRow("message with no receipt request") + << QByteArray( + " " + " " + " " + "1 " + "") + << false + << false << false; } void tst_QXmppMessageReceiptManager::testReceipt() { m_messageDelivered = false; + m_receiptSent = false; QFETCH(QByteArray, xml); QFETCH(bool, accept); + QFETCH(bool, sent); + QFETCH(bool, handled); QDomDocument doc; QCOMPARE(doc.setContent(xml, true), true); QDomElement element = doc.documentElement(); - QVERIFY(m_manager.handleStanza(element)); + QCOMPARE(m_manager->handleStanza(element), handled); QCOMPARE(m_messageDelivered, accept); + QCOMPARE(m_receiptSent, sent); } QTEST_MAIN(tst_QXmppMessageReceiptManager) -- cgit v1.2.3 From 88d7a70d121d3b703a2967b4ae3669da6ce3105a Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Sun, 29 Mar 2020 01:38:36 +0100 Subject: doc: xeps: Move XEP-0077: In-Band Registration to finished --- doc/xep.doc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/xep.doc b/doc/xep.doc index 2bb50793..5eb80af0 100644 --- a/doc/xep.doc +++ b/doc/xep.doc @@ -14,6 +14,7 @@ Complete: - XEP-0065: SOCKS5 Bytestreams - XEP-0066: Out of Band Data (partially) - XEP-0071: XHTML-IM +- XEP-0077: In-Band Registration (v2.4) - XEP-0078: Non-SASL Authentication - XEP-0082: XMPP Date and Time Profiles - XEP-0085: Chat State Notifications @@ -51,7 +52,6 @@ Complete: Ongoing: - XEP-0009: Jabber-RPC (API is not finalized yet) - XEP-0060: Publish-Subscribe (Only basic IQ implemented) -- XEP-0077: In-Band Registration (Only basic IQ implemented) - XEP-0369: Mediated Information eXchange (MIX) (Only IQ queries implemented) (v0.14.2) - XEP-0405: Mediated Information eXchange (MIX): Participant Server Requirements (Only IQ queries implemented) (v0.4.0) -- cgit v1.2.3 From 2543cb7cd5b77c77e4eab66bde40d76d79a62b1c Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Tue, 31 Mar 2020 23:13:56 +0200 Subject: tests: util: Add writePacketToDom() helper It is used in multiple places now. --- .../tst_qxmppregistrationmanager.cpp | 14 -------------- tests/util.h | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp b/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp index 15ecde95..4eda6579 100644 --- a/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp +++ b/tests/qxmppregistrationmanager/tst_qxmppregistrationmanager.cpp @@ -29,20 +29,6 @@ #include "util.h" -template -QDomElement writePacketToDom(T packet) -{ - QBuffer buffer; - buffer.open(QIODevice::ReadWrite); - QXmlStreamWriter writer(&buffer); - packet.toXml(&writer); - - QDomDocument doc; - doc.setContent(buffer.data(), true); - - return doc.documentElement(); -} - class tst_QXmppRegistrationManager : public QObject { Q_OBJECT diff --git a/tests/util.h b/tests/util.h index 9d1cee90..1268e1ad 100644 --- a/tests/util.h +++ b/tests/util.h @@ -49,6 +49,20 @@ static void serializePacket(T &packet, const QByteArray &xml) QCOMPARE(buffer.data(), xml); } +template +QDomElement writePacketToDom(T packet) +{ + QBuffer buffer; + buffer.open(QIODevice::ReadWrite); + QXmlStreamWriter writer(&buffer); + packet.toXml(&writer); + + QDomDocument doc; + doc.setContent(buffer.data(), true); + + return doc.documentElement(); +} + class TestPasswordChecker : public QXmppPasswordChecker { public: -- cgit v1.2.3 From 40622fc1dc45d514dfc82f8802dc6dac5306bddc Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Tue, 31 Mar 2020 22:32:11 +0200 Subject: Set user's vCard also when 'from' attribute contains user's bare JID --- src/client/QXmppVCardManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/QXmppVCardManager.cpp b/src/client/QXmppVCardManager.cpp index 8a1b4bab..039a82c3 100644 --- a/src/client/QXmppVCardManager.cpp +++ b/src/client/QXmppVCardManager.cpp @@ -113,7 +113,7 @@ bool QXmppVCardManager::handleStanza(const QDomElement& element) QXmppVCardIq vCardIq; vCardIq.parse(element); - if (vCardIq.from().isEmpty()) { + if (vCardIq.from().isEmpty() || vCardIq.from() == client()->configuration().jidBare()) { d->clientVCard = vCardIq; d->isClientVCardReceived = true; emit clientVCardReceived(); -- cgit v1.2.3 From 175ee42efc00e8185e3143a389df42c89dd78671 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Tue, 31 Mar 2020 23:20:00 +0200 Subject: Add QXmppVCardManger tests Co-authored-by: Melvin Keskin --- tests/CMakeLists.txt | 1 + tests/qxmppvcardmanager/tst_qxmppvcardmanager.cpp | 108 ++++++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 tests/qxmppvcardmanager/tst_qxmppvcardmanager.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d320ae95..b1ee1e57 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -51,6 +51,7 @@ add_simple_test(qxmppstarttlspacket) add_simple_test(qxmppstreamfeatures) add_simple_test(qxmppstunmessage) add_simple_test(qxmppvcardiq) +add_simple_test(qxmppvcardmanager) add_simple_test(qxmppversioniq) if(BUILD_INTERNAL_TESTS) diff --git a/tests/qxmppvcardmanager/tst_qxmppvcardmanager.cpp b/tests/qxmppvcardmanager/tst_qxmppvcardmanager.cpp new file mode 100644 index 00000000..ec079e93 --- /dev/null +++ b/tests/qxmppvcardmanager/tst_qxmppvcardmanager.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2008-2020 The QXmpp developers + * + * Authors: + * Melvin Keskin + * Linus Jahn + * + * Source: + * https://github.com/qxmpp-project/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include +#include "QXmppClient.h" +#include "QXmppVCardIq.h" +#include "QXmppVCardManager.h" +#include "util.h" + +Q_DECLARE_METATYPE(QXmppVCardIq); + +class tst_QXmppVCardManager : public QObject +{ + Q_OBJECT + +private slots: + void testHandleStanza_data(); + void testHandleStanza(); + +private: + QXmppClient m_client; +}; + +void tst_QXmppVCardManager::testHandleStanza_data() +{ + QTest::addColumn("expectedIq"); + QTest::addColumn("isClientVCard"); + +#define ROW(name, iq, clientVCard) \ + QTest::newRow(QT_STRINGIFY(name)) << iq << clientVCard + + QXmppVCardIq iq; + iq.setType(QXmppIq::Result); + iq.setTo("stpeter@jabber.org/roundabout"); + iq.setFullName("Jeremie Miller"); + + auto iqFromBare = iq; + iqFromBare.setFrom("stpeter@jabber.org"); + + auto iqFromFull = iq; + iqFromFull.setFrom("stpeter@jabber.org/roundabout"); + + ROW(client-vcard-from-empty, iq, true); + ROW(client-vcard-from-bare, iqFromBare, true); + ROW(client-vcard-from-full, iqFromFull, false); + +#undef ROW +} + +void tst_QXmppVCardManager::testHandleStanza() +{ + QFETCH(QXmppVCardIq, expectedIq); + QFETCH(bool, isClientVCard); + + // initialize new manager to clear internal values + QXmppVCardManager *manager = new QXmppVCardManager(); + m_client.addExtension(manager); + + // sets own jid internally + m_client.connectToServer("stpeter@jabber.org", {}); + m_client.disconnectFromServer(); + + bool vCardReceived = false; + bool clientVCardReceived = false; + + QObject context; + connect(manager, &QXmppVCardManager::vCardReceived, &context, [&](QXmppVCardIq iq) { + vCardReceived = true; + QCOMPARE(iq, expectedIq); + }); + connect(manager, &QXmppVCardManager::clientVCardReceived, &context, [&]() { + clientVCardReceived = true; + QCOMPARE(manager->clientVCard(), expectedIq); + }); + + bool accepted = manager->handleStanza(writePacketToDom(expectedIq)); + + QVERIFY(accepted); + QVERIFY(vCardReceived); + QCOMPARE(clientVCardReceived, isClientVCard); + + // clean up (client deletes manager) + m_client.removeExtension(manager); +} + +QTEST_MAIN(tst_QXmppVCardManager) +#include "tst_qxmppvcardmanager.moc" -- cgit v1.2.3 From bf5ae7357bc2348264dfe09d9264238f6decd2c5 Mon Sep 17 00:00:00 2001 From: Melvin Keskin Date: Thu, 19 Mar 2020 21:17:52 +0100 Subject: Do not include 'ask' attribute when renaming roster item --- src/client/QXmppRosterManager.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/client/QXmppRosterManager.cpp b/src/client/QXmppRosterManager.cpp index 7bba45ec..9da4fd8f 100644 --- a/src/client/QXmppRosterManager.cpp +++ b/src/client/QXmppRosterManager.cpp @@ -282,6 +282,10 @@ bool QXmppRosterManager::renameItem(const QString &bareJid, const QString &name) QXmppRosterIq::Item item = d->entries.value(bareJid); item.setName(name); + // If there is a pending subscription, do not include the corresponding attribute in the stanza. + if (!item.subscriptionStatus().isEmpty()) + item.setSubscriptionStatus({}); + QXmppRosterIq iq; iq.setType(QXmppIq::Set); iq.addItem(item); -- cgit v1.2.3 From 313ba92519363f1ce0c308778744f6739028586d Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Wed, 1 Apr 2020 00:49:55 +0200 Subject: QXmppRosterIq: Fix missing copy constructor --- src/base/QXmppRosterIq.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/base/QXmppRosterIq.cpp b/src/base/QXmppRosterIq.cpp index a930a3ca..7a7bd16e 100644 --- a/src/base/QXmppRosterIq.cpp +++ b/src/base/QXmppRosterIq.cpp @@ -44,6 +44,8 @@ QXmppRosterIq::QXmppRosterIq() { } +QXmppRosterIq::QXmppRosterIq(const QXmppRosterIq &) = default; + QXmppRosterIq::~QXmppRosterIq() = default; QXmppRosterIq &QXmppRosterIq::operator=(const QXmppRosterIq &) = default; -- cgit v1.2.3 From 624a919b371bd96f96ecfef0030a7bd58bc9b761 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Wed, 1 Apr 2020 00:50:56 +0200 Subject: Add tests for QXmppRosterManager --- tests/CMakeLists.txt | 1 + .../qxmpprostermanager/tst_qxmpprostermanager.cpp | 110 +++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 tests/qxmpprostermanager/tst_qxmpprostermanager.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index b1ee1e57..49d0e6b0 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -40,6 +40,7 @@ add_simple_test(qxmppregisteriq) add_simple_test(qxmppregistrationmanager) add_simple_test(qxmppresultset) add_simple_test(qxmpprosteriq) +add_simple_test(qxmpprostermanager) add_simple_test(qxmpprpciq) add_simple_test(qxmpprtcppacket) add_simple_test(qxmpprtppacket) diff --git a/tests/qxmpprostermanager/tst_qxmpprostermanager.cpp b/tests/qxmpprostermanager/tst_qxmpprostermanager.cpp new file mode 100644 index 00000000..f8a62aa7 --- /dev/null +++ b/tests/qxmpprostermanager/tst_qxmpprostermanager.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2008-2020 The QXmpp developers + * + * Authors: + * Jeremy Lainé + * Manjeet Dahiya + * + * Source: + * https://github.com/qxmpp-project/qxmpp + * + * This file is a part of QXmpp library. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + */ + +#include "QXmppClient.h" +#include "QXmppDiscoveryManager.h" +#include "QXmppRosterManager.h" + +#include "util.h" + +class tst_QXmppRosterManager : public QObject +{ + Q_OBJECT + +private slots: + void initTestCase(); + + void testDiscoFeatures(); + void testRenameItem(); + +private: + QXmppClient client; + QXmppLogger logger; + QXmppRosterManager *manager; +}; + +void tst_QXmppRosterManager::initTestCase() +{ + logger.setLoggingType(QXmppLogger::SignalLogging); + client.setLogger(&logger); + + manager = client.findExtension(); +} + +void tst_QXmppRosterManager::testDiscoFeatures() +{ + QCOMPARE(manager->discoveryFeatures(), QStringList()); +} + +void tst_QXmppRosterManager::testRenameItem() +{ + // used to clean up lambda signal connections + QObject context; + + auto createItem = [](const QString &jid, const QString &ask = {}) -> QXmppRosterIq::Item { + QXmppRosterIq::Item item; + item.setBareJid(jid); + item.setSubscriptionStatus(ask); + return item; + }; + + // fill roster with initial contacts to rename + QXmppRosterIq initialItems; + initialItems.setType(QXmppIq::Result); + initialItems.addItem(createItem("stpeter@jabber.org")); + initialItems.addItem(createItem("bob@qxmpp.org")); + + QVERIFY(manager->handleStanza(writePacketToDom(initialItems))); + + // set a subscription state for bob (the subscription state MUST NOT be + // sent when renaming an item, so we need to check that it's not) + QXmppRosterIq bobAsk; + bobAsk.setType(QXmppIq::Set); + bobAsk.addItem(createItem("bob@qxmpp.org", "subscribe")); + + QVERIFY(manager->handleStanza(writePacketToDom(bobAsk))); + QCOMPARE(manager->getRosterEntry("bob@qxmpp.org").subscriptionStatus(), "subscribe"); + + // rename bob + bool requestSent = false; + connect(&logger, &QXmppLogger::message, &context, [&](QXmppLogger::MessageType type, const QString &text) { + if (type == QXmppLogger::SentMessage) { + requestSent = true; + + QXmppRosterIq renameRequest; + parsePacket(renameRequest, text.toUtf8()); + QCOMPARE(renameRequest.items().size(), 1); + QCOMPARE(renameRequest.items().first().bareJid(), "bob@qxmpp.org"); + QCOMPARE(renameRequest.items().first().name(), "Bob"); + // check that subscription state ('ask') for bob is not included + QVERIFY(renameRequest.items().first().subscriptionStatus().isNull()); + } + }); + + manager->renameItem("bob@qxmpp.org", "Bob"); + QVERIFY(requestSent); +} + +QTEST_MAIN(tst_QXmppRosterManager) +#include "tst_qxmpprostermanager.moc" -- cgit v1.2.3 From 74c0391293f92b9028f68f1f7ff9e8bce0092a89 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Wed, 1 Apr 2020 01:08:32 +0200 Subject: Prepare CHANGELOG for QXmpp 1.2.1 --- CHANGELOG.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8866b84f..996c958a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,21 @@ +QXmpp 1.2.1 (Apr 01, 2020) +-------------------------- + +This release contains some bug fixes that have been found in the last two +months. Also, the coverage has slightly improved due to new unit tests for the +bug fixes. + +Fixes: + - QXmppRegistrationManager: Fix failed and succeeded signals are both emitted + on success (#260, @melvo) + - QXmppMessageReceiptManager: Fix receipts are sent on error messages + (#269, @TheBluestBird) + - QXmppVCardManager: Fix clientVCardReceived() not emitted when IQ is from the + bare JID of the user (#281, @melvo, @lnjX) + - QXmppRosterManager: Fix 'ask' attribute is included when renaming item + (#262, @melvo, @lnjX) + - QXmppRosterIq: Add missing implementation of the copy constructor (@lnjX) + QXmpp 1.2.0 (Feb 06, 2020) -------------------------- -- cgit v1.2.3 From 3ab1d34eceb8776193fe1cdc2070264d7dfbad30 Mon Sep 17 00:00:00 2001 From: Linus Jahn Date: Wed, 1 Apr 2020 01:10:08 +0200 Subject: Release QXmpp 1.2.1 --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index accf4919..e69af328 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ project(qxmpp) set(VERSION_MAJOR 1) set(VERSION_MINOR 2) -set(VERSION_PATCH 0) +set(VERSION_PATCH 1) set(SO_VERSION 3) set(VERSION_STRING ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) mark_as_advanced(VERSION_MAJOR VERSION_MINOR VERSION_PATCH VERSION_STRING) -- cgit v1.2.3