gpg: Extend --key-origin to take an optional URL arg.
authorWerner Koch <wk@gnupg.org>
Mon, 24 Jul 2017 19:07:03 +0000 (21:07 +0200)
committerWerner Koch <wk@gnupg.org>
Mon, 24 Jul 2017 19:10:58 +0000 (21:10 +0200)
* g10/getkey.c (parse_key_origin): Parse appended URL.
* g10/options.h (struct opt): Add field 'key_origin_url'.
* g10/gpg.c (main) <aImport>: Pass that option to import_keys.
* g10/import.c (apply_meta_data): Extend for file and url.
* g10/keyserver.c (keyserver_fetch): Pass the url to
import_keys_es_stream.
--

Example:

  gpg --key-origin url,myscheme://bla --import FILE

Signed-off-by: Werner Koch <wk@gnupg.org>
doc/gpg.texi
g10/getkey.c
g10/gpg.c
g10/import.c
g10/keyserver.c
g10/options.h

index 9147bdf..dddb930 100644 (file)
@@ -2260,12 +2260,14 @@ hint to optimize its buffer allocation strategy.  It is also used by
 the @option{--status-fd} line ``PROGRESS'' to provide a value for
 ``total'' if that is not available by other means.
 
-@item --key-origin @var{string}
+@item --key-origin @var{string}[,@var{url}]
 @opindex key-origin
 gpg can track the origin of a key. Certain origins are implicitly
 known (e.g. keyserver, web key directory) and set.  For a standard
-import the origin of the keys imported can be set with this optionb.
-To list the possible values use "help" for @var{string}.
+import the origin of the keys imported can be set with this option.
+To list the possible values use "help" for @var{string}.  Some origins
+can store an optional @var{url} argument.  That URL can appended to
+@var{string} after a comma.
 
 @item --import-options @code{parameters}
 @opindex import-options
index 74eed13..390e2dc 100644 (file)
@@ -4325,6 +4325,11 @@ int
 parse_key_origin (char *string)
 {
   int i;
+  char *comma;
+
+  comma = strchr (string, ',');
+  if (comma)
+    *comma = 0;
 
   if (!ascii_strcasecmp (string, "help"))
     {
@@ -4338,9 +4343,19 @@ parse_key_origin (char *string)
     if (!ascii_strcasecmp (string, key_origin_list[i].name))
       {
         opt.key_origin = key_origin_list[i].origin;
+        xfree (opt.key_origin_url);
+        opt.key_origin_url = NULL;
+        if (comma && comma[1])
+          {
+            opt.key_origin_url = xstrdup (comma+1);
+            trim_spaces (opt.key_origin_url);
+          }
+
         return 1;
       }
 
+  if (comma)
+    *comma = ',';
   return 0;
 }
 
index 7495e17..52b6089 100644 (file)
--- a/g10/gpg.c
+++ b/g10/gpg.c
@@ -4515,7 +4515,7 @@ main (int argc, char **argv)
         opt.import_options |= IMPORT_FAST; /* fall through */
       case aImport:
        import_keys (ctrl, argc? argv:NULL, argc, NULL,
-                     opt.import_options, opt.key_origin, NULL);
+                     opt.import_options, opt.key_origin, opt.key_origin_url);
        break;
 
        /* TODO: There are a number of command that use this same
index d22c8f4..f18ef48 100644 (file)
@@ -1425,6 +1425,22 @@ apply_meta_data (kbnode_t keyblock, int origin, const char *url)
               if (!pk->updateurl)
                 return gpg_error_from_syserror ();
             }
+          else if (origin == KEYORG_FILE)
+            {
+              pk->keyorg = origin;
+              pk->keyupdate = curtime;
+            }
+          else if (origin == KEYORG_URL)
+            {
+              pk->keyorg = origin;
+              pk->keyupdate = curtime;
+              if (url)
+                {
+                  pk->updateurl = xtrystrdup (url);
+                  if (!pk->updateurl)
+                    return gpg_error_from_syserror ();
+                }
+            }
         }
       else if (node->pkt->pkttype == PKT_USER_ID)
         {
@@ -1458,6 +1474,16 @@ apply_meta_data (kbnode_t keyblock, int origin, const char *url)
               uid->keyorg = origin;
               uid->keyupdate = curtime;
             }
+          else if (origin == KEYORG_FILE)
+            {
+              uid->keyorg = origin;
+              uid->keyupdate = curtime;
+            }
+          else if (origin == KEYORG_URL)
+            {
+              uid->keyorg = origin;
+              uid->keyupdate = curtime;
+            }
         }
     }
 
index 4d2a2c8..a8c222d 100644 (file)
@@ -1884,7 +1884,7 @@ keyserver_fetch (ctrl_t ctrl, strlist_t urilist, int origin)
           stats_handle = import_new_stats_handle();
           import_keys_es_stream (ctrl, datastream, stats_handle, NULL, NULL,
                                  opt.keyserver_options.import_options,
-                                 NULL, NULL, origin, NULL);
+                                 NULL, NULL, origin, sl->d);
 
           import_print_stats (stats_handle);
           import_release_stats_handle (stats_handle);
index 21249e9..83f4028 100644 (file)
@@ -266,6 +266,7 @@ struct
 
   /* The value of --key-origin.  See parse_key_origin().  */
   int key_origin;
+  char *key_origin_url;
 
   int passphrase_repeat;
   int pinentry_mode;