Blob Blame History Raw
diff -up kleopatra-19.12.2/src/kleopatraapplication.cpp.me kleopatra-19.12.2/src/kleopatraapplication.cpp
--- kleopatra-19.12.2/src/kleopatraapplication.cpp.me	2020-10-12 11:33:05.987075995 +0200
+++ kleopatra-19.12.2/src/kleopatraapplication.cpp	2020-10-12 11:37:47.047704984 +0200
@@ -267,13 +267,18 @@ QString KleopatraApplication::newInstanc
 
     QStringList files;
     const QDir cwd = QDir(workingDirectory);
-    Q_FOREACH (const QString &file, parser.positionalArguments()) {
-        // We do not check that file exists here. Better handle
-        // these errors in the UI.
-        if (QFileInfo(file).isAbsolute()) {
-            files << file;
-        } else {
-            files << cwd.absoluteFilePath(file);
+    bool queryMode = parser.isSet(QStringLiteral("query")) || parser.isSet(QStringLiteral("search"));
+
+    // Query and Search treat positional arguments differently, see below.
+    if (!queryMode) {
+        Q_FOREACH (const QString &file, parser.positionalArguments()) {
+            // We do not check that file exists here. Better handle
+            // these errors in the UI.
+            if (QFileInfo(file).isAbsolute()) {
+                files << file;
+            } else {
+                files << cwd.absoluteFilePath(file);
+            }
         }
     }
 
@@ -307,10 +312,8 @@ QString KleopatraApplication::newInstanc
 
     // Handle openpgp4fpr URI scheme
     QString needle;
-    if (parser.isSet(QStringLiteral("search"))) {
-        needle = parser.value(QStringLiteral("search"));
-    } else if (parser.isSet(QStringLiteral("query"))) {
-        needle = parser.value(QStringLiteral("query"));
+    if (queryMode) {
+        needle = parser.positionalArguments().join(QLatin1Char(' '));
     }
     if (needle.startsWith(QLatin1String("openpgp4fpr:"))) {
         needle.remove(0, 12);
diff -up kleopatra-19.12.2/src/kleopatra_options.h.me kleopatra-19.12.2/src/kleopatra_options.h
--- kleopatra-19.12.2/src/kleopatra_options.h.me	2020-10-12 11:28:44.805768637 +0200
+++ kleopatra-19.12.2/src/kleopatra_options.h	2020-10-12 11:40:35.288476417 +0200
@@ -79,8 +79,7 @@ static void kleopatra_options(QCommandLi
                                   << QStringLiteral("D"),
                                   i18n("Decrypt and/or verify file(s)"))
             << QCommandLineOption(QStringList() << QStringLiteral("search"),
-                                  i18n("Search for a certificate on a keyserver"),
-                                  QStringLiteral("search string"))
+                                  i18n("Search for a certificate on a keyserver"))
             << QCommandLineOption(QStringList() << QStringLiteral("checksum"),
                                   i18n("Create or check a checksum file"))
             << QCommandLineOption(QStringList() << QStringLiteral("query")
@@ -88,8 +87,7 @@ static void kleopatra_options(QCommandLi
                                   i18nc("If a certificate is already known it shows the certificate details dialog."
                                         "Otherwise it brings up the certificate search dialog.",
                                         "Show details of a local certificate or search for it on a keyserver"
-                                        " by fingerprint"),
-                                  QStringLiteral("fingerprint"))
+                                        " by fingerprint"))
             << QCommandLineOption(QStringList() << QStringLiteral("gen-key"),
                                   i18n("Create a new key pair or certificate signing request"))
             << QCommandLineOption(QStringLiteral("parent-windowid"),
@@ -99,11 +97,22 @@ static void kleopatra_options(QCommandLi
                                   i18n("Open the config dialog"));
 
     parser->addOptions(options);
+    /* Security note: To avoid code execution by shared library injection
+     * through e.g. -platformpluginpath any external input should be seperated
+     * by a double dash -- this is why query / search uses positional arguments.
+     *
+     * For example on Windows there is an URLhandler for openpgp4fpr:
+     * be opened with Kleopatra's query function. And while a browser should
+     * urlescape such a query there might be tricks to inject a quote character
+     * and as such inject command line options for Kleopatra in an URL. */
     parser->addVersionOption();
     parser->addHelpOption();
 
     parser->addPositionalArgument(QStringLiteral("files"),
                                   i18n("File(s) to process"),
-                                  QStringLiteral("[files..]"));
+                                  QStringLiteral("-- [files..]"));
+     parser->addPositionalArgument(QStringLiteral("query"),
+                                  i18n("String or Fingerprint for query and search"),
+                                  QStringLiteral("-- [query..]"));
 }
 #endif