#23 Add upstream patch to fix kded deadlock
Merged a year ago by jgrulich. Opened a year ago by orion.
rpms/ orion/plasma-workspace epel8-patch  into  epel8

@@ -0,0 +1,191 @@ 

+ From d693026676cc6bf2b7c23e9ff4b620679cf15d10 Mon Sep 17 00:00:00 2001

+ From: Nicolas Fella <nicolas.fella@gmx.de>

+ Date: Mon, 15 Aug 2022 18:36:56 +0200

+ Subject: [PATCH] [dataengines/geolocation] Port from KIO::http_post to

+  QNetworkAccessManager

+ 

+ Not only does this slightly simplify the code, it also avoids a deadlock in kded when automatic proxy detection is enabled

+ 

+ BUG: 449984

+ 

+ BUG: 457341

+ (cherry picked from commit 98cadd48c21c89b81fdeb3499a557a6551a09d8a)

+ ---

+  dataengines/geolocation/CMakeLists.txt  |  2 +-

+  dataengines/geolocation/location_ip.cpp | 84 ++++++++++---------------

+  2 files changed, 35 insertions(+), 51 deletions(-)

+ 

+ diff --git a/dataengines/geolocation/CMakeLists.txt b/dataengines/geolocation/CMakeLists.txt

+ index 175687bd4d..6ae707643c 100644

+ --- a/dataengines/geolocation/CMakeLists.txt

+ +++ b/dataengines/geolocation/CMakeLists.txt

+ @@ -36,7 +36,7 @@ target_link_libraries(plasma_engine_geolocation

+  kcoreaddons_add_plugin(plasma-geolocation-ip SOURCES location_ip.cpp INSTALL_NAMESPACE plasma/geolocationprovider)

+  ecm_qt_declare_logging_category(plasma-geolocation-ip HEADER geolocdebug.h IDENTIFIER DATAENGINE_GEOLOCATION CATEGORY_NAME org.kde.plasma.dataengine.geolocation)

+  target_compile_definitions(plasma-geolocation-ip PRIVATE -DQT_NO_KEYWORDS)

+ -target_link_libraries(plasma-geolocation-ip plasma-geolocation-interface KF5::KIOCore KF5::NetworkManagerQt)

+ +target_link_libraries(plasma-geolocation-ip plasma-geolocation-interface KF5::NetworkManagerQt)

+  

+  pkg_check_modules(LIBGPS libgps IMPORTED_TARGET)

+  

+ diff --git a/dataengines/geolocation/location_ip.cpp b/dataengines/geolocation/location_ip.cpp

+ index 27b530810c..3c5a202b89 100644

+ --- a/dataengines/geolocation/location_ip.cpp

+ +++ b/dataengines/geolocation/location_ip.cpp

+ @@ -12,15 +12,14 @@

+  

+  #include "location_ip.h"

+  #include "geolocdebug.h"

+ -#include <KIO/Job>

+ -#include <KIO/TransferJob>

+ -#include <KJob>

+  #include <KSharedConfig>

+  #include <NetworkManagerQt/Manager>

+  #include <NetworkManagerQt/WirelessDevice>

+  #include <QJsonArray>

+  #include <QJsonDocument>

+  #include <QJsonObject>

+ +#include <QNetworkAccessManager>

+ +#include <QNetworkReply>

+  #include <QUrl>

+  

+  class Ip::Private : public QObject

+ @@ -30,19 +29,21 @@ public:

+      Private(Ip *q)

+          : q(q)

+      {

+ +        m_nam.setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy);

+ +        m_nam.setStrictTransportSecurityEnabled(true);

+ +        m_nam.enableStrictTransportSecurityStore(true,

+ +                                                 QStandardPaths::writableLocation(QStandardPaths::GenericCacheLocation) + QLatin1String("/plasmashell/hsts/"));

+      }

+  

+ -    void readGeoLocation(KJob *job)

+ +    void readGeoLocation(QNetworkReply *reply)

+      {

+          m_geoLocationResolved = true;

+ -        if (job && job->error()) {

+ -            qCCritical(DATAENGINE_GEOLOCATION) << "error: " << job->errorString();

+ -            m_geoLocationPayload.clear();

+ +        if (reply->error()) {

+ +            qCCritical(DATAENGINE_GEOLOCATION) << "error: " << reply->errorString();

+              checkUpdateData();

+              return;

+          }

+ -        const QJsonObject json = QJsonDocument::fromJson(m_geoLocationPayload).object();

+ -        m_geoLocationPayload.clear();

+ +        const QJsonObject json = QJsonDocument::fromJson(reply->readAll()).object();

+  

+          auto accuracyIt = json.find(QStringLiteral("accuracy"));

+          if (accuracyIt != json.end()) {

+ @@ -62,52 +63,28 @@ public:

+  

+      void clear()

+      {

+ -        m_geoLocationPayload.clear();

+ -        m_countryPayload.clear();

+          m_countryResolved = false;

+          m_geoLocationResolved = false;

+          m_data.clear();

+      }

+  

+ -    void geoLocationData(KIO::Job *job, const QByteArray &data)

+ -    {

+ -        Q_UNUSED(job)

+ -

+ -        if (data.isEmpty()) {

+ -            return;

+ -        }

+ -        m_geoLocationPayload.append(data);

+ -    }

+ -

+ -    void countryData(KIO::Job *job, const QByteArray &data)

+ -    {

+ -        Q_UNUSED(job)

+ -

+ -        if (data.isEmpty()) {

+ -            return;

+ -        }

+ -        m_countryPayload.append(data);

+ -    }

+ -

+ -    void readCountry(KJob *job)

+ +    void readCountry(QNetworkReply *reply)

+      {

+          m_countryResolved = true;

+ -        if (job && job->error()) {

+ -            qCCritical(DATAENGINE_GEOLOCATION) << "error: " << job->errorString();

+ -            m_countryPayload.clear();

+ +        if (reply->error()) {

+ +            qCCritical(DATAENGINE_GEOLOCATION) << "error: " << reply->errorString();

+              checkUpdateData();

+              return;

+          }

+  

+ -        const QJsonObject json = QJsonDocument::fromJson(m_countryPayload).object();

+ -        m_countryPayload.clear();

+ +        const QJsonObject json = QJsonDocument::fromJson(reply->readAll()).object();

+  

+          m_data[QStringLiteral("country")] = json.value(QStringLiteral("country_name")).toString();

+          m_data[QStringLiteral("country code")] = json.value(QStringLiteral("country_code")).toString();

+ +

+          checkUpdateData();

+      }

+  

+ -private:

+      void checkUpdateData()

+      {

+          if (!m_countryResolved || !m_geoLocationResolved) {

+ @@ -117,11 +94,10 @@ private:

+      }

+  

+      Ip *q;

+ -    QByteArray m_geoLocationPayload;

+ -    QByteArray m_countryPayload;

+      bool m_countryResolved = false;

+      bool m_geoLocationResolved = false;

+      Plasma::DataEngine::Data m_data;

+ +    QNetworkAccessManager m_nam;

+  };

+  

+  Ip::Ip(QObject *parent, const QVariantList &args)

+ @@ -176,18 +152,26 @@ void Ip::update()

+      }

+      const QByteArray postData = QJsonDocument(request).toJson(QJsonDocument::Compact);

+      const QString apiKey = QStringLiteral("60e8eae6-3988-4ada-ad48-2cfddddf216b");

+ -    KIO::TransferJob *datajob =

+ -        KIO::http_post(QUrl(QStringLiteral("https://location.services.mozilla.com/v1/geolocate?key=%1").arg(apiKey)), postData, KIO::HideProgressInfo);

+ -    datajob->addMetaData(QStringLiteral("content-type"), QStringLiteral("application/json"));

+  

+      qCDebug(DATAENGINE_GEOLOCATION) << "Fetching https://location.services.mozilla.com/v1/geolocate";

+ -    connect(datajob, &KIO::TransferJob::data, d, &Ip::Private::geoLocationData);

+ -    connect(datajob, &KIO::TransferJob::result, d, &Ip::Private::readGeoLocation);

+ -

+ -    datajob = KIO::http_post(QUrl(QStringLiteral("https://location.services.mozilla.com/v1/country?key=%1").arg(apiKey)), postData, KIO::HideProgressInfo);

+ -    datajob->addMetaData(QStringLiteral("content-type"), QStringLiteral("application/json"));

+ -    connect(datajob, &KIO::TransferJob::data, d, &Ip::Private::countryData);

+ -    connect(datajob, &KIO::TransferJob::result, d, &Ip::Private::readCountry);

+ +    QNetworkRequest locationRequest(QUrl(QStringLiteral("https://location.services.mozilla.com/v1/geolocate?key=%1").arg(apiKey)));

+ +    locationRequest.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json"));

+ +    QNetworkReply *locationReply = d->m_nam.post(locationRequest, postData);

+ +

+ +    connect(locationReply, &QNetworkReply::finished, this, [this, locationReply] {

+ +        locationReply->deleteLater();

+ +        d->readGeoLocation(locationReply);

+ +    });

+ +

+ +    qCDebug(DATAENGINE_GEOLOCATION) << "Fetching https://location.services.mozilla.com/v1/country";

+ +    QNetworkRequest countryRequest(QUrl(QStringLiteral("https://location.services.mozilla.com/v1/country?key=%1").arg(apiKey)));

+ +    countryRequest.setHeader(QNetworkRequest::ContentTypeHeader, QStringLiteral("application/json"));

+ +    QNetworkReply *countryReply = d->m_nam.post(countryRequest, postData);

+ +

+ +    connect(countryReply, &QNetworkReply::finished, this, [this, countryReply] {

+ +        countryReply->deleteLater();

+ +        d->readCountry(countryReply);

+ +    });

+  }

+  

+  K_PLUGIN_CLASS_WITH_JSON(Ip, "plasma-geolocation-ip.json")

+ -- 

+ GitLab

+ 

file modified
+6 -1
@@ -28,7 +28,7 @@ 

  Name:    plasma-workspace

  Summary: Plasma workspace, applications and applets

  Version: 5.24.6

- Release: 2%{?dist}

+ Release: 3%{?dist}

  

  License: GPLv2+

  URL:     https://invent.kde.org/plasma/%{name}
@@ -67,6 +67,7 @@ 

  Source41:       spice-vdagent.conf

  

  ## upstream Patches (master branch)

+ Patch0:         https://invent.kde.org/plasma/plasma-workspace/-/commit/d693026676cc6bf2b7c23e9ff4b620679cf15d10.patch

  

  ## upstreamable Patches

  
@@ -465,6 +466,7 @@ 

  %setup -q -a 19 -a 20

  

  ## upstream patches

+ %patch0 -p1 -b .kded-deadlock

  

  ## upstreamable patches

  
@@ -786,6 +788,9 @@ 

  

  

  %changelog

+ * Fri Mar 31 2023 Orion Poplawski <orion@nwra.com> - 5.24.6-3

+ - Add upstream patch to fix kded deadlock

+ 

  * Fri Jul 29 2022 Troy Dawson <tdawson@redhat.com> - 5.24.6-2

  - Build plasma-lookandfeel-fedora on everything

  

Fixes https://bugs.kde.org/show_bug.cgi?id=457341 and https://bugs.kde.org/show_bug.cgi?id=449984 which was causing one of our users lots of trouble and took quite a while to debug.

Build failed. More information on how to proceed and troubleshoot errors available at https://fedoraproject.org/wiki/Zuul-based-ci
https://fedora.softwarefactory-project.io/zuul/buildset/b930191cf17044be9361cd24d5603067

Pull-Request has been merged by jgrulich

a year ago