Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libQuotient for openSUSE:Factory checked in at 2025-09-20 22:04:57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libQuotient (Old) and /work/SRC/openSUSE:Factory/.libQuotient.new.27445 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libQuotient" Sat Sep 20 22:04:57 2025 rev:22 rq:1306130 version:0.9.5 Changes: -------- --- /work/SRC/openSUSE:Factory/libQuotient/libQuotient.changes 2025-08-13 16:33:27.111764142 +0200 +++ /work/SRC/openSUSE:Factory/.libQuotient.new.27445/libQuotient.changes 2025-09-20 22:05:37.898574935 +0200 @@ -1,0 +2,10 @@ +Sat Sep 20 13:12:10 UTC 2025 - Christophe Marin <[email protected]> + +- Update to 0.9.5 + * Fixed verification sessions getting stuck in some cases + * Pass more information about network errors when mxc: requests + fail + * Massively improve E2EE performance when many devices are + registered on an account + +------------------------------------------------------------------- Old: ---- libQuotient-0.9.4.tar.gz New: ---- libQuotient-0.9.5.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libQuotient.spec ++++++ --- /var/tmp/diff_new_pack.QYNCw6/_old 2025-09-20 22:05:38.494599936 +0200 +++ /var/tmp/diff_new_pack.QYNCw6/_new 2025-09-20 22:05:38.494599936 +0200 @@ -29,7 +29,7 @@ %define sonum 0.9 %define rname libQuotient Name: libQuotient%{?pkg_suffix} -Version: 0.9.4 +Version: 0.9.5 Release: 0 Summary: Library for Qt Matrix Clients License: LGPL-2.1-only ++++++ libQuotient-0.9.4.tar.gz -> libQuotient-0.9.5.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/.github/workflows/ci.yml new/libQuotient-0.9.5/.github/workflows/ci.yml --- old/libQuotient-0.9.4/.github/workflows/ci.yml 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/.github/workflows/ci.yml 2025-09-20 13:57:20.000000000 +0200 @@ -38,12 +38,18 @@ env: GCC_VERSION: -13 CLANG_VERSION: -17 + SONAR_DIR: sonar steps: - uses: actions/checkout@v4 with: fetch-depth: 0 + - name: Install cmake + uses: jwlawson/actions-setup-cmake@v2 + with: + cmake-version: '3.x' + # Install on Linux via apt to get everything necessary in one go - name: Install dependencies (Linux) if: startsWith(matrix.os, 'ubuntu') @@ -105,7 +111,7 @@ " if [ '${{ matrix.static-analysis }}' == 'sonar' ]; then - mkdir -p $HOME/.sonar + # mkdir -p $HOME/.sonar CMAKE_ARGS="$CMAKE_ARGS -DCMAKE_CXX_FLAGS=--coverage" fi @@ -131,7 +137,7 @@ - name: Set up Sonar Cloud tools id: sonar if: matrix.static-analysis == 'sonar' - uses: sonarsource/sonarcloud-github-c-cpp@v2 + uses: SonarSource/sonarqube-scan-action/install-build-wrapper@v5 - name: Build and install QtKeychain run: | @@ -140,7 +146,8 @@ cmake -S qtkeychain -B qtkeychain/build -DBUILD_WITH_QT6=ON $CMAKE_ARGS cmake --build qtkeychain/build --target install - - name: Build and install Olm + - name: Build and install Olm (non-Linux) + if: "!startsWith(matrix.os, 'ubuntu')" run: | cd .. git clone https://gitlab.matrix.org/matrix-org/olm.git @@ -175,12 +182,12 @@ - name: Regenerate API code if: matrix.update-api - run: cmake --build ../build/libQuotient --target update-api + run: cmake --build $BUILD_PATH --target update-api - name: Build and install libQuotient run: | if [[ '${{ matrix.static-analysis }}' == 'sonar' ]]; then - BUILD_WRAPPER="${{ steps.sonar.outputs.build-wrapper-binary }} --out-dir $BUILD_PATH/sonar" + BUILD_WRAPPER="${{ steps.sonar.outputs.build-wrapper-binary }} --out-dir $SONAR_DIR" fi $BUILD_WRAPPER cmake --build $BUILD_PATH --target all cmake --build $BUILD_PATH --target install @@ -210,22 +217,24 @@ if: matrix.static-analysis == 'codeql' uses: github/codeql-action/analyze@v3 - - name: Run sonar-scanner + - name: Prepare coverage files for Sonar analysis if: matrix.static-analysis == 'sonar' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_SERVER_URL: 'https://sonarcloud.io' run: | mkdir .coverage && pushd .coverage - find $BUILD_PATH -name '*.gcda' -print0 \ - | xargs -0 gcov$GCC_VERSION -s $GITHUB_WORKSPACE -pr + find $BUILD_PATH -name '*.gcda' -print0 | xargs -0 gcov$GCC_VERSION -s $GITHUB_WORKSPACE -pr # Coverage of the test source code is not tracked, as it is always 100% # (if not, some tests failed and broke the build at an earlier stage) rm -f quotest* autotests* popd - ${{ steps.sonar.outputs.sonar-scanner-binary }} \ - -Dsonar.host.url="$SONAR_SERVER_URL" \ - -Dsonar.cfamily.compile-commands="$BUILD_PATH/sonar/compile_commands.json" \ - -Dsonar.cfamily.threads=2 \ - -Dsonar.cfamily.gcov.reportsPath=.coverage + + - name: Run sonar-scanner + if: matrix.static-analysis == 'sonar' + uses: SonarSource/sonarqube-scan-action@v5 + env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + with: + args: > + -Dsonar.cfamily.compile-commands=${{ env.SONAR_DIR }}/compile_commands.json + -Dsonar.cfamily.threads=2 + -Dsonar.cfamily.gcov.reportsPath=.coverage diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/CMakeLists.txt new/libQuotient-0.9.5/CMakeLists.txt --- old/libQuotient-0.9.4/CMakeLists.txt 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/CMakeLists.txt 2025-09-20 13:57:20.000000000 +0200 @@ -4,7 +4,7 @@ endif() set(API_VERSION "0.9") -project(Quotient VERSION "${API_VERSION}.4" LANGUAGES CXX) +project(Quotient VERSION "${API_VERSION}.5" LANGUAGES CXX) set(PRE_STAGE "") string(JOIN ~ FULL_VERSION ${PROJECT_VERSION} ${PRE_STAGE}) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/Quotient/connectionencryptiondata_p.cpp new/libQuotient-0.9.5/Quotient/connectionencryptiondata_p.cpp --- old/libQuotient-0.9.4/Quotient/connectionencryptiondata_p.cpp 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/Quotient/connectionencryptiondata_p.cpp 2025-09-20 13:57:20.000000000 +0200 @@ -955,15 +955,11 @@ const QString& roomId, const QOlmOutboundGroupSession& outboundSession, const QMultiHash<QString, QString>& devices) { - const auto& sessionId = outboundSession.sessionId(); - const auto& sessionKey = outboundSession.sessionKey(); - const auto& index = outboundSession.sessionMessageIndex(); - - const auto closure = [this, roomId, sessionId, sessionKey, index, devices] { - doSendSessionKeyToDevices(roomId, sessionId, sessionKey, index, devices); - }; + auto closure = std::bind_front(&ConnectionEncryptionData::doSendSessionKeyToDevices, this, + roomId, outboundSession.sessionId(), outboundSession.sessionKey(), + outboundSession.sessionMessageIndex(), devices); if (currentQueryKeysJob != nullptr) { - currentQueryKeysJob = currentQueryKeysJob.onResult(q, closure); + currentQueryKeysJob = currentQueryKeysJob.onResult(q, std::move(closure)); } else closure(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/Quotient/database.cpp new/libQuotient-0.9.5/Quotient/database.cpp --- old/libQuotient-0.9.4/Quotient/database.cpp 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/Quotient/database.cpp 2025-09-20 13:57:20.000000000 +0200 @@ -629,9 +629,7 @@ { auto query = prepareQuery(u"UPDATE master_keys SET verified=true WHERE key=:key;"_s); query.bindValue(u":key"_s, masterKey); - transaction(); execute(query); - commit(); } QString Database::userSigningPublicKey() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/Quotient/jobs/jobhandle.h new/libQuotient-0.9.5/Quotient/jobs/jobhandle.h --- old/libQuotient-0.9.4/Quotient/jobs/jobhandle.h 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/Quotient/jobs/jobhandle.h 2025-09-20 13:57:20.000000000 +0200 @@ -209,6 +209,7 @@ private: //! A function object that can be passed to QFuture::then and QFuture::onCanceled template <typename FnT> + requires (!std::is_reference_v<FnT>) struct BoundFn { auto operator()() { return callFn<false>(nullptr); } // For QFuture::onCanceled auto operator()(future_value_type job) { return callFn(job); } // For QFuture::then @@ -244,6 +245,9 @@ template <typename FnT> BoundFn(FnT&&) -> BoundFn<FnT>; + template <typename FnT> + BoundFn(const FnT &) -> BoundFn<FnT>; + template <typename FnT, typename ConfigT = Skip> static auto bindToContext(FnT&& fn, ConfigT config = {}) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/Quotient/jobs/syncjob.cpp new/libQuotient-0.9.5/Quotient/jobs/syncjob.cpp --- old/libQuotient-0.9.4/Quotient/jobs/syncjob.cpp 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/Quotient/jobs/syncjob.cpp 2025-09-20 13:57:20.000000000 +0200 @@ -23,7 +23,7 @@ query.addQueryItem(u"timeout"_s, QString::number(timeout)); backoffStrategy.jobTimeouts = { std::chrono::seconds(timeout / 1000 + 10) }; } else - backoffStrategy.jobTimeouts = { std::chrono::years { 1000 } }; // effectively disable the timeout + backoffStrategy.jobTimeouts = { std::chrono::weeks { 3 } }; // effectively disable the timeout setBackoffStrategy(std::move(backoffStrategy)); addParam<IfNotEmpty>(query, u"since"_s, since); setRequestQuery(query); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/Quotient/keyverificationsession.cpp new/libQuotient-0.9.5/Quotient/keyverificationsession.cpp --- old/libQuotient-0.9.4/Quotient/keyverificationsession.cpp 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/Quotient/keyverificationsession.cpp 2025-09-20 13:57:20.000000000 +0200 @@ -428,9 +428,7 @@ void KeyVerificationSession::handleStart(const KeyVerificationStartEvent& event) { if (startSentByUs) { - if (m_remoteUserId > m_connection->userId() - || (m_remoteUserId == m_connection->userId() - && m_remoteDeviceId > m_connection->deviceId())) { + if (m_remoteUserId > m_connection->userId()) { return; } startSentByUs = false; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libQuotient-0.9.4/Quotient/mxcreply.cpp new/libQuotient-0.9.5/Quotient/mxcreply.cpp --- old/libQuotient-0.9.4/Quotient/mxcreply.cpp 2025-08-12 21:51:27.000000000 +0200 +++ new/libQuotient-0.9.5/Quotient/mxcreply.cpp 2025-09-20 13:57:20.000000000 +0200 @@ -26,7 +26,14 @@ if (d->m_reply->error() != NoError) { const QJsonDocument doc = QJsonDocument::fromJson(d->m_reply->readAll()); - setErrorString(QStringLiteral("%1 (%2)").arg(doc["error"_L1].toString(), d->m_reply->url().toString())); + QString errorString; + if (doc.object().contains("error"_L1)) { + errorString = doc["error"_L1].toString(); + } else { + errorString = d->m_reply->errorString(); + } + setErrorString(QStringLiteral("%1 (%2)").arg(errorString, + d->m_reply->url().toString())); } else if (fileMetadata.isValid()) { auto buffer = new QBuffer(this); buffer->setData(decryptFile(d->m_reply->readAll(), fileMetadata));
