1 /* keyserver.c - generic keyserver code
2 * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006,
3 * 2007, 2008 Free Software Foundation, Inc.
5 * This file is part of GnuPG.
7 * GnuPG is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
12 * GnuPG is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, see <http://www.gnu.org/licenses/>.
41 #include "keyserver-internal.h"
46 #ifdef HAVE_W32_SYSTEM
47 /* It seems Vista doesn't grok X_OK and so fails access() tests.
48 Previous versions interpreted X_OK as F_OK anyway, so we'll just
52 #endif /* HAVE_W32_SYSTEM */
56 KEYDB_SEARCH_DESC desc
;
57 u32 createtime
,expiretime
;
64 enum ks_action
{KS_UNKNOWN
=0,KS_GET
,KS_GETNAME
,KS_SEND
,KS_SEARCH
};
66 static struct parse_options keyserver_opts
[]=
68 /* some of these options are not real - just for the help
70 {"max-cert-size",0,NULL
,NULL
},
71 {"include-revoked",0,NULL
,N_("include revoked keys in search results")},
72 {"include-subkeys",0,NULL
,N_("include subkeys when searching by key ID")},
73 {"use-temp-files",0,NULL
,
74 N_("use temporary files to pass data to keyserver helpers")},
75 {"keep-temp-files",KEYSERVER_KEEP_TEMP_FILES
,NULL
,
76 N_("do not delete temporary files after using them")},
77 {"refresh-add-fake-v3-keyids",KEYSERVER_ADD_FAKE_V3
,NULL
,
79 {"auto-key-retrieve",KEYSERVER_AUTO_KEY_RETRIEVE
,NULL
,
80 N_("automatically retrieve keys when verifying signatures")},
81 {"honor-keyserver-url",KEYSERVER_HONOR_KEYSERVER_URL
,NULL
,
82 N_("honor the preferred keyserver URL set on the key")},
83 {"honor-pka-record",KEYSERVER_HONOR_PKA_RECORD
,NULL
,
84 N_("honor the PKA record set on a key when retrieving keys")},
88 static int keyserver_work(enum ks_action action
,strlist_t list
,
89 KEYDB_SEARCH_DESC
*desc
,int count
,
90 unsigned char **fpr
,size_t *fpr_len
,
91 struct keyserver_spec
*keyserver
);
93 /* Reasonable guess */
94 #define DEFAULT_MAX_CERT_SIZE 16384
96 static size_t max_cert_size
=DEFAULT_MAX_CERT_SIZE
;
99 add_canonical_option(char *option
,strlist_t
*list
)
101 char *arg
=argsplit(option
);
107 joined
=xmalloc(strlen(option
)+1+strlen(arg
)+1);
108 /* Make a canonical name=value form with no spaces */
109 strcpy(joined
,option
);
112 append_to_strlist(list
,joined
);
116 append_to_strlist(list
,option
);
120 parse_keyserver_options(char *options
)
126 keyserver_opts
[0].value
=&max_cert
;
128 while((tok
=optsep(&options
)))
133 /* For backwards compatibility. 1.2.x used honor-http-proxy and
134 there are a good number of documents published that recommend
136 if(ascii_strcasecmp(tok
,"honor-http-proxy")==0)
138 else if(ascii_strcasecmp(tok
,"no-honor-http-proxy")==0)
141 /* We accept quite a few possible options here - some options to
142 handle specially, the keyserver_options list, and import and
143 export options that pertain to keyserver operations. Note
144 that you must use strncasecmp here as there might be an
145 =argument attached which will foil the use of strcasecmp. */
147 #ifdef EXEC_TEMPFILE_ONLY
148 if(ascii_strncasecmp(tok
,"use-temp-files",14)==0 ||
149 ascii_strncasecmp(tok
,"no-use-temp-files",17)==0)
150 log_info(_("WARNING: keyserver option `%s' is not used"
151 " on this platform\n"),tok
);
153 if(ascii_strncasecmp(tok
,"use-temp-files",14)==0)
154 opt
.keyserver_options
.options
|=KEYSERVER_USE_TEMP_FILES
;
155 else if(ascii_strncasecmp(tok
,"no-use-temp-files",17)==0)
156 opt
.keyserver_options
.options
&=~KEYSERVER_USE_TEMP_FILES
;
158 else if(!parse_options(tok
,&opt
.keyserver_options
.options
,
160 && !parse_import_options(tok
,
161 &opt
.keyserver_options
.import_options
,0)
162 && !parse_export_options(tok
,
163 &opt
.keyserver_options
.export_options
,0))
165 /* All of the standard options have failed, so the option is
166 destined for a keyserver plugin. */
167 add_canonical_option(tok
,&opt
.keyserver_options
.other
);
173 max_cert_size
=strtoul(max_cert
,(char **)NULL
,10);
176 max_cert_size
=DEFAULT_MAX_CERT_SIZE
;
183 free_keyserver_spec(struct keyserver_spec
*keyserver
)
185 xfree(keyserver
->uri
);
186 xfree(keyserver
->scheme
);
187 xfree(keyserver
->auth
);
188 xfree(keyserver
->host
);
189 xfree(keyserver
->port
);
190 xfree(keyserver
->path
);
191 xfree(keyserver
->opaque
);
192 free_strlist(keyserver
->options
);
196 /* Return 0 for match */
198 cmp_keyserver_spec(struct keyserver_spec
*one
,struct keyserver_spec
*two
)
200 if(ascii_strcasecmp(one
->scheme
,two
->scheme
)==0)
202 if(one
->host
&& two
->host
&& ascii_strcasecmp(one
->host
,two
->host
)==0)
204 if((one
->port
&& two
->port
205 && ascii_strcasecmp(one
->port
,two
->port
)==0)
206 || (!one
->port
&& !two
->port
))
209 else if(one
->opaque
&& two
->opaque
210 && ascii_strcasecmp(one
->opaque
,two
->opaque
)==0)
217 /* Try and match one of our keyservers. If we can, return that. If
218 we can't, return our input. */
219 struct keyserver_spec
*
220 keyserver_match(struct keyserver_spec
*spec
)
222 struct keyserver_spec
*ks
;
224 for(ks
=opt
.keyserver
;ks
;ks
=ks
->next
)
225 if(cmp_keyserver_spec(spec
,ks
)==0)
231 /* TODO: once we cut over to an all-curl world, we don't need this
232 parser any longer so it can be removed, or at least moved to
233 keyserver/ksutil.c for limited use in gpgkeys_ldap or the like. */
235 struct keyserver_spec
*
236 parse_keyserver_uri(const char *string
,int require_scheme
,
237 const char *configname
,unsigned int configlineno
)
240 struct keyserver_spec
*keyserver
;
245 assert(string
!=NULL
);
247 keyserver
=xmalloc_clear(sizeof(struct keyserver_spec
));
251 options
=strchr(uri
,' ');
259 while((tok
=optsep(&options
)))
260 add_canonical_option(tok
,&keyserver
->options
);
265 for(idx
=uri
,count
=0;*idx
&& *idx
!=':';idx
++)
269 /* Do we see the start of an RFC-2732 ipv6 address here? If so,
270 there clearly isn't a scheme so get out early. */
273 /* Was the '[' the first thing in the string? If not, we
274 have a mangled scheme with a [ in it so fail. */
285 if(*idx
=='\0' || *idx
=='[')
290 /* Assume HKP if there is no scheme */
292 keyserver
->scheme
=xstrdup("hkp");
294 keyserver
->uri
=xmalloc(strlen(keyserver
->scheme
)+3+strlen(uri
)+1);
295 strcpy(keyserver
->uri
,keyserver
->scheme
);
296 strcat(keyserver
->uri
,"://");
297 strcat(keyserver
->uri
,uri
);
303 keyserver
->uri
=xstrdup(uri
);
305 keyserver
->scheme
=xmalloc(count
+1);
307 /* Force to lowercase */
309 keyserver
->scheme
[i
]=ascii_tolower(uri
[i
]);
311 keyserver
->scheme
[i
]='\0';
313 /* Skip past the scheme and colon */
317 if(ascii_strcasecmp(keyserver
->scheme
,"x-broken-hkp")==0)
319 deprecated_warning(configname
,configlineno
,"x-broken-hkp",
320 "--keyserver-options ","broken-http-proxy");
321 xfree(keyserver
->scheme
);
322 keyserver
->scheme
=xstrdup("hkp");
323 append_to_strlist(&opt
.keyserver_options
.other
,"broken-http-proxy");
325 else if(ascii_strcasecmp(keyserver
->scheme
,"x-hkp")==0)
327 /* Canonicalize this to "hkp" so it works with both the internal
328 and external keyserver interface. */
329 xfree(keyserver
->scheme
);
330 keyserver
->scheme
=xstrdup("hkp");
333 if (uri
[0]=='/' && uri
[1]=='/' && uri
[2] == '/')
335 /* Three slashes means network path with a default host name.
336 This is a hack because it does not crok all possible
337 combiantions. We should better repalce all code bythe parser
339 keyserver
->path
= xstrdup (uri
+2);
341 else if(assume_hkp
|| (uri
[0]=='/' && uri
[1]=='/'))
343 /* Two slashes means network path. */
345 /* Skip over the "//", if any */
349 /* Do we have userinfo auth data present? */
350 for(idx
=uri
,count
=0;*idx
&& *idx
!='@' && *idx
!='/';idx
++)
353 /* We found a @ before the slash, so that means everything
354 before the @ is auth data. */
360 keyserver
->auth
=xmalloc(count
+1);
361 strncpy(keyserver
->auth
,uri
,count
);
362 keyserver
->auth
[count
]='\0';
366 /* Is it an RFC-2732 ipv6 [literal address] ? */
369 for(idx
=uri
+1,count
=1;*idx
370 && ((isascii (*idx
) && isxdigit(*idx
))
371 || *idx
==':' || *idx
=='.');idx
++)
374 /* Is the ipv6 literal address terminated? */
381 for(idx
=uri
,count
=0;*idx
&& *idx
!=':' && *idx
!='/';idx
++)
387 keyserver
->host
=xmalloc(count
+1);
388 strncpy(keyserver
->host
,uri
,count
);
389 keyserver
->host
[count
]='\0';
391 /* Skip past the host */
396 /* It would seem to be reasonable to limit the range of the
397 ports to values between 1-65535, but RFC 1738 and 1808
398 imply there is no limit. Of course, the real world has
401 for(idx
=uri
+1,count
=0;*idx
&& *idx
!='/';idx
++)
405 /* Ports are digits only */
410 keyserver
->port
=xmalloc(count
+1);
411 strncpy(keyserver
->port
,uri
+1,count
);
412 keyserver
->port
[count
]='\0';
414 /* Skip past the colon and port number */
418 /* Everything else is the path */
420 keyserver
->path
=xstrdup(uri
);
422 keyserver
->path
=xstrdup("/");
424 if(keyserver
->path
[1])
425 keyserver
->flags
.direct_uri
=1;
429 /* No slash means opaque. Just record the opaque blob and get
431 keyserver
->opaque
=xstrdup(uri
);
435 /* One slash means absolute path. We don't need to support that
443 free_keyserver_spec(keyserver
);
448 struct keyserver_spec
*
449 parse_preferred_keyserver(PKT_signature
*sig
)
451 struct keyserver_spec
*spec
=NULL
;
455 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_PREF_KS
,&plen
);
458 byte
*dupe
=xmalloc(plen
+1);
462 spec
=parse_keyserver_uri(dupe
,1,NULL
,0);
470 print_keyrec(int number
,struct keyrec
*keyrec
)
474 iobuf_writebyte(keyrec
->uidbuf
,0);
475 iobuf_flush_temp(keyrec
->uidbuf
);
476 printf("(%d)\t%s ",number
,iobuf_get_temp_buffer(keyrec
->uidbuf
));
479 printf("%d bit ",keyrec
->size
);
483 const char *str
= gcry_pk_algo_name (keyrec
->type
);
491 switch(keyrec
->desc
.mode
)
493 /* If the keyserver helper gave us a short keyid, we have no
494 choice but to use it. Do check --keyid-format to add a 0x if
496 case KEYDB_SEARCH_MODE_SHORT_KID
:
497 printf("key %s%08lX",
498 (opt
.keyid_format
==KF_0xSHORT
499 || opt
.keyid_format
==KF_0xLONG
)?"0x":"",
500 (ulong
)keyrec
->desc
.u
.kid
[1]);
503 /* However, if it gave us a long keyid, we can honor
505 case KEYDB_SEARCH_MODE_LONG_KID
:
506 printf("key %s",keystr(keyrec
->desc
.u
.kid
));
509 case KEYDB_SEARCH_MODE_FPR16
:
512 printf("%02X",keyrec
->desc
.u
.fpr
[i
]);
515 case KEYDB_SEARCH_MODE_FPR20
:
518 printf("%02X",keyrec
->desc
.u
.fpr
[i
]);
526 if(keyrec
->createtime
>0)
529 printf(_("created: %s"),strtimestamp(keyrec
->createtime
));
532 if(keyrec
->expiretime
>0)
535 printf(_("expires: %s"),strtimestamp(keyrec
->expiretime
));
539 printf(" (%s)",_("revoked"));
541 printf(" (%s)",_("disabled"));
543 printf(" (%s)",_("expired"));
548 /* Returns a keyrec (which must be freed) once a key is complete, and
549 NULL otherwise. Call with a NULL keystring once key parsing is
550 complete to return any unfinished keys. */
551 static struct keyrec
*
552 parse_keyrec(char *keystring
)
554 static struct keyrec
*work
=NULL
;
555 struct keyrec
*ret
=NULL
;
563 else if(work
->desc
.mode
==KEYDB_SEARCH_MODE_NONE
)
578 work
=xmalloc_clear(sizeof(struct keyrec
));
579 work
->uidbuf
=iobuf_temp();
582 /* Remove trailing whitespace */
583 for(i
=strlen(keystring
);i
>0;i
--)
584 if(ascii_isspace(keystring
[i
-1]))
589 if((record
=strsep(&keystring
,":"))==NULL
)
592 if(ascii_strcasecmp("pub",record
)==0)
599 work
=xmalloc_clear(sizeof(struct keyrec
));
600 work
->uidbuf
=iobuf_temp();
603 if((tok
=strsep(&keystring
,":"))==NULL
)
606 classify_user_id(tok
,&work
->desc
);
607 if(work
->desc
.mode
!=KEYDB_SEARCH_MODE_SHORT_KID
608 && work
->desc
.mode
!=KEYDB_SEARCH_MODE_LONG_KID
609 && work
->desc
.mode
!=KEYDB_SEARCH_MODE_FPR16
610 && work
->desc
.mode
!=KEYDB_SEARCH_MODE_FPR20
)
612 work
->desc
.mode
=KEYDB_SEARCH_MODE_NONE
;
616 /* Note all items after this are optional. This allows us to
617 have a pub line as simple as pub:keyid and nothing else. */
621 if((tok
=strsep(&keystring
,":"))==NULL
)
624 work
->type
=atoi(tok
);
626 if((tok
=strsep(&keystring
,":"))==NULL
)
629 work
->size
=atoi(tok
);
631 if((tok
=strsep(&keystring
,":"))==NULL
)
637 work
->createtime
=atoi(tok
);
639 if((tok
=strsep(&keystring
,":"))==NULL
)
646 work
->expiretime
=atoi(tok
);
647 /* Force the 'e' flag on if this key is expired. */
648 if(work
->expiretime
<=make_timestamp())
652 if((tok
=strsep(&keystring
,":"))==NULL
)
674 else if(ascii_strcasecmp("uid",record
)==0 && work
->desc
.mode
)
676 char *userid
,*tok
,*decoded
;
678 if((tok
=strsep(&keystring
,":"))==NULL
)
686 /* By definition, de-%-encoding is always smaller than the
687 original string so we can decode in place. */
692 if(tok
[0]=='%' && tok
[1] && tok
[2])
696 userid
[i
] = (c
=hextobyte(&tok
[1])) == -1 ? '?' : c
;
703 /* We don't care about the other info provided in the uid: line
704 since no keyserver supports marking userids with timestamps
705 or revoked/expired/disabled yet. */
707 /* No need to check for control characters, as utf8_to_native
710 decoded
=utf8_to_native(userid
,i
,0);
711 if(strlen(decoded
)>opt
.screen_columns
-10)
712 decoded
[opt
.screen_columns
-10]='\0';
713 iobuf_writestr(work
->uidbuf
,decoded
);
715 iobuf_writestr(work
->uidbuf
,"\n\t");
719 /* Ignore any records other than "pri" and "uid" for easy future
725 /* TODO: do this as a list sent to keyserver_work rather than calling
726 it once for each key to get the correct counts after the import
727 (cosmetics, really) and to better take advantage of the keyservers
728 that can do multiple fetches in one go (LDAP). */
730 show_prompt(KEYDB_SEARCH_DESC
*desc
,int numdesc
,int count
,const char *search
)
736 if(count
&& opt
.command_fd
==-1)
739 tty_printf("Keys %d-%d of %d for \"%s\". ",from
,numdesc
,count
,search
);
743 answer
=cpr_get_no_help("keysearch.prompt",
744 _("Enter number(s), N)ext, or Q)uit > "));
746 if(answer
[0]=='\x04')
752 if(answer
[0]=='q' || answer
[0]=='Q')
757 else if(atoi(answer
)>=1 && atoi(answer
)<=numdesc
)
759 char *split
=answer
,*num
;
761 while((num
=strsep(&split
," ,"))!=NULL
)
762 if(atoi(num
)>=1 && atoi(num
)<=numdesc
)
763 keyserver_work(KS_GET
,NULL
,&desc
[atoi(num
)-1],1,
764 NULL
,NULL
,opt
.keyserver
);
773 /* Count and searchstr are just for cosmetics. If the count is too
774 small, it will grow safely. If negative it disables the "Key x-y
775 of z" messages. searchstr should be UTF-8 (rather than native). */
777 keyserver_search_prompt(IOBUF buffer
,const char *searchstr
)
779 int i
=0,validcount
=0,started
=0,header
=0,count
=1;
780 unsigned int maxlen
,buflen
,numlines
=0;
781 KEYDB_SEARCH_DESC
*desc
;
786 localstr
=utf8_to_native(searchstr
,strlen(searchstr
),0);
788 desc
=xmalloc(count
*sizeof(KEYDB_SEARCH_DESC
));
792 struct keyrec
*keyrec
;
796 rl
=iobuf_read_line(buffer
,&line
,&buflen
,&maxlen
);
800 if(!header
&& ascii_strncasecmp("SEARCH ",line
,7)==0
801 && ascii_strncasecmp(" BEGIN",&line
[strlen(line
)-7],6)==0)
806 else if(ascii_strncasecmp("SEARCH ",line
,7)==0
807 && ascii_strncasecmp(" END",&line
[strlen(line
)-5],4)==0)
813 /* Look for an info: line. The only current info: values
814 defined are the version and key count. */
815 if(!started
&& rl
>0 && ascii_strncasecmp("info:",line
,5)==0)
817 char *tok
,*str
=&line
[5];
819 if((tok
=strsep(&str
,":"))!=NULL
)
823 if(sscanf(tok
,"%d",&version
)!=1)
828 log_error(_("invalid keyserver protocol "
829 "(us %d!=handler %d)\n"),1,version
);
834 if((tok
=strsep(&str
,":"))!=NULL
&& sscanf(tok
,"%d",&count
)==1)
843 desc
=xrealloc(desc
,count
*sizeof(KEYDB_SEARCH_DESC
));
852 keyrec
=parse_keyrec(NULL
);
867 if(show_prompt(desc
,i
,validcount
?count
:0,localstr
))
876 keyrec
=parse_keyrec(line
);
880 /* keyserver helper sent more keys than they claimed in the
883 desc
=xrealloc(desc
,count
*sizeof(KEYDB_SEARCH_DESC
));
889 desc
[i
]=keyrec
->desc
;
893 /* screen_lines - 1 for the prompt. */
894 if(numlines
+keyrec
->lines
>opt
.screen_lines
-1)
896 if(show_prompt(desc
,i
,validcount
?count
:0,localstr
))
902 print_keyrec(i
+1,keyrec
);
905 numlines
+=keyrec
->lines
;
906 iobuf_close(keyrec
->uidbuf
);
915 /* Leave this commented out or now, and perhaps for a very long
916 time. All HKPish servers return HTML error messages for
920 log_info(_("keyserver does not support searching\n"));
926 log_info(_("key \"%s\" not found on keyserver\n"),localstr
);
928 log_info(_("key not found on keyserver\n"));
936 /* We sometimes want to use a different gpgkeys_xxx for a given
937 protocol (for example, ldaps is handled by gpgkeys_ldap). Map
940 keyserver_typemap(const char *type
)
942 if(strcmp(type
,"ldaps")==0)
948 /* The PGP LDAP and the curl fetch-a-LDAP-object methodologies are
949 sufficiently different that we can't use curl to do LDAP. */
951 direct_uri_map(const char *scheme
,unsigned int is_direct
)
953 if(is_direct
&& strcmp(scheme
,"ldap")==0)
959 #if GNUPG_MAJOR_VERSION == 2
960 #define GPGKEYS_PREFIX "gpg2keys_"
962 #define GPGKEYS_PREFIX "gpgkeys_"
964 #define GPGKEYS_CURL GPGKEYS_PREFIX "curl" EXEEXT
965 #define GPGKEYS_PREFIX_LEN (strlen(GPGKEYS_CURL))
966 #define KEYSERVER_ARGS_KEEP " -o \"%O\" \"%I\""
967 #define KEYSERVER_ARGS_NOKEEP " -o \"%o\" \"%i\""
970 keyserver_spawn(enum ks_action action
,strlist_t list
,KEYDB_SEARCH_DESC
*desc
,
971 int count
,int *prog
,unsigned char **fpr
,size_t *fpr_len
,
972 struct keyserver_spec
*keyserver
)
974 int ret
=0,i
,gotversion
=0,outofband
=0;
976 unsigned int maxlen
,buflen
;
977 char *command
,*end
,*searchstr
=NULL
;
979 struct exec_info
*spawn
;
981 const char *libexecdir
= gnupg_libexecdir ();
985 #ifdef EXEC_TEMPFILE_ONLY
986 opt
.keyserver_options
.options
|=KEYSERVER_USE_TEMP_FILES
;
989 /* Build the filename for the helper to execute */
990 scheme
=keyserver_typemap(keyserver
->scheme
);
992 #ifdef DISABLE_KEYSERVER_PATH
993 /* Destroy any path we might have. This is a little tricky,
994 portability-wise. It's not correct to delete the PATH
995 environment variable, as that may fall back to a system built-in
996 PATH. Similarly, it is not correct to set PATH to the null
997 string (PATH="") since this actually deletes the PATH environment
998 variable under MinGW. The safest thing to do here is to force
999 PATH to be GNUPG_LIBEXECDIR. All this is not that meaningful on
1000 Unix-like systems (since we're going to give a full path to
1001 gpgkeys_foo), but on W32 it prevents loading any DLLs from
1002 directories in %PATH%.
1004 After some more thinking about this we came to the conclusion
1005 that it is better to load the helpers from the directory where
1006 the program of this process lives. Fortunately Windows provides
1007 a way to retrieve this and our gnupg_libexecdir function has been
1008 modified to return just this. Setting the exec-path is not
1010 set_exec_path(libexecdir);
1013 if(opt
.exec_path_set
)
1015 /* If exec-path was set, and DISABLE_KEYSERVER_PATH is
1016 undefined, then don't specify a full path to gpgkeys_foo, so
1017 that the PATH can work. */
1018 command
=xmalloc(GPGKEYS_PREFIX_LEN
+strlen(scheme
)+3+strlen(EXEEXT
)+1);
1024 /* Specify a full path to gpgkeys_foo. */
1025 command
=xmalloc(strlen(libexecdir
)+strlen(DIRSEP_S
)+
1026 GPGKEYS_PREFIX_LEN
+strlen(scheme
)+3+strlen(EXEEXT
)+1);
1027 strcpy(command
,libexecdir
);
1028 strcat(command
,DIRSEP_S
);
1031 end
=command
+strlen(command
);
1033 /* Build a path for the keyserver helper. If it is direct_uri
1034 (i.e. an object fetch and not a keyserver), then add "_uri" to
1035 the end to distinguish the keyserver helper from an object
1036 fetcher that can speak that protocol (this is a problem for
1039 strcat(command
,GPGKEYS_PREFIX
);
1040 strcat(command
,scheme
);
1042 /* This "_uri" thing is in case we need to call a direct handler
1043 instead of the keyserver handler. This lets us use gpgkeys_curl
1044 or gpgkeys_ldap_uri (we don't provide it, but a user might)
1045 instead of gpgkeys_ldap to fetch things like
1046 ldap://keyserver.pgp.com/o=PGP%20keys?pgpkey?sub?pgpkeyid=99242560 */
1048 if(direct_uri_map(scheme
,keyserver
->flags
.direct_uri
))
1049 strcat(command
,"_uri");
1051 strcat(command
,EXEEXT
);
1053 /* Can we execute it? If not, try curl as our catchall. */
1054 if(path_access(command
,X_OK
)!=0)
1055 strcpy(end
,GPGKEYS_CURL
);
1057 if(opt
.keyserver_options
.options
&KEYSERVER_USE_TEMP_FILES
)
1059 if(opt
.keyserver_options
.options
&KEYSERVER_KEEP_TEMP_FILES
)
1061 command
=xrealloc(command
,strlen(command
)+
1062 strlen(KEYSERVER_ARGS_KEEP
)+1);
1063 strcat(command
,KEYSERVER_ARGS_KEEP
);
1067 command
=xrealloc(command
,strlen(command
)+
1068 strlen(KEYSERVER_ARGS_NOKEEP
)+1);
1069 strcat(command
,KEYSERVER_ARGS_NOKEEP
);
1072 ret
=exec_write(&spawn
,NULL
,command
,NULL
,0,0);
1075 ret
=exec_write(&spawn
,command
,NULL
,NULL
,0,0);
1082 fprintf(spawn
->tochild
,
1083 "# This is a GnuPG %s keyserver communications file\n",VERSION
);
1084 fprintf(spawn
->tochild
,"VERSION %d\n",KEYSERVER_PROTO_VERSION
);
1085 fprintf(spawn
->tochild
,"PROGRAM %s\n",VERSION
);
1086 fprintf(spawn
->tochild
,"SCHEME %s\n",keyserver
->scheme
);
1088 if(keyserver
->opaque
)
1089 fprintf(spawn
->tochild
,"OPAQUE %s\n",keyserver
->opaque
);
1093 fprintf(spawn
->tochild
,"AUTH %s\n",keyserver
->auth
);
1096 fprintf(spawn
->tochild
,"HOST %s\n",keyserver
->host
);
1099 fprintf(spawn
->tochild
,"PORT %s\n",keyserver
->port
);
1102 fprintf(spawn
->tochild
,"PATH %s\n",keyserver
->path
);
1105 /* Write global options */
1107 for(temp
=opt
.keyserver_options
.other
;temp
;temp
=temp
->next
)
1108 fprintf(spawn
->tochild
,"OPTION %s\n",temp
->d
);
1110 /* Write per-keyserver options */
1112 for(temp
=keyserver
->options
;temp
;temp
=temp
->next
)
1113 fprintf(spawn
->tochild
,"OPTION %s\n",temp
->d
);
1119 fprintf(spawn
->tochild
,"COMMAND GET\n\n");
1121 /* Which keys do we want? */
1123 for(i
=0;i
<count
;i
++)
1127 if(desc
[i
].mode
==KEYDB_SEARCH_MODE_FPR20
)
1131 fprintf(spawn
->tochild
,"0x");
1133 for(f
=0;f
<MAX_FINGERPRINT_LEN
;f
++)
1134 fprintf(spawn
->tochild
,"%02X",desc
[i
].u
.fpr
[f
]);
1136 fprintf(spawn
->tochild
,"\n");
1138 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_FPR16
)
1142 fprintf(spawn
->tochild
,"0x");
1145 fprintf(spawn
->tochild
,"%02X",desc
[i
].u
.fpr
[f
]);
1147 fprintf(spawn
->tochild
,"\n");
1149 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_LONG_KID
)
1150 fprintf(spawn
->tochild
,"0x%08lX%08lX\n",
1151 (ulong
)desc
[i
].u
.kid
[0],
1152 (ulong
)desc
[i
].u
.kid
[1]);
1153 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_SHORT_KID
)
1154 fprintf(spawn
->tochild
,"0x%08lX\n",
1155 (ulong
)desc
[i
].u
.kid
[1]);
1156 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_EXACT
)
1158 fprintf(spawn
->tochild
,"0x0000000000000000\n");
1161 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_NONE
)
1169 log_info(_("requesting key %s from %s server %s\n"),
1170 keystr_from_desc(&desc
[i
]),
1171 keyserver
->scheme
,keyserver
->host
);
1173 log_info(_("requesting key %s from %s\n"),
1174 keystr_from_desc(&desc
[i
]),keyserver
->uri
);
1178 fprintf(spawn
->tochild
,"\n");
1187 fprintf(spawn
->tochild
,"COMMAND GETNAME\n\n");
1189 /* Which names do we want? */
1191 for(key
=list
;key
!=NULL
;key
=key
->next
)
1192 fprintf(spawn
->tochild
,"%s\n",key
->d
);
1194 fprintf(spawn
->tochild
,"\n");
1197 log_info(_("searching for names from %s server %s\n"),
1198 keyserver
->scheme
,keyserver
->host
);
1200 log_info(_("searching for names from %s\n"),keyserver
->uri
);
1209 /* Note the extra \n here to send an empty keylist block */
1210 fprintf(spawn
->tochild
,"COMMAND SEND\n\n\n");
1212 for(key
=list
;key
!=NULL
;key
=key
->next
)
1214 armor_filter_context_t
*afx
;
1215 IOBUF buffer
= iobuf_temp ();
1219 add_to_strlist(&temp
,key
->d
);
1221 afx
= new_armor_context ();
1223 /* Tell the armor filter to use Unix-style \n line
1224 endings, since we're going to fprintf this to a file
1225 that (on Win32) is open in text mode. The win32 stdio
1226 will transform the \n to \r\n and we'll end up with the
1227 proper line endings on win32. This is a no-op on
1230 push_armor_filter (afx
, buffer
);
1231 release_armor_context (afx
);
1233 /* TODO: Remove Comment: lines from keys exported this
1236 if(export_pubkeys_stream(buffer
,temp
,&block
,
1237 opt
.keyserver_options
.export_options
)==-1)
1238 iobuf_close(buffer
);
1243 iobuf_flush_temp(buffer
);
1245 merge_keys_and_selfsig(block
);
1247 fprintf(spawn
->tochild
,"INFO %08lX%08lX BEGIN\n",
1248 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[0],
1249 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[1]);
1251 for(node
=block
;node
;node
=node
->next
)
1253 switch(node
->pkt
->pkttype
)
1258 case PKT_PUBLIC_KEY
:
1259 case PKT_PUBLIC_SUBKEY
:
1261 PKT_public_key
*pk
=node
->pkt
->pkt
.public_key
;
1263 keyid_from_pk(pk
,NULL
);
1265 fprintf(spawn
->tochild
,"%sb:%08lX%08lX:%u:%u:%u:%u:",
1266 node
->pkt
->pkttype
==PKT_PUBLIC_KEY
?"pu":"su",
1267 (ulong
)pk
->keyid
[0],(ulong
)pk
->keyid
[1],
1274 fprintf(spawn
->tochild
,"r");
1276 fprintf(spawn
->tochild
,"e");
1278 fprintf(spawn
->tochild
,"\n");
1284 PKT_user_id
*uid
=node
->pkt
->pkt
.user_id
;
1287 if(uid
->attrib_data
)
1290 fprintf(spawn
->tochild
,"uid:");
1292 /* Quote ':', '%', and any 8-bit
1294 for(r
=0;r
<uid
->len
;r
++)
1296 if(uid
->name
[r
]==':' || uid
->name
[r
]=='%'
1297 || uid
->name
[r
]&0x80)
1298 fprintf(spawn
->tochild
,"%%%02X",
1299 (byte
)uid
->name
[r
]);
1301 fprintf(spawn
->tochild
,"%c",uid
->name
[r
]);
1304 fprintf(spawn
->tochild
,":%u:%u:",
1305 uid
->created
,uid
->expiredate
);
1308 fprintf(spawn
->tochild
,"r");
1310 fprintf(spawn
->tochild
,"e");
1312 fprintf(spawn
->tochild
,"\n");
1316 /* This bit is really for the benefit of
1317 people who store their keys in LDAP
1318 servers. It makes it easy to do queries
1319 for things like "all keys signed by
1323 PKT_signature
*sig
=node
->pkt
->pkt
.signature
;
1325 if(!IS_UID_SIG(sig
))
1328 fprintf(spawn
->tochild
,"sig:%08lX%08lX:%X:%u:%u\n",
1329 (ulong
)sig
->keyid
[0],(ulong
)sig
->keyid
[1],
1330 sig
->sig_class
,sig
->timestamp
,
1337 fprintf(spawn
->tochild
,"INFO %08lX%08lX END\n",
1338 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[0],
1339 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[1]);
1341 fprintf(spawn
->tochild
,"KEY %08lX%08lX BEGIN\n",
1342 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[0],
1343 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[1]);
1344 fwrite(iobuf_get_temp_buffer(buffer
),
1345 iobuf_get_temp_length(buffer
),1,spawn
->tochild
);
1346 fprintf(spawn
->tochild
,"KEY %08lX%08lX END\n",
1347 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[0],
1348 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[1]);
1350 iobuf_close(buffer
);
1353 log_info(_("sending key %s to %s server %s\n"),
1354 keystr(block
->pkt
->pkt
.public_key
->keyid
),
1355 keyserver
->scheme
,keyserver
->host
);
1357 log_info(_("sending key %s to %s\n"),
1358 keystr(block
->pkt
->pkt
.public_key
->keyid
),
1361 release_kbnode(block
);
1374 fprintf(spawn
->tochild
,"COMMAND SEARCH\n\n");
1376 /* Which keys do we want? Remember that the gpgkeys_ program
1377 is going to lump these together into a search string. */
1379 for(key
=list
;key
!=NULL
;key
=key
->next
)
1381 fprintf(spawn
->tochild
,"%s\n",key
->d
);
1384 searchstr
=xrealloc(searchstr
,
1385 strlen(searchstr
)+strlen(key
->d
)+2);
1386 strcat(searchstr
," ");
1390 searchstr
=xmalloc(strlen(key
->d
)+1);
1394 strcat(searchstr
,key
->d
);
1397 fprintf(spawn
->tochild
,"\n");
1400 log_info(_("searching for \"%s\" from %s server %s\n"),
1401 searchstr
,keyserver
->scheme
,keyserver
->host
);
1403 log_info(_("searching for \"%s\" from %s\n"),
1404 searchstr
,keyserver
->uri
);
1410 log_fatal(_("no keyserver action!\n"));
1414 /* Done sending, so start reading. */
1415 ret
=exec_read(spawn
);
1419 /* Now handle the response */
1427 if(iobuf_read_line(spawn
->fromchild
,&line
,&buflen
,&maxlen
)==0)
1429 ret
= gpg_error_from_syserror ();
1430 goto fail
; /* i.e. EOF */
1435 /* remove trailing whitespace */
1437 while(plen
>0 && ascii_isspace(ptr
[plen
-1]))
1444 if(ascii_strncasecmp(ptr
,"VERSION ",8)==0)
1448 if(atoi(&ptr
[8])!=KEYSERVER_PROTO_VERSION
)
1450 log_error(_("invalid keyserver protocol (us %d!=handler %d)\n"),
1451 KEYSERVER_PROTO_VERSION
,atoi(&ptr
[8]));
1455 else if(ascii_strncasecmp(ptr
,"PROGRAM ",8)==0)
1457 if(ascii_strncasecmp(&ptr
[8],VERSION
,strlen(VERSION
))!=0)
1458 log_info(_("WARNING: keyserver handler from a different"
1459 " version of GnuPG (%s)\n"),&ptr
[8]);
1461 else if(ascii_strncasecmp(ptr
,"OPTION OUTOFBAND",16)==0)
1462 outofband
=1; /* Currently the only OPTION */
1467 log_error(_("keyserver did not send VERSION\n"));
1479 stats_handle
=import_new_stats_handle();
1481 /* Slurp up all the key data. In the future, it might be
1482 nice to look for KEY foo OUTOFBAND and FAILED indicators.
1483 It's harmless to ignore them, but ignoring them does make
1484 gpg complain about "no valid OpenPGP data found". One
1485 way to do this could be to continue parsing this
1486 line-by-line and make a temp iobuf for each key. */
1488 import_keys_stream(spawn
->fromchild
,stats_handle
,fpr
,fpr_len
,
1489 opt
.keyserver_options
.import_options
);
1491 import_print_stats(stats_handle
);
1492 import_release_stats_handle(stats_handle
);
1497 /* Nothing to do here */
1502 keyserver_search_prompt(spawn
->fromchild
,searchstr
);
1506 log_fatal(_("no keyserver action!\n"));
1515 *prog
=exec_finish(spawn
);
1521 keyserver_work(enum ks_action action
,strlist_t list
,KEYDB_SEARCH_DESC
*desc
,
1522 int count
,unsigned char **fpr
,size_t *fpr_len
,
1523 struct keyserver_spec
*keyserver
)
1529 log_error(_("no keyserver known (use option --keyserver)\n"));
1530 return G10ERR_BAD_URI
;
1533 #ifdef DISABLE_KEYSERVER_HELPERS
1535 log_error(_("external keyserver calls are not supported in this build\n"));
1536 return G10ERR_KEYSERVER
;
1539 /* Spawn a handler */
1541 rc
=keyserver_spawn(action
,list
,desc
,count
,&ret
,fpr
,fpr_len
,keyserver
);
1546 case KEYSERVER_SCHEME_NOT_FOUND
:
1547 log_error(_("no handler for keyserver scheme `%s'\n"),
1551 case KEYSERVER_NOT_SUPPORTED
:
1552 log_error(_("action `%s' not supported with keyserver "
1554 action
==KS_GET
?"get":action
==KS_SEND
?"send":
1555 action
==KS_SEARCH
?"search":"unknown",
1559 case KEYSERVER_VERSION_ERROR
:
1560 log_error(_(GPGKEYS_PREFIX
"%s does not support"
1561 " handler version %d\n"),
1562 keyserver_typemap(keyserver
->scheme
),
1563 KEYSERVER_PROTO_VERSION
);
1566 case KEYSERVER_TIMEOUT
:
1567 log_error(_("keyserver timed out\n"));
1570 case KEYSERVER_INTERNAL_ERROR
:
1572 log_error(_("keyserver internal error\n"));
1576 return G10ERR_KEYSERVER
;
1581 log_error(_("keyserver communications error: %s\n"),g10_errstr(rc
));
1587 #endif /* ! DISABLE_KEYSERVER_HELPERS*/
1591 keyserver_export(strlist_t users
)
1594 KEYDB_SEARCH_DESC desc
;
1597 /* Weed out descriptors that we don't support sending */
1598 for(;users
;users
=users
->next
)
1600 classify_user_id (users
->d
, &desc
);
1601 if(desc
.mode
!=KEYDB_SEARCH_MODE_SHORT_KID
&&
1602 desc
.mode
!=KEYDB_SEARCH_MODE_LONG_KID
&&
1603 desc
.mode
!=KEYDB_SEARCH_MODE_FPR16
&&
1604 desc
.mode
!=KEYDB_SEARCH_MODE_FPR20
)
1606 log_error(_("\"%s\" not a key ID: skipping\n"),users
->d
);
1610 append_to_strlist(&sl
,users
->d
);
1615 rc
=keyserver_work(KS_SEND
,sl
,NULL
,0,NULL
,NULL
,opt
.keyserver
);
1623 keyserver_import(strlist_t users
)
1625 KEYDB_SEARCH_DESC
*desc
;
1626 int num
=100,count
=0;
1629 /* Build a list of key ids */
1630 desc
=xmalloc(sizeof(KEYDB_SEARCH_DESC
)*num
);
1632 for(;users
;users
=users
->next
)
1634 classify_user_id (users
->d
, &desc
[count
]);
1635 if(desc
[count
].mode
!=KEYDB_SEARCH_MODE_SHORT_KID
&&
1636 desc
[count
].mode
!=KEYDB_SEARCH_MODE_LONG_KID
&&
1637 desc
[count
].mode
!=KEYDB_SEARCH_MODE_FPR16
&&
1638 desc
[count
].mode
!=KEYDB_SEARCH_MODE_FPR20
)
1640 log_error(_("\"%s\" not a key ID: skipping\n"),users
->d
);
1648 desc
=xrealloc(desc
,sizeof(KEYDB_SEARCH_DESC
)*num
);
1653 rc
=keyserver_work(KS_GET
,NULL
,desc
,count
,NULL
,NULL
,opt
.keyserver
);
1661 keyserver_import_fprint(const byte
*fprint
,size_t fprint_len
,
1662 struct keyserver_spec
*keyserver
)
1664 KEYDB_SEARCH_DESC desc
;
1666 memset(&desc
,0,sizeof(desc
));
1669 desc
.mode
=KEYDB_SEARCH_MODE_FPR16
;
1670 else if(fprint_len
==20)
1671 desc
.mode
=KEYDB_SEARCH_MODE_FPR20
;
1675 memcpy(desc
.u
.fpr
,fprint
,fprint_len
);
1677 /* TODO: Warn here if the fingerprint we got doesn't match the one
1679 return keyserver_work(KS_GET
,NULL
,&desc
,1,NULL
,NULL
,keyserver
);
1683 keyserver_import_keyid(u32
*keyid
,struct keyserver_spec
*keyserver
)
1685 KEYDB_SEARCH_DESC desc
;
1687 memset(&desc
,0,sizeof(desc
));
1689 desc
.mode
=KEYDB_SEARCH_MODE_LONG_KID
;
1690 desc
.u
.kid
[0]=keyid
[0];
1691 desc
.u
.kid
[1]=keyid
[1];
1693 return keyserver_work(KS_GET
,NULL
,&desc
,1,NULL
,NULL
,keyserver
);
1696 /* code mostly stolen from do_export_stream */
1698 keyidlist(strlist_t users
,KEYDB_SEARCH_DESC
**klist
,int *count
,int fakev3
)
1700 int rc
=0,ndesc
,num
=100;
1701 KBNODE keyblock
=NULL
,node
;
1703 KEYDB_SEARCH_DESC
*desc
;
1708 *klist
=xmalloc(sizeof(KEYDB_SEARCH_DESC
)*num
);
1715 desc
= xmalloc_clear ( ndesc
* sizeof *desc
);
1716 desc
[0].mode
= KEYDB_SEARCH_MODE_FIRST
;
1720 for (ndesc
=0, sl
=users
; sl
; sl
= sl
->next
, ndesc
++)
1722 desc
= xmalloc ( ndesc
* sizeof *desc
);
1724 for (ndesc
=0, sl
=users
; sl
; sl
= sl
->next
)
1726 if(classify_user_id (sl
->d
, desc
+ndesc
))
1729 log_error (_("key \"%s\" not found: %s\n"),
1730 sl
->d
, g10_errstr (G10ERR_INV_USER_ID
));
1734 while (!(rc
= keydb_search (kdbhd
, desc
, ndesc
)))
1737 desc
[0].mode
= KEYDB_SEARCH_MODE_NEXT
;
1739 /* read the keyblock */
1740 rc
= keydb_get_keyblock (kdbhd
, &keyblock
);
1743 log_error (_("error reading keyblock: %s\n"), g10_errstr(rc
) );
1747 if((node
=find_kbnode(keyblock
,PKT_PUBLIC_KEY
)))
1749 /* This is to work around a bug in some keyservers (pksd and
1750 OKS) that calculate v4 RSA keyids as if they were v3 RSA.
1751 The answer is to refresh both the correct v4 keyid
1752 (e.g. 99242560) and the fake v3 keyid (e.g. 68FDDBC7).
1753 This only happens for key refresh using the HKP scheme
1754 and if the refresh-add-fake-v3-keyids keyserver option is
1756 if(fakev3
&& is_RSA(node
->pkt
->pkt
.public_key
->pubkey_algo
) &&
1757 node
->pkt
->pkt
.public_key
->version
>=4)
1759 (*klist
)[*count
].mode
=KEYDB_SEARCH_MODE_LONG_KID
;
1760 v3_keyid (node
->pkt
->pkt
.public_key
->pkey
[0],
1761 (*klist
)[*count
].u
.kid
);
1767 *klist
=xrealloc(*klist
,sizeof(KEYDB_SEARCH_DESC
)*num
);
1771 /* v4 keys get full fingerprints. v3 keys get long keyids.
1772 This is because it's easy to calculate any sort of keyid
1773 from a v4 fingerprint, but not a v3 fingerprint. */
1775 if(node
->pkt
->pkt
.public_key
->version
<4)
1777 (*klist
)[*count
].mode
=KEYDB_SEARCH_MODE_LONG_KID
;
1778 keyid_from_pk(node
->pkt
->pkt
.public_key
,
1779 (*klist
)[*count
].u
.kid
);
1785 (*klist
)[*count
].mode
=KEYDB_SEARCH_MODE_FPR20
;
1786 fingerprint_from_pk(node
->pkt
->pkt
.public_key
,
1787 (*klist
)[*count
].u
.fpr
,&dummy
);
1790 /* This is a little hackish, using the skipfncvalue as a
1791 void* pointer to the keyserver spec, but we don't need
1792 the skipfnc here, and it saves having an additional field
1793 for this (which would be wasted space most of the
1796 (*klist
)[*count
].skipfncvalue
=NULL
;
1798 /* Are we honoring preferred keyservers? */
1799 if(opt
.keyserver_options
.options
&KEYSERVER_HONOR_KEYSERVER_URL
)
1801 PKT_user_id
*uid
=NULL
;
1802 PKT_signature
*sig
=NULL
;
1804 merge_keys_and_selfsig(keyblock
);
1806 for(node
=node
->next
;node
;node
=node
->next
)
1808 if(node
->pkt
->pkttype
==PKT_USER_ID
1809 && node
->pkt
->pkt
.user_id
->is_primary
)
1810 uid
=node
->pkt
->pkt
.user_id
;
1811 else if(node
->pkt
->pkttype
==PKT_SIGNATURE
1812 && node
->pkt
->pkt
.signature
->
1813 flags
.chosen_selfsig
&& uid
)
1815 sig
=node
->pkt
->pkt
.signature
;
1820 /* Try and parse the keyserver URL. If it doesn't work,
1821 then we end up writing NULL which indicates we are
1822 the same as any other key. */
1824 (*klist
)[*count
].skipfncvalue
=parse_preferred_keyserver(sig
);
1832 *klist
=xrealloc(*klist
,sizeof(KEYDB_SEARCH_DESC
)*num
);
1844 keydb_release(kdbhd
);
1845 release_kbnode(keyblock
);
1850 /* Note this is different than the original HKP refresh. It allows
1851 usernames to refresh only part of the keyring. */
1854 keyserver_refresh(strlist_t users
)
1856 int rc
,count
,numdesc
,fakev3
=0;
1857 KEYDB_SEARCH_DESC
*desc
;
1858 unsigned int options
=opt
.keyserver_options
.import_options
;
1860 /* We switch merge-only on during a refresh, as 'refresh' should
1861 never import new keys, even if their keyids match. */
1862 opt
.keyserver_options
.import_options
|=IMPORT_MERGE_ONLY
;
1864 /* Similarly, we switch on fast-import, since refresh may make
1865 multiple import sets (due to preferred keyserver URLs). We don't
1866 want each set to rebuild the trustdb. Instead we do it once at
1868 opt
.keyserver_options
.import_options
|=IMPORT_FAST
;
1870 /* If refresh_add_fake_v3_keyids is on and it's a HKP or MAILTO
1871 scheme, then enable fake v3 keyid generation. */
1872 if((opt
.keyserver_options
.options
&KEYSERVER_ADD_FAKE_V3
) && opt
.keyserver
1873 && (ascii_strcasecmp(opt
.keyserver
->scheme
,"hkp")==0 ||
1874 ascii_strcasecmp(opt
.keyserver
->scheme
,"mailto")==0))
1877 rc
=keyidlist(users
,&desc
,&numdesc
,fakev3
);
1886 /* Try to handle preferred keyserver keys first */
1887 for(i
=0;i
<numdesc
;i
++)
1889 if(desc
[i
].skipfncvalue
)
1891 struct keyserver_spec
*keyserver
=desc
[i
].skipfncvalue
;
1893 /* We use the keyserver structure we parsed out before.
1894 Note that a preferred keyserver without a scheme://
1895 will be interpreted as hkp:// */
1897 rc
=keyserver_work(KS_GET
,NULL
,&desc
[i
],1,NULL
,NULL
,keyserver
);
1899 log_info(_("WARNING: unable to refresh key %s"
1900 " via %s: %s\n"),keystr_from_desc(&desc
[i
]),
1901 keyserver
->uri
,g10_errstr(rc
));
1904 /* We got it, so mark it as NONE so we don't try and
1905 get it again from the regular keyserver. */
1907 desc
[i
].mode
=KEYDB_SEARCH_MODE_NONE
;
1911 free_keyserver_spec(keyserver
);
1921 log_info(_("refreshing 1 key from %s\n"),opt
.keyserver
->uri
);
1923 log_info(_("refreshing %d keys from %s\n"),
1924 count
,opt
.keyserver
->uri
);
1927 rc
=keyserver_work(KS_GET
,NULL
,desc
,numdesc
,NULL
,NULL
,opt
.keyserver
);
1932 opt
.keyserver_options
.import_options
=options
;
1934 /* If the original options didn't have fast import, and the trustdb
1935 is dirty, rebuild. */
1936 if(!(opt
.keyserver_options
.import_options
&IMPORT_FAST
))
1937 trustdb_check_or_update();
1943 keyserver_search(strlist_t tokens
)
1946 return keyserver_work(KS_SEARCH
,tokens
,NULL
,0,NULL
,NULL
,opt
.keyserver
);
1952 keyserver_fetch(strlist_t urilist
)
1954 KEYDB_SEARCH_DESC desc
;
1956 unsigned int options
=opt
.keyserver_options
.import_options
;
1958 /* Switch on fast-import, since fetch can handle more than one
1959 import and we don't want each set to rebuild the trustdb.
1960 Instead we do it once at the end. */
1961 opt
.keyserver_options
.import_options
|=IMPORT_FAST
;
1963 /* A dummy desc since we're not actually fetching a particular key
1965 memset(&desc
,0,sizeof(desc
));
1966 desc
.mode
=KEYDB_SEARCH_MODE_EXACT
;
1968 for(sl
=urilist
;sl
;sl
=sl
->next
)
1970 struct keyserver_spec
*spec
;
1972 spec
=parse_keyserver_uri(sl
->d
,1,NULL
,0);
1977 rc
=keyserver_work(KS_GET
,NULL
,&desc
,1,NULL
,NULL
,spec
);
1979 log_info (_("WARNING: unable to fetch URI %s: %s\n"),
1980 sl
->d
,g10_errstr(rc
));
1982 free_keyserver_spec(spec
);
1985 log_info (_("WARNING: unable to parse URI %s\n"),sl
->d
);
1988 opt
.keyserver_options
.import_options
=options
;
1990 /* If the original options didn't have fast import, and the trustdb
1991 is dirty, rebuild. */
1992 if(!(opt
.keyserver_options
.import_options
&IMPORT_FAST
))
1993 trustdb_check_or_update();
1998 /* Import key in a CERT or pointed to by a CERT */
2000 keyserver_import_cert(const char *name
,unsigned char **fpr
,size_t *fpr_len
)
2002 char *domain
,*look
,*url
;
2004 int type
,rc
=G10ERR_GENERAL
;
2008 domain
=strrchr(look
,'@');
2012 type
=get_dns_cert(look
,max_cert_size
,&key
,fpr
,fpr_len
,&url
);
2013 if (!type
|| type
== -1)
2015 /* There might be an error in res_query which leads to an error
2016 return (-1) in the case that nothing was found. Thus we take
2017 all errors as key not found. */
2018 rc
= G10ERR_NO_PUBKEY
;
2022 int armor_status
=opt
.no_armor
;
2024 /* CERTs are always in binary format */
2027 rc
=import_keys_stream(key
,NULL
,fpr
,fpr_len
,
2028 opt
.keyserver_options
.import_options
);
2030 opt
.no_armor
=armor_status
;
2034 else if(type
==2 && *fpr
)
2036 /* We only consider the IPGP type if a fingerprint was provided.
2037 This lets us select the right key regardless of what a URL
2038 points to, or get the key from a keyserver. */
2041 struct keyserver_spec
*spec
;
2043 spec
=parse_keyserver_uri(url
,1,NULL
,0);
2046 rc
=keyserver_import_fprint(*fpr
,*fpr_len
,spec
);
2047 free_keyserver_spec(spec
);
2050 else if(opt
.keyserver
)
2052 /* If only a fingerprint is provided, try and fetch it from
2055 rc
=keyserver_import_fprint(*fpr
,*fpr_len
,opt
.keyserver
);
2058 log_info(_("no keyserver known (use option --keyserver)\n"));
2060 /* Give a better string here? "CERT fingerprint for \"%s\"
2061 found, but no keyserver" " known (use option
2062 --keyserver)\n" ? */
2072 /* Import key pointed to by a PKA record. Return the requested
2073 fingerprint in fpr. */
2075 keyserver_import_pka(const char *name
,unsigned char **fpr
,size_t *fpr_len
)
2078 int rc
= G10ERR_NO_PUBKEY
;
2080 *fpr
= xmalloc (20);
2083 uri
= get_pka_info (name
, *fpr
);
2086 /* An URI is available. Lookup the key. */
2087 struct keyserver_spec
*spec
;
2088 spec
= parse_keyserver_uri (uri
, 1, NULL
, 0);
2091 rc
= keyserver_import_fprint (*fpr
, 20, spec
);
2092 free_keyserver_spec (spec
);
2106 /* Import all keys that match name */
2108 keyserver_import_name(const char *name
,unsigned char **fpr
,size_t *fpr_len
,
2109 struct keyserver_spec
*keyserver
)
2111 strlist_t list
=NULL
;
2114 append_to_strlist(&list
,name
);
2116 rc
=keyserver_work(KS_GETNAME
,list
,NULL
,0,fpr
,fpr_len
,keyserver
);
2123 /* Use the PGP Universal trick of asking ldap://keys.(maildomain) for
2126 keyserver_import_ldap(const char *name
,unsigned char **fpr
,size_t *fpr_len
)
2129 struct keyserver_spec
*keyserver
;
2130 strlist_t list
=NULL
;
2133 append_to_strlist(&list
,name
);
2135 /* Parse out the domain */
2136 domain
=strrchr(name
,'@');
2138 return G10ERR_GENERAL
;
2142 keyserver
=xmalloc_clear(sizeof(struct keyserver_spec
));
2144 keyserver
->scheme
=xstrdup("ldap");
2145 keyserver
->host
=xmalloc(5+strlen(domain
)+1);
2146 strcpy(keyserver
->host
,"keys.");
2147 strcat(keyserver
->host
,domain
);
2148 keyserver
->uri
=xmalloc(strlen(keyserver
->scheme
)+
2149 3+strlen(keyserver
->host
)+1);
2150 strcpy(keyserver
->uri
,keyserver
->scheme
);
2151 strcat(keyserver
->uri
,"://");
2152 strcat(keyserver
->uri
,keyserver
->host
);
2154 rc
=keyserver_work(KS_GETNAME
,list
,NULL
,0,fpr
,fpr_len
,keyserver
);
2158 free_keyserver_spec(keyserver
);