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;
+};
+
+}

Reply via email to