Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libqxmpp for openSUSE:Factory checked in at 2024-07-11 20:30:24 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libqxmpp (Old) and /work/SRC/openSUSE:Factory/.libqxmpp.new.17339 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libqxmpp" Thu Jul 11 20:30:24 2024 rev:25 rq:1186567 version:1.7.1 Changes: -------- --- /work/SRC/openSUSE:Factory/libqxmpp/libqxmpp.changes 2024-05-22 21:30:24.313435767 +0200 +++ /work/SRC/openSUSE:Factory/.libqxmpp.new.17339/libqxmpp.changes 2024-07-11 20:30:44.391506280 +0200 @@ -1,0 +2,7 @@ +Wed Jul 10 06:58:56 UTC 2024 - Michael Vetter <mvet...@suse.com> + +- Update to 1.7.1: + * OMEMO: Fix messages are dropped if decryption fails (#634) + * Fix build issue with MSVC: missing export of utility functions + +------------------------------------------------------------------- Old: ---- libqxmpp-1.7.0.tar.gz New: ---- libqxmpp-1.7.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libqxmpp.spec ++++++ --- /var/tmp/diff_new_pack.Q7ttfd/_old 2024-07-11 20:30:45.007529045 +0200 +++ /var/tmp/diff_new_pack.Q7ttfd/_new 2024-07-11 20:30:45.007529045 +0200 @@ -32,7 +32,7 @@ %endif %define sover 5 Name: libqxmpp%{?pkg_suffix} -Version: 1.7.0 +Version: 1.7.1 Release: 0 Summary: Qt XMPP Library License: LGPL-2.1-or-later @@ -46,8 +46,8 @@ %endif # c++-17 is required %if 0%{?suse_version} < 1550 -BuildRequires: gcc13-c++ BuildRequires: gcc13-PIE +BuildRequires: gcc13-c++ %endif BuildRequires: pkgconfig %if 0%{?qt5} ++++++ libqxmpp-1.7.0.tar.gz -> libqxmpp-1.7.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qxmpp-1.7.0/CHANGELOG.md new/qxmpp-1.7.1/CHANGELOG.md --- old/qxmpp-1.7.0/CHANGELOG.md 2024-05-19 17:51:48.000000000 +0200 +++ new/qxmpp-1.7.1/CHANGELOG.md 2024-07-07 13:06:52.000000000 +0200 @@ -4,6 +4,12 @@ SPDX-License-Identifier: CC0-1.0 --> +QXmpp 1.7.1 (July 07, 2024) +--------------------------- + + - OMEMO: Fix messages are dropped if decryption fails (@melvo, #634) + - Fix build issue with MSVC: missing export of utility functions (@lnjX) + QXmpp 1.7.0 (May 19, 2024) -------------------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qxmpp-1.7.0/CMakeLists.txt new/qxmpp-1.7.1/CMakeLists.txt --- old/qxmpp-1.7.0/CMakeLists.txt 2024-05-19 17:51:48.000000000 +0200 +++ new/qxmpp-1.7.1/CMakeLists.txt 2024-07-07 13:06:52.000000000 +0200 @@ -3,7 +3,7 @@ # SPDX-License-Identifier: CC0-1.0 cmake_minimum_required(VERSION 3.7) -project(qxmpp VERSION 1.7.0) +project(qxmpp VERSION 1.7.1) set(SO_VERSION 5) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qxmpp-1.7.0/src/base/QXmppUtils_p.h new/qxmpp-1.7.1/src/base/QXmppUtils_p.h --- old/qxmpp-1.7.0/src/base/QXmppUtils_p.h 2024-05-19 17:51:48.000000000 +0200 +++ new/qxmpp-1.7.1/src/base/QXmppUtils_p.h 2024-07-07 13:06:52.000000000 +0200 @@ -95,9 +95,9 @@ // DOM // -bool isIqType(const QDomElement &, QStringView tagName, QStringView xmlns); -QDomElement firstChildElement(const QDomElement &, QStringView tagName = {}, QStringView xmlNs = {}); -QDomElement nextSiblingElement(const QDomElement &, QStringView tagName = {}, QStringView xmlNs = {}); +QXMPP_EXPORT bool isIqType(const QDomElement &, QStringView tagName, QStringView xmlns); +QXMPP_EXPORT QDomElement firstChildElement(const QDomElement &, QStringView tagName = {}, QStringView xmlNs = {}); +QXMPP_EXPORT QDomElement nextSiblingElement(const QDomElement &, QStringView tagName = {}, QStringView xmlNs = {}); struct DomChildElements { QDomElement parent; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qxmpp-1.7.0/src/client/QXmppMixManager.cpp new/qxmpp-1.7.1/src/client/QXmppMixManager.cpp --- old/qxmpp-1.7.0/src/client/QXmppMixManager.cpp 2024-05-19 17:51:48.000000000 +0200 +++ new/qxmpp-1.7.1/src/client/QXmppMixManager.cpp 2024-07-07 13:06:52.000000000 +0200 @@ -54,6 +54,23 @@ /// auto *manager = client->addNewExtension<QXmppMixManager>(); /// \endcode /// +/// Before calling one of the following methods, you need to request the information once per +/// connection: +/// * participantSupport() +/// * messageArchivingSupport() +/// That is done via QXmppDiscoveryManager::requestInfo(): +/// \code +/// client->findExtension<QXmppDiscoveryManager>()->requestInfo(client->configuration().domain()); +/// \endcode +/// +/// Before calling one of the following methods, you need to request the information once per +/// connection: +/// * services() +/// That is done via QXmppDiscoveryManager::requestItems(): +/// \code +/// client->findExtension<QXmppDiscoveryManager>()->requestItems(client->configuration().domain()); +/// \endcode +/// /// If you want to be informed about updates of the channel (e.g., its configuration or allowed /// JIDs), make sure to subscribe to the corresponding nodes. /// @@ -170,13 +187,14 @@ /// /// Server support for a feature. /// +/// The information is cached until a new connection is established. +/// That makes it possible to retrieve the latest state even while the client is disconnected. +/// /// \var QXmppMixManager::Support::Unknown /// /// Whether the server supports the feature is not known. /// /// That means, there is no corresponding information from the server (yet). -/// That is, for example, the case if the client is not connected or connected but has not received -/// the information yet. /// /// \var QXmppMixManager::Unsupported /// @@ -678,8 +696,7 @@ /// Requests all JIDs which are allowed to participate in a MIX channel. /// /// The JIDs can specify users (e.g., "al...@example.org") or groups of users (e.g., "example.org") -/// to let all users join which have a JID containing the specified domain. -/// This is only relevant/used for private channels having a user-specified JID. +/// for allowing all users to participate that have a JID containing the specified domain. /// /// \param channelJid JID of the channel /// @@ -693,8 +710,8 @@ /// /// Allows a JID to participate in a MIX channel. /// -/// The JID can specify a user (e.g., "al...@example.org") or groups of users (e.g., "example.org") -/// to let all users join which have a JID containing the specified domain. +/// The JID can specify a user (e.g., "al...@example.org") or a group of users (e.g., "example.org") +/// for allowing all users to participate that have a JID containing the specified domain. /// /// Allowing a JID is only needed if the channel does not allow anyone to participate. /// That is the case when QXmppMixConfigItem::Node::AllowedJids exists for the channel. @@ -801,8 +818,8 @@ /// /// Bans a JID from participating in a MIX channel. /// -/// The JID can specify a user (e.g., "al...@example.org") or groups of users (e.g., "example.org") -/// to ban all users which have a JID containing the specified domain. +/// The JID can specify a user (e.g., "al...@example.org") or a group of users (e.g., "example.org") +/// for banning all users that have a JID containing the specified domain. /// /// Before calling this, make sure that QXmppMixConfigItem::Node::BannedJids exists for the channel. /// Use requestChannelConfiguration() and QXmppMixConfigItem::nodes() to determine that. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qxmpp-1.7.0/src/omemo/QXmppOmemoManager.cpp new/qxmpp-1.7.1/src/omemo/QXmppOmemoManager.cpp --- old/qxmpp-1.7.0/src/omemo/QXmppOmemoManager.cpp 2024-05-19 17:51:48.000000000 +0200 +++ new/qxmpp-1.7.1/src/omemo/QXmppOmemoManager.cpp 2024-07-07 13:06:52.000000000 +0200 @@ -1024,8 +1024,7 @@ SendError::EncryptionError }); } - auto omemoElement = message.omemoElement(); - if (!omemoElement) { + if (!message.omemoElement()) { return makeReadyTask<MessageDecryptResult>(NotEncrypted()); } @@ -1157,9 +1156,11 @@ { if (d->isStarted && message.omemoElement()) { auto future = d->decryptMessage(message); - future.then(this, [=](std::optional<QXmppMessage> optionalDecryptedMessage) mutable { + future.then(this, [this, message](std::optional<QXmppMessage> optionalDecryptedMessage) { if (optionalDecryptedMessage) { injectMessage(std::move(*optionalDecryptedMessage)); + } else { + Q_EMIT client() -> messageReceived(message); } }); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/qxmpp-1.7.0/src/omemo/QXmppOmemoManager_p.cpp new/qxmpp-1.7.1/src/omemo/QXmppOmemoManager_p.cpp --- old/qxmpp-1.7.0/src/omemo/QXmppOmemoManager_p.cpp 2024-05-19 17:51:48.000000000 +0200 +++ new/qxmpp-1.7.1/src/omemo/QXmppOmemoManager_p.cpp 2024-07-07 13:06:52.000000000 +0200 @@ -1057,18 +1057,6 @@ const auto &deviceId = itr.key(); const auto &device = itr.value(); - // Skip encrypting for a device if it does not respond for a while. - if (const auto unrespondedSentStanzasCount = device.unrespondedSentStanzasCount; unrespondedSentStanzasCount == UNRESPONDED_STANZAS_UNTIL_ENCRYPTION_IS_STOPPED) { - if (++(*skippedDevicesCount) == devicesCount) { - warning(u"OMEMO element could not be created because no recipient device responded to " + - QString::number(unrespondedSentStanzasCount) + - u" sent stanzas"); - interface.finish(std::nullopt); - } - - continue; - } - auto controlDeviceProcessing = [=](bool isSuccessful = true) mutable { if (isSuccessful) { ++(*successfullyProcessedDevicesCount); @@ -1087,6 +1075,19 @@ } }; + // Skip encrypting for a device if it does not respond for a while. + if (const auto unrespondedSentStanzasCount = device.unrespondedSentStanzasCount; unrespondedSentStanzasCount == UNRESPONDED_STANZAS_UNTIL_ENCRYPTION_IS_STOPPED) { + if (++(*skippedDevicesCount) == devicesCount) { + warning(u"OMEMO element could not be created because no recipient device responded to " + + QString::number(unrespondedSentStanzasCount) + u" sent stanzas"); + interface.finish(std::nullopt); + } else { + controlDeviceProcessing(false); + } + + continue; + } + const auto address = Address(jid, deviceId); auto addOmemoEnvelope = [=](bool isKeyExchange = false) mutable { @@ -1099,7 +1100,11 @@ } else if (devices.value(jid).contains(deviceId)) { auto &deviceBeingModified = devices[jid][deviceId]; deviceBeingModified.unrespondedReceivedStanzasCount = 0; - ++deviceBeingModified.unrespondedSentStanzasCount; + + if (auto &unrespondedSentStanzasCount = deviceBeingModified.unrespondedSentStanzasCount; unrespondedSentStanzasCount + 1 <= UNRESPONDED_STANZAS_UNTIL_ENCRYPTION_IS_STOPPED) { + ++unrespondedSentStanzasCount; + } + omemoStorage->addDevice(jid, deviceId, deviceBeingModified); QXmppOmemoEnvelope omemoEnvelope; @@ -1609,13 +1614,12 @@ warning(QStringLiteral("OMEMO envelope data could not be deserialized")); interface.finish(std::nullopt); } else { - BufferPtr publicIdentityKeyBuffer; + BufferPtr publicIdentityKeyBuffer(ec_public_key_get_ed(pre_key_signal_message_get_identity_key(omemoEnvelopeData.get()))); - if (ec_public_key_serialize(publicIdentityKeyBuffer.ptrRef(), pre_key_signal_message_get_identity_key(omemoEnvelopeData.get())) < 0) { + if (const auto key = publicIdentityKeyBuffer.toByteArray(); key.isEmpty()) { warning(QStringLiteral("Public Identity key could not be retrieved")); interface.finish(std::nullopt); } else { - const auto key = publicIdentityKeyBuffer.toByteArray(); auto &device = devices[senderJid][senderDeviceId]; auto &storedKeyId = device.keyId;