diff options
Diffstat (limited to 'kde-plasma/plasma-workspace/files/plasma-workspace-5.25.5-geolocation-deadlock.patch')
-rw-r--r-- | kde-plasma/plasma-workspace/files/plasma-workspace-5.25.5-geolocation-deadlock.patch | 194 |
1 files changed, 194 insertions, 0 deletions
diff --git a/kde-plasma/plasma-workspace/files/plasma-workspace-5.25.5-geolocation-deadlock.patch b/kde-plasma/plasma-workspace/files/plasma-workspace-5.25.5-geolocation-deadlock.patch new file mode 100644 index 000000000000..70bd28419472 --- /dev/null +++ b/kde-plasma/plasma-workspace/files/plasma-workspace-5.25.5-geolocation-deadlock.patch @@ -0,0 +1,194 @@ +https://invent.kde.org/plasma/plasma-workspace/-/commit/d693026676cc6bf2b7c23e9ff4b620679cf15d10 + +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 + + |