1 /* keyserver.c - generic keyserver code
2 * Copyright (C) 2001, 2002, 2003, 2004, 2005,
3 * 2006 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 2 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, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
43 #include "keyserver-internal.h"
51 KEYDB_SEARCH_DESC desc
;
52 u32 createtime
,expiretime
;
59 enum ks_action
{KS_UNKNOWN
=0,KS_GET
,KS_GETNAME
,KS_SEND
,KS_SEARCH
};
61 static struct parse_options keyserver_opts
[]=
63 /* some of these options are not real - just for the help
65 {"max-cert-size",0,NULL
,NULL
},
66 {"include-revoked",0,NULL
,N_("include revoked keys in search results")},
67 {"include-subkeys",0,NULL
,N_("include subkeys when searching by key ID")},
68 {"use-temp-files",0,NULL
,
69 N_("use temporary files to pass data to keyserver helpers")},
70 {"keep-temp-files",KEYSERVER_KEEP_TEMP_FILES
,NULL
,
71 N_("do not delete temporary files after using them")},
72 {"refresh-add-fake-v3-keyids",KEYSERVER_ADD_FAKE_V3
,NULL
,
74 {"auto-key-retrieve",KEYSERVER_AUTO_KEY_RETRIEVE
,NULL
,
75 N_("automatically retrieve keys when verifying signatures")},
76 {"honor-keyserver-url",KEYSERVER_HONOR_KEYSERVER_URL
,NULL
,
77 N_("honor the preferred keyserver URL set on the key")},
78 {"honor-pka-record",KEYSERVER_HONOR_PKA_RECORD
,NULL
,
79 N_("honor the PKA record set on a key when retrieving keys")},
83 static int keyserver_work(enum ks_action action
,STRLIST list
,
84 KEYDB_SEARCH_DESC
*desc
,int count
,
85 unsigned char **fpr
,size_t *fpr_len
,
86 struct keyserver_spec
*keyserver
);
88 /* Reasonable guess */
89 #define DEFAULT_MAX_CERT_SIZE 16384
91 static size_t max_cert_size
=DEFAULT_MAX_CERT_SIZE
;
94 add_canonical_option(char *option
,STRLIST
*list
)
96 char *arg
=argsplit(option
);
102 joined
=xmalloc(strlen(option
)+1+strlen(arg
)+1);
103 /* Make a canonical name=value form with no spaces */
104 strcpy(joined
,option
);
107 append_to_strlist(list
,joined
);
111 append_to_strlist(list
,option
);
115 parse_keyserver_options(char *options
)
121 keyserver_opts
[0].value
=&max_cert
;
123 while((tok
=optsep(&options
)))
128 /* For backwards compatibility. 1.2.x used honor-http-proxy and
129 there are a good number of documents published that recommend
131 if(ascii_strcasecmp(tok
,"honor-http-proxy")==0)
133 else if(ascii_strcasecmp(tok
,"no-honor-http-proxy")==0)
136 /* We accept quite a few possible options here - some options to
137 handle specially, the keyserver_options list, and import and
138 export options that pertain to keyserver operations. Note
139 that you must use strncasecmp here as there might be an
140 =argument attached which will foil the use of strcasecmp. */
142 #ifdef EXEC_TEMPFILE_ONLY
143 if(ascii_strncasecmp(tok
,"use-temp-files",14)==0 ||
144 ascii_strncasecmp(tok
,"no-use-temp-files",17)==0)
145 log_info(_("WARNING: keyserver option `%s' is not used"
146 " on this platform\n"),tok
);
148 if(ascii_strncasecmp(tok
,"use-temp-files",14)==0)
149 opt
.keyserver_options
.options
|=KEYSERVER_USE_TEMP_FILES
;
150 else if(ascii_strncasecmp(tok
,"no-use-temp-files",17)==0)
151 opt
.keyserver_options
.options
&=~KEYSERVER_USE_TEMP_FILES
;
153 else if(!parse_options(tok
,&opt
.keyserver_options
.options
,
155 && !parse_import_options(tok
,
156 &opt
.keyserver_options
.import_options
,0)
157 && !parse_export_options(tok
,
158 &opt
.keyserver_options
.export_options
,0))
160 /* All of the standard options have failed, so the option is
161 destined for a keyserver plugin. */
162 add_canonical_option(tok
,&opt
.keyserver_options
.other
);
168 max_cert_size
=strtoul(max_cert
,(char **)NULL
,10);
171 max_cert_size
=DEFAULT_MAX_CERT_SIZE
;
178 free_keyserver_spec(struct keyserver_spec
*keyserver
)
180 xfree(keyserver
->uri
);
181 xfree(keyserver
->scheme
);
182 xfree(keyserver
->auth
);
183 xfree(keyserver
->host
);
184 xfree(keyserver
->port
);
185 xfree(keyserver
->path
);
186 xfree(keyserver
->opaque
);
187 free_strlist(keyserver
->options
);
191 /* Return 0 for match */
193 cmp_keyserver_spec(struct keyserver_spec
*one
,struct keyserver_spec
*two
)
195 if(ascii_strcasecmp(one
->scheme
,two
->scheme
)==0)
197 if(one
->host
&& two
->host
&& ascii_strcasecmp(one
->host
,two
->host
)==0)
199 if((one
->port
&& two
->port
200 && ascii_strcasecmp(one
->port
,two
->port
)==0)
201 || (!one
->port
&& !two
->port
))
204 else if(one
->opaque
&& two
->opaque
205 && ascii_strcasecmp(one
->opaque
,two
->opaque
)==0)
212 /* Try and match one of our keyservers. If we can, return that. If
213 we can't, return our input. */
214 struct keyserver_spec
*
215 keyserver_match(struct keyserver_spec
*spec
)
217 struct keyserver_spec
*ks
;
219 for(ks
=opt
.keyserver
;ks
;ks
=ks
->next
)
220 if(cmp_keyserver_spec(spec
,ks
)==0)
226 /* TODO: once we cut over to an all-curl world, we don't need this
227 parser any longer so it can be removed, or at least moved to
228 keyserver/ksutil.c for limited use in gpgkeys_ldap or the like. */
230 struct keyserver_spec
*
231 parse_keyserver_uri(const char *string
,int require_scheme
,
232 const char *configname
,unsigned int configlineno
)
235 struct keyserver_spec
*keyserver
;
240 assert(string
!=NULL
);
242 keyserver
=xmalloc_clear(sizeof(struct keyserver_spec
));
246 options
=strchr(uri
,' ');
254 while((tok
=optsep(&options
)))
255 add_canonical_option(tok
,&keyserver
->options
);
260 for(idx
=uri
,count
=0;*idx
&& *idx
!=':';idx
++)
264 /* Do we see the start of an RFC-2732 ipv6 address here? If so,
265 there clearly isn't a scheme so get out early. */
268 /* Was the '[' the first thing in the string? If not, we
269 have a mangled scheme with a [ in it so fail. */
280 if(*idx
=='\0' || *idx
=='[')
285 /* Assume HKP if there is no scheme */
287 keyserver
->scheme
=xstrdup("hkp");
289 keyserver
->uri
=xmalloc(strlen(keyserver
->scheme
)+3+strlen(uri
)+1);
290 strcpy(keyserver
->uri
,keyserver
->scheme
);
291 strcat(keyserver
->uri
,"://");
292 strcat(keyserver
->uri
,uri
);
298 keyserver
->uri
=xstrdup(uri
);
300 keyserver
->scheme
=xmalloc(count
+1);
302 /* Force to lowercase */
304 keyserver
->scheme
[i
]=ascii_tolower(uri
[i
]);
306 keyserver
->scheme
[i
]='\0';
308 /* Skip past the scheme and colon */
312 if(ascii_strcasecmp(keyserver
->scheme
,"x-broken-hkp")==0)
314 deprecated_warning(configname
,configlineno
,"x-broken-hkp",
315 "--keyserver-options ","broken-http-proxy");
316 xfree(keyserver
->scheme
);
317 keyserver
->scheme
=xstrdup("hkp");
318 append_to_strlist(&opt
.keyserver_options
.other
,"broken-http-proxy");
320 else if(ascii_strcasecmp(keyserver
->scheme
,"x-hkp")==0)
322 /* Canonicalize this to "hkp" so it works with both the internal
323 and external keyserver interface. */
324 xfree(keyserver
->scheme
);
325 keyserver
->scheme
=xstrdup("hkp");
328 if(assume_hkp
|| (uri
[0]=='/' && uri
[1]=='/'))
330 /* Two slashes means network path. */
332 /* Skip over the "//", if any */
336 /* Do we have userinfo auth data present? */
337 for(idx
=uri
,count
=0;*idx
&& *idx
!='@' && *idx
!='/';idx
++)
340 /* We found a @ before the slash, so that means everything
341 before the @ is auth data. */
347 keyserver
->auth
=xmalloc(count
+1);
348 strncpy(keyserver
->auth
,uri
,count
);
349 keyserver
->auth
[count
]='\0';
353 /* Is it an RFC-2732 ipv6 [literal address] ? */
356 for(idx
=uri
+1,count
=1;*idx
357 && ((isascii (*idx
) && isxdigit(*idx
))
358 || *idx
==':' || *idx
=='.');idx
++)
361 /* Is the ipv6 literal address terminated? */
368 for(idx
=uri
,count
=0;*idx
&& *idx
!=':' && *idx
!='/';idx
++)
374 keyserver
->host
=xmalloc(count
+1);
375 strncpy(keyserver
->host
,uri
,count
);
376 keyserver
->host
[count
]='\0';
378 /* Skip past the host */
383 /* It would seem to be reasonable to limit the range of the
384 ports to values between 1-65535, but RFC 1738 and 1808
385 imply there is no limit. Of course, the real world has
388 for(idx
=uri
+1,count
=0;*idx
&& *idx
!='/';idx
++)
392 /* Ports are digits only */
397 keyserver
->port
=xmalloc(count
+1);
398 strncpy(keyserver
->port
,uri
+1,count
);
399 keyserver
->port
[count
]='\0';
401 /* Skip past the colon and port number */
405 /* Everything else is the path */
407 keyserver
->path
=xstrdup(uri
);
409 keyserver
->path
=xstrdup("/");
411 if(keyserver
->path
[1])
412 keyserver
->flags
.direct_uri
=1;
416 /* No slash means opaque. Just record the opaque blob and get
418 keyserver
->opaque
=xstrdup(uri
);
422 /* One slash means absolute path. We don't need to support that
430 free_keyserver_spec(keyserver
);
435 struct keyserver_spec
*
436 parse_preferred_keyserver(PKT_signature
*sig
)
438 struct keyserver_spec
*spec
=NULL
;
442 p
=parse_sig_subpkt(sig
->hashed
,SIGSUBPKT_PREF_KS
,&plen
);
445 byte
*dupe
=xmalloc(plen
+1);
449 spec
=parse_keyserver_uri(dupe
,1,NULL
,0);
457 print_keyrec(int number
,struct keyrec
*keyrec
)
461 iobuf_writebyte(keyrec
->uidbuf
,0);
462 iobuf_flush_temp(keyrec
->uidbuf
);
463 printf("(%d)\t%s ",number
,iobuf_get_temp_buffer(keyrec
->uidbuf
));
466 printf("%d bit ",keyrec
->size
);
470 const char *str
= gcry_pk_algo_name (keyrec
->type
);
478 switch(keyrec
->desc
.mode
)
480 /* If the keyserver helper gave us a short keyid, we have no
481 choice but to use it. Do check --keyid-format to add a 0x if
483 case KEYDB_SEARCH_MODE_SHORT_KID
:
484 printf("key %s%08lX",
485 (opt
.keyid_format
==KF_0xSHORT
486 || opt
.keyid_format
==KF_0xLONG
)?"0x":"",
487 (ulong
)keyrec
->desc
.u
.kid
[1]);
490 /* However, if it gave us a long keyid, we can honor
492 case KEYDB_SEARCH_MODE_LONG_KID
:
493 printf("key %s",keystr(keyrec
->desc
.u
.kid
));
496 case KEYDB_SEARCH_MODE_FPR16
:
499 printf("%02X",keyrec
->desc
.u
.fpr
[i
]);
502 case KEYDB_SEARCH_MODE_FPR20
:
505 printf("%02X",keyrec
->desc
.u
.fpr
[i
]);
513 if(keyrec
->createtime
>0)
516 printf(_("created: %s"),strtimestamp(keyrec
->createtime
));
519 if(keyrec
->expiretime
>0)
522 printf(_("expires: %s"),strtimestamp(keyrec
->expiretime
));
526 printf(" (%s)",_("revoked"));
528 printf(" (%s)",_("disabled"));
530 printf(" (%s)",_("expired"));
535 /* Returns a keyrec (which must be freed) once a key is complete, and
536 NULL otherwise. Call with a NULL keystring once key parsing is
537 complete to return any unfinished keys. */
538 static struct keyrec
*
539 parse_keyrec(char *keystring
)
541 static struct keyrec
*work
=NULL
;
542 struct keyrec
*ret
=NULL
;
550 else if(work
->desc
.mode
==KEYDB_SEARCH_MODE_NONE
)
565 work
=xmalloc_clear(sizeof(struct keyrec
));
566 work
->uidbuf
=iobuf_temp();
569 /* Remove trailing whitespace */
570 for(i
=strlen(keystring
);i
>0;i
--)
571 if(ascii_isspace(keystring
[i
-1]))
576 if((record
=strsep(&keystring
,":"))==NULL
)
579 if(ascii_strcasecmp("pub",record
)==0)
586 work
=xmalloc_clear(sizeof(struct keyrec
));
587 work
->uidbuf
=iobuf_temp();
590 if((tok
=strsep(&keystring
,":"))==NULL
)
593 classify_user_id(tok
,&work
->desc
);
594 if(work
->desc
.mode
!=KEYDB_SEARCH_MODE_SHORT_KID
595 && work
->desc
.mode
!=KEYDB_SEARCH_MODE_LONG_KID
596 && work
->desc
.mode
!=KEYDB_SEARCH_MODE_FPR16
597 && work
->desc
.mode
!=KEYDB_SEARCH_MODE_FPR20
)
599 work
->desc
.mode
=KEYDB_SEARCH_MODE_NONE
;
603 /* Note all items after this are optional. This allows us to
604 have a pub line as simple as pub:keyid and nothing else. */
608 if((tok
=strsep(&keystring
,":"))==NULL
)
611 work
->type
=atoi(tok
);
613 if((tok
=strsep(&keystring
,":"))==NULL
)
616 work
->size
=atoi(tok
);
618 if((tok
=strsep(&keystring
,":"))==NULL
)
624 work
->createtime
=atoi(tok
);
626 if((tok
=strsep(&keystring
,":"))==NULL
)
633 work
->expiretime
=atoi(tok
);
634 /* Force the 'e' flag on if this key is expired. */
635 if(work
->expiretime
<=make_timestamp())
639 if((tok
=strsep(&keystring
,":"))==NULL
)
661 else if(ascii_strcasecmp("uid",record
)==0 && work
->desc
.mode
)
663 char *userid
,*tok
,*decoded
;
665 if((tok
=strsep(&keystring
,":"))==NULL
)
673 /* By definition, de-%-encoding is always smaller than the
674 original string so we can decode in place. */
679 if(tok
[0]=='%' && tok
[1] && tok
[2])
681 if((userid
[i
]=hextobyte(&tok
[1]))==-1)
690 /* We don't care about the other info provided in the uid: line
691 since no keyserver supports marking userids with timestamps
692 or revoked/expired/disabled yet. */
694 /* No need to check for control characters, as utf8_to_native
697 decoded
=utf8_to_native(userid
,i
,0);
698 if(strlen(decoded
)>opt
.screen_columns
-10)
699 decoded
[opt
.screen_columns
-10]='\0';
700 iobuf_writestr(work
->uidbuf
,decoded
);
702 iobuf_writestr(work
->uidbuf
,"\n\t");
706 /* Ignore any records other than "pri" and "uid" for easy future
712 /* TODO: do this as a list sent to keyserver_work rather than calling
713 it once for each key to get the correct counts after the import
714 (cosmetics, really) and to better take advantage of the keyservers
715 that can do multiple fetches in one go (LDAP). */
717 show_prompt(KEYDB_SEARCH_DESC
*desc
,int numdesc
,int count
,const char *search
)
721 if(count
&& opt
.command_fd
==-1)
724 tty_printf("Keys %d-%d of %d for \"%s\". ",from
,numdesc
,count
,search
);
728 answer
=cpr_get_no_help("keysearch.prompt",
729 _("Enter number(s), N)ext, or Q)uit > "));
731 if(answer
[0]=='\x04')
737 if(answer
[0]=='q' || answer
[0]=='Q')
742 else if(atoi(answer
)>=1 && atoi(answer
)<=numdesc
)
744 char *split
=answer
,*num
;
746 while((num
=strsep(&split
," ,"))!=NULL
)
747 if(atoi(num
)>=1 && atoi(num
)<=numdesc
)
748 keyserver_work(KS_GET
,NULL
,&desc
[atoi(num
)-1],1,
749 NULL
,NULL
,opt
.keyserver
);
758 /* Count and searchstr are just for cosmetics. If the count is too
759 small, it will grow safely. If negative it disables the "Key x-y
760 of z" messages. searchstr should be UTF-8 (rather than native). */
762 keyserver_search_prompt(IOBUF buffer
,const char *searchstr
)
764 int i
=0,validcount
=0,started
=0,header
=0,count
=1;
765 unsigned int maxlen
,buflen
,numlines
=0;
766 KEYDB_SEARCH_DESC
*desc
;
771 localstr
=utf8_to_native(searchstr
,strlen(searchstr
),0);
773 desc
=xmalloc(count
*sizeof(KEYDB_SEARCH_DESC
));
777 struct keyrec
*keyrec
;
781 rl
=iobuf_read_line(buffer
,&line
,&buflen
,&maxlen
);
785 if(!header
&& ascii_strncasecmp("SEARCH ",line
,7)==0
786 && ascii_strncasecmp(" BEGIN",&line
[strlen(line
)-7],6)==0)
791 else if(ascii_strncasecmp("SEARCH ",line
,7)==0
792 && ascii_strncasecmp(" END",&line
[strlen(line
)-5],4)==0)
798 /* Look for an info: line. The only current info: values
799 defined are the version and key count. */
800 if(!started
&& rl
>0 && ascii_strncasecmp("info:",line
,5)==0)
802 char *tok
,*str
=&line
[5];
804 if((tok
=strsep(&str
,":"))!=NULL
)
808 if(sscanf(tok
,"%d",&version
)!=1)
813 log_error(_("invalid keyserver protocol "
814 "(us %d!=handler %d)\n"),1,version
);
819 if((tok
=strsep(&str
,":"))!=NULL
&& sscanf(tok
,"%d",&count
)==1)
828 desc
=xrealloc(desc
,count
*sizeof(KEYDB_SEARCH_DESC
));
837 keyrec
=parse_keyrec(NULL
);
852 if(show_prompt(desc
,i
,validcount
?count
:0,localstr
))
861 keyrec
=parse_keyrec(line
);
865 /* keyserver helper sent more keys than they claimed in the
868 desc
=xrealloc(desc
,count
*sizeof(KEYDB_SEARCH_DESC
));
874 desc
[i
]=keyrec
->desc
;
878 /* screen_lines - 1 for the prompt. */
879 if(numlines
+keyrec
->lines
>opt
.screen_lines
-1)
881 if(show_prompt(desc
,i
,validcount
?count
:0,localstr
))
887 print_keyrec(i
+1,keyrec
);
890 numlines
+=keyrec
->lines
;
891 iobuf_close(keyrec
->uidbuf
);
900 /* Leave this commented out or now, and perhaps for a very long
901 time. All HKPish servers return HTML error messages for
905 log_info(_("keyserver does not support searching\n"));
911 log_info(_("key \"%s\" not found on keyserver\n"),localstr
);
913 log_info(_("key not found on keyserver\n"));
921 /* We sometimes want to use a different gpgkeys_xxx for a given
922 protocol (for example, ldaps is handled by gpgkeys_ldap). Map
925 keyserver_typemap(const char *type
)
927 if(strcmp(type
,"ldaps")==0)
933 /* The PGP LDAP and the curl fetch-a-LDAP-object methodologies are
934 sufficiently different that we can't use curl to do LDAP. */
936 direct_uri_map(const char *scheme
,unsigned int is_direct
)
938 if(is_direct
&& strcmp(scheme
,"ldap")==0)
944 #if GNUPG_MAJOR_VERSION == 2
945 #define GPGKEYS_PREFIX "gpg2keys_"
947 #define GPGKEYS_PREFIX "gpgkeys_"
949 #define GPGKEYS_CURL GPGKEYS_PREFIX "curl" EXEEXT
950 #define GPGKEYS_PREFIX_LEN (strlen(GPGKEYS_CURL))
951 #define KEYSERVER_ARGS_KEEP " -o \"%O\" \"%I\""
952 #define KEYSERVER_ARGS_NOKEEP " -o \"%o\" \"%i\""
955 keyserver_spawn(enum ks_action action
,STRLIST list
,KEYDB_SEARCH_DESC
*desc
,
956 int count
,int *prog
,unsigned char **fpr
,size_t *fpr_len
,
957 struct keyserver_spec
*keyserver
)
959 int ret
=0,i
,gotversion
=0,outofband
=0;
961 unsigned int maxlen
,buflen
;
962 char *command
,*end
,*searchstr
=NULL
;
964 struct exec_info
*spawn
;
966 const char *libexecdir
= get_libexecdir ();
970 #ifdef EXEC_TEMPFILE_ONLY
971 opt
.keyserver_options
.options
|=KEYSERVER_USE_TEMP_FILES
;
974 /* Build the filename for the helper to execute */
975 scheme
=keyserver_typemap(keyserver
->scheme
);
977 #ifdef DISABLE_KEYSERVER_PATH
978 /* Destroy any path we might have. This is a little tricky,
979 portability-wise. It's not correct to delete the PATH
980 environment variable, as that may fall back to a system built-in
981 PATH. Similarly, it is not correct to set PATH to the null
982 string (PATH="") since this actually deletes the PATH environment
983 variable under MinGW. The safest thing to do here is to force
984 PATH to be GNUPG_LIBEXECDIR. All this is not that meaningful on
985 Unix-like systems (since we're going to give a full path to
986 gpgkeys_foo), but on W32 it prevents loading any DLLs from
987 directories in %PATH%.
989 After some more thinking about this we came to the conclusion
990 that it is better to load the helpers from the directory where
991 the program of this process lives. Fortunately Windows provides
992 a way to retrieve this and our get_libexecdir function has been
993 modified to return just this. Setting the exec-path is not
995 set_exec_path(libexecdir);
998 if(opt
.exec_path_set
)
1000 /* If exec-path was set, and DISABLE_KEYSERVER_PATH is
1001 undefined, then don't specify a full path to gpgkeys_foo, so
1002 that the PATH can work. */
1003 command
=xmalloc(GPGKEYS_PREFIX_LEN
+strlen(scheme
)+3+strlen(EXEEXT
)+1);
1009 /* Specify a full path to gpgkeys_foo. */
1010 command
=xmalloc(strlen(libexecdir
)+strlen(DIRSEP_S
)+
1011 GPGKEYS_PREFIX_LEN
+strlen(scheme
)+3+strlen(EXEEXT
)+1);
1012 strcpy(command
,libexecdir
);
1013 strcat(command
,DIRSEP_S
);
1016 end
=command
+strlen(command
);
1018 /* Build a path for the keyserver helper. If it is direct_uri
1019 (i.e. an object fetch and not a keyserver), then add "_uri" to
1020 the end to distinguish the keyserver helper from an object
1021 fetcher that can speak that protocol (this is a problem for
1024 strcat(command
,GPGKEYS_PREFIX
);
1025 strcat(command
,scheme
);
1027 /* This "_uri" thing is in case we need to call a direct handler
1028 instead of the keyserver handler. This lets us use gpgkeys_curl
1029 or gpgkeys_ldap_uri (we don't provide it, but a user might)
1030 instead of gpgkeys_ldap to fetch things like
1031 ldap://keyserver.pgp.com/o=PGP%20keys?pgpkey?sub?pgpkeyid=99242560 */
1033 if(direct_uri_map(scheme
,keyserver
->flags
.direct_uri
))
1034 strcat(command
,"_uri");
1036 strcat(command
,EXEEXT
);
1038 /* Can we execute it? If not, try curl as our catchall. */
1039 if(path_access(command
,X_OK
)!=0)
1040 strcpy(end
,GPGKEYS_CURL
);
1042 if(opt
.keyserver_options
.options
&KEYSERVER_USE_TEMP_FILES
)
1044 if(opt
.keyserver_options
.options
&KEYSERVER_KEEP_TEMP_FILES
)
1046 command
=xrealloc(command
,strlen(command
)+
1047 strlen(KEYSERVER_ARGS_KEEP
)+1);
1048 strcat(command
,KEYSERVER_ARGS_KEEP
);
1052 command
=xrealloc(command
,strlen(command
)+
1053 strlen(KEYSERVER_ARGS_NOKEEP
)+1);
1054 strcat(command
,KEYSERVER_ARGS_NOKEEP
);
1057 ret
=exec_write(&spawn
,NULL
,command
,NULL
,0,0);
1060 ret
=exec_write(&spawn
,command
,NULL
,NULL
,0,0);
1067 fprintf(spawn
->tochild
,
1068 "# This is a GnuPG %s keyserver communications file\n",VERSION
);
1069 fprintf(spawn
->tochild
,"VERSION %d\n",KEYSERVER_PROTO_VERSION
);
1070 fprintf(spawn
->tochild
,"PROGRAM %s\n",VERSION
);
1071 fprintf(spawn
->tochild
,"SCHEME %s\n",keyserver
->scheme
);
1073 if(keyserver
->opaque
)
1074 fprintf(spawn
->tochild
,"OPAQUE %s\n",keyserver
->opaque
);
1078 fprintf(spawn
->tochild
,"AUTH %s\n",keyserver
->auth
);
1081 fprintf(spawn
->tochild
,"HOST %s\n",keyserver
->host
);
1084 fprintf(spawn
->tochild
,"PORT %s\n",keyserver
->port
);
1087 fprintf(spawn
->tochild
,"PATH %s\n",keyserver
->path
);
1090 /* Write global options */
1092 for(temp
=opt
.keyserver_options
.other
;temp
;temp
=temp
->next
)
1093 fprintf(spawn
->tochild
,"OPTION %s\n",temp
->d
);
1095 /* Write per-keyserver options */
1097 for(temp
=keyserver
->options
;temp
;temp
=temp
->next
)
1098 fprintf(spawn
->tochild
,"OPTION %s\n",temp
->d
);
1104 fprintf(spawn
->tochild
,"COMMAND GET\n\n");
1106 /* Which keys do we want? */
1108 for(i
=0;i
<count
;i
++)
1112 if(desc
[i
].mode
==KEYDB_SEARCH_MODE_FPR20
)
1116 fprintf(spawn
->tochild
,"0x");
1118 for(f
=0;f
<MAX_FINGERPRINT_LEN
;f
++)
1119 fprintf(spawn
->tochild
,"%02X",desc
[i
].u
.fpr
[f
]);
1121 fprintf(spawn
->tochild
,"\n");
1123 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_FPR16
)
1127 fprintf(spawn
->tochild
,"0x");
1130 fprintf(spawn
->tochild
,"%02X",desc
[i
].u
.fpr
[f
]);
1132 fprintf(spawn
->tochild
,"\n");
1134 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_LONG_KID
)
1135 fprintf(spawn
->tochild
,"0x%08lX%08lX\n",
1136 (ulong
)desc
[i
].u
.kid
[0],
1137 (ulong
)desc
[i
].u
.kid
[1]);
1138 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_SHORT_KID
)
1139 fprintf(spawn
->tochild
,"0x%08lX\n",
1140 (ulong
)desc
[i
].u
.kid
[1]);
1141 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_EXACT
)
1143 fprintf(spawn
->tochild
,"0x0000000000000000\n");
1146 else if(desc
[i
].mode
==KEYDB_SEARCH_MODE_NONE
)
1154 log_info(_("requesting key %s from %s server %s\n"),
1155 keystr_from_desc(&desc
[i
]),
1156 keyserver
->scheme
,keyserver
->host
);
1158 log_info(_("requesting key %s from %s\n"),
1159 keystr_from_desc(&desc
[i
]),keyserver
->uri
);
1163 fprintf(spawn
->tochild
,"\n");
1172 fprintf(spawn
->tochild
,"COMMAND GETNAME\n\n");
1174 /* Which names do we want? */
1176 for(key
=list
;key
!=NULL
;key
=key
->next
)
1177 fprintf(spawn
->tochild
,"%s\n",key
->d
);
1179 fprintf(spawn
->tochild
,"\n");
1182 log_info(_("searching for names from %s server %s\n"),
1183 keyserver
->scheme
,keyserver
->host
);
1185 log_info(_("searching for names from %s\n"),keyserver
->uri
);
1194 /* Note the extra \n here to send an empty keylist block */
1195 fprintf(spawn
->tochild
,"COMMAND SEND\n\n\n");
1197 for(key
=list
;key
!=NULL
;key
=key
->next
)
1199 armor_filter_context_t afx
;
1200 IOBUF buffer
=iobuf_temp();
1204 add_to_strlist(&temp
,key
->d
);
1206 memset(&afx
,0,sizeof(afx
));
1208 /* Tell the armor filter to use Unix-style \n line
1209 endings, since we're going to fprintf this to a file
1210 that (on Win32) is open in text mode. The win32 stdio
1211 will transform the \n to \r\n and we'll end up with the
1212 proper line endings on win32. This is a no-op on
1215 iobuf_push_filter(buffer
,armor_filter
,&afx
);
1217 /* TODO: Remove Comment: lines from keys exported this
1220 if(export_pubkeys_stream(buffer
,temp
,&block
,
1221 opt
.keyserver_options
.export_options
)==-1)
1222 iobuf_close(buffer
);
1227 iobuf_flush_temp(buffer
);
1229 merge_keys_and_selfsig(block
);
1231 fprintf(spawn
->tochild
,"INFO %08lX%08lX BEGIN\n",
1232 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[0],
1233 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[1]);
1235 for(node
=block
;node
;node
=node
->next
)
1237 switch(node
->pkt
->pkttype
)
1242 case PKT_PUBLIC_KEY
:
1243 case PKT_PUBLIC_SUBKEY
:
1245 PKT_public_key
*pk
=node
->pkt
->pkt
.public_key
;
1247 keyid_from_pk(pk
,NULL
);
1249 fprintf(spawn
->tochild
,"%sb:%08lX%08lX:%u:%u:%u:%u:",
1250 node
->pkt
->pkttype
==PKT_PUBLIC_KEY
?"pu":"su",
1251 (ulong
)pk
->keyid
[0],(ulong
)pk
->keyid
[1],
1258 fprintf(spawn
->tochild
,"r");
1260 fprintf(spawn
->tochild
,"e");
1262 fprintf(spawn
->tochild
,"\n");
1268 PKT_user_id
*uid
=node
->pkt
->pkt
.user_id
;
1271 if(uid
->attrib_data
)
1274 fprintf(spawn
->tochild
,"uid:");
1276 /* Quote ':', '%', and any 8-bit
1278 for(r
=0;r
<uid
->len
;r
++)
1280 if(uid
->name
[r
]==':' || uid
->name
[r
]=='%'
1281 || uid
->name
[r
]&0x80)
1282 fprintf(spawn
->tochild
,"%%%02X",
1283 (byte
)uid
->name
[r
]);
1285 fprintf(spawn
->tochild
,"%c",uid
->name
[r
]);
1288 fprintf(spawn
->tochild
,":%u:%u:",
1289 uid
->created
,uid
->expiredate
);
1292 fprintf(spawn
->tochild
,"r");
1294 fprintf(spawn
->tochild
,"e");
1296 fprintf(spawn
->tochild
,"\n");
1300 /* This bit is really for the benefit of
1301 people who store their keys in LDAP
1302 servers. It makes it easy to do queries
1303 for things like "all keys signed by
1307 PKT_signature
*sig
=node
->pkt
->pkt
.signature
;
1309 if(!IS_UID_SIG(sig
))
1312 fprintf(spawn
->tochild
,"sig:%08lX%08lX:%X:%u:%u\n",
1313 (ulong
)sig
->keyid
[0],(ulong
)sig
->keyid
[1],
1314 sig
->sig_class
,sig
->timestamp
,
1321 fprintf(spawn
->tochild
,"INFO %08lX%08lX END\n",
1322 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[0],
1323 (ulong
)block
->pkt
->pkt
.public_key
->keyid
[1]);
1325 fprintf(spawn
->tochild
,"KEY %s BEGIN\n",key
->d
);
1326 fwrite(iobuf_get_temp_buffer(buffer
),
1327 iobuf_get_temp_length(buffer
),1,spawn
->tochild
);
1328 fprintf(spawn
->tochild
,"KEY %s END\n",key
->d
);
1330 iobuf_close(buffer
);
1333 log_info(_("sending key %s to %s server %s\n"),
1334 keystr(block
->pkt
->pkt
.public_key
->keyid
),
1335 keyserver
->scheme
,keyserver
->host
);
1337 log_info(_("sending key %s to %s\n"),
1338 keystr(block
->pkt
->pkt
.public_key
->keyid
),
1341 release_kbnode(block
);
1354 fprintf(spawn
->tochild
,"COMMAND SEARCH\n\n");
1356 /* Which keys do we want? Remember that the gpgkeys_ program
1357 is going to lump these together into a search string. */
1359 for(key
=list
;key
!=NULL
;key
=key
->next
)
1361 fprintf(spawn
->tochild
,"%s\n",key
->d
);
1364 searchstr
=xrealloc(searchstr
,
1365 strlen(searchstr
)+strlen(key
->d
)+2);
1366 strcat(searchstr
," ");
1370 searchstr
=xmalloc(strlen(key
->d
)+1);
1374 strcat(searchstr
,key
->d
);
1377 fprintf(spawn
->tochild
,"\n");
1380 log_info(_("searching for \"%s\" from %s server %s\n"),
1381 searchstr
,keyserver
->scheme
,keyserver
->host
);
1383 log_info(_("searching for \"%s\" from %s\n"),
1384 searchstr
,keyserver
->uri
);
1390 log_fatal(_("no keyserver action!\n"));
1394 /* Done sending, so start reading. */
1395 ret
=exec_read(spawn
);
1399 /* Now handle the response */
1407 if(iobuf_read_line(spawn
->fromchild
,&line
,&buflen
,&maxlen
)==0)
1409 ret
= gpg_error_from_errno (errno
);
1410 goto fail
; /* i.e. EOF */
1415 /* remove trailing whitespace */
1417 while(plen
>0 && ascii_isspace(ptr
[plen
-1]))
1424 if(ascii_strncasecmp(ptr
,"VERSION ",8)==0)
1428 if(atoi(&ptr
[8])!=KEYSERVER_PROTO_VERSION
)
1430 log_error(_("invalid keyserver protocol (us %d!=handler %d)\n"),
1431 KEYSERVER_PROTO_VERSION
,atoi(&ptr
[8]));
1435 else if(ascii_strncasecmp(ptr
,"PROGRAM ",8)==0)
1437 if(ascii_strncasecmp(&ptr
[8],VERSION
,strlen(VERSION
))!=0)
1438 log_info(_("WARNING: keyserver handler from a different"
1439 " version of GnuPG (%s)\n"),&ptr
[8]);
1441 else if(ascii_strncasecmp(ptr
,"OPTION OUTOFBAND",16)==0)
1442 outofband
=1; /* Currently the only OPTION */
1447 log_error(_("keyserver did not send VERSION\n"));
1459 stats_handle
=import_new_stats_handle();
1461 /* Slurp up all the key data. In the future, it might be
1462 nice to look for KEY foo OUTOFBAND and FAILED indicators.
1463 It's harmless to ignore them, but ignoring them does make
1464 gpg complain about "no valid OpenPGP data found". One
1465 way to do this could be to continue parsing this
1466 line-by-line and make a temp iobuf for each key. */
1468 import_keys_stream(spawn
->fromchild
,stats_handle
,fpr
,fpr_len
,
1469 opt
.keyserver_options
.import_options
);
1471 import_print_stats(stats_handle
);
1472 import_release_stats_handle(stats_handle
);
1477 /* Nothing to do here */
1482 keyserver_search_prompt(spawn
->fromchild
,searchstr
);
1486 log_fatal(_("no keyserver action!\n"));
1495 *prog
=exec_finish(spawn
);
1501 keyserver_work(enum ks_action action
,STRLIST list
,KEYDB_SEARCH_DESC
*desc
,
1502 int count
,unsigned char **fpr
,size_t *fpr_len
,
1503 struct keyserver_spec
*keyserver
)
1509 log_error(_("no keyserver known (use option --keyserver)\n"));
1510 return G10ERR_BAD_URI
;
1513 #ifdef DISABLE_KEYSERVER_HELPERS
1515 log_error(_("external keyserver calls are not supported in this build\n"));
1516 return G10ERR_KEYSERVER
;
1519 /* Spawn a handler */
1521 rc
=keyserver_spawn(action
,list
,desc
,count
,&ret
,fpr
,fpr_len
,keyserver
);
1526 case KEYSERVER_SCHEME_NOT_FOUND
:
1527 log_error(_("no handler for keyserver scheme `%s'\n"),
1531 case KEYSERVER_NOT_SUPPORTED
:
1532 log_error(_("action `%s' not supported with keyserver "
1534 action
==KS_GET
?"get":action
==KS_SEND
?"send":
1535 action
==KS_SEARCH
?"search":"unknown",
1539 case KEYSERVER_VERSION_ERROR
:
1540 log_error(_(GPGKEYS_PREFIX
"%s does not support"
1541 " handler version %d\n"),
1542 keyserver_typemap(keyserver
->scheme
),
1543 KEYSERVER_PROTO_VERSION
);
1546 case KEYSERVER_TIMEOUT
:
1547 log_error(_("keyserver timed out\n"));
1550 case KEYSERVER_INTERNAL_ERROR
:
1552 log_error(_("keyserver internal error\n"));
1556 return G10ERR_KEYSERVER
;
1561 log_error(_("keyserver communications error: %s\n"),g10_errstr(rc
));
1567 #endif /* ! DISABLE_KEYSERVER_HELPERS*/
1571 keyserver_export(STRLIST users
)
1574 KEYDB_SEARCH_DESC desc
;
1577 /* Weed out descriptors that we don't support sending */
1578 for(;users
;users
=users
->next
)
1580 classify_user_id (users
->d
, &desc
);
1581 if(desc
.mode
!=KEYDB_SEARCH_MODE_SHORT_KID
&&
1582 desc
.mode
!=KEYDB_SEARCH_MODE_LONG_KID
&&
1583 desc
.mode
!=KEYDB_SEARCH_MODE_FPR16
&&
1584 desc
.mode
!=KEYDB_SEARCH_MODE_FPR20
)
1586 log_error(_("\"%s\" not a key ID: skipping\n"),users
->d
);
1590 append_to_strlist(&sl
,users
->d
);
1595 rc
=keyserver_work(KS_SEND
,sl
,NULL
,0,NULL
,NULL
,opt
.keyserver
);
1603 keyserver_import(STRLIST users
)
1605 KEYDB_SEARCH_DESC
*desc
;
1606 int num
=100,count
=0;
1609 /* Build a list of key ids */
1610 desc
=xmalloc(sizeof(KEYDB_SEARCH_DESC
)*num
);
1612 for(;users
;users
=users
->next
)
1614 classify_user_id (users
->d
, &desc
[count
]);
1615 if(desc
[count
].mode
!=KEYDB_SEARCH_MODE_SHORT_KID
&&
1616 desc
[count
].mode
!=KEYDB_SEARCH_MODE_LONG_KID
&&
1617 desc
[count
].mode
!=KEYDB_SEARCH_MODE_FPR16
&&
1618 desc
[count
].mode
!=KEYDB_SEARCH_MODE_FPR20
)
1620 log_error(_("\"%s\" not a key ID: skipping\n"),users
->d
);
1628 desc
=xrealloc(desc
,sizeof(KEYDB_SEARCH_DESC
)*num
);
1633 rc
=keyserver_work(KS_GET
,NULL
,desc
,count
,NULL
,NULL
,opt
.keyserver
);
1641 keyserver_import_fprint(const byte
*fprint
,size_t fprint_len
,
1642 struct keyserver_spec
*keyserver
)
1644 KEYDB_SEARCH_DESC desc
;
1646 memset(&desc
,0,sizeof(desc
));
1649 desc
.mode
=KEYDB_SEARCH_MODE_FPR16
;
1650 else if(fprint_len
==20)
1651 desc
.mode
=KEYDB_SEARCH_MODE_FPR20
;
1655 memcpy(desc
.u
.fpr
,fprint
,fprint_len
);
1657 /* TODO: Warn here if the fingerprint we got doesn't match the one
1659 return keyserver_work(KS_GET
,NULL
,&desc
,1,NULL
,NULL
,keyserver
);
1663 keyserver_import_keyid(u32
*keyid
,struct keyserver_spec
*keyserver
)
1665 KEYDB_SEARCH_DESC desc
;
1667 memset(&desc
,0,sizeof(desc
));
1669 desc
.mode
=KEYDB_SEARCH_MODE_LONG_KID
;
1670 desc
.u
.kid
[0]=keyid
[0];
1671 desc
.u
.kid
[1]=keyid
[1];
1673 return keyserver_work(KS_GET
,NULL
,&desc
,1,NULL
,NULL
,keyserver
);
1676 /* code mostly stolen from do_export_stream */
1678 keyidlist(STRLIST users
,KEYDB_SEARCH_DESC
**klist
,int *count
,int fakev3
)
1680 int rc
=0,ndesc
,num
=100;
1681 KBNODE keyblock
=NULL
,node
;
1683 KEYDB_SEARCH_DESC
*desc
;
1688 *klist
=xmalloc(sizeof(KEYDB_SEARCH_DESC
)*num
);
1695 desc
= xmalloc_clear ( ndesc
* sizeof *desc
);
1696 desc
[0].mode
= KEYDB_SEARCH_MODE_FIRST
;
1700 for (ndesc
=0, sl
=users
; sl
; sl
= sl
->next
, ndesc
++)
1702 desc
= xmalloc ( ndesc
* sizeof *desc
);
1704 for (ndesc
=0, sl
=users
; sl
; sl
= sl
->next
)
1706 if(classify_user_id (sl
->d
, desc
+ndesc
))
1709 log_error (_("key \"%s\" not found: %s\n"),
1710 sl
->d
, g10_errstr (G10ERR_INV_USER_ID
));
1714 while (!(rc
= keydb_search (kdbhd
, desc
, ndesc
)))
1717 desc
[0].mode
= KEYDB_SEARCH_MODE_NEXT
;
1719 /* read the keyblock */
1720 rc
= keydb_get_keyblock (kdbhd
, &keyblock
);
1723 log_error (_("error reading keyblock: %s\n"), g10_errstr(rc
) );
1727 if((node
=find_kbnode(keyblock
,PKT_PUBLIC_KEY
)))
1729 /* This is to work around a bug in some keyservers (pksd and
1730 OKS) that calculate v4 RSA keyids as if they were v3 RSA.
1731 The answer is to refresh both the correct v4 keyid
1732 (e.g. 99242560) and the fake v3 keyid (e.g. 68FDDBC7).
1733 This only happens for key refresh using the HKP scheme
1734 and if the refresh-add-fake-v3-keyids keyserver option is
1736 if(fakev3
&& is_RSA(node
->pkt
->pkt
.public_key
->pubkey_algo
) &&
1737 node
->pkt
->pkt
.public_key
->version
>=4)
1739 (*klist
)[*count
].mode
=KEYDB_SEARCH_MODE_LONG_KID
;
1740 v3_keyid (node
->pkt
->pkt
.public_key
->pkey
[0],
1741 (*klist
)[*count
].u
.kid
);
1747 *klist
=xrealloc(*klist
,sizeof(KEYDB_SEARCH_DESC
)*num
);
1751 /* v4 keys get full fingerprints. v3 keys get long keyids.
1752 This is because it's easy to calculate any sort of keyid
1753 from a v4 fingerprint, but not a v3 fingerprint. */
1755 if(node
->pkt
->pkt
.public_key
->version
<4)
1757 (*klist
)[*count
].mode
=KEYDB_SEARCH_MODE_LONG_KID
;
1758 keyid_from_pk(node
->pkt
->pkt
.public_key
,
1759 (*klist
)[*count
].u
.kid
);
1765 (*klist
)[*count
].mode
=KEYDB_SEARCH_MODE_FPR20
;
1766 fingerprint_from_pk(node
->pkt
->pkt
.public_key
,
1767 (*klist
)[*count
].u
.fpr
,&dummy
);
1770 /* This is a little hackish, using the skipfncvalue as a
1771 void* pointer to the keyserver spec, but we don't need
1772 the skipfnc here, and it saves having an additional field
1773 for this (which would be wasted space most of the
1776 (*klist
)[*count
].skipfncvalue
=NULL
;
1778 /* Are we honoring preferred keyservers? */
1779 if(opt
.keyserver_options
.options
&KEYSERVER_HONOR_KEYSERVER_URL
)
1781 PKT_user_id
*uid
=NULL
;
1782 PKT_signature
*sig
=NULL
;
1784 merge_keys_and_selfsig(keyblock
);
1786 for(node
=node
->next
;node
;node
=node
->next
)
1788 if(node
->pkt
->pkttype
==PKT_USER_ID
1789 && node
->pkt
->pkt
.user_id
->is_primary
)
1790 uid
=node
->pkt
->pkt
.user_id
;
1791 else if(node
->pkt
->pkttype
==PKT_SIGNATURE
1792 && node
->pkt
->pkt
.signature
->
1793 flags
.chosen_selfsig
&& uid
)
1795 sig
=node
->pkt
->pkt
.signature
;
1800 /* Try and parse the keyserver URL. If it doesn't work,
1801 then we end up writing NULL which indicates we are
1802 the same as any other key. */
1804 (*klist
)[*count
].skipfncvalue
=parse_preferred_keyserver(sig
);
1812 *klist
=xrealloc(*klist
,sizeof(KEYDB_SEARCH_DESC
)*num
);
1824 keydb_release(kdbhd
);
1825 release_kbnode(keyblock
);
1830 /* Note this is different than the original HKP refresh. It allows
1831 usernames to refresh only part of the keyring. */
1834 keyserver_refresh(STRLIST users
)
1836 int rc
,count
,numdesc
,fakev3
=0;
1837 KEYDB_SEARCH_DESC
*desc
;
1838 unsigned int options
=opt
.keyserver_options
.import_options
;
1840 /* We switch merge-only on during a refresh, as 'refresh' should
1841 never import new keys, even if their keyids match. */
1842 opt
.keyserver_options
.import_options
|=IMPORT_MERGE_ONLY
;
1844 /* Similarly, we switch on fast-import, since refresh may make
1845 multiple import sets (due to preferred keyserver URLs). We don't
1846 want each set to rebuild the trustdb. Instead we do it once at
1848 opt
.keyserver_options
.import_options
|=IMPORT_FAST
;
1850 /* If refresh_add_fake_v3_keyids is on and it's a HKP or MAILTO
1851 scheme, then enable fake v3 keyid generation. */
1852 if((opt
.keyserver_options
.options
&KEYSERVER_ADD_FAKE_V3
) && opt
.keyserver
1853 && (ascii_strcasecmp(opt
.keyserver
->scheme
,"hkp")==0 ||
1854 ascii_strcasecmp(opt
.keyserver
->scheme
,"mailto")==0))
1857 rc
=keyidlist(users
,&desc
,&numdesc
,fakev3
);
1866 /* Try to handle preferred keyserver keys first */
1867 for(i
=0;i
<numdesc
;i
++)
1869 if(desc
[i
].skipfncvalue
)
1871 struct keyserver_spec
*keyserver
=desc
[i
].skipfncvalue
;
1873 /* We use the keyserver structure we parsed out before.
1874 Note that a preferred keyserver without a scheme://
1875 will be interpreted as hkp:// */
1877 rc
=keyserver_work(KS_GET
,NULL
,&desc
[i
],1,NULL
,NULL
,keyserver
);
1879 log_info(_("WARNING: unable to refresh key %s"
1880 " via %s: %s\n"),keystr_from_desc(&desc
[i
]),
1881 keyserver
->uri
,g10_errstr(rc
));
1884 /* We got it, so mark it as NONE so we don't try and
1885 get it again from the regular keyserver. */
1887 desc
[i
].mode
=KEYDB_SEARCH_MODE_NONE
;
1891 free_keyserver_spec(keyserver
);
1901 log_info(_("refreshing 1 key from %s\n"),opt
.keyserver
->uri
);
1903 log_info(_("refreshing %d keys from %s\n"),
1904 count
,opt
.keyserver
->uri
);
1907 rc
=keyserver_work(KS_GET
,NULL
,desc
,numdesc
,NULL
,NULL
,opt
.keyserver
);
1912 opt
.keyserver_options
.import_options
=options
;
1914 /* If the original options didn't have fast import, and the trustdb
1915 is dirty, rebuild. */
1916 if(!(opt
.keyserver_options
.import_options
&IMPORT_FAST
))
1917 trustdb_check_or_update();
1923 keyserver_search(STRLIST tokens
)
1926 return keyserver_work(KS_SEARCH
,tokens
,NULL
,0,NULL
,NULL
,opt
.keyserver
);
1932 keyserver_fetch(STRLIST urilist
)
1934 KEYDB_SEARCH_DESC desc
;
1936 unsigned int options
=opt
.keyserver_options
.import_options
;
1938 /* Switch on fast-import, since fetch can handle more than one
1939 import and we don't want each set to rebuild the trustdb.
1940 Instead we do it once at the end. */
1941 opt
.keyserver_options
.import_options
|=IMPORT_FAST
;
1943 /* A dummy desc since we're not actually fetching a particular key
1945 memset(&desc
,0,sizeof(desc
));
1946 desc
.mode
=KEYDB_SEARCH_MODE_EXACT
;
1948 for(sl
=urilist
;sl
;sl
=sl
->next
)
1950 struct keyserver_spec
*spec
;
1952 spec
=parse_keyserver_uri(sl
->d
,1,NULL
,0);
1957 rc
=keyserver_work(KS_GET
,NULL
,&desc
,1,NULL
,NULL
,spec
);
1959 log_info (_("WARNING: unable to fetch URI %s: %s\n"),
1960 sl
->d
,g10_errstr(rc
));
1962 free_keyserver_spec(spec
);
1965 log_info (_("WARNING: unable to parse URI %s\n"),sl
->d
);
1968 opt
.keyserver_options
.import_options
=options
;
1970 /* If the original options didn't have fast import, and the trustdb
1971 is dirty, rebuild. */
1972 if(!(opt
.keyserver_options
.import_options
&IMPORT_FAST
))
1973 trustdb_check_or_update();
1978 /* Import key in a CERT or pointed to by a CERT */
1980 keyserver_import_cert(const char *name
,unsigned char **fpr
,size_t *fpr_len
)
1982 char *domain
,*look
,*url
;
1984 int type
,rc
=G10ERR_GENERAL
;
1988 domain
=strrchr(look
,'@');
1992 type
=get_dns_cert(look
,max_cert_size
,&key
,fpr
,fpr_len
,&url
);
1995 int armor_status
=opt
.no_armor
;
1997 /* CERTs are always in binary format */
2000 rc
=import_keys_stream(key
,NULL
,fpr
,fpr_len
,
2001 opt
.keyserver_options
.import_options
);
2003 opt
.no_armor
=armor_status
;
2007 else if(type
==2 && *fpr
)
2009 /* We only consider the IPGP type if a fingerprint was provided.
2010 This lets us select the right key regardless of what a URL
2011 points to, or get the key from a keyserver. */
2014 struct keyserver_spec
*spec
;
2016 spec
=parse_keyserver_uri(url
,1,NULL
,0);
2021 add_to_strlist(&list
,url
);
2023 rc
=keyserver_fetch(list
);
2026 free_keyserver_spec(spec
);
2029 else if(opt
.keyserver
)
2031 /* If only a fingerprint is provided, try and fetch it from
2034 rc
=keyserver_import_fprint(*fpr
,*fpr_len
,opt
.keyserver
);
2037 log_info(_("no keyserver known (use option --keyserver)\n"));
2039 /* Give a better string here? "CERT fingerprint for \"%s\"
2040 found, but no keyserver" " known (use option
2041 --keyserver)\n" ? */
2051 /* Import key pointed to by a PKA record. Return the requested
2052 fingerprint in fpr. */
2054 keyserver_import_pka(const char *name
,unsigned char **fpr
,size_t *fpr_len
)
2062 uri
= get_pka_info (name
, *fpr
);
2065 struct keyserver_spec
*spec
;
2066 spec
= parse_keyserver_uri (uri
, 1, NULL
, 0);
2069 rc
=keyserver_import_fprint (*fpr
, 20, spec
);
2070 free_keyserver_spec (spec
);
2081 /* Import all keys that match name */
2083 keyserver_import_name(const char *name
,unsigned char **fpr
,size_t *fpr_len
,
2084 struct keyserver_spec
*keyserver
)
2089 append_to_strlist(&list
,name
);
2091 rc
=keyserver_work(KS_GETNAME
,list
,NULL
,0,fpr
,fpr_len
,keyserver
);
2098 /* Use the PGP Universal trick of asking ldap://keys.(maildomain) for
2101 keyserver_import_ldap(const char *name
,unsigned char **fpr
,size_t *fpr_len
)
2104 struct keyserver_spec
*keyserver
;
2108 append_to_strlist(&list
,name
);
2110 /* Parse out the domain */
2111 domain
=strrchr(name
,'@');
2113 return G10ERR_GENERAL
;
2117 keyserver
=xmalloc_clear(sizeof(struct keyserver_spec
));
2119 keyserver
->scheme
=xstrdup("ldap");
2120 keyserver
->host
=xmalloc(5+strlen(domain
)+1);
2121 strcpy(keyserver
->host
,"keys.");
2122 strcat(keyserver
->host
,domain
);
2123 keyserver
->uri
=xmalloc(strlen(keyserver
->scheme
)+
2124 3+strlen(keyserver
->host
)+1);
2125 strcpy(keyserver
->uri
,keyserver
->scheme
);
2126 strcat(keyserver
->uri
,"://");
2127 strcat(keyserver
->uri
,keyserver
->host
);
2129 rc
=keyserver_work(KS_GETNAME
,list
,NULL
,0,fpr
,fpr_len
,keyserver
);
2133 free_keyserver_spec(keyserver
);