Add patch for SKS >= 1.1.5 support in gpgme
authorAndre Heinecke <aheinecke@intevation.de>
Tue, 12 Aug 2014 17:12:38 +0000 (17:12 +0000)
committerAndre Heinecke <aheinecke@intevation.de>
Tue, 12 Aug 2014 17:13:52 +0000 (17:13 +0000)
    * gpgme-1.4.4/
    0001-Handle-modern-keyserver-output-which-may-emit-the-fi.patch: New

patches/gpgme-1.4.4/0001-Handle-modern-keyserver-output-which-may-emit-the-fi.patch [new file with mode: 0755]

diff --git a/patches/gpgme-1.4.4/0001-Handle-modern-keyserver-output-which-may-emit-the-fi.patch b/patches/gpgme-1.4.4/0001-Handle-modern-keyserver-output-which-may-emit-the-fi.patch
new file mode 100755 (executable)
index 0000000..ff5beb7
--- /dev/null
@@ -0,0 +1,101 @@
+#! /bin/sh
+patch -p1 -f -l $* < $0
+exit $?
+
+From 7a0e7f93f727e82d9404655b96abb0a8558cb2e5 Mon Sep 17 00:00:00 2001
+From: Werner Koch <wk@gnupg.org>
+Date: Tue, 12 Aug 2014 10:36:30 +0200
+Subject: [PATCH] Handle modern keyserver output which may emit the
+ fingerprint.
+
+* src/engine-gpg.c (read_colon_line): Split preprocessed lines.
+(gpg_keylist_preprocess): Limit keyid field and print fingerprint.
+---
+ src/engine-gpg.c | 53 ++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 44 insertions(+), 9 deletions(-)
+
+diff --git a/src/engine-gpg.c b/src/engine-gpg.c
+index 36f035a..924ba44 100644
+--- a/src/engine-gpg.c
++++ b/src/engine-gpg.c
+@@ -1237,10 +1237,26 @@ read_colon_line (engine_gpg_t gpg)
+                   }
+
+                 assert (gpg->colon.fnc);
+-                gpg->colon.fnc (gpg->colon.fnc_value, line ? line : buffer);
+-                if (line)
+-                  free (line);
+-              }
++                  if (line)
++                    {
++                      char *linep = line;
++                      char *endp;
++
++                      do
++                        {
++                          endp = strchr (linep, '\n');
++                          if (endp)
++                            *endp++ = 0;
++                          gpg->colon.fnc (gpg->colon.fnc_value, linep);
++                          linep = endp;
++                        }
++                      while (linep && *linep);
++
++                      free (line);
++                    }
++                  else
++                    gpg->colon.fnc (gpg->colon.fnc_value, buffer);
++                }
+
+             /* To reuse the buffer for the next line we have to
+                shift the remaining data to the buffer start and
+@@ -2059,6 +2075,7 @@ gpg_keylist_preprocess (char *line, char **r_line)
+ #define NR_FIELDS 16
+   char *field[NR_FIELDS];
+   int fields = 0;
++  size_t n;
+
+   *r_line = NULL;
+
+@@ -2094,16 +2111,34 @@ gpg_keylist_preprocess (char *line, char **r_line)
+        pub:<keyid>:<algo>:<keylen>:<creationdate>:<expirationdate>:<flags>
+
+        as defined in 5.2. Machine Readable Indexes of the OpenPGP
+-       HTTP Keyserver Protocol (draft).
++       HTTP Keyserver Protocol (draft).  Modern versions of the SKS
++       keyserver return the fingerprint instead of the keyid.  We
++       detect this here and use the v4 fingerprint format to convert
++       it to a key id.
+
+        We want:
+        pub:o<flags>:<keylen>:<algo>:<keyid>:<creatdate>:<expdate>::::::::
+       */
+
+-      if (asprintf (r_line, "pub:o%s:%s:%s:%s:%s:%s::::::::",
+-                  field[6], field[3], field[2], field[1],
+-                  field[4], field[5]) < 0)
+-      return gpg_error_from_syserror ();
++      n = strlen (field[1]);
++      if (n > 16)
++        {
++          if (asprintf (r_line,
++                        "pub:o%s:%s:%s:%s:%s:%s::::::::\n"
++                        "fpr:::::::::%s:",
++                        field[6], field[3], field[2], field[1] + n - 16,
++                        field[4], field[5], field[1]) < 0)
++            return gpg_error_from_syserror ();
++        }
++      else
++        {
++          if (asprintf (r_line,
++                        "pub:o%s:%s:%s:%s:%s:%s::::::::",
++                        field[6], field[3], field[2], field[1],
++                        field[4], field[5]) < 0)
++            return gpg_error_from_syserror ();
++        }
++
+       return 0;
+
+     case RT_UID:
+--
+1.9.1