Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package drkonqi5 for openSUSE:Factory checked in at 2021-05-06 22:51:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/drkonqi5 (Old) and /work/SRC/openSUSE:Factory/.drkonqi5.new.2988 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "drkonqi5" Thu May 6 22:51:59 2021 rev:67 rq:890561 version:5.21.5 Changes: -------- --- /work/SRC/openSUSE:Factory/drkonqi5/drkonqi5.changes 2021-04-14 10:09:42.569365065 +0200 +++ /work/SRC/openSUSE:Factory/.drkonqi5.new.2988/drkonqi5.changes 2021-05-06 22:52:11.310858073 +0200 @@ -1,0 +2,10 @@ +Tue May 4 14:15:38 UTC 2021 - Fabian Vogt <fab...@ritter-vogt.de> + +- Update to 5.21.5 + * New bugfix release + * For more details please see: + * https://kde.org/announcements/plasma/5/5.21.5 +- Changes since 5.21.4: + * move bugz api from qurlquery to a custom container (kde#435442) + +------------------------------------------------------------------- Old: ---- drkonqi-5.21.4.tar.xz drkonqi-5.21.4.tar.xz.sig New: ---- drkonqi-5.21.5.tar.xz drkonqi-5.21.5.tar.xz.sig ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ drkonqi5.spec ++++++ --- /var/tmp/diff_new_pack.IBRNul/_old 2021-05-06 22:52:11.858855812 +0200 +++ /var/tmp/diff_new_pack.IBRNul/_new 2021-05-06 22:52:11.862855795 +0200 @@ -23,7 +23,7 @@ %{!?_plasma5_bugfix: %define _plasma5_bugfix %{version}} # Latest ABI-stable Plasma (e.g. 5.8 in KF5, but 5.9.1 in KUF) %{!?_plasma5_version: %define _plasma5_version %(echo %{_plasma5_bugfix} | awk -F. '{print $1"."$2}')} -Version: 5.21.4 +Version: 5.21.5 Release: 0 Summary: Helper for debugging and reporting crashes License: GPL-2.0-or-later ++++++ drkonqi-5.21.4.tar.xz -> drkonqi-5.21.5.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/CMakeLists.txt new/drkonqi-5.21.5/CMakeLists.txt --- old/drkonqi-5.21.4/CMakeLists.txt 2021-04-06 14:17:31.000000000 +0200 +++ new/drkonqi-5.21.5/CMakeLists.txt 2021-05-04 13:51:34.000000000 +0200 @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.0) project(drkonqi) -set(PROJECT_VERSION "5.21.4") +set(PROJECT_VERSION "5.21.5") set(PROJECT_VERSION_MAJOR 5) set(QT_MIN_VERSION "5.15.0") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/po/de/drkonqi5.po new/drkonqi-5.21.5/po/de/drkonqi5.po --- old/drkonqi-5.21.4/po/de/drkonqi5.po 2021-04-06 14:17:08.000000000 +0200 +++ new/drkonqi-5.21.5/po/de/drkonqi5.po 2021-05-04 13:50:27.000000000 +0200 @@ -2,7 +2,7 @@ # Stephan Johach <hun...@gmx.de>, 2005. # Thomas Reitelbach <t...@erdfunkstelle.de>, 2005, 2007, 2008, 2009. # Frederik Schwarzer <schwar...@kde.org>, 2009, 2010, 2011, 2012, 2016, 2018. -# Burkhard L??ck <lu...@hube-lueck.de>, 2009, 2011, 2012, 2013, 2014, 2015, 2017, 2019, 2020. +# Burkhard L??ck <lu...@hube-lueck.de>, 2009, 2011, 2012, 2013, 2014, 2015, 2017, 2019, 2020, 2021. # Johannes Obermayr <johannesoberm...@gmx.de>, 2009, 2010. # Panagiotis Papadopoulos <pano...@gmx.net>, 2010, 2011. # Hendrik Knackstedt <kn.hend...@gmail.com>, 2011. @@ -11,14 +11,14 @@ "Project-Id-Version: drkonqi\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2021-03-05 08:47+0100\n" -"PO-Revision-Date: 2020-10-17 07:20+0200\n" +"PO-Revision-Date: 2021-04-15 15:05+0200\n" "Last-Translator: Burkhard L??ck <lu...@hube-lueck.de>\n" "Language-Team: German <kde-i18n...@kde.org>\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Lokalize 19.04.3\n" +"X-Generator: Lokalize 19.12.3\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" #, kde-format @@ -970,6 +970,9 @@ "compositor and cannot be submitted as it lacks the required information to " "resolve the problem." msgstr "" +"Es scheint, dass dieser Absturz tats??chlich das Ergebnis eines fr??heren " +"Absturzes im Compositor ist und kann nicht ??bermittelt werden, da die " +"erforderlichen Informationen fehlen, um das Problem zu beheben." #: bugzillaintegration/reportassistantpages_base.cpp:260 #, kde-kuit-format @@ -982,6 +985,12 @@ "How_to_create_useful_crash_reports#Retrieving_a_backtrace_using_coredumpctl'>the " "KDE Community Wiki</link>." msgstr "" +"Die KDE-Entwickler w??rden sich freuen, wenn Sie das Absturzprotokoll f??r den " +"Compositor finden und anh??ngen k??nnten. M??glicherweise k??nnen Sie es mit dem " +"Dienstprogramm coredumpctl erhalten.Weitere Informationen finden Sie im " +"<link url='https://community.kde.org/Richtlinien_und_HOWTOs/Debugging/" +"How_to_create_useful_crash_reports#Retrieving_a_backtrace_using_coredumpctl'>im " +"Wiki der KDE-Gemeinschaft</link>." #: bugzillaintegration/reportassistantpages_base.cpp:284 #, kde-format diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/po/zh_CN/drkonqi5.po new/drkonqi-5.21.5/po/zh_CN/drkonqi5.po --- old/drkonqi-5.21.4/po/zh_CN/drkonqi5.po 2021-04-06 14:17:30.000000000 +0200 +++ new/drkonqi-5.21.5/po/zh_CN/drkonqi5.po 2021-05-04 13:51:31.000000000 +0200 @@ -13,7 +13,7 @@ "Project-Id-Version: kdeorg\n" "Report-Msgid-Bugs-To: https://bugs.kde.org\n" "POT-Creation-Date: 2021-03-05 08:47+0100\n" -"PO-Revision-Date: 2021-03-27 17:31\n" +"PO-Revision-Date: 2021-04-24 15:45\n" "Last-Translator: \n" "Language-Team: Chinese Simplified\n" "Language: zh_CN\n" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/CMakeLists.txt new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/CMakeLists.txt --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/CMakeLists.txt 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/CMakeLists.txt 2021-05-04 13:50:10.000000000 +0200 @@ -3,6 +3,7 @@ bugzilla.cpp connection.cpp exceptions.cpp + query.cpp clients/attachmentclient.cpp clients/bugclient.cpp diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/attachmenttest.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/attachmenttest.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/attachmenttest.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/attachmenttest.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -22,7 +22,7 @@ Q_UNREACHABLE(); } - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *get(const QString &path, const Query &query = Query()) const override { Q_UNUSED(path) Q_UNUSED(query) @@ -30,7 +30,7 @@ return nullptr; } - virtual APIJob *post(const QString &path, const QByteArray &data, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *post(const QString &path, const QByteArray &data, const Query &query = Query()) const override { Q_UNUSED(query); if (path == "/bug/1/attachment") { @@ -43,7 +43,7 @@ return nullptr; } - virtual APIJob *put(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *put(const QString &path, const QByteArray &, const Query &query = Query()) const override { Q_UNUSED(path) Q_UNUSED(query) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/bugfieldtest.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/bugfieldtest.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/bugfieldtest.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/bugfieldtest.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -22,7 +22,7 @@ Q_UNREACHABLE(); } - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *get(const QString &path, const Query &query = Query()) const override { if (path == "/field/bug/rep_platform" && query.toString() == "") { return new JobDouble{QFINDTESTDATA("data/field.rep_platform.json")}; @@ -31,13 +31,13 @@ return nullptr; } - virtual APIJob *post(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *post(const QString &path, const QByteArray &, const Query &query = Query()) const override { Q_ASSERT_X(false, "post", qUtf8Printable(QStringLiteral("unmapped: %1; %2").arg(path, query.toString()))); return nullptr; } - virtual APIJob *put(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *put(const QString &path, const QByteArray &, const Query &query = Query()) const override { Q_ASSERT_X(false, "put", qUtf8Printable(QStringLiteral("unmapped: %1; %2").arg(path, query.toString()))); return nullptr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/bugtest.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/bugtest.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/bugtest.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/bugtest.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -49,7 +49,7 @@ Q_UNREACHABLE(); } - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *get(const QString &path, const Query &query = Query()) const override { if (path == "/bug" && query.toString() == "product=dragonplayer") { return new JobDouble{QFINDTESTDATA("data/bugs.dragonplayer.json")}; @@ -61,7 +61,7 @@ return nullptr; } - virtual APIJob *post(const QString &path, const QByteArray &data, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *post(const QString &path, const QByteArray &data, const Query &query = Query()) const override { qDebug() << path << query.toString(); if (path == "/bug" && query.isEmpty()) { @@ -79,7 +79,7 @@ return nullptr; } - virtual APIJob *put(const QString &path, const QByteArray &data, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *put(const QString &path, const QByteArray &data, const Query &query = Query()) const override { if (path == "/bug/54321" && query.isEmpty()) { QJsonParseError e; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/bugzillatest.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/bugzillatest.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/bugzillatest.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/bugzillatest.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -22,7 +22,7 @@ Q_UNREACHABLE(); } - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *get(const QString &path, const Query &query = Query()) const override { if (path == "/version") { return new JobDouble{QFINDTESTDATA("data/bugzilla.version.json")}; @@ -33,13 +33,13 @@ return nullptr; } - virtual APIJob *post(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *post(const QString &path, const QByteArray &, const Query &query = Query()) const override { Q_ASSERT_X(false, "post", qUtf8Printable(QStringLiteral("unmapped: %1; %2").arg(path, query.toString()))); return nullptr; } - virtual APIJob *put(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *put(const QString &path, const QByteArray &, const Query &query = Query()) const override { Q_ASSERT_X(false, "put", qUtf8Printable(QStringLiteral("unmapped: %1; %2").arg(path, query.toString()))); return nullptr; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/commenttest.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/commenttest.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/commenttest.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/commenttest.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -22,7 +22,7 @@ Q_UNREACHABLE(); } - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *get(const QString &path, const Query &query = Query()) const override { if (path == "/bug/407363/comment" && query.toString().isEmpty()) { return new JobDouble{QFINDTESTDATA("data/comments.json")}; @@ -34,7 +34,7 @@ return nullptr; } - virtual APIJob *post(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *post(const QString &path, const QByteArray &, const Query &query = Query()) const override { Q_UNUSED(path); Q_UNUSED(query); @@ -42,7 +42,7 @@ return nullptr; } - virtual APIJob *put(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *put(const QString &path, const QByteArray &, const Query &query = Query()) const override { Q_UNUSED(path); Q_UNUSED(query); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/connectiontest.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/connectiontest.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/connectiontest.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/connectiontest.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -1,5 +1,5 @@ /* - SPDX-FileCopyrightText: 2019 Harald Sitter <sit...@kde.org> + SPDX-FileCopyrightText: 2019-2021 Harald Sitter <sit...@kde.org> SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL */ @@ -70,7 +70,13 @@ // needs it encoded which is a bit weird because it doesn't actually // require full-form encoding either (i.e. space becomes plus and // plus becomes encoded). - if (httpBlob.startsWith("GET /hi?informal=yes%2Bcertainly")) { + // + // This further broke because we force-recoded the query items but then that caused over-decoding (%FF) + // because QUrlQuery internally stores the DecodeReserved variant and we blindly FullDecode leading to the + // verbatim percent value getting decoded at the same time we can't DecodeReserved because that would + // still decode verbatim reserved sequences form the input password (e.g. the password containing %3C aka <). + // https://bugs.kde.org/show_bug.cgi?id=435442 + if (httpBlob.startsWith("GET /hi?informal=yes%2Bcertainly&password=%253C___m%26T9zSZ%3E0%2Cq%25FFDN")) { QFile file(QFINDTESTDATA("data/hi.http")); file.open(QFile::ReadOnly | QFile::Text); socket->write(file.readAll()); @@ -86,8 +92,9 @@ QUrl root("http://localhost"); root.setPort(t.serverPort()); HTTPConnection c(root); - QUrlQuery query; + Query query; query.addQueryItem("informal", "yes+certainly"); + query.addQueryItem("password", "%3C___m&T9zSZ>0,q%FFDN"); auto job = c.get("/hi", query); job->exec(); QCOMPARE(job->data(), "Hello!\n"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/producttest.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/producttest.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/autotests/producttest.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/autotests/producttest.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -23,7 +23,7 @@ Q_UNREACHABLE(); } - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *get(const QString &path, const Query &query = Query()) const override { Q_UNUSED(path); Q_UNUSED(query); @@ -34,14 +34,14 @@ return nullptr; } - virtual APIJob *post(const QString &path, const QByteArray &, const QUrlQuery &query = QUrlQuery()) const override + virtual APIJob *post(const QString &path, const QByteArray &, const Query &query = Query()) const override { qDebug() << path << query.toString(); Q_UNREACHABLE(); return nullptr; } - virtual APIJob *put(const QString &, const QByteArray &, const QUrlQuery & = QUrlQuery()) const override + virtual APIJob *put(const QString &, const QByteArray &, const Query & = Query()) const override { Q_UNREACHABLE(); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/bugzilla.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/bugzilla.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/bugzilla.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/bugzilla.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -31,7 +31,7 @@ APIJob *login(const QString &username, const QString &password, const Connection &connection) { - QUrlQuery query; + Query query; query.addQueryItem(QStringLiteral("login"), username); query.addQueryItem(QStringLiteral("password"), password); query.addQueryItem(QStringLiteral("restrict_login"), QStringLiteral("true")); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -8,9 +8,9 @@ namespace Bugzilla { -QUrlQuery BugSearch::toQuery() const +Query BugSearch::toQuery() const { - QUrlQuery query; + Query query; QSet<QString> seen; for (const QString &product : products) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.h new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.h --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.h 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/bugsearch.h 2021-05-04 13:50:10.000000000 +0200 @@ -24,7 +24,7 @@ BUGZILLA_MEMBER_PROPERTY(QStringList, order); public: - virtual QUrlQuery toQuery() const override; + virtual Query toQuery() const override; }; } // namespace Bugzilla diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -10,13 +10,13 @@ namespace Bugzilla { -QUrlQuery QueryCommand::toQuery() const +Query QueryCommand::toQuery() const { - QUrlQuery query; + Query query; return expandQuery(query, QSet<QString>()); } -QUrlQuery QueryCommand::expandQuery(QUrlQuery &query, const QSet<QString> &seen) const +Query QueryCommand::expandQuery(Query &query, const QSet<QString> &seen) const { const auto propertyCount = metaObject()->propertyCount(); for (int i = 0; i < propertyCount; ++i) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.h new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.h --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.h 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/clients/commands/querycommand.h 2021-05-04 13:50:10.000000000 +0200 @@ -10,9 +10,9 @@ #include <QObject> #include <QSet> #include <QString> -#include <QUrlQuery> #include "commandbase.h" +#include "query.h" namespace Bugzilla { @@ -21,8 +21,8 @@ public: using QObject::QObject; - virtual QUrlQuery toQuery() const; - QUrlQuery expandQuery(QUrlQuery &query, const QSet<QString> &seen) const; + virtual Query toQuery() const; + Query expandQuery(Query &query, const QSet<QString> &seen) const; }; } // namespace Bugzilla diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/connection.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/connection.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/connection.cpp 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/connection.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -1,5 +1,5 @@ /* - SPDX-FileCopyrightText: 2019 Harald Sitter <sit...@kde.org> + SPDX-FileCopyrightText: 2019-2021 Harald Sitter <sit...@kde.org> SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL */ @@ -7,6 +7,7 @@ #include "connection.h" #include <KIOCore/KIO/TransferJob> +#include <QUrlQuery> #include "bugzilla_debug.h" @@ -54,21 +55,21 @@ m_token = authToken; } -APIJob *HTTPConnection::get(const QString &path, const QUrlQuery &query) const +APIJob *HTTPConnection::get(const QString &path, const Query &query) const { qCDebug(BUGZILLA_LOG) << path << query.toString(); auto job = new TransferAPIJob(KIO::get(url(path, query), KIO::Reload, KIO::HideProgressInfo)); return job; } -APIJob *HTTPConnection::post(const QString &path, const QByteArray &data, const QUrlQuery &query) const +APIJob *HTTPConnection::post(const QString &path, const QByteArray &data, const Query &query) const { qCDebug(BUGZILLA_LOG) << path << query.toString(); auto job = new TransferAPIJob(KIO::http_post(url(path, query), data, KIO::HideProgressInfo)); return job; } -APIJob *HTTPConnection::put(const QString &path, const QByteArray &data, const QUrlQuery &query) const +APIJob *HTTPConnection::put(const QString &path, const QByteArray &data, const Query &query) const { qCDebug(BUGZILLA_LOG) << path << query.toString(); auto job = new TransferAPIJob(KIO::put(url(path, query), KIO::HideProgressInfo)); @@ -81,7 +82,7 @@ return m_root; } -QUrl HTTPConnection::url(const QString &appendix, QUrlQuery query) const +QUrl HTTPConnection::url(const QString &appendix, Query query) const { QUrl url(m_root); url.setPath(m_root.path() + appendix); @@ -91,13 +92,12 @@ } // https://bugs.kde.org/show_bug.cgi?id=413920 - // Force encoding. QUrlQuery by default wouldn't encode '+' and bugzilla doesn't like that... + // Force encoding. Query by default wouldn't encode '+' and bugzilla doesn't like that... // For any query argument. Tested with username, password, and products (for bug search) // on bugzilla 5.0.6. As a result let's force full encoding on every argument. - QUrlQuery escapedQuery(query); // copy delimiter properties and the like - escapedQuery.clear(); // but then throw away the values - for (const auto &pair : query.queryItems(QUrl::FullyDecoded)) { - escapedQuery.addQueryItem(pair.first, QString::fromUtf8(QUrl::toPercentEncoding(pair.second))); + QUrlQuery escapedQuery; + for (auto it = query.cbegin(); it != query.cend(); ++it) { + escapedQuery.addQueryItem(it.key(), QString::fromUtf8(it.value().toUtf8().toPercentEncoding())); } url.setQuery(escapedQuery); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/connection.h new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/connection.h --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/connection.h 2021-04-06 14:17:02.000000000 +0200 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/connection.h 2021-05-04 13:50:10.000000000 +0200 @@ -9,10 +9,10 @@ #include <QObject> #include <QUrl> -#include <QUrlQuery> #include "apijob.h" #include "exceptions.h" +#include "query.h" namespace Bugzilla { @@ -30,9 +30,9 @@ virtual void setToken(const QString &authToken) = 0; - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const = 0; - virtual APIJob *post(const QString &path, const QByteArray &data, const QUrlQuery &query = QUrlQuery()) const = 0; - virtual APIJob *put(const QString &path, const QByteArray &data, const QUrlQuery &query = QUrlQuery()) const = 0; + virtual APIJob *get(const QString &path, const Query &query = Query()) const = 0; + virtual APIJob *post(const QString &path, const QByteArray &data, const Query &query = Query()) const = 0; + virtual APIJob *put(const QString &path, const QByteArray &data, const Query &query = Query()) const = 0; }; /** @@ -41,20 +41,22 @@ class HTTPConnection : public Connection { Q_OBJECT + friend class ConnectionTest; + public: explicit HTTPConnection(const QUrl &root = QUrl(QStringLiteral("http://bugstest.kde.org/rest")), QObject *parent = nullptr); ~HTTPConnection(); virtual void setToken(const QString &authToken) override; - virtual APIJob *get(const QString &path, const QUrlQuery &query = QUrlQuery()) const override; - virtual APIJob *post(const QString &path, const QByteArray &data, const QUrlQuery &query = QUrlQuery()) const override; - virtual APIJob *put(const QString &path, const QByteArray &data, const QUrlQuery &query = QUrlQuery()) const override; + virtual APIJob *get(const QString &path, const Query &query = Query()) const override; + virtual APIJob *post(const QString &path, const QByteArray &data, const Query &query = Query()) const override; + virtual APIJob *put(const QString &path, const QByteArray &data, const Query &query = Query()) const override; QUrl root() const; private: - QUrl url(const QString &appendix, QUrlQuery query) const; + QUrl url(const QString &appendix, Query query) const; QUrl m_root; QString m_token; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/query.cpp new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/query.cpp --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/query.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/query.cpp 2021-05-04 13:50:10.000000000 +0200 @@ -0,0 +1,34 @@ +/* + SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + SPDX-FileCopyrightText: 2021 Harald Sitter <sit...@kde.org> +*/ + +#include "query.h" + +namespace Bugzilla +{ +bool Query::hasQueryItem(const QString &key) +{ + return contains(key); +} + +void Query::addQueryItem(const QString &key, const QString &value) +{ + insert(key, value); +} + +// Don't use this to do anything other than streaming to qDebug. +// The output is not encoded and thus not necessarily a valid URL query. +QString Query::toString() const +{ + QString output; + for (auto it = cbegin(); it != cend(); ++it) { + if (!output.isEmpty()) { + output += QStringLiteral("&"); + } + output += it.key() + QStringLiteral("=") + it.value(); + } + return output; +} + +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/query.h new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/query.h --- old/drkonqi-5.21.4/src/bugzillaintegration/libbugzilla/query.h 1970-01-01 01:00:00.000000000 +0100 +++ new/drkonqi-5.21.5/src/bugzillaintegration/libbugzilla/query.h 2021-05-04 13:50:10.000000000 +0200 @@ -0,0 +1,38 @@ +/* + SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL + SPDX-FileCopyrightText: 2021 Harald Sitter <sit...@kde.org> +*/ + +#pragma once + +#include <QMap> +#include <QString> + +namespace Bugzilla +{ +// Query container. Do not use QUrlQuery. Since bugzilla wants more encoding +// than QUrlQuery would provide by default we always store the input values +// in this Query container. Only once we are actually ready to construct +// the final request is this container converted to a QUrlQuery. +// +// NB: This class intentionally has no QUrlQuery converter function because +// any behavior we need must be implemented in this container, not run +// through QUrlQuery to prevent encoding confusion. +// +// QMap is used as base because order makes test assertions easier to check. +class Query : public QMap<QString, QString> +{ +public: + using QMap<QString, QString>::QMap; + + // Compat rigging so this feels like QUrlQuery and reduces porting + // noise for bugfix backport. + bool hasQueryItem(const QString &key); + void addQueryItem(const QString &key, const QString &value); + + // Don't use this to do anything other than streaming to qDebug. + // The output is not encoded and thus not necessarily a valid URL query. + QString toString() const; +}; + +}