mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-21 10:09:57 +01:00
Remove the obsolete keyserver directory from the repo.
-- We also merge dirmngr/ChangeLog.1 into dirmngr/ChangeLog-2011 and rename keyserver/ChangeLog-2011 to dirmngr/ChangeLog-2011-ks.
This commit is contained in:
parent
2180845959
commit
62b2cee85f
@ -1583,8 +1583,813 @@
|
||||
|
||||
Please note that earlier entries are found in the top level
|
||||
ChangeLog.
|
||||
[Update after merge with GnuPG: see ./ChangeLog.1]
|
||||
[Update after merge with GnuPG: These old ChangeLog entries are
|
||||
found below up to ==END OLDEST CHANGELOG==]
|
||||
|
||||
==BEGIN OLDEST CHANGELOG==
|
||||
|
||||
2004-10-04 Werner Koch <wk@g10code.com>
|
||||
|
||||
* src/dirmngr.c: Changed an help entry description.
|
||||
|
||||
2004-09-30 Werner Koch <wk@g10code.com>
|
||||
|
||||
* src/dirmngr.c (i18n_init): Always use LC_ALL.
|
||||
|
||||
2004-09-28 Werner Koch <wk@g10code.com>
|
||||
|
||||
Released 0.5.6.
|
||||
|
||||
* config.guess, config.sub: Updated.
|
||||
|
||||
2004-06-21 Werner Koch <wk@g10code.com>
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Bad hack to use the right attribute.
|
||||
|
||||
2004-05-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.5.
|
||||
|
||||
* src/ldap.c (start_cert_fetch_ldap, start_cert_fetch_ldap): More
|
||||
detailed error messages.
|
||||
|
||||
* src/crlcache.c (update_dir): Handle i-records properly.
|
||||
|
||||
2004-04-29 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.4.
|
||||
|
||||
* src/crlcache.h (crl_cache_result_t): Add CRL_CACHE_CANTUSE.
|
||||
* src/server.c (cmd_isvalid): Handle it here.
|
||||
* src/crlcache.c (crl_cache_isvalid): Issue this code if the CRL
|
||||
cant be used.
|
||||
(open_dir): Parse new fields 8,9 and 10 as well as the invalid flag.
|
||||
(write_dir_line_crl): Write new fields.
|
||||
(get_crl_number, get_auth_key_id): New.
|
||||
(crl_cache_insert): Fill new fields. Mark the entry invalid if
|
||||
the CRL is too old after an update or an unknown critical
|
||||
extension was seen.
|
||||
(list_one_crl_entry): Print the new fields.
|
||||
|
||||
2004-04-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Requires libksba 0.9.6.
|
||||
|
||||
* src/dirmngr.c: New option --ocsp-signer.
|
||||
* src/dirmngr.h (opt): Renamed member OCSP_REPONDERS to
|
||||
OCSP_RESPONDER and made ist a simple string. Add OCSP_SIGNER.
|
||||
* src/ocsp.c (ocsp_isvalid): Changed it accordingly.
|
||||
(ocsp_isvalid): Pass the ocsp_signer to check_signature.
|
||||
(check_signature): New arg SIGNER_FPR. Use it to retrieve the
|
||||
certificate. Factored out common code to ..
|
||||
(check_signature_core): .. New.
|
||||
|
||||
2004-04-27 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/server.c (start_command_handler): Keep track of the first
|
||||
connection.
|
||||
(dirmngr_tick): New.
|
||||
* src/ldap.c (attr_fetch_fun_reader): Call it from time to time.
|
||||
|
||||
2004-04-23 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main): Removed the add-servers option from the
|
||||
gpgconf list. It is not really useful.
|
||||
|
||||
2004-04-02 Thomas Schwinge <schwinge@nic-nac-project.de>
|
||||
|
||||
* autogen.sh: Added ACLOCAL_FLAGS.
|
||||
|
||||
2004-04-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (update_dir): Do not double close FPOUT.
|
||||
|
||||
2004-04-09 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/cdblib.c (cdb_make_start): Wipeout the entire buffer to
|
||||
shutup valgrind.
|
||||
(ewrite): Fixed writing bad data on EINTR.
|
||||
|
||||
* src/ldap.c (get_attr_from_result_ldap): Fixed bad copy and
|
||||
terminate of a string.
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Fixed freeing of VALUE on error.
|
||||
|
||||
2004-04-07 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.h (server_control_s): Add member force_crl_refresh.
|
||||
* src/server.c (option_handler): New.
|
||||
(start_command_handler): Register option handler
|
||||
* src/crlcache.c (crl_cache_isvalid): Add arg FORCE_REFRESH.
|
||||
(crl_cache_insert): Record last refresh in memory.
|
||||
|
||||
* src/server.c (inquire_cert_and_load_crl): Renamed from
|
||||
inquire_cert.
|
||||
|
||||
2004-04-06 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.3
|
||||
|
||||
* doc/dirmngr.texi: Updated.
|
||||
* doc/texinfo.tex: Updated.
|
||||
|
||||
2004-04-05 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/ocsp.c (ocsp_isvalid): Check THIS_UPDATE.
|
||||
|
||||
* src/misc.c (add_isotime): New.
|
||||
(date2jd, jd2date, days_per_month, days_per_year): New. Taken from
|
||||
my ancient (1988) code used in Wedit (time2.c).
|
||||
|
||||
2004-04-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh: Check gettext version.
|
||||
* configure.ac: Add AM_GNU_GETTEXT.
|
||||
|
||||
2004-04-02 gettextize <bug-gnu-gettext@gnu.org>
|
||||
|
||||
* Makefile.am (SUBDIRS): Add intl.
|
||||
(EXTRA_DIST): Add config.rpath.
|
||||
* configure.ac (AC_CONFIG_FILES): Add intl/Makefile,
|
||||
|
||||
2004-04-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Add i18n at most places.
|
||||
|
||||
* src/dirmngr.c (i18n_init): New.
|
||||
(main): Call it.
|
||||
* src/dirmngr.h: Add i18n stuff.
|
||||
|
||||
2004-04-01 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/misc.c (get_fingerprint_hexstring): New.
|
||||
|
||||
* src/server.c (dirmngr_status): New.
|
||||
|
||||
2004-03-26 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Add AC_SYS_LARGEFILE.
|
||||
|
||||
* doc/dirmngr.texi: Changed the license to the GPL as per message
|
||||
by Mathhias Kalle Dalheimer of Klaralvdalens-Datakonsult dated
|
||||
Jan 7, 2004.
|
||||
* doc/fdl.texi: Removed.
|
||||
|
||||
2004-03-25 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main): New command --fetch-crl.
|
||||
|
||||
2004-03-23 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c: New option --allow-ocsp.
|
||||
* src/server.c (cmd_isvalid): Make use of allow_ocsp.
|
||||
|
||||
2004-03-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main) <gpgconf>: Fixed default value quoting.
|
||||
|
||||
2004-03-16 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main): Add ocsp-responder to the gpgconf list.
|
||||
Add option --debug-level.
|
||||
(set_debug): New.
|
||||
|
||||
2004-03-15 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/misc.c (canon_sexp_to_grcy): New.
|
||||
|
||||
2004-03-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Hack to substitute http for https.
|
||||
|
||||
2004-03-10 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file): Don't skip the entire
|
||||
file on errors.
|
||||
|
||||
2004-03-09 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (my_ksba_hash_buffer): New.
|
||||
(main): Initialize the internal libksba hashing.
|
||||
|
||||
* src/server.c (get_issuer_cert_local): Renamed to ...
|
||||
(get_cert_local): ... this. Changed all callers. Allow NULL for
|
||||
ISSUER to return the current target cert.
|
||||
(get_issuing_cert_local): New.
|
||||
(do_get_cert_local): Moved common code to here.
|
||||
|
||||
2004-03-06 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.2.
|
||||
|
||||
* configure.ac: Fixed last change to check the API version of
|
||||
libgcrypt.
|
||||
|
||||
2004-03-05 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Also check the SONAME of libgcrypt.
|
||||
|
||||
2004-03-03 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c: New option --ocsp-responder.
|
||||
* src/dirmngr.h (opt): Add member OCSP_RESPONDERS.
|
||||
|
||||
2004-02-26 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/server.c (start_command_handler): Corrected typo and made
|
||||
dirmngr output it's version in the greeting message.
|
||||
|
||||
2004-02-24 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* src/dirmngr.c (DEFAULT_ADD_SERVERS): Removed. If this were
|
||||
true, there'd be no way to disable it.
|
||||
(main): Dump options in new gpgconf format.
|
||||
|
||||
2004-02-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh (check_version): Removed bashism and simplified.
|
||||
|
||||
2004-02-06 Moritz Schulte <mo@g10code.com>
|
||||
|
||||
* src/crlfetch.c (crl_fetch_default): Do not dereference VALUE,
|
||||
when checking for non-zero.
|
||||
|
||||
2004-02-01 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* src/dirmngr.c (DEFAULT_ADD_SERVERS, DEFAULT_MAX_REPLIES)
|
||||
(DEFAULT_LDAP_TIMEOUT): New macros.
|
||||
(main): Use them.
|
||||
(enum cmd_and_opt_values): New command aGPGConfList.
|
||||
(main): Add handler here.
|
||||
|
||||
2004-01-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Added AC_CHECK_FUNCS tests again, because the
|
||||
other test occurrences belong to the jnlib tests block.
|
||||
|
||||
2004-01-15 Moritz Schulte <mo@g10code.com>
|
||||
|
||||
* configure.ac: Fixed funopen replacement mechanism; removed
|
||||
unnecessary AC_CHECK_FUNCS calls.
|
||||
|
||||
2004-01-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (list_one_crl_entry): Don't use putchar.
|
||||
|
||||
* src/server.c (cmd_listcrls): New.
|
||||
|
||||
2003-12-23 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.1.
|
||||
|
||||
2003-12-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac (CFLAGS): Add -Wformat-noliteral in gcc +
|
||||
maintainer mode.
|
||||
(NEED_LIBASSUAN_VERSION): Bump up to 0.6.2.
|
||||
|
||||
2003-12-16 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Update the tests for jnlib.
|
||||
* src/dirmngr.c (main): Ignore SIGPIPE in server mode.
|
||||
|
||||
2003-12-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (hash_dbfile): Also hash version info of the
|
||||
cache file format.
|
||||
|
||||
* src/Makefile.am (dirmngr_SOURCES): Add http.h.
|
||||
|
||||
* configure.ac: Removed checking for DB2. Add checking for mmap.
|
||||
* src/cdb.h, src/cdblib.h: New. Add a few comments from the
|
||||
original man page and fixed typos.
|
||||
* src/cdblib.c (cdb_findinit, cdb_findnext): Modified to allow
|
||||
walking over all entries.
|
||||
* src/crlcache.h: Removed DB2/4 cruft.
|
||||
(release_one_cache_entry, lock_db_file, crl_parse_insert)
|
||||
(crl_cache_insert, crl_cache_isvalid, list_one_crl_entry): Use the
|
||||
new CDB interface.
|
||||
|
||||
* src/dirmngr.c: Beautified the help messages.
|
||||
(wrong_args): New.
|
||||
(main): new option --force. Revamped the command handling code.
|
||||
Allow to pass multiple CRLS as well as stdin to --local-crl.
|
||||
* src/crlcache.c (crl_cache_insert): Make --force work.
|
||||
|
||||
2003-12-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Enhanced to allow fetching binary
|
||||
data using HTTP.
|
||||
* src/http.c, src/http.h: Replaced by the code from gnupg 1.3 and
|
||||
modified acording to our needs.
|
||||
(read_line): New. Based on the code from GnuPG's iobuf_read_line.
|
||||
* configure.ac: Check for getaddrinfo.
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file): Close the stream.
|
||||
(main): Free ldapfile.
|
||||
|
||||
* src/ocsp.c, src/ocsp.h: New. Albeit not functionality.
|
||||
|
||||
* src/server.c (inquire_cert): Catch EOF when reading dist points.
|
||||
|
||||
* src/crlcache.c (hash_dbfile, check_dbfile): New.
|
||||
(lock_db_file, crl_cache_insert): Use them here to detect
|
||||
corrupted CRL files.
|
||||
(open_dir): Read the new dbfile hash field.
|
||||
|
||||
* src/crlfetch.c (crl_fetch, crl_fetch_default): Changed to retrun
|
||||
a stream.
|
||||
(fun_reader, fun_closer, setup_funopen): New.
|
||||
* src/server.c (inquire_cert): Changed to use the new stream interface
|
||||
of crlfetch.c.
|
||||
|
||||
2003-12-10 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/funopen.c: New.
|
||||
* configure.ac (funopen): Add test.
|
||||
* src/Makefile.am (dirmngr_LDADD): Add LIBOBJS.
|
||||
|
||||
* src/crlcache.c (next_line_from_file): Remove the limit on the
|
||||
line length.
|
||||
(crl_cache_new): Removed.
|
||||
(open_dbcontent): New.
|
||||
(crl_cache_init): Use it here.
|
||||
(crl_cache_flush): The DB content fie is now in the cache
|
||||
directory, so we can simplify it.
|
||||
(make_db_file_name, lock_db_file, unlock_db_file): New.
|
||||
(release_cache): Close the cached DB files.
|
||||
(crl_cache_isvalid): Make use of the new lock_db_file.
|
||||
(crl_cache_insert): Changed to take a stream as argument.
|
||||
(crl_parse_insert): Rewritten to use a temporary DB and to avoid
|
||||
using up large amounts of memory.
|
||||
(db_entry_new): Removed.
|
||||
(release_cache,release_one_cache_entry): Splitted up.
|
||||
(find_entry): Take care of the new deleted flag.
|
||||
(crl_cache_load): Simplified becuase we can now pass a FP to the
|
||||
insert code.
|
||||
(save_contents): Removed.
|
||||
(update_dir): New.
|
||||
(open_dbcontent_file): Renamed to open_dir_file.
|
||||
(check_dbcontent_version): Renamed to check_dir_version.
|
||||
(open_dbcontent): Renamed to open_dir.
|
||||
|
||||
* src/dirmngr.c: New option --faked-system-time.
|
||||
* src/misc.c (faked_time_p, set_time, get_time): New. Taken from GnuPG.
|
||||
(check_isotime): New.
|
||||
(unpercent_string): New.
|
||||
|
||||
2003-12-09 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.h (DBDIR,DBCONTENTFILE): Changed value.
|
||||
|
||||
* autogen.sh: Reworked.
|
||||
* README.CVS: New.
|
||||
* configure.ac: Added min_automake_version.
|
||||
|
||||
2003-12-03 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/server.c (cmd_lookup): Send an END line after each
|
||||
certificate.
|
||||
|
||||
2003-11-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/Makefile.am (dirmngr_LDADD): Remove DB_LIBS
|
||||
because it never got defined and -ldb{2,4} is implictly set
|
||||
by the AC_CHECK_LIB test in configure.
|
||||
|
||||
* src/crlcache.c (mydbopen): DB4 needs an extra parameter; I
|
||||
wonder who ever tested DB4 support. Add an error statement in
|
||||
case no DB support is configured.
|
||||
|
||||
* tests/Makefile.am: Don't use AM_CPPFLAGS but AM_CFLAGS, replaced
|
||||
variables by configure templates.
|
||||
* src/Makefile.am: Ditto.
|
||||
|
||||
2003-11-19 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (list_one_crl_entry): Define X to nothing for non
|
||||
DB4 systems. Thanks to Luca M. G. Centamore.
|
||||
|
||||
2003-11-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.0
|
||||
|
||||
* src/crlcache.c (crl_cache_new): Fixed eof detection.
|
||||
|
||||
* src/server.c (cmd_loadcrl): Do the unescaping.
|
||||
|
||||
* doc/dirmngr.texi: Added a history section for this modified
|
||||
version.
|
||||
|
||||
2003-11-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* tests/asschk.c: New. Taken from GnuPG.
|
||||
* tests/Makefile.am: Added asschk.
|
||||
|
||||
2003-11-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/ldap.c (fetch_next_cert_ldap): Get the pattern switching
|
||||
right.
|
||||
|
||||
* tests/test-dirmngr.c: Replaced a couple of deprecated types.
|
||||
|
||||
* configure.ac (GPG_ERR_SOURCE_DEFAULT): Added.
|
||||
(fopencookie, asprintf): Removed unneeded test.
|
||||
(PRINTABLE_OS_NAME): Updated the test from gnupg.
|
||||
(CFLAGS): Do full warnings only in maintainer mode. Add flag
|
||||
--enable gcc-warnings to override it and to enable even more
|
||||
warnings.
|
||||
* acinclude.m4: Removed the libgcrypt test.
|
||||
|
||||
* src/ldap.c (get_attr_from_result_ldap): Simplified the binary
|
||||
hack and return a proper gpg error.
|
||||
(attr_fetch_ldap_internal): Changed error handling.
|
||||
(attr_fetch_ldap): Reworked. Return configuration error if no
|
||||
servers are configured.
|
||||
(url_fetch_ldap, add_server_to_servers)
|
||||
(url_fetch_ldap_internal): Reworked.
|
||||
(struct cert_fetch_context_s): New to get rid of a global state.
|
||||
(start_cert_fetch_ldap): Allocate context and do a bind with a
|
||||
timeout. Parse pattern.
|
||||
(end_cert_fetch_ldap): Take context and don't return anything.
|
||||
(find_next_pattern): Removed.
|
||||
(parse_one_pattern): Redone.
|
||||
(get_cert_ldap): Redone.
|
||||
* src/server.c (cmd_lookup): Changed for changed fetch functions.
|
||||
|
||||
* doc/dirmngr.texi: Reworked a bit to get rid of tex errors.
|
||||
|
||||
* configure.ac: Enable makeinfo test.
|
||||
|
||||
* src/crlcache.c (crl_cache_insert): Fixed for latest KSBA API
|
||||
changes.
|
||||
* tests/test-dirmngr.c (main): Ditto. Also added some more error
|
||||
checking.
|
||||
|
||||
2003-11-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/cert.c (hashify_data, hexify_data, serial_hex)
|
||||
(serial_to_buffer): Moved all to ...
|
||||
* src/misc.c: .. here.
|
||||
* src/Makefile.am (cert.c, cert.h): Removed.
|
||||
* cert.c, cert.h: Removed.
|
||||
|
||||
* m4/: New.
|
||||
* configure.ac, Makefile.am: Include m4 directory support, updated
|
||||
required library versions.
|
||||
|
||||
* src/cert.c (make_cert): Removed.
|
||||
|
||||
* src/ldap.c (fetch_next_cert_ldap): Return a gpg style error.
|
||||
|
||||
* src/misc.h (copy_time): New.
|
||||
* src/misc.c (get_isotime): New.
|
||||
(iso_string2time, iso_time2string): Removed.
|
||||
(unhexify): New.
|
||||
|
||||
* src/crlcache.h (DBCONTENTSVERSION): Bumbed to 0.6.
|
||||
* src/crlcache.c (finish_sig_check): New. Factored out from
|
||||
crl_parse_insert and entirely redone.
|
||||
(do_encode_md): Removed.
|
||||
(print_time): Removed
|
||||
(crl_cache_isvalid): Reworked.
|
||||
|
||||
2003-11-10 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (make_db_val, parse_db_val): Removed.
|
||||
|
||||
* src/cert.c (serial_to_buffer): New.
|
||||
|
||||
* src/server.c (get_issuer_cert_local): Rewritten.
|
||||
|
||||
* src/crlcache.c (crl_parse_insert): Rewritten. Takes now a CTRL
|
||||
instead of the Assuan context. Changed caller accordingly.
|
||||
(get_issuer_cert): Cleaned up.
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Changed VALUE to unsigned char* for
|
||||
documentation reasons. Make sure that VALUE is released on error.
|
||||
(crl_fetch_default, ca_cert_fetch): Ditto.
|
||||
|
||||
* src/crlcache.c (release_cache): New.
|
||||
(crl_cache_deinit): Use it here.
|
||||
(crl_cache_flush): Redone.
|
||||
(save_contents): Redone.
|
||||
(crl_cache_list, list_one_crl_entry): Print error messages.
|
||||
|
||||
2003-11-06 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (create_directory_if_needed, cleanup_cache_dir):
|
||||
New. Factored out from crl_cache_new and mostly rewritten.
|
||||
(crl_cache_new): Rewritten.
|
||||
(next_line_from_file): New.
|
||||
(find_entry): Cleaned up.
|
||||
(crl_cache_deinit): Cleaned up.
|
||||
|
||||
* src/dirmngr.c (dirmngr_init_default_ctrl): New stub.
|
||||
* src/dirmngr.h (ctrl_t): New.
|
||||
(DBG_ASSUAN,...): Added the usual debug test macros.
|
||||
* src/server.c: Removed the GET_PTR cruft, replaced it by ctrl_t.
|
||||
Removed the recursion flag.
|
||||
(get_issuer_cert_local): Allow for arbitary large
|
||||
certificates. 4096 is definitely too small.
|
||||
(inquire_cert): Ditto.
|
||||
(start_command_handler): Set a hello line and call the default
|
||||
init function.
|
||||
(cmd_isvalid): Rewritten.
|
||||
(inquire_cert): Removed unused arg LINE. General cleanup.
|
||||
(map_assuan_err,map_to_assuan_status): New. Taken from gnupg 1.9.
|
||||
(cmd_lookup): Rewritten.
|
||||
(cmd_loadcrl): Started to rewrite it.
|
||||
|
||||
2003-10-29 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file): Entirely rewritten.
|
||||
(cleanup): New.
|
||||
(main): Cleaned up.
|
||||
|
||||
2003-10-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.h: Renamed dirmngr_opt to opt.
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file, free_ldapservers_list):
|
||||
Moved with this file. Cleaned up. Replaced too deep recursion in
|
||||
the free function.
|
||||
|
||||
2003-10-21 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Changed all occurrences of assuan.h to use use the system provided
|
||||
one.
|
||||
* src/server.c (register_commands): Adjusted for Assuan API change.
|
||||
|
||||
2003-08-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/Makefile.am: s/LIBKSBA_/KSBA_/. Changed for external Assuan lib.
|
||||
* tests/Makefile.am: Ditto.
|
||||
|
||||
* configure.ac: Partly restructured, add standard checks for
|
||||
required libraries, removed included libassuan.
|
||||
* Makefile.am (SUBDIRS): Removed assuan becuase we now use the
|
||||
libassuan package.
|
||||
|
||||
* src/dirmngr.c (main): Properly initialize Libgcrypt and libksba.
|
||||
|
||||
2003-08-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/server.c (get_issuer_cert_local): Print error using
|
||||
assuan_strerror.
|
||||
|
||||
* src/crlcache.c (do_encode_md, start_sig_check): Adjust for
|
||||
changed Libgcrypt API.
|
||||
|
||||
2003-06-19 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Upped version to 0.4.7-cvs.
|
||||
|
||||
2003-06-19 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Release 0.4.6.
|
||||
|
||||
2003-06-17 Bernhard Reiter <bernhard@intevation.de>
|
||||
|
||||
* src/ldap.c (url_fetch_ldap()):
|
||||
try other default servers when an url with hostname failed
|
||||
* AUTHORS: added Steffen and Werner
|
||||
* THANKS: Thanked people in the ChangeLog and the Ägypten-Team
|
||||
|
||||
|
||||
2003-06-16 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac, src/crlcache.h, src/crlcache.c: Added db4 support.
|
||||
* src/Makefile.am, tests/Makefile.am: Removed automake warning.
|
||||
* tests/test-dirmngr.c: Removed a warning.
|
||||
|
||||
2003-05-12 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* doc/Makefile.am: Added dirmngr.ops to DISTCLEANFILES.
|
||||
* ChangeLog, doc/ChangeLog, src/ChangeLog: Merged dirmngr ChangeLogs
|
||||
into one toplevel file.
|
||||
* acinclude.m4, configure.ac: Renamed PFX to PATH for consistency.
|
||||
|
||||
2003-05-12 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/ldap.c: Fixed end-of-certificates-list indication.
|
||||
|
||||
2003-05-08 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/server.c: Fixed iteration over server list
|
||||
|
||||
2003-02-23 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/crlcache.h, src/crlcache.c, src/dirmngr.c: Implemented --flush command.
|
||||
|
||||
2003-02-07 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* configure.ac: Release 0.4.4.
|
||||
|
||||
2003-02-05 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/ldap.c: Try harder with and without ";binary" in the
|
||||
attribute name when fetching certificates.
|
||||
* src/ldap.c, src/server.c: Support multiple userCertificate attributes
|
||||
per entry.
|
||||
|
||||
2003-02-04 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/ldap.c: Include the sn attribute in the search filter.
|
||||
Better log messages.
|
||||
|
||||
2002-11-20 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Doc updates (fixes #1373)
|
||||
* Fix for #1419 (crash in free_ldapservers_list())
|
||||
* Fix for #1375. Dirmngr now asks back with an INQUIRE SENDCERT before
|
||||
querying the LDAP servers for an issuer certificate to validate a CRL
|
||||
|
||||
2002-11-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* config.sub, config.guess: Updated from ftp.gnu.org/gnu/config
|
||||
to version 2002-11-08.
|
||||
|
||||
2002-11-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* dirmngr.c (main) <load_crl_filename>: Better pass NULL instead
|
||||
of an unitialized Assuan context. Let's hope that the other
|
||||
functions can cope with this.
|
||||
|
||||
2002-10-25 Bernhard Reiter <bernhard@intevation.de>
|
||||
|
||||
* src/ldap.c (get_attr_from_result_ldap()):
|
||||
added value extraction retry for CRLs and Certs without ";binary"
|
||||
* changed version number to reflect cvs status to "0.4.3-cvs"
|
||||
|
||||
2002-08-21 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* dirmngr.c (main): Changed default homedir to .gnupg.
|
||||
|
||||
2002-08-07 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Added configure check to examine whether db2 cursor() uses 3 or
|
||||
4 parameters.
|
||||
|
||||
2002-07-31 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* doc/dirmngr.texi: Fixed the structure and added menu entries
|
||||
for the other nodes.
|
||||
|
||||
2002-07-30 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Added doc dir and first steps towards manual.
|
||||
|
||||
2002-07-29 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Got rid of the default server for CRL lookup. We now use the
|
||||
same list of servers that we use for cert. lookup.
|
||||
|
||||
2002-07-29 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* New option --add-servers to allow dirmngr to add LDAP servers
|
||||
found in CRL distribution points to the list of servers it
|
||||
searches. NOTE: The added servers are only active in the currently
|
||||
running dirmngr -- the info isn't written to persistens storage.
|
||||
|
||||
2002-07-26 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Default LDAP timeout is 100 seconds now.
|
||||
|
||||
* Use DB2 instead of DB1. Check for libresolv, fixed bug when
|
||||
libldap was found in the default search path.
|
||||
|
||||
2002-07-22 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Implemented --load-crl <filename> option. Also available as
|
||||
LOADCRL assuan command when in server mode.
|
||||
|
||||
2002-07-22 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Implemented new option --ldaptimeout to specify the number of seconds to
|
||||
wait for an LDAP request before timeout.
|
||||
|
||||
* Added --list-crls option to print the contents of the CRL cache
|
||||
* Added some items to the dbcontents file to make printout nicer
|
||||
and updated it's version number
|
||||
|
||||
2002-07-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* crlcache.c (crl_parse_insert): Fixed log_debug format string.
|
||||
|
||||
2002-07-02 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Use DB->get() return value correctly.
|
||||
|
||||
2002-06-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* crlcache.c (crl_parse_insert): Keep track of newly allocated
|
||||
ENTRY so that we don't free existing errors after a bad signature.
|
||||
|
||||
* dirmngr.h: Include prototype for start_command_handler.
|
||||
|
||||
* crlfetch.c, crlcache.c, http.c, cert.c, ldap.c: Include
|
||||
config.h.
|
||||
|
||||
* crlcache.c (crl_parse_insert): Fixed format type specifiers for
|
||||
time_t variables in log_debug.
|
||||
|
||||
* error.h: Use log_debug instead of dirmngr_debug. Changed all
|
||||
callers.
|
||||
* Makefile.am (dirmngr_SOURCES): Removed error.c
|
||||
|
||||
* dirmngr.c (main): Register gcrypt malloc functions with ksba so
|
||||
that we don't run into problems by using the wrong free function.
|
||||
The gcrypt malloc function have the additional benefit of a
|
||||
providing allocation sanity checks when compiled with that
|
||||
feature.
|
||||
|
||||
* crlcache.c (get_issuer_cert): Use xfree instead of ksba_free.
|
||||
|
||||
|
||||
2002-06-27 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* ldap.c: Look for both userCertificate and caCertificate
|
||||
|
||||
2002-06-26 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Upped version number to 0.3.1
|
||||
|
||||
2002-06-25 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* server.c (cmd_lookup): Use assuan_write_status which ensures a
|
||||
correct syntax.
|
||||
|
||||
2002-06-20 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* crlcache.c (crl_cache_isvalid): Started with some nicer logging.
|
||||
However, this will need a lot more work.
|
||||
(get_issuer_cert): Ditto.
|
||||
|
||||
* dirmngr.c (main): Changed required libgcrypt version and don't
|
||||
print the prefix when using a logfile.
|
||||
|
||||
2002-06-20 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* tests/Makefile.am (TESTS): Removed test-dirmngr because it
|
||||
is not a proper test program.
|
||||
(EXTRA_DIST): Removed the non-existent test certificate.
|
||||
|
||||
2002-05-21 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* server.c (start_command_handler): Enable assuan debugging.
|
||||
|
||||
2002-05-08 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Replaced gdbm check with db1 check
|
||||
|
||||
2002-05-08 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Replaced gdbm with db1, updated file format version
|
||||
|
||||
2002-03-01 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Added gdbm configure check
|
||||
|
||||
2002-01-23 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Return ASSUAN_CRL_Too_Old if the CRL is too old
|
||||
|
||||
|
||||
2002-01-17 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
Added commandline options --ldapserver <host> --ldapport <port>
|
||||
--ldapuser <user> --ldappassword <passwd>.
|
||||
|
||||
Cleaned up CRL parsing, signature evaluation a bit, changed
|
||||
datetime format in config file to ISO, added version string to
|
||||
contents format and cache file clean up code in case of mismatch.
|
||||
|
||||
2002-01-14 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Use dirmngr_opt.homedir for storing the db. Added Makefile.am to
|
||||
tests, bugfixes.
|
||||
|
||||
* First code.
|
||||
Things that work:
|
||||
Loading/saving database (paths hardcoded)
|
||||
Fetching CRL from hardcoded server, parsing and inserting in database
|
||||
Answer ISVALID xxx.yyy requests
|
||||
|
||||
Things that are missing:
|
||||
Some error-checking/handling
|
||||
Proper autoconf handling of gdbm and OpenLDAP
|
||||
Signature checking downloaded CRLs
|
||||
Answer LOOKUP requests
|
||||
...
|
||||
|
||||
How to test:
|
||||
cd tests
|
||||
ldapsearch -v -x -h www.trustcenter.de -b '<some-users-DN>' userCertificate -t
|
||||
cp /tmp/<cert-file> testcert.der
|
||||
./test-dirmngr
|
||||
|
||||
==END OLDEST CHANGELOG==
|
||||
|
||||
Copyright 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
2011 Free Software Foundation, Inc.
|
||||
|
@ -1,3 +1,7 @@
|
||||
[ This is the ChangeLog from the former keyserver/ directory which
|
||||
kept the old gpgkeys_* keyserver access helpers. We keep it here
|
||||
to document the history of certain keyserver relates features. ]
|
||||
|
||||
2011-12-01 Werner Koch <wk@g10code.com>
|
||||
|
||||
NB: ChangeLog files are no longer manually maintained. Starting
|
@ -1,806 +0,0 @@
|
||||
There are old Dirmngr ChangeLog entries.
|
||||
|
||||
2004-10-04 Werner Koch <wk@g10code.com>
|
||||
|
||||
* src/dirmngr.c: Changed an help entry description.
|
||||
|
||||
2004-09-30 Werner Koch <wk@g10code.com>
|
||||
|
||||
* src/dirmngr.c (i18n_init): Always use LC_ALL.
|
||||
|
||||
2004-09-28 Werner Koch <wk@g10code.com>
|
||||
|
||||
Released 0.5.6.
|
||||
|
||||
* config.guess, config.sub: Updated.
|
||||
|
||||
2004-06-21 Werner Koch <wk@g10code.com>
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Bad hack to use the right attribute.
|
||||
|
||||
2004-05-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.5.
|
||||
|
||||
* src/ldap.c (start_cert_fetch_ldap, start_cert_fetch_ldap): More
|
||||
detailed error messages.
|
||||
|
||||
* src/crlcache.c (update_dir): Handle i-records properly.
|
||||
|
||||
2004-04-29 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.4.
|
||||
|
||||
* src/crlcache.h (crl_cache_result_t): Add CRL_CACHE_CANTUSE.
|
||||
* src/server.c (cmd_isvalid): Handle it here.
|
||||
* src/crlcache.c (crl_cache_isvalid): Issue this code if the CRL
|
||||
cant be used.
|
||||
(open_dir): Parse new fields 8,9 and 10 as well as the invalid flag.
|
||||
(write_dir_line_crl): Write new fields.
|
||||
(get_crl_number, get_auth_key_id): New.
|
||||
(crl_cache_insert): Fill new fields. Mark the entry invalid if
|
||||
the CRL is too old after an update or an unknown critical
|
||||
extension was seen.
|
||||
(list_one_crl_entry): Print the new fields.
|
||||
|
||||
2004-04-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Requires libksba 0.9.6.
|
||||
|
||||
* src/dirmngr.c: New option --ocsp-signer.
|
||||
* src/dirmngr.h (opt): Renamed member OCSP_REPONDERS to
|
||||
OCSP_RESPONDER and made ist a simple string. Add OCSP_SIGNER.
|
||||
* src/ocsp.c (ocsp_isvalid): Changed it accordingly.
|
||||
(ocsp_isvalid): Pass the ocsp_signer to check_signature.
|
||||
(check_signature): New arg SIGNER_FPR. Use it to retrieve the
|
||||
certificate. Factored out common code to ..
|
||||
(check_signature_core): .. New.
|
||||
|
||||
2004-04-27 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/server.c (start_command_handler): Keep track of the first
|
||||
connection.
|
||||
(dirmngr_tick): New.
|
||||
* src/ldap.c (attr_fetch_fun_reader): Call it from time to time.
|
||||
|
||||
2004-04-23 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main): Removed the add-servers option from the
|
||||
gpgconf list. It is not really useful.
|
||||
|
||||
2004-04-02 Thomas Schwinge <schwinge@nic-nac-project.de>
|
||||
|
||||
* autogen.sh: Added ACLOCAL_FLAGS.
|
||||
|
||||
2004-04-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (update_dir): Do not double close FPOUT.
|
||||
|
||||
2004-04-09 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/cdblib.c (cdb_make_start): Wipeout the entire buffer to
|
||||
shutup valgrind.
|
||||
(ewrite): Fixed writing bad data on EINTR.
|
||||
|
||||
* src/ldap.c (get_attr_from_result_ldap): Fixed bad copy and
|
||||
terminate of a string.
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Fixed freeing of VALUE on error.
|
||||
|
||||
2004-04-07 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.h (server_control_s): Add member force_crl_refresh.
|
||||
* src/server.c (option_handler): New.
|
||||
(start_command_handler): Register option handler
|
||||
* src/crlcache.c (crl_cache_isvalid): Add arg FORCE_REFRESH.
|
||||
(crl_cache_insert): Record last refresh in memory.
|
||||
|
||||
* src/server.c (inquire_cert_and_load_crl): Renamed from
|
||||
inquire_cert.
|
||||
|
||||
2004-04-06 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.3
|
||||
|
||||
* doc/dirmngr.texi: Updated.
|
||||
* doc/texinfo.tex: Updated.
|
||||
|
||||
2004-04-05 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/ocsp.c (ocsp_isvalid): Check THIS_UPDATE.
|
||||
|
||||
* src/misc.c (add_isotime): New.
|
||||
(date2jd, jd2date, days_per_month, days_per_year): New. Taken from
|
||||
my ancient (1988) code used in Wedit (time2.c).
|
||||
|
||||
2004-04-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh: Check gettext version.
|
||||
* configure.ac: Add AM_GNU_GETTEXT.
|
||||
|
||||
2004-04-02 gettextize <bug-gnu-gettext@gnu.org>
|
||||
|
||||
* Makefile.am (SUBDIRS): Add intl.
|
||||
(EXTRA_DIST): Add config.rpath.
|
||||
* configure.ac (AC_CONFIG_FILES): Add intl/Makefile,
|
||||
|
||||
2004-04-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Add i18n at most places.
|
||||
|
||||
* src/dirmngr.c (i18n_init): New.
|
||||
(main): Call it.
|
||||
* src/dirmngr.h: Add i18n stuff.
|
||||
|
||||
2004-04-01 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/misc.c (get_fingerprint_hexstring): New.
|
||||
|
||||
* src/server.c (dirmngr_status): New.
|
||||
|
||||
2004-03-26 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Add AC_SYS_LARGEFILE.
|
||||
|
||||
* doc/dirmngr.texi: Changed the license to the GPL as per message
|
||||
by Mathhias Kalle Dalheimer of Klaralvdalens-Datakonsult dated
|
||||
Jan 7, 2004.
|
||||
* doc/fdl.texi: Removed.
|
||||
|
||||
2004-03-25 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main): New command --fetch-crl.
|
||||
|
||||
2004-03-23 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c: New option --allow-ocsp.
|
||||
* src/server.c (cmd_isvalid): Make use of allow_ocsp.
|
||||
|
||||
2004-03-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main) <gpgconf>: Fixed default value quoting.
|
||||
|
||||
2004-03-16 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (main): Add ocsp-responder to the gpgconf list.
|
||||
Add option --debug-level.
|
||||
(set_debug): New.
|
||||
|
||||
2004-03-15 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/misc.c (canon_sexp_to_grcy): New.
|
||||
|
||||
2004-03-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Hack to substitute http for https.
|
||||
|
||||
2004-03-10 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file): Don't skip the entire
|
||||
file on errors.
|
||||
|
||||
2004-03-09 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (my_ksba_hash_buffer): New.
|
||||
(main): Initialize the internal libksba hashing.
|
||||
|
||||
* src/server.c (get_issuer_cert_local): Renamed to ...
|
||||
(get_cert_local): ... this. Changed all callers. Allow NULL for
|
||||
ISSUER to return the current target cert.
|
||||
(get_issuing_cert_local): New.
|
||||
(do_get_cert_local): Moved common code to here.
|
||||
|
||||
2004-03-06 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.2.
|
||||
|
||||
* configure.ac: Fixed last change to check the API version of
|
||||
libgcrypt.
|
||||
|
||||
2004-03-05 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Also check the SONAME of libgcrypt.
|
||||
|
||||
2004-03-03 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c: New option --ocsp-responder.
|
||||
* src/dirmngr.h (opt): Add member OCSP_RESPONDERS.
|
||||
|
||||
2004-02-26 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/server.c (start_command_handler): Corrected typo and made
|
||||
dirmngr output it's version in the greeting message.
|
||||
|
||||
2004-02-24 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* src/dirmngr.c (DEFAULT_ADD_SERVERS): Removed. If this were
|
||||
true, there'd be no way to disable it.
|
||||
(main): Dump options in new gpgconf format.
|
||||
|
||||
2004-02-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* autogen.sh (check_version): Removed bashism and simplified.
|
||||
|
||||
2004-02-06 Moritz Schulte <mo@g10code.com>
|
||||
|
||||
* src/crlfetch.c (crl_fetch_default): Do not dereference VALUE,
|
||||
when checking for non-zero.
|
||||
|
||||
2004-02-01 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* src/dirmngr.c (DEFAULT_ADD_SERVERS, DEFAULT_MAX_REPLIES)
|
||||
(DEFAULT_LDAP_TIMEOUT): New macros.
|
||||
(main): Use them.
|
||||
(enum cmd_and_opt_values): New command aGPGConfList.
|
||||
(main): Add handler here.
|
||||
|
||||
2004-01-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Added AC_CHECK_FUNCS tests again, because the
|
||||
other test occurrences belong to the jnlib tests block.
|
||||
|
||||
2004-01-15 Moritz Schulte <mo@g10code.com>
|
||||
|
||||
* configure.ac: Fixed funopen replacement mechanism; removed
|
||||
unnecessary AC_CHECK_FUNCS calls.
|
||||
|
||||
2004-01-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (list_one_crl_entry): Don't use putchar.
|
||||
|
||||
* src/server.c (cmd_listcrls): New.
|
||||
|
||||
2003-12-23 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.1.
|
||||
|
||||
2003-12-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac (CFLAGS): Add -Wformat-noliteral in gcc +
|
||||
maintainer mode.
|
||||
(NEED_LIBASSUAN_VERSION): Bump up to 0.6.2.
|
||||
|
||||
2003-12-16 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* configure.ac: Update the tests for jnlib.
|
||||
* src/dirmngr.c (main): Ignore SIGPIPE in server mode.
|
||||
|
||||
2003-12-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (hash_dbfile): Also hash version info of the
|
||||
cache file format.
|
||||
|
||||
* src/Makefile.am (dirmngr_SOURCES): Add http.h.
|
||||
|
||||
* configure.ac: Removed checking for DB2. Add checking for mmap.
|
||||
* src/cdb.h, src/cdblib.h: New. Add a few comments from the
|
||||
original man page and fixed typos.
|
||||
* src/cdblib.c (cdb_findinit, cdb_findnext): Modified to allow
|
||||
walking over all entries.
|
||||
* src/crlcache.h: Removed DB2/4 cruft.
|
||||
(release_one_cache_entry, lock_db_file, crl_parse_insert)
|
||||
(crl_cache_insert, crl_cache_isvalid, list_one_crl_entry): Use the
|
||||
new CDB interface.
|
||||
|
||||
* src/dirmngr.c: Beautified the help messages.
|
||||
(wrong_args): New.
|
||||
(main): new option --force. Revamped the command handling code.
|
||||
Allow to pass multiple CRLS as well as stdin to --local-crl.
|
||||
* src/crlcache.c (crl_cache_insert): Make --force work.
|
||||
|
||||
2003-12-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Enhanced to allow fetching binary
|
||||
data using HTTP.
|
||||
* src/http.c, src/http.h: Replaced by the code from gnupg 1.3 and
|
||||
modified acording to our needs.
|
||||
(read_line): New. Based on the code from GnuPG's iobuf_read_line.
|
||||
* configure.ac: Check for getaddrinfo.
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file): Close the stream.
|
||||
(main): Free ldapfile.
|
||||
|
||||
* src/ocsp.c, src/ocsp.h: New. Albeit not functionality.
|
||||
|
||||
* src/server.c (inquire_cert): Catch EOF when reading dist points.
|
||||
|
||||
* src/crlcache.c (hash_dbfile, check_dbfile): New.
|
||||
(lock_db_file, crl_cache_insert): Use them here to detect
|
||||
corrupted CRL files.
|
||||
(open_dir): Read the new dbfile hash field.
|
||||
|
||||
* src/crlfetch.c (crl_fetch, crl_fetch_default): Changed to retrun
|
||||
a stream.
|
||||
(fun_reader, fun_closer, setup_funopen): New.
|
||||
* src/server.c (inquire_cert): Changed to use the new stream interface
|
||||
of crlfetch.c.
|
||||
|
||||
2003-12-10 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/funopen.c: New.
|
||||
* configure.ac (funopen): Add test.
|
||||
* src/Makefile.am (dirmngr_LDADD): Add LIBOBJS.
|
||||
|
||||
* src/crlcache.c (next_line_from_file): Remove the limit on the
|
||||
line length.
|
||||
(crl_cache_new): Removed.
|
||||
(open_dbcontent): New.
|
||||
(crl_cache_init): Use it here.
|
||||
(crl_cache_flush): The DB content fie is now in the cache
|
||||
directory, so we can simplify it.
|
||||
(make_db_file_name, lock_db_file, unlock_db_file): New.
|
||||
(release_cache): Close the cached DB files.
|
||||
(crl_cache_isvalid): Make use of the new lock_db_file.
|
||||
(crl_cache_insert): Changed to take a stream as argument.
|
||||
(crl_parse_insert): Rewritten to use a temporary DB and to avoid
|
||||
using up large amounts of memory.
|
||||
(db_entry_new): Removed.
|
||||
(release_cache,release_one_cache_entry): Splitted up.
|
||||
(find_entry): Take care of the new deleted flag.
|
||||
(crl_cache_load): Simplified becuase we can now pass a FP to the
|
||||
insert code.
|
||||
(save_contents): Removed.
|
||||
(update_dir): New.
|
||||
(open_dbcontent_file): Renamed to open_dir_file.
|
||||
(check_dbcontent_version): Renamed to check_dir_version.
|
||||
(open_dbcontent): Renamed to open_dir.
|
||||
|
||||
* src/dirmngr.c: New option --faked-system-time.
|
||||
* src/misc.c (faked_time_p, set_time, get_time): New. Taken from GnuPG.
|
||||
(check_isotime): New.
|
||||
(unpercent_string): New.
|
||||
|
||||
2003-12-09 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.h (DBDIR,DBCONTENTFILE): Changed value.
|
||||
|
||||
* autogen.sh: Reworked.
|
||||
* README.CVS: New.
|
||||
* configure.ac: Added min_automake_version.
|
||||
|
||||
2003-12-03 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/server.c (cmd_lookup): Send an END line after each
|
||||
certificate.
|
||||
|
||||
2003-11-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/Makefile.am (dirmngr_LDADD): Remove DB_LIBS
|
||||
because it never got defined and -ldb{2,4} is implictly set
|
||||
by the AC_CHECK_LIB test in configure.
|
||||
|
||||
* src/crlcache.c (mydbopen): DB4 needs an extra parameter; I
|
||||
wonder who ever tested DB4 support. Add an error statement in
|
||||
case no DB support is configured.
|
||||
|
||||
* tests/Makefile.am: Don't use AM_CPPFLAGS but AM_CFLAGS, replaced
|
||||
variables by configure templates.
|
||||
* src/Makefile.am: Ditto.
|
||||
|
||||
2003-11-19 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (list_one_crl_entry): Define X to nothing for non
|
||||
DB4 systems. Thanks to Luca M. G. Centamore.
|
||||
|
||||
2003-11-17 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Released 0.5.0
|
||||
|
||||
* src/crlcache.c (crl_cache_new): Fixed eof detection.
|
||||
|
||||
* src/server.c (cmd_loadcrl): Do the unescaping.
|
||||
|
||||
* doc/dirmngr.texi: Added a history section for this modified
|
||||
version.
|
||||
|
||||
2003-11-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* tests/asschk.c: New. Taken from GnuPG.
|
||||
* tests/Makefile.am: Added asschk.
|
||||
|
||||
2003-11-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/ldap.c (fetch_next_cert_ldap): Get the pattern switching
|
||||
right.
|
||||
|
||||
* tests/test-dirmngr.c: Replaced a couple of deprecated types.
|
||||
|
||||
* configure.ac (GPG_ERR_SOURCE_DEFAULT): Added.
|
||||
(fopencookie, asprintf): Removed unneeded test.
|
||||
(PRINTABLE_OS_NAME): Updated the test from gnupg.
|
||||
(CFLAGS): Do full warnings only in maintainer mode. Add flag
|
||||
--enable gcc-warnings to override it and to enable even more
|
||||
warnings.
|
||||
* acinclude.m4: Removed the libgcrypt test.
|
||||
|
||||
* src/ldap.c (get_attr_from_result_ldap): Simplified the binary
|
||||
hack and return a proper gpg error.
|
||||
(attr_fetch_ldap_internal): Changed error handling.
|
||||
(attr_fetch_ldap): Reworked. Return configuration error if no
|
||||
servers are configured.
|
||||
(url_fetch_ldap, add_server_to_servers)
|
||||
(url_fetch_ldap_internal): Reworked.
|
||||
(struct cert_fetch_context_s): New to get rid of a global state.
|
||||
(start_cert_fetch_ldap): Allocate context and do a bind with a
|
||||
timeout. Parse pattern.
|
||||
(end_cert_fetch_ldap): Take context and don't return anything.
|
||||
(find_next_pattern): Removed.
|
||||
(parse_one_pattern): Redone.
|
||||
(get_cert_ldap): Redone.
|
||||
* src/server.c (cmd_lookup): Changed for changed fetch functions.
|
||||
|
||||
* doc/dirmngr.texi: Reworked a bit to get rid of tex errors.
|
||||
|
||||
* configure.ac: Enable makeinfo test.
|
||||
|
||||
* src/crlcache.c (crl_cache_insert): Fixed for latest KSBA API
|
||||
changes.
|
||||
* tests/test-dirmngr.c (main): Ditto. Also added some more error
|
||||
checking.
|
||||
|
||||
2003-11-11 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/cert.c (hashify_data, hexify_data, serial_hex)
|
||||
(serial_to_buffer): Moved all to ...
|
||||
* src/misc.c: .. here.
|
||||
* src/Makefile.am (cert.c, cert.h): Removed.
|
||||
* cert.c, cert.h: Removed.
|
||||
|
||||
* m4/: New.
|
||||
* configure.ac, Makefile.am: Include m4 directory support, updated
|
||||
required library versions.
|
||||
|
||||
* src/cert.c (make_cert): Removed.
|
||||
|
||||
* src/ldap.c (fetch_next_cert_ldap): Return a gpg style error.
|
||||
|
||||
* src/misc.h (copy_time): New.
|
||||
* src/misc.c (get_isotime): New.
|
||||
(iso_string2time, iso_time2string): Removed.
|
||||
(unhexify): New.
|
||||
|
||||
* src/crlcache.h (DBCONTENTSVERSION): Bumbed to 0.6.
|
||||
* src/crlcache.c (finish_sig_check): New. Factored out from
|
||||
crl_parse_insert and entirely redone.
|
||||
(do_encode_md): Removed.
|
||||
(print_time): Removed
|
||||
(crl_cache_isvalid): Reworked.
|
||||
|
||||
2003-11-10 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (make_db_val, parse_db_val): Removed.
|
||||
|
||||
* src/cert.c (serial_to_buffer): New.
|
||||
|
||||
* src/server.c (get_issuer_cert_local): Rewritten.
|
||||
|
||||
* src/crlcache.c (crl_parse_insert): Rewritten. Takes now a CTRL
|
||||
instead of the Assuan context. Changed caller accordingly.
|
||||
(get_issuer_cert): Cleaned up.
|
||||
|
||||
* src/crlfetch.c (crl_fetch): Changed VALUE to unsigned char* for
|
||||
documentation reasons. Make sure that VALUE is released on error.
|
||||
(crl_fetch_default, ca_cert_fetch): Ditto.
|
||||
|
||||
* src/crlcache.c (release_cache): New.
|
||||
(crl_cache_deinit): Use it here.
|
||||
(crl_cache_flush): Redone.
|
||||
(save_contents): Redone.
|
||||
(crl_cache_list, list_one_crl_entry): Print error messages.
|
||||
|
||||
2003-11-06 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/crlcache.c (create_directory_if_needed, cleanup_cache_dir):
|
||||
New. Factored out from crl_cache_new and mostly rewritten.
|
||||
(crl_cache_new): Rewritten.
|
||||
(next_line_from_file): New.
|
||||
(find_entry): Cleaned up.
|
||||
(crl_cache_deinit): Cleaned up.
|
||||
|
||||
* src/dirmngr.c (dirmngr_init_default_ctrl): New stub.
|
||||
* src/dirmngr.h (ctrl_t): New.
|
||||
(DBG_ASSUAN,...): Added the usual debug test macros.
|
||||
* src/server.c: Removed the GET_PTR cruft, replaced it by ctrl_t.
|
||||
Removed the recursion flag.
|
||||
(get_issuer_cert_local): Allow for arbitary large
|
||||
certificates. 4096 is definitely too small.
|
||||
(inquire_cert): Ditto.
|
||||
(start_command_handler): Set a hello line and call the default
|
||||
init function.
|
||||
(cmd_isvalid): Rewritten.
|
||||
(inquire_cert): Removed unused arg LINE. General cleanup.
|
||||
(map_assuan_err,map_to_assuan_status): New. Taken from gnupg 1.9.
|
||||
(cmd_lookup): Rewritten.
|
||||
(cmd_loadcrl): Started to rewrite it.
|
||||
|
||||
2003-10-29 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file): Entirely rewritten.
|
||||
(cleanup): New.
|
||||
(main): Cleaned up.
|
||||
|
||||
2003-10-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/dirmngr.h: Renamed dirmngr_opt to opt.
|
||||
|
||||
* src/dirmngr.c (parse_ldapserver_file, free_ldapservers_list):
|
||||
Moved with this file. Cleaned up. Replaced too deep recursion in
|
||||
the free function.
|
||||
|
||||
2003-10-21 Werner Koch <wk@gnupg.org>
|
||||
|
||||
Changed all occurrences of assuan.h to use use the system provided
|
||||
one.
|
||||
* src/server.c (register_commands): Adjusted for Assuan API change.
|
||||
|
||||
2003-08-14 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/Makefile.am: s/LIBKSBA_/KSBA_/. Changed for external Assuan lib.
|
||||
* tests/Makefile.am: Ditto.
|
||||
|
||||
* configure.ac: Partly restructured, add standard checks for
|
||||
required libraries, removed included libassuan.
|
||||
* Makefile.am (SUBDIRS): Removed assuan becuase we now use the
|
||||
libassuan package.
|
||||
|
||||
* src/dirmngr.c (main): Properly initialize Libgcrypt and libksba.
|
||||
|
||||
2003-08-13 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* src/server.c (get_issuer_cert_local): Print error using
|
||||
assuan_strerror.
|
||||
|
||||
* src/crlcache.c (do_encode_md, start_sig_check): Adjust for
|
||||
changed Libgcrypt API.
|
||||
|
||||
2003-06-19 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Upped version to 0.4.7-cvs.
|
||||
|
||||
2003-06-19 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Release 0.4.6.
|
||||
|
||||
2003-06-17 Bernhard Reiter <bernhard@intevation.de>
|
||||
|
||||
* src/ldap.c (url_fetch_ldap()):
|
||||
try other default servers when an url with hostname failed
|
||||
* AUTHORS: added Steffen and Werner
|
||||
* THANKS: Thanked people in the ChangeLog and the Ägypten-Team
|
||||
|
||||
|
||||
2003-06-16 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac, src/crlcache.h, src/crlcache.c: Added db4 support.
|
||||
* src/Makefile.am, tests/Makefile.am: Removed automake warning.
|
||||
* tests/test-dirmngr.c: Removed a warning.
|
||||
|
||||
2003-05-12 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* doc/Makefile.am: Added dirmngr.ops to DISTCLEANFILES.
|
||||
* ChangeLog, doc/ChangeLog, src/ChangeLog: Merged dirmngr ChangeLogs
|
||||
into one toplevel file.
|
||||
* acinclude.m4, configure.ac: Renamed PFX to PATH for consistency.
|
||||
|
||||
2003-05-12 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/ldap.c: Fixed end-of-certificates-list indication.
|
||||
|
||||
2003-05-08 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/server.c: Fixed iteration over server list
|
||||
|
||||
2003-02-23 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/crlcache.h, src/crlcache.c, src/dirmngr.c: Implemented --flush command.
|
||||
|
||||
2003-02-07 Marcus Brinkmann <marcus@g10code.de>
|
||||
|
||||
* configure.ac: Release 0.4.4.
|
||||
|
||||
2003-02-05 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/ldap.c: Try harder with and without ";binary" in the
|
||||
attribute name when fetching certificates.
|
||||
* src/ldap.c, src/server.c: Support multiple userCertificate attributes
|
||||
per entry.
|
||||
|
||||
2003-02-04 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* src/ldap.c: Include the sn attribute in the search filter.
|
||||
Better log messages.
|
||||
|
||||
2002-11-20 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Doc updates (fixes #1373)
|
||||
* Fix for #1419 (crash in free_ldapservers_list())
|
||||
* Fix for #1375. Dirmngr now asks back with an INQUIRE SENDCERT before
|
||||
querying the LDAP servers for an issuer certificate to validate a CRL
|
||||
|
||||
2002-11-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* config.sub, config.guess: Updated from ftp.gnu.org/gnu/config
|
||||
to version 2002-11-08.
|
||||
|
||||
2002-11-12 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* dirmngr.c (main) <load_crl_filename>: Better pass NULL instead
|
||||
of an unitialized Assuan context. Let's hope that the other
|
||||
functions can cope with this.
|
||||
|
||||
2002-10-25 Bernhard Reiter <bernhard@intevation.de>
|
||||
|
||||
* src/ldap.c (get_attr_from_result_ldap()):
|
||||
added value extraction retry for CRLs and Certs without ";binary"
|
||||
* changed version number to reflect cvs status to "0.4.3-cvs"
|
||||
|
||||
2002-08-21 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* dirmngr.c (main): Changed default homedir to .gnupg.
|
||||
|
||||
2002-08-07 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Added configure check to examine whether db2 cursor() uses 3 or
|
||||
4 parameters.
|
||||
|
||||
2002-07-31 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* doc/dirmngr.texi: Fixed the structure and added menu entries
|
||||
for the other nodes.
|
||||
|
||||
2002-07-30 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Added doc dir and first steps towards manual.
|
||||
|
||||
2002-07-29 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Got rid of the default server for CRL lookup. We now use the
|
||||
same list of servers that we use for cert. lookup.
|
||||
|
||||
2002-07-29 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* New option --add-servers to allow dirmngr to add LDAP servers
|
||||
found in CRL distribution points to the list of servers it
|
||||
searches. NOTE: The added servers are only active in the currently
|
||||
running dirmngr -- the info isn't written to persistens storage.
|
||||
|
||||
2002-07-26 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Default LDAP timeout is 100 seconds now.
|
||||
|
||||
* Use DB2 instead of DB1. Check for libresolv, fixed bug when
|
||||
libldap was found in the default search path.
|
||||
|
||||
2002-07-22 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Implemented --load-crl <filename> option. Also available as
|
||||
LOADCRL assuan command when in server mode.
|
||||
|
||||
2002-07-22 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Implemented new option --ldaptimeout to specify the number of seconds to
|
||||
wait for an LDAP request before timeout.
|
||||
|
||||
* Added --list-crls option to print the contents of the CRL cache
|
||||
* Added some items to the dbcontents file to make printout nicer
|
||||
and updated it's version number
|
||||
|
||||
2002-07-02 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* crlcache.c (crl_parse_insert): Fixed log_debug format string.
|
||||
|
||||
2002-07-02 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Use DB->get() return value correctly.
|
||||
|
||||
2002-06-28 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* crlcache.c (crl_parse_insert): Keep track of newly allocated
|
||||
ENTRY so that we don't free existing errors after a bad signature.
|
||||
|
||||
* dirmngr.h: Include prototype for start_command_handler.
|
||||
|
||||
* crlfetch.c, crlcache.c, http.c, cert.c, ldap.c: Include
|
||||
config.h.
|
||||
|
||||
* crlcache.c (crl_parse_insert): Fixed format type specifiers for
|
||||
time_t variables in log_debug.
|
||||
|
||||
* error.h: Use log_debug instead of dirmngr_debug. Changed all
|
||||
callers.
|
||||
* Makefile.am (dirmngr_SOURCES): Removed error.c
|
||||
|
||||
* dirmngr.c (main): Register gcrypt malloc functions with ksba so
|
||||
that we don't run into problems by using the wrong free function.
|
||||
The gcrypt malloc function have the additional benefit of a
|
||||
providing allocation sanity checks when compiled with that
|
||||
feature.
|
||||
|
||||
* crlcache.c (get_issuer_cert): Use xfree instead of ksba_free.
|
||||
|
||||
|
||||
2002-06-27 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* ldap.c: Look for both userCertificate and caCertificate
|
||||
|
||||
2002-06-26 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* configure.ac: Upped version number to 0.3.1
|
||||
|
||||
2002-06-25 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* server.c (cmd_lookup): Use assuan_write_status which ensures a
|
||||
correct syntax.
|
||||
|
||||
2002-06-20 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* crlcache.c (crl_cache_isvalid): Started with some nicer logging.
|
||||
However, this will need a lot more work.
|
||||
(get_issuer_cert): Ditto.
|
||||
|
||||
* dirmngr.c (main): Changed required libgcrypt version and don't
|
||||
print the prefix when using a logfile.
|
||||
|
||||
2002-06-20 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* tests/Makefile.am (TESTS): Removed test-dirmngr because it
|
||||
is not a proper test program.
|
||||
(EXTRA_DIST): Removed the non-existent test certificate.
|
||||
|
||||
2002-05-21 Werner Koch <wk@gnupg.org>
|
||||
|
||||
* server.c (start_command_handler): Enable assuan debugging.
|
||||
|
||||
2002-05-08 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Replaced gdbm check with db1 check
|
||||
|
||||
2002-05-08 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Replaced gdbm with db1, updated file format version
|
||||
|
||||
2002-03-01 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Added gdbm configure check
|
||||
|
||||
2002-01-23 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Return ASSUAN_CRL_Too_Old if the CRL is too old
|
||||
|
||||
|
||||
2002-01-17 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
Added commandline options --ldapserver <host> --ldapport <port>
|
||||
--ldapuser <user> --ldappassword <passwd>.
|
||||
|
||||
Cleaned up CRL parsing, signature evaluation a bit, changed
|
||||
datetime format in config file to ISO, added version string to
|
||||
contents format and cache file clean up code in case of mismatch.
|
||||
|
||||
2002-01-14 Steffen Hansen <steffen@klaralvdalens-datakonsult.se>
|
||||
|
||||
* Use dirmngr_opt.homedir for storing the db. Added Makefile.am to
|
||||
tests, bugfixes.
|
||||
|
||||
* First code.
|
||||
Things that work:
|
||||
Loading/saving database (paths hardcoded)
|
||||
Fetching CRL from hardcoded server, parsing and inserting in database
|
||||
Answer ISVALID xxx.yyy requests
|
||||
|
||||
Things that are missing:
|
||||
Some error-checking/handling
|
||||
Proper autoconf handling of gdbm and OpenLDAP
|
||||
Signature checking downloaded CRLs
|
||||
Answer LOOKUP requests
|
||||
...
|
||||
|
||||
How to test:
|
||||
cd tests
|
||||
ldapsearch -v -x -h www.trustcenter.de -b '<some-users-DN>' userCertificate -t
|
||||
cp /tmp/<cert-file> testcert.der
|
||||
./test-dirmngr
|
||||
|
||||
Local Variables:
|
||||
buffer-read-only: t
|
||||
End:
|
@ -19,7 +19,7 @@
|
||||
|
||||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
EXTRA_DIST = OAUTHORS ONEWS ChangeLog.1 ChangeLog-2011
|
||||
EXTRA_DIST = OAUTHORS ONEWS ChangeLog-2011
|
||||
|
||||
bin_PROGRAMS = dirmngr dirmngr-client
|
||||
|
||||
|
@ -1,382 +0,0 @@
|
||||
/* curl-shim.c - Implement a small subset of the curl API in terms of
|
||||
* the iobuf HTTP API
|
||||
*
|
||||
* Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "util.h"
|
||||
#include "http.h"
|
||||
#include "ksutil.h"
|
||||
#include "curl-shim.h"
|
||||
|
||||
static CURLcode
|
||||
handle_error(CURL *curl,CURLcode err,const char *str)
|
||||
{
|
||||
if(curl->errorbuffer)
|
||||
{
|
||||
/* Make sure you never exceed CURL_ERROR_SIZE, currently set to
|
||||
256 in curl-shim.h */
|
||||
switch(err)
|
||||
{
|
||||
case CURLE_OK:
|
||||
strcpy(curl->errorbuffer,"okay");
|
||||
break;
|
||||
|
||||
case CURLE_UNSUPPORTED_PROTOCOL:
|
||||
strcpy(curl->errorbuffer,"unsupported protocol");
|
||||
break;
|
||||
|
||||
case CURLE_COULDNT_CONNECT:
|
||||
strcpy(curl->errorbuffer,"couldn't connect");
|
||||
break;
|
||||
|
||||
case CURLE_WRITE_ERROR:
|
||||
strcpy(curl->errorbuffer,"write error");
|
||||
break;
|
||||
|
||||
case CURLE_HTTP_RETURNED_ERROR:
|
||||
sprintf(curl->errorbuffer,"url returned error %u",curl->status);
|
||||
break;
|
||||
|
||||
default:
|
||||
strcpy(curl->errorbuffer,"generic error");
|
||||
break;
|
||||
}
|
||||
|
||||
if(str && (strlen(curl->errorbuffer)+2+strlen(str)+1)<=CURL_ERROR_SIZE)
|
||||
{
|
||||
strcat(curl->errorbuffer,": ");
|
||||
strcat(curl->errorbuffer,str);
|
||||
}
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
CURLcode
|
||||
curl_global_init(long flags)
|
||||
{
|
||||
(void)flags;
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
void
|
||||
curl_global_cleanup(void) {}
|
||||
|
||||
CURL *
|
||||
curl_easy_init(void)
|
||||
{
|
||||
CURL *handle;
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
w32_init_sockets ();
|
||||
#endif
|
||||
|
||||
handle=calloc(1,sizeof(CURL));
|
||||
if(handle)
|
||||
handle->errors=stderr;
|
||||
|
||||
return handle;
|
||||
}
|
||||
|
||||
void
|
||||
curl_easy_cleanup(CURL *curl)
|
||||
{
|
||||
if (curl)
|
||||
{
|
||||
http_close (curl->hd, 0);
|
||||
free(curl);
|
||||
}
|
||||
}
|
||||
|
||||
CURLcode
|
||||
curl_easy_setopt(CURL *curl,CURLoption option,...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap,option);
|
||||
|
||||
switch(option)
|
||||
{
|
||||
case CURLOPT_URL:
|
||||
curl->url=va_arg(ap,char *);
|
||||
break;
|
||||
case CURLOPT_USERPWD:
|
||||
curl->auth=va_arg(ap,char *);
|
||||
break;
|
||||
case CURLOPT_WRITEFUNCTION:
|
||||
curl->writer=va_arg(ap,write_func);
|
||||
break;
|
||||
case CURLOPT_FILE:
|
||||
curl->file=va_arg(ap,void *);
|
||||
break;
|
||||
case CURLOPT_ERRORBUFFER:
|
||||
curl->errorbuffer=va_arg(ap,char *);
|
||||
break;
|
||||
case CURLOPT_PROXY:
|
||||
curl->proxy=va_arg(ap,char *);
|
||||
break;
|
||||
case CURLOPT_POST:
|
||||
curl->flags.post=va_arg(ap,long)?1:0;
|
||||
break;
|
||||
case CURLOPT_POSTFIELDS:
|
||||
curl->postfields=va_arg(ap,char *);
|
||||
break;
|
||||
case CURLOPT_SRVTAG_GPG_HACK:
|
||||
curl->srvtag=va_arg(ap,char *);
|
||||
break;
|
||||
case CURLOPT_FAILONERROR:
|
||||
curl->flags.failonerror=va_arg(ap,long)?1:0;
|
||||
break;
|
||||
case CURLOPT_VERBOSE:
|
||||
curl->flags.verbose=va_arg(ap,long)?1:0;
|
||||
break;
|
||||
case CURLOPT_STDERR:
|
||||
curl->errors=va_arg(ap,FILE *);
|
||||
break;
|
||||
case CURLOPT_HTTPHEADER:
|
||||
curl->headers=va_arg(ap,struct curl_slist *);
|
||||
break;
|
||||
default:
|
||||
/* We ignore the huge majority of curl options */
|
||||
break;
|
||||
}
|
||||
|
||||
return handle_error(curl,CURLE_OK,NULL);
|
||||
}
|
||||
|
||||
CURLcode
|
||||
curl_easy_perform(CURL *curl)
|
||||
{
|
||||
int rc;
|
||||
CURLcode err=CURLE_OK;
|
||||
const char *errstr=NULL;
|
||||
char *proxy=NULL;
|
||||
|
||||
/* Emulate the libcurl proxy behavior. If the calling program set a
|
||||
proxy, use it. If it didn't set a proxy or set it to NULL, check
|
||||
for one in the environment. If the calling program explicitly
|
||||
set a null-string proxy the http code doesn't use a proxy at
|
||||
all. */
|
||||
|
||||
if(curl->proxy)
|
||||
proxy=curl->proxy;
|
||||
else
|
||||
proxy=getenv(HTTP_PROXY_ENV);
|
||||
|
||||
if(curl->flags.verbose)
|
||||
{
|
||||
fprintf(curl->errors,"* HTTP proxy is \"%s\"\n",proxy?proxy:"null");
|
||||
fprintf(curl->errors,"* HTTP URL is \"%s\"\n",curl->url);
|
||||
fprintf(curl->errors,"* HTTP auth is \"%s\"\n",
|
||||
curl->auth?curl->auth:"null");
|
||||
fprintf(curl->errors,"* HTTP method is %s\n",
|
||||
curl->flags.post?"POST":"GET");
|
||||
}
|
||||
|
||||
if(curl->flags.post)
|
||||
{
|
||||
rc = http_open (&curl->hd, HTTP_REQ_POST, curl->url, NULL, curl->auth,
|
||||
0, proxy, NULL, curl->srvtag,
|
||||
curl->headers?curl->headers->list:NULL);
|
||||
if (!rc)
|
||||
{
|
||||
unsigned int post_len = strlen(curl->postfields);
|
||||
|
||||
es_fprintf (http_get_write_ptr (curl->hd),
|
||||
"Content-Type: application/x-www-form-urlencoded\r\n"
|
||||
"Content-Length: %u\r\n", post_len);
|
||||
http_start_data (curl->hd);
|
||||
es_write (http_get_write_ptr (curl->hd),
|
||||
curl->postfields, post_len, NULL);
|
||||
|
||||
rc = http_wait_response (curl->hd);
|
||||
curl->status = http_get_status_code (curl->hd);
|
||||
if (!rc && curl->flags.failonerror && curl->status>=300)
|
||||
err = CURLE_HTTP_RETURNED_ERROR;
|
||||
http_close (curl->hd, 0);
|
||||
curl->hd = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rc = http_open (&curl->hd, HTTP_REQ_GET, curl->url, NULL, curl->auth,
|
||||
0, proxy, NULL, curl->srvtag,
|
||||
curl->headers?curl->headers->list:NULL);
|
||||
if (!rc)
|
||||
{
|
||||
rc = http_wait_response (curl->hd);
|
||||
curl->status = http_get_status_code (curl->hd);
|
||||
if (!rc)
|
||||
{
|
||||
if (curl->flags.failonerror && curl->status>=300)
|
||||
err = CURLE_HTTP_RETURNED_ERROR;
|
||||
else
|
||||
{
|
||||
size_t maxlen = 1024;
|
||||
size_t buflen;
|
||||
unsigned int len;
|
||||
char *line = NULL;
|
||||
|
||||
while ((len = es_read_line (http_get_read_ptr (curl->hd),
|
||||
&line, &buflen, &maxlen)))
|
||||
{
|
||||
size_t ret;
|
||||
|
||||
maxlen=1024;
|
||||
|
||||
ret=(curl->writer)(line,len,1,curl->file);
|
||||
if(ret!=len)
|
||||
{
|
||||
err=CURLE_WRITE_ERROR;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
es_free (line);
|
||||
http_close(curl->hd, 0);
|
||||
curl->hd = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
http_close (curl->hd, 0);
|
||||
curl->hd = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
switch(gpg_err_code (rc))
|
||||
{
|
||||
case 0:
|
||||
break;
|
||||
|
||||
case GPG_ERR_INV_URI:
|
||||
err=CURLE_UNSUPPORTED_PROTOCOL;
|
||||
break;
|
||||
|
||||
default:
|
||||
errstr=gpg_strerror (rc);
|
||||
err=CURLE_COULDNT_CONNECT;
|
||||
break;
|
||||
}
|
||||
|
||||
return handle_error(curl,err,errstr);
|
||||
}
|
||||
|
||||
/* This is not the same exact set that is allowed according to
|
||||
RFC-2396, but it is what the real curl uses. */
|
||||
#define VALID_URI_CHARS "abcdefghijklmnopqrstuvwxyz" \
|
||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
|
||||
"0123456789"
|
||||
|
||||
char *
|
||||
curl_escape(char *str,int length)
|
||||
{
|
||||
int len,max,idx,enc_idx=0;
|
||||
char *enc;
|
||||
|
||||
if(length)
|
||||
len=length;
|
||||
else
|
||||
len=strlen(str);
|
||||
|
||||
enc=malloc(len+1);
|
||||
if(!enc)
|
||||
return enc;
|
||||
|
||||
max=len;
|
||||
|
||||
for(idx=0;idx<len;idx++)
|
||||
{
|
||||
if(enc_idx+3>max)
|
||||
{
|
||||
char *tmp;
|
||||
|
||||
max+=100;
|
||||
|
||||
tmp=realloc(enc,max+1);
|
||||
if(!tmp)
|
||||
{
|
||||
free(enc);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
enc=tmp;
|
||||
}
|
||||
|
||||
if(strchr(VALID_URI_CHARS,str[idx]))
|
||||
enc[enc_idx++]=str[idx];
|
||||
else
|
||||
{
|
||||
char numbuf[5];
|
||||
sprintf(numbuf,"%%%02X",str[idx]);
|
||||
strcpy(&enc[enc_idx],numbuf);
|
||||
enc_idx+=3;
|
||||
}
|
||||
}
|
||||
|
||||
enc[enc_idx]='\0';
|
||||
|
||||
return enc;
|
||||
}
|
||||
|
||||
curl_version_info_data *
|
||||
curl_version_info(int type)
|
||||
{
|
||||
static curl_version_info_data data;
|
||||
static const char *protocols[]={"http",NULL};
|
||||
|
||||
(void)type;
|
||||
|
||||
data.protocols=protocols;
|
||||
|
||||
return &data;
|
||||
}
|
||||
|
||||
struct curl_slist *
|
||||
curl_slist_append(struct curl_slist *list,const char *string)
|
||||
{
|
||||
if(!list)
|
||||
{
|
||||
list=calloc(1,sizeof(*list));
|
||||
if(!list)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
add_to_strlist(&list->list,string);
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
void
|
||||
curl_slist_free_all(struct curl_slist *list)
|
||||
{
|
||||
if(list)
|
||||
{
|
||||
free_strlist(list->list);
|
||||
free(list);
|
||||
}
|
||||
}
|
@ -1,111 +0,0 @@
|
||||
/* curl-shim.h
|
||||
* Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GNUPG.
|
||||
*
|
||||
* GNUPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GNUPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef _CURL_SHIM_H_
|
||||
#define _CURL_SHIM_H_
|
||||
|
||||
#include "util.h"
|
||||
#include "http.h"
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CURLE_OK=0,
|
||||
CURLE_UNSUPPORTED_PROTOCOL=1,
|
||||
CURLE_COULDNT_CONNECT=7,
|
||||
CURLE_FTP_COULDNT_RETR_FILE=19,
|
||||
CURLE_HTTP_RETURNED_ERROR=22,
|
||||
CURLE_WRITE_ERROR=23
|
||||
} CURLcode;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
CURLOPT_URL,
|
||||
CURLOPT_USERPWD,
|
||||
CURLOPT_WRITEFUNCTION,
|
||||
CURLOPT_FILE,
|
||||
CURLOPT_ERRORBUFFER,
|
||||
CURLOPT_FOLLOWLOCATION,
|
||||
CURLOPT_MAXREDIRS,
|
||||
CURLOPT_STDERR,
|
||||
CURLOPT_VERBOSE,
|
||||
CURLOPT_SSL_VERIFYPEER,
|
||||
CURLOPT_PROXY,
|
||||
CURLOPT_CAINFO,
|
||||
CURLOPT_POST,
|
||||
CURLOPT_POSTFIELDS,
|
||||
CURLOPT_FAILONERROR,
|
||||
CURLOPT_HTTPHEADER,
|
||||
CURLOPT_SRVTAG_GPG_HACK
|
||||
} CURLoption;
|
||||
|
||||
typedef size_t (*write_func)(char *buffer,size_t size,
|
||||
size_t nitems,void *outstream);
|
||||
|
||||
typedef struct
|
||||
{
|
||||
char *url;
|
||||
char *auth;
|
||||
char *errorbuffer;
|
||||
char *proxy;
|
||||
write_func writer;
|
||||
void *file;
|
||||
char *postfields;
|
||||
char *srvtag;
|
||||
unsigned int status;
|
||||
FILE *errors;
|
||||
struct curl_slist *headers;
|
||||
struct
|
||||
{
|
||||
unsigned int post:1;
|
||||
unsigned int failonerror:1;
|
||||
unsigned int verbose:1;
|
||||
} flags;
|
||||
http_t hd;
|
||||
} CURL;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
const char **protocols;
|
||||
} curl_version_info_data;
|
||||
|
||||
#define CURL_ERROR_SIZE 256
|
||||
#define CURL_GLOBAL_DEFAULT 0
|
||||
#define CURLVERSION_NOW 0
|
||||
|
||||
CURLcode curl_global_init(long flags);
|
||||
void curl_global_cleanup(void);
|
||||
CURL *curl_easy_init(void);
|
||||
CURLcode curl_easy_setopt(CURL *curl,CURLoption option,...);
|
||||
CURLcode curl_easy_perform(CURL *curl);
|
||||
void curl_easy_cleanup(CURL *curl);
|
||||
char *curl_escape(char *str,int len);
|
||||
#define curl_free(x) free(x)
|
||||
#define curl_version() GNUPG_NAME" curl-shim"
|
||||
curl_version_info_data *curl_version_info(int type);
|
||||
|
||||
struct curl_slist
|
||||
{
|
||||
strlist_t list;
|
||||
};
|
||||
|
||||
struct curl_slist *curl_slist_append(struct curl_slist *list,
|
||||
const char *string);
|
||||
void curl_slist_free_all(struct curl_slist *list);
|
||||
|
||||
#endif /* !_CURL_SHIM_H_ */
|
@ -1,211 +0,0 @@
|
||||
#!@PERL@ -w
|
||||
|
||||
# gpg2keys_mailto - talk to a email keyserver
|
||||
# Copyright (C) 2001, 2002 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of GnuPG.
|
||||
#
|
||||
# GnuPG is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# GnuPG is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
use Getopt::Std;
|
||||
$Getopt::Std::STANDARD_HELP_VERSION=1;
|
||||
$sendmail="@SENDMAIL@ -t";
|
||||
|
||||
###
|
||||
|
||||
sub VERSION_MESSAGE ()
|
||||
{
|
||||
print STDOUT "gpg2keys_mailto (GnuPG) @VERSION@\n";
|
||||
}
|
||||
|
||||
sub HELP_MESSAGE ()
|
||||
{
|
||||
print STDOUT <<EOT
|
||||
|
||||
--help Print this help
|
||||
--version Print the version
|
||||
-o FILE Write output to FILE
|
||||
EOT
|
||||
}
|
||||
|
||||
|
||||
|
||||
getopts('o:');
|
||||
|
||||
if(defined($opt_o))
|
||||
{
|
||||
open(STDOUT,">$opt_o") || die "Can't open output file $opt_o\n";
|
||||
}
|
||||
|
||||
if(@ARGV)
|
||||
{
|
||||
open(STDIN,$ARGV[0]) || die "Can't open input file $ARGV[0]\n";
|
||||
}
|
||||
|
||||
while(<STDIN>)
|
||||
{
|
||||
last if($_ eq "\n");
|
||||
|
||||
if(/^COMMAND (\S+)/)
|
||||
{
|
||||
$command=$1;
|
||||
}
|
||||
|
||||
if(/^OPAQUE (\S+)/)
|
||||
{
|
||||
$address=$1;
|
||||
}
|
||||
|
||||
if(/^PROGRAM (\S+)/)
|
||||
{
|
||||
$program=$1;
|
||||
}
|
||||
|
||||
if(/^OPTION (\S+)/)
|
||||
{
|
||||
if($1=~/^verbose$/i)
|
||||
{
|
||||
$verbose++;
|
||||
}
|
||||
elsif($1=~/^no-verbose$/i)
|
||||
{
|
||||
$verbose--;
|
||||
}
|
||||
elsif($1=~/^mail-from=(.+)$/i)
|
||||
{
|
||||
$from=$1;
|
||||
}
|
||||
elsif($1=~/^no-mail-from$/i)
|
||||
{
|
||||
undef $from;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if(!defined($from))
|
||||
{
|
||||
($login,$name)=(getpwuid($<))[0,6];
|
||||
$from="$name <$login>";
|
||||
}
|
||||
|
||||
$program="(unknown)" if(!defined($program));
|
||||
|
||||
if(!defined($address))
|
||||
{
|
||||
print STDERR "gpgkeys: no address provided\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
while(<STDIN>)
|
||||
{
|
||||
last if($_ eq "\n");
|
||||
|
||||
chomp;
|
||||
|
||||
push(@keys,$_);
|
||||
}
|
||||
|
||||
# Send response
|
||||
|
||||
print "VERSION 1\n";
|
||||
print "OPTION OUTOFBAND\n\n";
|
||||
|
||||
# Email keyservers get and search the same way
|
||||
|
||||
if($command=~/get/i || $command=~/search/i)
|
||||
{
|
||||
if($command=~/search/i)
|
||||
{
|
||||
print "COUNT 0\n";
|
||||
}
|
||||
|
||||
foreach $key (@keys)
|
||||
{
|
||||
open(MAIL,"|$sendmail") || die "ERROR: Can't open $sendmail\n";
|
||||
print MAIL "From: $from\n";
|
||||
print MAIL "To: $address\n";
|
||||
if($command=~/get/i)
|
||||
{
|
||||
# mail keyservers don't like long-form keyids
|
||||
|
||||
if(substr($key,0,2) eq "0x")
|
||||
{
|
||||
$key=substr($key,2);
|
||||
}
|
||||
|
||||
if(length($key)>8)
|
||||
{
|
||||
$key=substr($key,-8);
|
||||
}
|
||||
|
||||
print MAIL "Subject: GET 0x$key\n\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print MAIL "Subject: GET $key\n\n";
|
||||
}
|
||||
print MAIL "GnuPG $program email keyserver request\n";
|
||||
close(MAIL);
|
||||
|
||||
# Tell GnuPG not to expect a key
|
||||
print "KEY $key OUTOFBAND\n";
|
||||
|
||||
if($verbose)
|
||||
{
|
||||
print STDERR "gpgkeys: key $key requested from $address\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if($command=~/send/i)
|
||||
{
|
||||
while(!eof(STDIN))
|
||||
{
|
||||
open(MAIL,"|$sendmail") || die "ERROR: Can't open $sendmail\n";
|
||||
print MAIL "From: $name <$login>\n";
|
||||
print MAIL "To: $address\n";
|
||||
print MAIL "Subject: ADD\n\n";
|
||||
|
||||
while(<STDIN>)
|
||||
{
|
||||
if(/^KEY (\S+) BEGIN$/)
|
||||
{
|
||||
$key=$1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
while(<STDIN>)
|
||||
{
|
||||
if(/^KEY \S+ END$/)
|
||||
{
|
||||
last;
|
||||
}
|
||||
|
||||
print MAIL;
|
||||
}
|
||||
|
||||
close(MAIL);
|
||||
|
||||
if($verbose)
|
||||
{
|
||||
print STDERR "gpgkeys: key $key sent to $address\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# mode:perl
|
||||
# End:
|
@ -1,97 +0,0 @@
|
||||
#!@PERL@
|
||||
|
||||
# gpg2keys_test - keyserver code tester
|
||||
# Copyright (C) 2001 Free Software Foundation, Inc.
|
||||
#
|
||||
# This file is part of GnuPG.
|
||||
#
|
||||
# GnuPG is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# GnuPG is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
use Getopt::Std;
|
||||
$Getopt::Std::STANDARD_HELP_VERSION=1;
|
||||
|
||||
$|=1;
|
||||
|
||||
sub VERSION_MESSAGE ()
|
||||
{
|
||||
print STDOUT "gpg2keys_test (GnuPG) @VERSION@\n";
|
||||
}
|
||||
|
||||
sub HELP_MESSAGE ()
|
||||
{
|
||||
print STDOUT <<EOT
|
||||
|
||||
--help Print this help
|
||||
--version Print the version
|
||||
EOT
|
||||
}
|
||||
|
||||
|
||||
getopts('o:');
|
||||
|
||||
print STDERR "gpgkeys_test starting\n";
|
||||
|
||||
if(defined($opt_o))
|
||||
{
|
||||
print STDERR "Using output file $opt_o\n";
|
||||
open(STDOUT,">$opt_o") || die "Can't open output file $opt_o\n";
|
||||
}
|
||||
|
||||
if(@ARGV)
|
||||
{
|
||||
print STDERR "Using input file $ARGV[0]\n";
|
||||
open(STDIN,$ARGV[0]) || die "Can't open input file $ARGV[0]\n";
|
||||
}
|
||||
|
||||
# Get the command block
|
||||
|
||||
print STDERR "Command block:\n";
|
||||
|
||||
while(<STDIN>)
|
||||
{
|
||||
last if($_ eq "\n");
|
||||
print STDERR "--command-> $_";
|
||||
|
||||
if(/^COMMAND (\w+)/)
|
||||
{
|
||||
$command=$1;
|
||||
}
|
||||
}
|
||||
|
||||
# Get the keylist block
|
||||
|
||||
print STDERR "Keylist block:\n";
|
||||
|
||||
while(<STDIN>)
|
||||
{
|
||||
last if($_ eq "\n");
|
||||
print STDERR "--keylist-> $_";
|
||||
}
|
||||
|
||||
# If it's a SEND, then get the key material
|
||||
|
||||
if($command eq "SEND")
|
||||
{
|
||||
print STDERR "Key material to send:\n";
|
||||
|
||||
while(<STDIN>)
|
||||
{
|
||||
print STDERR "$_";
|
||||
}
|
||||
}
|
||||
|
||||
printf STDERR "gpgkeys_test finished\n";
|
||||
|
||||
# Local Variables:
|
||||
# mode:perl
|
||||
# End:
|
@ -1,419 +0,0 @@
|
||||
/* gpgkeys_curl.c - fetch a key via libcurl
|
||||
* Copyright (C) 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the Free Software Foundation
|
||||
* gives permission to link the code of the keyserver helper tools:
|
||||
* gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
|
||||
* project's "OpenSSL" library (or with modified versions of it that
|
||||
* use the same license as the "OpenSSL" library), and distribute the
|
||||
* linked executables. You must obey the GNU General Public License
|
||||
* in all respects for all of the code used other than "OpenSSL". If
|
||||
* you modify this file, you may extend this exception to your version
|
||||
* of the file, but you are not obligated to do so. If you do not
|
||||
* wish to do so, delete this exception statement from your version.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIBCURL
|
||||
#include <curl/curl.h>
|
||||
#else
|
||||
#include "curl-shim.h"
|
||||
#endif
|
||||
#include "keyserver.h"
|
||||
#include "ksutil.h"
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
static FILE *input,*output,*console;
|
||||
static CURL *curl;
|
||||
static struct ks_options *opt;
|
||||
|
||||
static int
|
||||
get_key(char *getkey)
|
||||
{
|
||||
CURLcode res;
|
||||
char errorbuffer[CURL_ERROR_SIZE];
|
||||
char request[MAX_URL];
|
||||
struct curl_writer_ctx ctx;
|
||||
|
||||
memset(&ctx,0,sizeof(ctx));
|
||||
|
||||
if(strncmp(getkey,"0x",2)==0)
|
||||
getkey+=2;
|
||||
|
||||
fprintf(output,"KEY 0x%s BEGIN\n",getkey);
|
||||
|
||||
sprintf(request,"%s://%s%s%s%s",opt->scheme,opt->host,
|
||||
opt->port?":":"",opt->port?opt->port:"",opt->path?opt->path:"/");
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_URL,request);
|
||||
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
|
||||
ctx.stream=output;
|
||||
curl_easy_setopt(curl,CURLOPT_FILE,&ctx);
|
||||
curl_easy_setopt(curl,CURLOPT_ERRORBUFFER,errorbuffer);
|
||||
|
||||
res=curl_easy_perform(curl);
|
||||
if(res!=CURLE_OK)
|
||||
{
|
||||
fprintf(console,"gpgkeys: %s fetch error %d: %s\n",opt->scheme,
|
||||
res,errorbuffer);
|
||||
fprintf(output,"\nKEY 0x%s FAILED %d\n",getkey,curl_err_to_gpg_err(res));
|
||||
}
|
||||
else
|
||||
{
|
||||
curl_writer_finalize(&ctx);
|
||||
if(!ctx.flags.done)
|
||||
{
|
||||
fprintf(console,"gpgkeys: no key data found for %s\n",request);
|
||||
fprintf(output,"\nKEY 0x%s FAILED %d\n",
|
||||
getkey,KEYSERVER_KEY_NOT_FOUND);
|
||||
}
|
||||
else
|
||||
fprintf(output,"\nKEY 0x%s END\n",getkey);
|
||||
}
|
||||
|
||||
return curl_err_to_gpg_err(res);
|
||||
}
|
||||
|
||||
static void
|
||||
show_help (FILE *fp)
|
||||
{
|
||||
fprintf (fp,"-h, --help\thelp\n");
|
||||
fprintf (fp,"-V\t\tmachine readable version\n");
|
||||
fprintf (fp,"--version\thuman readable version\n");
|
||||
fprintf (fp,"-o\t\toutput to this file\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,char *argv[])
|
||||
{
|
||||
int arg,ret=KEYSERVER_INTERNAL_ERROR,i;
|
||||
char line[MAX_LINE];
|
||||
char *thekey=NULL;
|
||||
long follow_redirects=5;
|
||||
char *proxy=NULL;
|
||||
curl_version_info_data *curldata;
|
||||
struct curl_slist *headers=NULL;
|
||||
|
||||
console=stderr;
|
||||
|
||||
/* Kludge to implement standard GNU options. */
|
||||
if (argc > 1 && !strcmp (argv[1], "--version"))
|
||||
{
|
||||
printf ("gpgkeys_curl (%s) %s\n", GNUPG_NAME, VERSION);
|
||||
printf ("Uses: %s\n", curl_version());
|
||||
return 0;
|
||||
}
|
||||
else if (argc > 1 && !strcmp (argv[1], "--help"))
|
||||
{
|
||||
show_help (stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while((arg=getopt(argc,argv,"hVo:"))!=-1)
|
||||
switch(arg)
|
||||
{
|
||||
default:
|
||||
case 'h':
|
||||
show_help (console);
|
||||
return KEYSERVER_OK;
|
||||
|
||||
case 'V':
|
||||
fprintf(stdout,"%d\n%s\n",KEYSERVER_PROTO_VERSION,VERSION);
|
||||
return KEYSERVER_OK;
|
||||
|
||||
case 'o':
|
||||
output=fopen(optarg,"wb");
|
||||
if(output==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: Cannot open output file '%s': %s\n",
|
||||
optarg,strerror(errno));
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if(argc>optind)
|
||||
{
|
||||
input=fopen(argv[optind],"r");
|
||||
if(input==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: Cannot open input file '%s': %s\n",
|
||||
argv[optind],strerror(errno));
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if(input==NULL)
|
||||
input=stdin;
|
||||
|
||||
if(output==NULL)
|
||||
output=stdout;
|
||||
|
||||
opt=init_ks_options();
|
||||
if(!opt)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
|
||||
/* Get the command and info block */
|
||||
|
||||
while(fgets(line,MAX_LINE,input)!=NULL)
|
||||
{
|
||||
int err;
|
||||
char option[MAX_OPTION+1];
|
||||
|
||||
if(line[0]=='\n')
|
||||
break;
|
||||
|
||||
err=parse_ks_options(line,opt);
|
||||
if(err>0)
|
||||
{
|
||||
ret=err;
|
||||
goto fail;
|
||||
}
|
||||
else if(err==0)
|
||||
continue;
|
||||
|
||||
if(sscanf(line,"OPTION %" MKSTRING(MAX_OPTION) "s\n",option)==1)
|
||||
{
|
||||
int no=0;
|
||||
char *start=&option[0];
|
||||
|
||||
option[MAX_OPTION]='\0';
|
||||
|
||||
if(strncasecmp(option,"no-",3)==0)
|
||||
{
|
||||
no=1;
|
||||
start=&option[3];
|
||||
}
|
||||
|
||||
if(strncasecmp(start,"http-proxy",10)==0)
|
||||
{
|
||||
/* Safe to not check the return code of strdup() here.
|
||||
If it fails, we simply won't use a proxy. */
|
||||
if(no)
|
||||
{
|
||||
free(proxy);
|
||||
proxy=strdup("");
|
||||
}
|
||||
else if(start[10]=='=')
|
||||
{
|
||||
if(strlen(&start[11])<MAX_PROXY)
|
||||
{
|
||||
free(proxy);
|
||||
proxy=strdup(&start[11]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(strncasecmp(start,"follow-redirects",16)==0)
|
||||
{
|
||||
if(no)
|
||||
follow_redirects=0;
|
||||
else if(start[16]=='=')
|
||||
follow_redirects=atoi(&start[17]);
|
||||
else if(start[16]=='\0')
|
||||
follow_redirects=-1;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(!opt->scheme)
|
||||
{
|
||||
fprintf(console,"gpgkeys: no scheme supplied!\n");
|
||||
ret=KEYSERVER_SCHEME_NOT_FOUND;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(!opt->host)
|
||||
{
|
||||
fprintf(console,"gpgkeys: no keyserver host provided\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(opt->timeout && register_timeout()==-1)
|
||||
{
|
||||
fprintf(console,"gpgkeys: unable to register timeout handler\n");
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
|
||||
curl=curl_easy_init();
|
||||
if(!curl)
|
||||
{
|
||||
fprintf(console,"gpgkeys: unable to initialize curl\n");
|
||||
ret=KEYSERVER_INTERNAL_ERROR;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Make sure we have the protocol the user is asking for so we can
|
||||
print a nicer error message. */
|
||||
curldata=curl_version_info(CURLVERSION_NOW);
|
||||
for(i=0;curldata->protocols[i];i++)
|
||||
if(strcasecmp(curldata->protocols[i],opt->scheme)==0)
|
||||
break;
|
||||
|
||||
if(curldata->protocols[i]==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: protocol '%s' not supported\n",opt->scheme);
|
||||
ret=KEYSERVER_SCHEME_NOT_FOUND;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(follow_redirects)
|
||||
{
|
||||
curl_easy_setopt(curl,CURLOPT_FOLLOWLOCATION,1L);
|
||||
if(follow_redirects>0)
|
||||
curl_easy_setopt(curl,CURLOPT_MAXREDIRS,follow_redirects);
|
||||
}
|
||||
|
||||
if(opt->auth)
|
||||
curl_easy_setopt(curl,CURLOPT_USERPWD,opt->auth);
|
||||
|
||||
if(opt->debug)
|
||||
{
|
||||
fprintf(console,"gpgkeys: curl version = %s\n",curl_version());
|
||||
curl_easy_setopt(curl,CURLOPT_STDERR,console);
|
||||
curl_easy_setopt(curl,CURLOPT_VERBOSE,1L);
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,(long)opt->flags.check_cert);
|
||||
curl_easy_setopt(curl,CURLOPT_CAINFO,opt->ca_cert_file);
|
||||
|
||||
/* Avoid caches to get the most recent copy of the key. This is bug
|
||||
#1061. In pre-curl versions of the code, we didn't do it. Then
|
||||
we did do it (as a curl default) until curl changed the default.
|
||||
Now we're doing it again, but in such a way that changing
|
||||
defaults in the future won't impact us. We set both the Pragma
|
||||
and Cache-Control versions of the header, so we're good with both
|
||||
HTTP 1.0 and 1.1. */
|
||||
headers=curl_slist_append(headers,"Pragma: no-cache");
|
||||
if(headers)
|
||||
headers=curl_slist_append(headers,"Cache-Control: no-cache");
|
||||
|
||||
if(!headers)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory when building HTTP headers\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);
|
||||
|
||||
if(proxy)
|
||||
curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
|
||||
|
||||
/* If it's a GET or a SEARCH, the next thing to come in is the
|
||||
keyids. If it's a SEND, then there are no keyids. */
|
||||
|
||||
if(opt->action==KS_GET)
|
||||
{
|
||||
/* Eat the rest of the file */
|
||||
for(;;)
|
||||
{
|
||||
if(fgets(line,MAX_LINE,input)==NULL)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if(line[0]=='\n' || line[0]=='\0')
|
||||
break;
|
||||
|
||||
if(!thekey)
|
||||
{
|
||||
thekey=strdup(line);
|
||||
if(!thekey)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory while "
|
||||
"building key list\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Trim the trailing \n */
|
||||
thekey[strlen(line)-1]='\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(console,
|
||||
"gpgkeys: this keyserver type only supports key retrieval\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(!thekey)
|
||||
{
|
||||
fprintf(console,"gpgkeys: invalid keyserver instructions\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Send the response */
|
||||
|
||||
fprintf(output,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
|
||||
fprintf(output,"PROGRAM %s\n\n",VERSION);
|
||||
|
||||
if(opt->verbose)
|
||||
{
|
||||
fprintf(console,"Scheme:\t\t%s\n",opt->scheme);
|
||||
fprintf(console,"Host:\t\t%s\n",opt->host);
|
||||
if(opt->port)
|
||||
fprintf(console,"Port:\t\t%s\n",opt->port);
|
||||
if(opt->path)
|
||||
fprintf(console,"Path:\t\t%s\n",opt->path);
|
||||
fprintf(console,"Command:\tGET\n");
|
||||
}
|
||||
|
||||
set_timeout(opt->timeout);
|
||||
|
||||
ret=get_key(thekey);
|
||||
|
||||
fail:
|
||||
|
||||
free(thekey);
|
||||
|
||||
if(input!=stdin)
|
||||
fclose(input);
|
||||
|
||||
if(output!=stdout)
|
||||
fclose(output);
|
||||
|
||||
free_ks_options(opt);
|
||||
|
||||
curl_slist_free_all(headers);
|
||||
|
||||
if(curl)
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
free(proxy);
|
||||
|
||||
curl_global_cleanup();
|
||||
|
||||
return ret;
|
||||
}
|
@ -1,500 +0,0 @@
|
||||
/* gpgkeys_finger.c - fetch a key via finger
|
||||
* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
#include <windows.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
#include <time.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#endif
|
||||
|
||||
#define INCLUDED_BY_MAIN_MODULE 1
|
||||
#include "util.h"
|
||||
#include "keyserver.h"
|
||||
#include "ksutil.h"
|
||||
#include "iobuf.h"
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
#define sock_close(a) closesocket(a)
|
||||
#else
|
||||
#define sock_close(a) close(a)
|
||||
#endif
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
static FILE *input,*output,*console;
|
||||
static struct ks_options *opt;
|
||||
|
||||
|
||||
/* Connect to SERVER at PORT and return a file descriptor or -1 on
|
||||
error. */
|
||||
static int
|
||||
connect_server (const char *server, unsigned short port)
|
||||
{
|
||||
int sock = -1;
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
struct hostent *hp;
|
||||
struct sockaddr_in addr;
|
||||
unsigned long l;
|
||||
|
||||
w32_init_sockets ();
|
||||
|
||||
memset (&addr, 0, sizeof addr);
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons (port);
|
||||
|
||||
/* Win32 gethostbyname doesn't handle IP addresses internally, so we
|
||||
try inet_addr first on that platform only. */
|
||||
if ((l = inet_addr (server)) != INADDR_NONE)
|
||||
memcpy (&addr.sin_addr, &l, sizeof l);
|
||||
else if ((hp = gethostbyname (server)))
|
||||
{
|
||||
if (hp->h_addrtype != AF_INET)
|
||||
{
|
||||
fprintf (console, "gpgkeys: unknown address family for '%s'\n",
|
||||
server);
|
||||
return -1;
|
||||
}
|
||||
if (hp->h_length != 4)
|
||||
{
|
||||
fprintf (console, "gpgkeys: illegal address length for '%s'\n",
|
||||
server);
|
||||
return -1;
|
||||
}
|
||||
memcpy (&addr.sin_addr, hp->h_addr, hp->h_length);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (console, "gpgkeys: host '%s' not found: ec=%d\n",
|
||||
server, (int)WSAGetLastError ());
|
||||
return -1;
|
||||
}
|
||||
|
||||
sock = socket (AF_INET, SOCK_STREAM, 0);
|
||||
if (sock == INVALID_SOCKET)
|
||||
{
|
||||
fprintf (console, "gpgkeys: error creating socket: ec=%d\n",
|
||||
(int)WSAGetLastError ());
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (connect (sock, (struct sockaddr *)&addr, sizeof addr))
|
||||
{
|
||||
fprintf (console, "gpgkeys: error connecting '%s': ec=%d\n",
|
||||
server, (int)WSAGetLastError ());
|
||||
sock_close (sock);
|
||||
return -1;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
struct sockaddr_in addr;
|
||||
struct hostent *host;
|
||||
|
||||
addr.sin_family = AF_INET;
|
||||
addr.sin_port = htons (port);
|
||||
host = gethostbyname ((char*)server);
|
||||
if (!host)
|
||||
{
|
||||
fprintf (console, "gpgkeys: host '%s' not found: %s\n",
|
||||
server, strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
addr.sin_addr = *(struct in_addr*)host->h_addr;
|
||||
|
||||
sock = socket (AF_INET, SOCK_STREAM, 0);
|
||||
if (sock == -1)
|
||||
{
|
||||
fprintf (console, "gpgkeys: error creating socket: %s\n",
|
||||
strerror (errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (connect (sock, (struct sockaddr *)&addr, sizeof addr) == -1)
|
||||
{
|
||||
fprintf (console, "gpgkeys: error connecting '%s': %s\n",
|
||||
server, strerror (errno));
|
||||
close (sock);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
return sock;
|
||||
}
|
||||
|
||||
static int
|
||||
write_server (int sock, const char *data, size_t length)
|
||||
{
|
||||
int nleft;
|
||||
|
||||
nleft = length;
|
||||
while (nleft > 0)
|
||||
{
|
||||
int nwritten;
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
nwritten = send (sock, data, nleft, 0);
|
||||
if ( nwritten == SOCKET_ERROR )
|
||||
{
|
||||
fprintf (console, "gpgkeys: write failed: ec=%d\n",
|
||||
(int)WSAGetLastError ());
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
nwritten = write (sock, data, nleft);
|
||||
if (nwritten == -1)
|
||||
{
|
||||
if (errno == EINTR)
|
||||
continue;
|
||||
if (errno == EAGAIN)
|
||||
{
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = 0;
|
||||
tv.tv_usec = 50000;
|
||||
select(0, NULL, NULL, NULL, &tv);
|
||||
continue;
|
||||
}
|
||||
fprintf (console, "gpgkeys: write failed: %s\n", strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
nleft -=nwritten;
|
||||
data += nwritten;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Send the finger REQUEST to the server. Returns 0 and a file descriptor
|
||||
in R_SOCK if the request was sucessful. */
|
||||
static int
|
||||
send_request (const char *request, int *r_sock)
|
||||
{
|
||||
char *server;
|
||||
char *name;
|
||||
int sock;
|
||||
|
||||
*r_sock = -1;
|
||||
name = strdup (request);
|
||||
if (!name)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
}
|
||||
|
||||
server = strchr (name, '@');
|
||||
if (!server)
|
||||
{
|
||||
fprintf (console, "gpgkeys: no name included in request\n");
|
||||
free (name);
|
||||
return KEYSERVER_GENERAL_ERROR;
|
||||
}
|
||||
*server++ = 0;
|
||||
|
||||
sock = connect_server (server, 79);
|
||||
if (sock == -1)
|
||||
{
|
||||
free (name);
|
||||
return KEYSERVER_UNREACHABLE;
|
||||
}
|
||||
|
||||
if (write_server (sock, name, strlen (name))
|
||||
|| write_server (sock, "\r\n", 2))
|
||||
{
|
||||
free (name);
|
||||
sock_close (sock);
|
||||
return KEYSERVER_GENERAL_ERROR;
|
||||
}
|
||||
free (name);
|
||||
*r_sock = sock;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
get_key (char *getkey)
|
||||
{
|
||||
int rc;
|
||||
int sock;
|
||||
iobuf_t fp_read;
|
||||
unsigned int maxlen, buflen, gotit=0;
|
||||
byte *line = NULL;
|
||||
|
||||
if (strncmp (getkey,"0x",2)==0)
|
||||
getkey+=2;
|
||||
|
||||
/* Frankly we don't know what keys the server will return; we
|
||||
indicated the requested key anyway. */
|
||||
fprintf(output,"KEY 0x%s BEGIN\n",getkey);
|
||||
|
||||
rc=send_request(opt->opaque,&sock);
|
||||
if(rc)
|
||||
{
|
||||
fprintf(output,"KEY 0x%s FAILED %d\n",getkey, rc);
|
||||
sock_close (sock);
|
||||
return KEYSERVER_OK;
|
||||
}
|
||||
|
||||
/* Hmmm, we use iobuf here only to cope with Windows socket
|
||||
peculiarities (we can't used fdopen). */
|
||||
fp_read = iobuf_sockopen (sock , "r");
|
||||
if (!fp_read)
|
||||
{
|
||||
fprintf(output,"KEY 0x%s FAILED %d\n",getkey, KEYSERVER_INTERNAL_ERROR);
|
||||
sock_close (sock);
|
||||
return KEYSERVER_OK;
|
||||
}
|
||||
|
||||
while ( iobuf_read_line ( fp_read, &line, &buflen, &maxlen))
|
||||
{
|
||||
maxlen=1024;
|
||||
|
||||
if(gotit)
|
||||
{
|
||||
print_nocr(output, (const char*)line);
|
||||
if (!strncmp((char*)line,END,strlen(END)))
|
||||
break;
|
||||
}
|
||||
else if(!strncmp((char*)line,BEGIN,strlen(BEGIN)))
|
||||
{
|
||||
print_nocr(output, (const char*)line);
|
||||
gotit=1;
|
||||
}
|
||||
}
|
||||
|
||||
if(gotit)
|
||||
fprintf (output,"KEY 0x%s END\n", getkey);
|
||||
else
|
||||
{
|
||||
fprintf(console,"gpgkeys: no key data found for finger:%s\n",
|
||||
opt->opaque);
|
||||
fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_KEY_NOT_FOUND);
|
||||
}
|
||||
|
||||
xfree(line);
|
||||
iobuf_close (fp_read);
|
||||
|
||||
return KEYSERVER_OK;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
show_help (FILE *fp)
|
||||
{
|
||||
fprintf (fp,"-h, --help\thelp\n");
|
||||
fprintf (fp,"-V\t\tmachine readable version\n");
|
||||
fprintf (fp,"--version\thuman readable version\n");
|
||||
fprintf (fp,"-o\t\toutput to this file\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,char *argv[])
|
||||
{
|
||||
int arg,ret=KEYSERVER_INTERNAL_ERROR;
|
||||
char line[MAX_LINE];
|
||||
char *thekey=NULL;
|
||||
|
||||
console=stderr;
|
||||
|
||||
/* Kludge to implement standard GNU options. */
|
||||
if (argc > 1 && !strcmp (argv[1], "--version"))
|
||||
{
|
||||
fputs ("gpgkeys_finger ("GNUPG_NAME") " VERSION"\n", stdout);
|
||||
return 0;
|
||||
}
|
||||
else if (argc > 1 && !strcmp (argv[1], "--help"))
|
||||
{
|
||||
show_help (stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while((arg=getopt(argc,argv,"hVo:"))!=-1)
|
||||
switch(arg)
|
||||
{
|
||||
default:
|
||||
case 'h':
|
||||
show_help (console);
|
||||
return KEYSERVER_OK;
|
||||
|
||||
case 'V':
|
||||
fprintf(stdout,"%d\n%s\n",KEYSERVER_PROTO_VERSION,VERSION);
|
||||
return KEYSERVER_OK;
|
||||
|
||||
case 'o':
|
||||
output=fopen(optarg,"w");
|
||||
if(output==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: Cannot open output file '%s': %s\n",
|
||||
optarg,strerror(errno));
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if(argc>optind)
|
||||
{
|
||||
input=fopen(argv[optind],"r");
|
||||
if(input==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: Cannot open input file '%s': %s\n",
|
||||
argv[optind],strerror(errno));
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if(input==NULL)
|
||||
input=stdin;
|
||||
|
||||
if(output==NULL)
|
||||
output=stdout;
|
||||
|
||||
opt=init_ks_options();
|
||||
if(!opt)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
|
||||
/* Get the command and info block */
|
||||
|
||||
while(fgets(line,MAX_LINE,input)!=NULL)
|
||||
{
|
||||
int err;
|
||||
|
||||
if(line[0]=='\n')
|
||||
break;
|
||||
|
||||
err=parse_ks_options(line,opt);
|
||||
if(err>0)
|
||||
{
|
||||
ret=err;
|
||||
goto fail;
|
||||
}
|
||||
else if(err==0)
|
||||
continue;
|
||||
}
|
||||
|
||||
if(opt->host)
|
||||
{
|
||||
fprintf(console,"gpgkeys: finger://relay/user syntax is not"
|
||||
" supported. Use finger:user instead.\n");
|
||||
ret=KEYSERVER_NOT_SUPPORTED;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(opt->timeout && register_timeout()==-1)
|
||||
{
|
||||
fprintf(console,"gpgkeys: unable to register timeout handler\n");
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
/* If it's a GET or a SEARCH, the next thing to come in is the
|
||||
keyids. If it's a SEND, then there are no keyids. */
|
||||
|
||||
if(opt->action==KS_GET)
|
||||
{
|
||||
/* Eat the rest of the file */
|
||||
for(;;)
|
||||
{
|
||||
if(fgets(line,MAX_LINE,input)==NULL)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if(line[0]=='\n' || line[0]=='\0')
|
||||
break;
|
||||
|
||||
if(!thekey)
|
||||
{
|
||||
thekey=strdup(line);
|
||||
if(!thekey)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory while "
|
||||
"building key list\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Trim the trailing \n */
|
||||
thekey[strlen(line)-1]='\0';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(console,
|
||||
"gpgkeys: this keyserver type only supports key retrieval\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(!thekey || !opt->opaque)
|
||||
{
|
||||
fprintf(console,"gpgkeys: invalid keyserver instructions\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Send the response */
|
||||
|
||||
fprintf(output,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
|
||||
fprintf(output,"PROGRAM %s\n\n",VERSION);
|
||||
|
||||
if(opt->verbose>1)
|
||||
{
|
||||
fprintf(console,"User:\t\t%s\n",opt->opaque);
|
||||
fprintf(console,"Command:\tGET\n");
|
||||
}
|
||||
|
||||
set_timeout(opt->timeout);
|
||||
|
||||
ret=get_key(thekey);
|
||||
|
||||
fail:
|
||||
|
||||
free(thekey);
|
||||
|
||||
if(input!=stdin)
|
||||
fclose(input);
|
||||
|
||||
if(output!=stdout)
|
||||
fclose(output);
|
||||
|
||||
free_ks_options(opt);
|
||||
|
||||
return ret;
|
||||
}
|
@ -1,976 +0,0 @@
|
||||
/* gpgkeys_hkp.c - talk to an HKP keyserver
|
||||
* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
|
||||
* 2009 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the Free Software Foundation
|
||||
* gives permission to link the code of the keyserver helper tools:
|
||||
* gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
|
||||
* project's "OpenSSL" library (or with modified versions of it that
|
||||
* use the same license as the "OpenSSL" library), and distribute the
|
||||
* linked executables. You must obey the GNU General Public License
|
||||
* in all respects for all of the code used other than "OpenSSL". If
|
||||
* you modify this file, you may extend this exception to your version
|
||||
* of the file, but you are not obligated to do so. If you do not
|
||||
* wish to do so, delete this exception statement from your version.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
#ifdef HAVE_LIBCURL
|
||||
#include <curl/curl.h>
|
||||
#else
|
||||
#include "curl-shim.h"
|
||||
#endif
|
||||
#include "util.h"
|
||||
#ifdef USE_DNS_SRV
|
||||
#include "srv.h"
|
||||
#endif
|
||||
#include "keyserver.h"
|
||||
#include "ksutil.h"
|
||||
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
static FILE *input,*output,*console;
|
||||
static CURL *curl;
|
||||
static struct ks_options *opt;
|
||||
static char errorbuffer[CURL_ERROR_SIZE];
|
||||
static char *proto,*port;
|
||||
|
||||
static size_t
|
||||
curl_mrindex_writer(const void *ptr,size_t size,size_t nmemb,void *stream)
|
||||
{
|
||||
static int checked=0,swallow=0;
|
||||
|
||||
if(!checked)
|
||||
{
|
||||
/* If the document begins with a '<', assume it's a HTML
|
||||
response, which we don't support. Discard the whole message
|
||||
body. GPG can handle it, but this is an optimization to deal
|
||||
with it on this side of the pipe. */
|
||||
const char *buf=ptr;
|
||||
if(buf[0]=='<')
|
||||
swallow=1;
|
||||
|
||||
checked=1;
|
||||
}
|
||||
|
||||
if(swallow || fwrite(ptr,size,nmemb,stream)==nmemb)
|
||||
return size*nmemb;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Append but avoid creating a double slash // in the path. */
|
||||
static char *
|
||||
append_path(char *dest,const char *src)
|
||||
{
|
||||
size_t n=strlen(dest);
|
||||
|
||||
if(src[0]=='/' && n>0 && dest[n-1]=='/')
|
||||
dest[n-1]='\0';
|
||||
|
||||
return strcat(dest,src);
|
||||
}
|
||||
|
||||
/* Return a pointer into STRING so that appending PATH to STRING will
|
||||
not yield a duplicated slash. */
|
||||
static const char *
|
||||
appendable_path (const char *string, const char *path)
|
||||
{
|
||||
size_t n;
|
||||
|
||||
if (path[0] == '/' && (n=strlen (string)) && string[n-1] == '/')
|
||||
return path+1;
|
||||
else
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
send_key(int *r_eof)
|
||||
{
|
||||
CURLcode res;
|
||||
char request[MAX_URL+15];
|
||||
int begin=0,end=0,ret=KEYSERVER_INTERNAL_ERROR;
|
||||
char keyid[17],state[6];
|
||||
char line[MAX_LINE];
|
||||
char *key=NULL,*encoded_key=NULL;
|
||||
size_t keylen=0,keymax=0;
|
||||
|
||||
/* Read and throw away input until we see the BEGIN */
|
||||
|
||||
while(fgets(line,MAX_LINE,input)!=NULL)
|
||||
if(sscanf(line,"KEY%*[ ]%16s%*[ ]%5s\n",keyid,state)==2
|
||||
&& strcmp(state,"BEGIN")==0)
|
||||
{
|
||||
begin=1;
|
||||
break;
|
||||
}
|
||||
|
||||
if(!begin)
|
||||
{
|
||||
/* i.e. eof before the KEY BEGIN was found. This isn't an
|
||||
error. */
|
||||
*r_eof=1;
|
||||
ret=KEYSERVER_OK;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Now slurp up everything until we see the END */
|
||||
|
||||
while(fgets(line,MAX_LINE,input))
|
||||
if(sscanf(line,"KEY%*[ ]%16s%*[ ]%3s\n",keyid,state)==2
|
||||
&& strcmp(state,"END")==0)
|
||||
{
|
||||
end=1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(strlen(line)+keylen>keymax)
|
||||
{
|
||||
char *tmp;
|
||||
|
||||
keymax+=200;
|
||||
tmp=realloc(key,keymax+1);
|
||||
if(!tmp)
|
||||
{
|
||||
free(key);
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
key=tmp;
|
||||
}
|
||||
|
||||
strcpy(&key[keylen],line);
|
||||
keylen+=strlen(line);
|
||||
}
|
||||
|
||||
if(!end)
|
||||
{
|
||||
fprintf(console,"gpgkeys: no KEY %s END found\n",keyid);
|
||||
*r_eof=1;
|
||||
ret=KEYSERVER_KEY_INCOMPLETE;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
encoded_key=curl_escape(key,keylen);
|
||||
if(!encoded_key)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
free(key);
|
||||
|
||||
key = strconcat ("keytext=", encoded_key, NULL);
|
||||
if(!key)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
strcpy(request,proto);
|
||||
strcat(request,"://");
|
||||
strcat(request,opt->host);
|
||||
strcat(request,":");
|
||||
strcat(request,port);
|
||||
strcat(request,opt->path);
|
||||
/* request is MAX_URL+15 bytes long - MAX_URL covers the whole URL,
|
||||
including any supplied path. The 15 covers /pks/add. */
|
||||
append_path(request,"/pks/add");
|
||||
|
||||
if(opt->verbose>2)
|
||||
fprintf(console,"gpgkeys: HTTP URL is '%s'\n",request);
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_URL,request);
|
||||
curl_easy_setopt(curl,CURLOPT_POST,1L);
|
||||
curl_easy_setopt(curl,CURLOPT_POSTFIELDS,key);
|
||||
curl_easy_setopt(curl,CURLOPT_FAILONERROR,1L);
|
||||
|
||||
res=curl_easy_perform(curl);
|
||||
if(res!=0)
|
||||
{
|
||||
fprintf(console,"gpgkeys: HTTP post error %d: %s\n",res,errorbuffer);
|
||||
ret=curl_err_to_gpg_err(res);
|
||||
goto fail;
|
||||
}
|
||||
else
|
||||
fprintf(output,"\nKEY %s SENT\n",keyid);
|
||||
|
||||
ret=KEYSERVER_OK;
|
||||
|
||||
fail:
|
||||
xfree (key);
|
||||
curl_free(encoded_key);
|
||||
|
||||
if(ret!=0 && begin)
|
||||
fprintf(output,"KEY %s FAILED %d\n",keyid,ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
get_key(char *getkey)
|
||||
{
|
||||
CURLcode res;
|
||||
char request[MAX_URL+92];
|
||||
char *offset;
|
||||
struct curl_writer_ctx ctx;
|
||||
size_t keylen;
|
||||
|
||||
memset(&ctx,0,sizeof(ctx));
|
||||
|
||||
/* Build the search string. HKP only uses the short key IDs. */
|
||||
|
||||
if(strncmp(getkey,"0x",2)==0)
|
||||
getkey+=2;
|
||||
|
||||
fprintf(output,"KEY 0x%s BEGIN\n",getkey);
|
||||
|
||||
if(strlen(getkey)==32)
|
||||
{
|
||||
fprintf(console,
|
||||
"gpgkeys: HKP keyservers do not support v3 fingerprints\n");
|
||||
fprintf(output,"KEY 0x%s FAILED %d\n",getkey,KEYSERVER_NOT_SUPPORTED);
|
||||
return KEYSERVER_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
strcpy(request,proto);
|
||||
strcat(request,"://");
|
||||
strcat(request,opt->host);
|
||||
strcat(request,":");
|
||||
strcat(request,port);
|
||||
strcat(request,opt->path);
|
||||
/* request is MAX_URL+55 bytes long - MAX_URL covers the whole URL,
|
||||
including any supplied path. The 92 overcovers this /pks/... etc
|
||||
string plus the 8, 16, or 40 bytes of key id/fingerprint */
|
||||
append_path(request,"/pks/lookup?op=get&options=mr&search=0x");
|
||||
|
||||
/* send only fingerprint, long key id, or short keyid. see:
|
||||
https://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#section-3.1.1.1 */
|
||||
keylen = strlen(getkey);
|
||||
if(keylen >= 40)
|
||||
offset=&getkey[keylen-40];
|
||||
else if(keylen >= 16)
|
||||
offset=&getkey[keylen-16];
|
||||
else if(keylen >= 8)
|
||||
offset=&getkey[keylen-8];
|
||||
else
|
||||
offset=getkey;
|
||||
|
||||
strcat(request,offset);
|
||||
|
||||
if(opt->verbose>2)
|
||||
fprintf(console,"gpgkeys: HTTP URL is '%s'\n",request);
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_URL,request);
|
||||
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
|
||||
ctx.stream=output;
|
||||
curl_easy_setopt(curl,CURLOPT_FILE,&ctx);
|
||||
|
||||
res=curl_easy_perform(curl);
|
||||
if(res!=CURLE_OK)
|
||||
{
|
||||
fprintf(console,"gpgkeys: HTTP fetch error %d: %s\n",res,errorbuffer);
|
||||
fprintf(output,"\nKEY 0x%s FAILED %d\n",getkey,curl_err_to_gpg_err(res));
|
||||
}
|
||||
else
|
||||
{
|
||||
curl_writer_finalize(&ctx);
|
||||
if(!ctx.flags.done)
|
||||
{
|
||||
fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
|
||||
fprintf(output,"\nKEY 0x%s FAILED %d\n",
|
||||
getkey,KEYSERVER_KEY_NOT_FOUND);
|
||||
}
|
||||
else
|
||||
fprintf(output,"\nKEY 0x%s END\n",getkey);
|
||||
}
|
||||
|
||||
return KEYSERVER_OK;
|
||||
}
|
||||
|
||||
static int
|
||||
get_name(const char *getkey)
|
||||
{
|
||||
CURLcode res;
|
||||
char *request=NULL;
|
||||
char *searchkey_encoded;
|
||||
int ret=KEYSERVER_INTERNAL_ERROR;
|
||||
struct curl_writer_ctx ctx;
|
||||
|
||||
memset(&ctx,0,sizeof(ctx));
|
||||
|
||||
searchkey_encoded=curl_escape((char *)getkey,0);
|
||||
if(!searchkey_encoded)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
request = strconcat
|
||||
(proto,
|
||||
"://",
|
||||
opt->host,
|
||||
":",
|
||||
port,
|
||||
opt->path,
|
||||
appendable_path (opt->path,"/pks/lookup?op=get&options=mr&search="),
|
||||
searchkey_encoded,
|
||||
"&exact=on",
|
||||
NULL);
|
||||
if(!request)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
fprintf(output,"NAME %s BEGIN\n",getkey);
|
||||
|
||||
if(opt->verbose>2)
|
||||
fprintf(console,"gpgkeys: HTTP URL is '%s'\n",request);
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_URL,request);
|
||||
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_writer);
|
||||
ctx.stream=output;
|
||||
curl_easy_setopt(curl,CURLOPT_FILE,&ctx);
|
||||
|
||||
res=curl_easy_perform(curl);
|
||||
if(res!=CURLE_OK)
|
||||
{
|
||||
fprintf(console,"gpgkeys: HTTP fetch error %d: %s\n",res,errorbuffer);
|
||||
ret=curl_err_to_gpg_err(res);
|
||||
}
|
||||
else
|
||||
{
|
||||
curl_writer_finalize(&ctx);
|
||||
if(!ctx.flags.done)
|
||||
{
|
||||
fprintf(console,"gpgkeys: key %s not found on keyserver\n",getkey);
|
||||
ret=KEYSERVER_KEY_NOT_FOUND;
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(output,"\nNAME %s END\n",getkey);
|
||||
ret=KEYSERVER_OK;
|
||||
}
|
||||
}
|
||||
|
||||
fail:
|
||||
curl_free(searchkey_encoded);
|
||||
xfree (request);
|
||||
|
||||
if(ret!=KEYSERVER_OK)
|
||||
fprintf(output,"\nNAME %s FAILED %d\n",getkey,ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
search_key(const char *searchkey)
|
||||
{
|
||||
CURLcode res;
|
||||
char *request=NULL;
|
||||
char *searchkey_encoded;
|
||||
int ret=KEYSERVER_INTERNAL_ERROR;
|
||||
enum ks_search_type search_type;
|
||||
const char *hexprefix;
|
||||
|
||||
search_type=classify_ks_search(&searchkey);
|
||||
|
||||
if(opt->debug)
|
||||
fprintf(console,"gpgkeys: search type is %d, and key is \"%s\"\n",
|
||||
search_type,searchkey);
|
||||
|
||||
searchkey_encoded=curl_escape((char *)searchkey,0);
|
||||
if(!searchkey_encoded)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* HKP keyservers like the 0x to be present when searching by
|
||||
keyid. */
|
||||
hexprefix = (search_type==KS_SEARCH_KEYID_SHORT
|
||||
|| search_type==KS_SEARCH_KEYID_LONG)? "0x":"";
|
||||
|
||||
request = strconcat
|
||||
(proto,
|
||||
"://",
|
||||
opt->host,
|
||||
":",
|
||||
port,
|
||||
opt->path,
|
||||
appendable_path (opt->path, "/pks/lookup?op=index&options=mr&search="),
|
||||
hexprefix,
|
||||
searchkey_encoded,
|
||||
NULL);
|
||||
if(!request)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
fprintf(output,"SEARCH %s BEGIN\n",searchkey);
|
||||
|
||||
if(opt->verbose>2)
|
||||
fprintf(console,"gpgkeys: HTTP URL is '%s'\n",request);
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_URL,request);
|
||||
curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,curl_mrindex_writer);
|
||||
curl_easy_setopt(curl,CURLOPT_FILE,output);
|
||||
|
||||
res=curl_easy_perform(curl);
|
||||
if(res!=0)
|
||||
{
|
||||
fprintf(console,"gpgkeys: HTTP search error %d: %s\n",res,errorbuffer);
|
||||
ret=curl_err_to_gpg_err(res);
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(output,"\nSEARCH %s END\n",searchkey);
|
||||
ret=KEYSERVER_OK;
|
||||
}
|
||||
|
||||
fail:
|
||||
curl_free(searchkey_encoded);
|
||||
xfree (request);
|
||||
|
||||
if(ret!=KEYSERVER_OK)
|
||||
fprintf(output,"\nSEARCH %s FAILED %d\n",searchkey,ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
fail_all(struct keylist *keylist,int err)
|
||||
{
|
||||
if(!keylist)
|
||||
return;
|
||||
|
||||
if(opt->action==KS_SEARCH)
|
||||
{
|
||||
fprintf(output,"SEARCH ");
|
||||
while(keylist)
|
||||
{
|
||||
fprintf(output,"%s ",keylist->str);
|
||||
keylist=keylist->next;
|
||||
}
|
||||
fprintf(output,"FAILED %d\n",err);
|
||||
}
|
||||
else
|
||||
while(keylist)
|
||||
{
|
||||
fprintf(output,"KEY %s FAILED %d\n",keylist->str,err);
|
||||
keylist=keylist->next;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_LIBCURL
|
||||
/* If there is a SRV record, take the highest ranked possibility.
|
||||
This is a hack, as we don't proceed downwards. */
|
||||
static void
|
||||
srv_replace(const char *srvtag)
|
||||
{
|
||||
#ifdef USE_DNS_SRV
|
||||
struct srventry *srvlist=NULL;
|
||||
int srvcount;
|
||||
|
||||
if(!srvtag)
|
||||
return;
|
||||
|
||||
if(1+strlen(srvtag)+6+strlen(opt->host)+1<=MAXDNAME)
|
||||
{
|
||||
char srvname[MAXDNAME];
|
||||
|
||||
strcpy(srvname,"_");
|
||||
strcat(srvname,srvtag);
|
||||
strcat(srvname,"._tcp.");
|
||||
strcat(srvname,opt->host);
|
||||
srvcount=getsrv(srvname,&srvlist);
|
||||
}
|
||||
|
||||
if(srvlist)
|
||||
{
|
||||
char *newname,*newport;
|
||||
|
||||
newname=strdup(srvlist->target);
|
||||
newport=malloc(MAX_PORT);
|
||||
if(newname && newport)
|
||||
{
|
||||
free(opt->host);
|
||||
free(opt->port);
|
||||
opt->host=newname;
|
||||
snprintf(newport,MAX_PORT,"%u",srvlist->port);
|
||||
opt->port=newport;
|
||||
}
|
||||
else
|
||||
{
|
||||
free(newname);
|
||||
free(newport);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
static void
|
||||
show_help (FILE *fp)
|
||||
{
|
||||
fprintf (fp,"-h, --help\thelp\n");
|
||||
fprintf (fp,"-V\t\tmachine readable version\n");
|
||||
fprintf (fp,"--version\thuman readable version\n");
|
||||
fprintf (fp,"-o\t\toutput to this file\n");
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc,char *argv[])
|
||||
{
|
||||
int arg,ret=KEYSERVER_INTERNAL_ERROR,try_srv=1;
|
||||
char line[MAX_LINE];
|
||||
int failed=0;
|
||||
struct keylist *keylist=NULL,*keyptr=NULL;
|
||||
char *proxy=NULL;
|
||||
struct curl_slist *headers=NULL;
|
||||
|
||||
console=stderr;
|
||||
|
||||
/* Kludge to implement standard GNU options. */
|
||||
if (argc > 1 && !strcmp (argv[1], "--version"))
|
||||
{
|
||||
printf ("gpgkeys_hkp (%s) %s\n", GNUPG_NAME, VERSION);
|
||||
printf ("Uses: %s\n", curl_version());
|
||||
return 0;
|
||||
}
|
||||
else if (argc > 1 && !strcmp (argv[1], "--help"))
|
||||
{
|
||||
show_help (stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while((arg=getopt(argc,argv,"hVo:"))!=-1)
|
||||
switch(arg)
|
||||
{
|
||||
default:
|
||||
case 'h':
|
||||
show_help (console);
|
||||
return KEYSERVER_OK;
|
||||
|
||||
case 'V':
|
||||
fprintf(stdout,"%d\n%s\n",KEYSERVER_PROTO_VERSION,VERSION);
|
||||
return KEYSERVER_OK;
|
||||
|
||||
case 'o':
|
||||
output=fopen(optarg,"w");
|
||||
if(output==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: Cannot open output file '%s': %s\n",
|
||||
optarg,strerror(errno));
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
if(argc>optind)
|
||||
{
|
||||
input=fopen(argv[optind],"r");
|
||||
if(input==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: Cannot open input file '%s': %s\n",
|
||||
argv[optind],strerror(errno));
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if(input==NULL)
|
||||
input=stdin;
|
||||
|
||||
if(output==NULL)
|
||||
output=stdout;
|
||||
|
||||
opt=init_ks_options();
|
||||
if(!opt)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
|
||||
/* Get the command and info block */
|
||||
|
||||
while(fgets(line,MAX_LINE,input)!=NULL)
|
||||
{
|
||||
int err;
|
||||
char option[MAX_OPTION+1];
|
||||
|
||||
if(line[0]=='\n')
|
||||
break;
|
||||
|
||||
err=parse_ks_options(line,opt);
|
||||
if(err>0)
|
||||
{
|
||||
ret=err;
|
||||
goto fail;
|
||||
}
|
||||
else if(err==0)
|
||||
continue;
|
||||
|
||||
if(sscanf(line,"OPTION %" MKSTRING(MAX_OPTION) "s\n",option)==1)
|
||||
{
|
||||
int no=0;
|
||||
char *start=&option[0];
|
||||
|
||||
option[MAX_OPTION]='\0';
|
||||
|
||||
if(strncasecmp(option,"no-",3)==0)
|
||||
{
|
||||
no=1;
|
||||
start=&option[3];
|
||||
}
|
||||
|
||||
if(strncasecmp(start,"http-proxy",10)==0)
|
||||
{
|
||||
if(no)
|
||||
{
|
||||
free(proxy);
|
||||
proxy=strdup("");
|
||||
}
|
||||
else if(start[10]=='=')
|
||||
{
|
||||
if(strlen(&start[11])<MAX_PROXY)
|
||||
{
|
||||
free(proxy);
|
||||
proxy=strdup(&start[11]);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(strcasecmp(start,"try-dns-srv")==0)
|
||||
{
|
||||
if(no)
|
||||
try_srv=0;
|
||||
else
|
||||
try_srv=1;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if(!opt->scheme)
|
||||
{
|
||||
fprintf(console,"gpgkeys: no scheme supplied!\n");
|
||||
ret=KEYSERVER_SCHEME_NOT_FOUND;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(ascii_strcasecmp(opt->scheme,"hkps")==0)
|
||||
{
|
||||
proto="https";
|
||||
port="443";
|
||||
}
|
||||
else
|
||||
{
|
||||
proto="http";
|
||||
port="11371";
|
||||
}
|
||||
|
||||
if(!opt->host)
|
||||
{
|
||||
fprintf(console,"gpgkeys: no keyserver host provided\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if(opt->timeout && register_timeout()==-1)
|
||||
{
|
||||
fprintf(console,"gpgkeys: unable to register timeout handler\n");
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||
curl=curl_easy_init();
|
||||
if(!curl)
|
||||
{
|
||||
fprintf(console,"gpgkeys: unable to initialize curl\n");
|
||||
ret=KEYSERVER_INTERNAL_ERROR;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* If the user gives a :port, then disable SRV. The semantics of a
|
||||
specified port and SRV do not play well together. */
|
||||
if(opt->port)
|
||||
port=opt->port;
|
||||
else if(try_srv)
|
||||
{
|
||||
char *srvtag;
|
||||
|
||||
if(ks_strcasecmp(opt->scheme,"hkp")==0)
|
||||
srvtag="pgpkey-http";
|
||||
else if(ks_strcasecmp(opt->scheme,"hkps")==0)
|
||||
srvtag="pgpkey-https";
|
||||
else
|
||||
srvtag=NULL;
|
||||
|
||||
#ifdef HAVE_LIBCURL
|
||||
/* We're using libcurl, so fake SRV support via our wrapper.
|
||||
This isn't as good as true SRV support, as we do not try all
|
||||
possible targets at one particular level and work our way
|
||||
down the list, but it's better than nothing. */
|
||||
srv_replace(srvtag);
|
||||
#else
|
||||
/* We're using our internal curl shim, so we can use its (true)
|
||||
SRV support. Obviously, CURLOPT_SRVTAG_GPG_HACK isn't a real
|
||||
libcurl option. It's specific to our shim. */
|
||||
curl_easy_setopt(curl,CURLOPT_SRVTAG_GPG_HACK,srvtag);
|
||||
#endif
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_ERRORBUFFER,errorbuffer);
|
||||
|
||||
if(opt->auth)
|
||||
curl_easy_setopt(curl,CURLOPT_USERPWD,opt->auth);
|
||||
|
||||
if(opt->debug)
|
||||
{
|
||||
fprintf(console,"gpgkeys: curl version = %s\n",curl_version());
|
||||
curl_easy_setopt(curl,CURLOPT_STDERR,console);
|
||||
curl_easy_setopt(curl,CURLOPT_VERBOSE,1L);
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,(long)opt->flags.check_cert);
|
||||
curl_easy_setopt(curl,CURLOPT_CAINFO,opt->ca_cert_file);
|
||||
|
||||
/* Avoid caches to get the most recent copy of the key. This is bug
|
||||
#1061. In pre-curl versions of the code, we didn't do it. Then
|
||||
we did do it (as a curl default) until curl changed the default.
|
||||
Now we're doing it again, but in such a way that changing
|
||||
defaults in the future won't impact us. We set both the Pragma
|
||||
and Cache-Control versions of the header, so we're good with both
|
||||
HTTP 1.0 and 1.1. */
|
||||
headers=curl_slist_append(headers,"Pragma: no-cache");
|
||||
if(headers)
|
||||
headers=curl_slist_append(headers,"Cache-Control: no-cache");
|
||||
|
||||
if(!headers)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory when building HTTP headers\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
curl_easy_setopt(curl,CURLOPT_HTTPHEADER,headers);
|
||||
|
||||
if(proxy)
|
||||
curl_easy_setopt(curl,CURLOPT_PROXY,proxy);
|
||||
|
||||
/* If it's a GET or a SEARCH, the next thing to come in is the
|
||||
keyids. If it's a SEND, then there are no keyids. */
|
||||
|
||||
if(opt->action==KS_SEND)
|
||||
while(fgets(line,MAX_LINE,input)!=NULL && line[0]!='\n');
|
||||
else if(opt->action==KS_GET
|
||||
|| opt->action==KS_GETNAME || opt->action==KS_SEARCH)
|
||||
{
|
||||
for(;;)
|
||||
{
|
||||
struct keylist *work;
|
||||
|
||||
if(fgets(line,MAX_LINE,input)==NULL)
|
||||
break;
|
||||
else
|
||||
{
|
||||
if(line[0]=='\n' || line[0]=='\0')
|
||||
break;
|
||||
|
||||
work=malloc(sizeof(struct keylist));
|
||||
if(work==NULL)
|
||||
{
|
||||
fprintf(console,"gpgkeys: out of memory while "
|
||||
"building key list\n");
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
strcpy(work->str,line);
|
||||
|
||||
/* Trim the trailing \n */
|
||||
work->str[strlen(line)-1]='\0';
|
||||
|
||||
work->next=NULL;
|
||||
|
||||
/* Always attach at the end to keep the list in proper
|
||||
order for searching */
|
||||
if(keylist==NULL)
|
||||
keylist=work;
|
||||
else
|
||||
keyptr->next=work;
|
||||
|
||||
keyptr=work;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf(console,"gpgkeys: no keyserver command specified\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Send the response */
|
||||
|
||||
fprintf(output,"VERSION %d\n",KEYSERVER_PROTO_VERSION);
|
||||
fprintf(output,"PROGRAM %s\n\n",VERSION);
|
||||
|
||||
if(opt->verbose>1)
|
||||
{
|
||||
fprintf(console,"Host:\t\t%s\n",opt->host);
|
||||
if(opt->port)
|
||||
fprintf(console,"Port:\t\t%s\n",opt->port);
|
||||
if(strcmp(opt->path,"/")!=0)
|
||||
fprintf(console,"Path:\t\t%s\n",opt->path);
|
||||
fprintf(console,"Command:\t%s\n",ks_action_to_string(opt->action));
|
||||
}
|
||||
|
||||
if(opt->action==KS_GET)
|
||||
{
|
||||
keyptr=keylist;
|
||||
|
||||
while(keyptr!=NULL)
|
||||
{
|
||||
set_timeout(opt->timeout);
|
||||
|
||||
if(get_key(keyptr->str)!=KEYSERVER_OK)
|
||||
failed++;
|
||||
|
||||
keyptr=keyptr->next;
|
||||
}
|
||||
}
|
||||
else if(opt->action==KS_GETNAME)
|
||||
{
|
||||
keyptr=keylist;
|
||||
|
||||
while(keyptr!=NULL)
|
||||
{
|
||||
set_timeout(opt->timeout);
|
||||
|
||||
if(get_name(keyptr->str)!=KEYSERVER_OK)
|
||||
failed++;
|
||||
|
||||
keyptr=keyptr->next;
|
||||
}
|
||||
}
|
||||
else if(opt->action==KS_SEND)
|
||||
{
|
||||
int myeof=0;
|
||||
|
||||
do
|
||||
{
|
||||
set_timeout(opt->timeout);
|
||||
|
||||
if(send_key(&myeof)!=KEYSERVER_OK)
|
||||
failed++;
|
||||
}
|
||||
while(!myeof);
|
||||
}
|
||||
else if(opt->action==KS_SEARCH)
|
||||
{
|
||||
char *searchkey=NULL;
|
||||
int len=0;
|
||||
|
||||
set_timeout(opt->timeout);
|
||||
|
||||
/* To search, we stick a space in between each key to search
|
||||
for. */
|
||||
|
||||
keyptr=keylist;
|
||||
while(keyptr!=NULL)
|
||||
{
|
||||
len+=strlen(keyptr->str)+1;
|
||||
keyptr=keyptr->next;
|
||||
}
|
||||
|
||||
searchkey=malloc(len+1);
|
||||
if(searchkey==NULL)
|
||||
{
|
||||
ret=KEYSERVER_NO_MEMORY;
|
||||
fail_all(keylist,KEYSERVER_NO_MEMORY);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
searchkey[0]='\0';
|
||||
|
||||
keyptr=keylist;
|
||||
while(keyptr!=NULL)
|
||||
{
|
||||
strcat(searchkey,keyptr->str);
|
||||
strcat(searchkey," ");
|
||||
keyptr=keyptr->next;
|
||||
}
|
||||
|
||||
/* Nail that last space */
|
||||
if(*searchkey)
|
||||
searchkey[strlen(searchkey)-1]='\0';
|
||||
|
||||
if(search_key(searchkey)!=KEYSERVER_OK)
|
||||
failed++;
|
||||
|
||||
free(searchkey);
|
||||
}
|
||||
else
|
||||
abort();
|
||||
|
||||
if(!failed)
|
||||
ret=KEYSERVER_OK;
|
||||
|
||||
fail:
|
||||
while(keylist!=NULL)
|
||||
{
|
||||
struct keylist *current=keylist;
|
||||
keylist=keylist->next;
|
||||
free(current);
|
||||
}
|
||||
|
||||
if(input!=stdin)
|
||||
fclose(input);
|
||||
|
||||
if(output!=stdout)
|
||||
fclose(output);
|
||||
|
||||
free_ks_options(opt);
|
||||
|
||||
curl_slist_free_all(headers);
|
||||
|
||||
if(curl)
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
free(proxy);
|
||||
|
||||
return ret;
|
||||
}
|
@ -1,444 +0,0 @@
|
||||
/* gpgkeys_kdns.c - Fetch a key via the GnuPG specific KDNS scheme.
|
||||
* Copyright (C) 2008 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#ifdef HAVE_GETOPT_H
|
||||
# include <getopt.h>
|
||||
#endif
|
||||
#include <assert.h>
|
||||
#ifdef HAVE_ADNS_H
|
||||
# include <adns.h>
|
||||
# ifndef HAVE_ADNS_FREE
|
||||
# define adns_free free
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define INCLUDED_BY_MAIN_MODULE 1
|
||||
#include "util.h"
|
||||
#include "keyserver.h"
|
||||
#include "ksutil.h"
|
||||
|
||||
/* Our own name. */
|
||||
#define PGM "gpgkeys_kdns"
|
||||
|
||||
/* getopt(3) requires declarion of some global variables. */
|
||||
extern char *optarg;
|
||||
extern int optind;
|
||||
|
||||
/* Convenience variables usually intialized withn std{in,out,err}. */
|
||||
static FILE *input, *output, *console;
|
||||
|
||||
/* Standard keyserver module options. */
|
||||
static struct ks_options *opt;
|
||||
|
||||
/* The flags we pass to adns_init: Do not allow any environment
|
||||
variables and for now enable debugging. */
|
||||
#define MY_ADNS_INITFLAGS (adns_if_noenv)
|
||||
|
||||
|
||||
/* ADNS has no support for CERT yes. */
|
||||
#define my_adns_r_cert 37
|
||||
|
||||
/* The root of the KDNS tree. */
|
||||
static const char *kdns_root;
|
||||
|
||||
/* The replacement string for the at sign. */
|
||||
static const char *kdns_at_repl;
|
||||
|
||||
/* Flag indicating that a TCP connection should be used. */
|
||||
static int kdns_usevc;
|
||||
|
||||
|
||||
|
||||
/* Retrieve one key. ADDRESS should be an RFC-2822 addr-spec. */
|
||||
static int
|
||||
get_key (adns_state adns_ctx, char *address)
|
||||
{
|
||||
int ret = KEYSERVER_INTERNAL_ERROR;
|
||||
const char *domain;
|
||||
char *name = NULL;
|
||||
adns_answer *answer = NULL;
|
||||
const unsigned char *data;
|
||||
int datalen;
|
||||
struct b64state b64state;
|
||||
char *p;
|
||||
|
||||
domain = strrchr (address, '@');
|
||||
if (!domain || domain == address || !domain[1])
|
||||
{
|
||||
fprintf (console, PGM": invalid mail address '%s'\n", address);
|
||||
ret = KEYSERVER_GENERAL_ERROR;
|
||||
goto leave;
|
||||
}
|
||||
name = xtrymalloc (strlen (address) + strlen (kdns_at_repl)
|
||||
+ 1 + strlen (kdns_root) + 1);
|
||||
if (!name)
|
||||
goto leave;
|
||||
memcpy (name, address, domain - address);
|
||||
p = stpcpy (name + (domain-address), ".");
|
||||
if (*kdns_at_repl)
|
||||
p = stpcpy (stpcpy (p, kdns_at_repl), ".");
|
||||
p = stpcpy (p, domain+1);
|
||||
if (*kdns_root)
|
||||
strcpy (stpcpy (p, "."), kdns_root);
|
||||
|
||||
fprintf (output,"NAME %s BEGIN\n", address);
|
||||
if (opt->verbose > 2)
|
||||
fprintf(console, PGM": looking up '%s'\n", name);
|
||||
|
||||
if ( adns_synchronous (adns_ctx, name, (adns_r_unknown | my_adns_r_cert),
|
||||
adns_qf_quoteok_query|(kdns_usevc?adns_qf_usevc:0),
|
||||
&answer) )
|
||||
{
|
||||
fprintf (console, PGM": DNS query failed: %s\n", strerror (errno));
|
||||
ret = KEYSERVER_KEY_NOT_FOUND;
|
||||
goto leave;
|
||||
}
|
||||
if (answer->status != adns_s_ok)
|
||||
{
|
||||
fprintf (console, PGM": DNS query returned: %s (%s)\n",
|
||||
adns_strerror (answer->status),
|
||||
adns_errabbrev (answer->status));
|
||||
ret = KEYSERVER_KEY_NOT_FOUND;
|
||||
goto leave;
|
||||
}
|
||||
datalen = answer->rrs.byteblock->len;
|
||||
data = answer->rrs.byteblock->data;
|
||||
|
||||
if ( opt->debug > 1 )
|
||||
{
|
||||
int i;
|
||||
|
||||
fprintf (console, "got %d bytes of data:", datalen);
|
||||
for (i=0; i < datalen; i++)
|
||||
{
|
||||
if (!(i % 32))
|
||||
fprintf (console, "\n%08x ", i);
|
||||
fprintf (console, "%02x", data[i]);
|
||||
}
|
||||
putc ('\n', console);
|
||||
}
|
||||
if ( datalen < 5 )
|
||||
{
|
||||
fprintf (console, PGM": error: truncated CERT record\n");
|
||||
ret = KEYSERVER_KEY_NOT_FOUND;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
switch ( ((data[0]<<8)|data[1]) )
|
||||
{
|
||||
case 3: /* CERT type is PGP. */
|
||||
/* (key tag and algorithm fields are ignored for this CERT type). */
|
||||
data += 5;
|
||||
datalen -= 5;
|
||||
if ( datalen < 11 )
|
||||
{
|
||||
/* Gpg checks for a minium length of 11, thus we do the same. */
|
||||
fprintf (console, PGM": error: OpenPGP data to short\n");
|
||||
ret = KEYSERVER_KEY_NOT_FOUND;
|
||||
goto leave;
|
||||
}
|
||||
if (b64enc_start (&b64state, output, "PGP PUBLIC KEY BLOCK")
|
||||
|| b64enc_write (&b64state, data, datalen)
|
||||
|| b64enc_finish (&b64state))
|
||||
goto leave; /* Oops, base64 encoder failed. */
|
||||
break;
|
||||
|
||||
default:
|
||||
fprintf (console, PGM": CERT type %d ignored\n", (data[0] <<8|data[1]));
|
||||
ret = KEYSERVER_KEY_NOT_FOUND;
|
||||
goto leave;
|
||||
}
|
||||
|
||||
ret = 0; /* All fine. */
|
||||
|
||||
leave:
|
||||
if (ret)
|
||||
fprintf (output, "\nNAME %s FAILED %d\n", address, ret);
|
||||
else
|
||||
fprintf (output, "\nNAME %s END\n", address);
|
||||
adns_free (answer);
|
||||
xfree (name);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* Print some help. */
|
||||
static void
|
||||
show_help (FILE *fp)
|
||||
{
|
||||
fputs (PGM" ("GNUPG_NAME") " VERSION"\n\n", fp);
|
||||
fputs (" -h\thelp\n"
|
||||
" -V\tversion\n"
|
||||
" -o\toutput to this file\n"
|
||||
"\n", fp);
|
||||
fputs ("This keyserver helper accepts URLs of the form:\n"
|
||||
" kdns://[NAMESERVER]/[ROOT][?at=STRING]\n"
|
||||
"with\n"
|
||||
" NAMESERVER used for queries (default: system standard)\n"
|
||||
" ROOT a DNS name appended to the query (default: none)\n"
|
||||
" STRING a string to replace the '@' (default: \".\")\n"
|
||||
"If a long answer is expected add the parameter \"usevc=1\".\n"
|
||||
"\n", fp);
|
||||
fputs ("Example: A query for \"hacker@gnupg.org\" with\n"
|
||||
" kdns://10.0.0.1/example.net?at=_key&usevc=1\n"
|
||||
"setup as --auto-key-lookup does a CERT record query\n"
|
||||
"with type PGP on the nameserver 10.0.0.1 for\n"
|
||||
" hacker._key_.gnupg.org.example.net\n"
|
||||
"\n", fp);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, char *argv[])
|
||||
{
|
||||
int arg;
|
||||
int ret = KEYSERVER_INTERNAL_ERROR;
|
||||
char line[MAX_LINE];
|
||||
struct keylist *keylist = NULL;
|
||||
struct keylist **keylist_tail = &keylist;
|
||||
struct keylist *akey;
|
||||
int failed = 0;
|
||||
adns_state adns_ctx = NULL;
|
||||
adns_initflags my_adns_initflags = MY_ADNS_INITFLAGS;
|
||||
int tmprc;
|
||||
|
||||
/* The defaults for the KDNS name mangling. */
|
||||
kdns_root = "";
|
||||
kdns_at_repl = "";
|
||||
|
||||
console = stderr;
|
||||
|
||||
/* Kludge to implement standard GNU options. */
|
||||
if (argc > 1 && !strcmp (argv[1], "--version"))
|
||||
{
|
||||
fputs (PGM" ("GNUPG_NAME") " VERSION"\n", stdout);
|
||||
return 0;
|
||||
}
|
||||
else if (argc > 1 && !strcmp (argv[1], "--help"))
|
||||
{
|
||||
show_help (stdout);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while ( (arg = getopt (argc, argv, "hVo:")) != -1 )
|
||||
{
|
||||
switch(arg)
|
||||
{
|
||||
case 'V':
|
||||
printf ("%d\n%s\n", KEYSERVER_PROTO_VERSION, VERSION);
|
||||
return KEYSERVER_OK;
|
||||
|
||||
case 'o':
|
||||
output = fopen (optarg,"w");
|
||||
if (!output)
|
||||
{
|
||||
fprintf (console, PGM": cannot open output file '%s': %s\n",
|
||||
optarg, strerror(errno) );
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
default:
|
||||
show_help (console);
|
||||
return KEYSERVER_OK;
|
||||
}
|
||||
}
|
||||
|
||||
if (argc > optind)
|
||||
{
|
||||
input = fopen (argv[optind], "r");
|
||||
if (!input)
|
||||
{
|
||||
fprintf (console, PGM": cannot open input file '%s': %s\n",
|
||||
argv[optind], strerror(errno) );
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if (!input)
|
||||
input = stdin;
|
||||
|
||||
if (!output)
|
||||
output = stdout;
|
||||
|
||||
opt = init_ks_options();
|
||||
if(!opt)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
|
||||
/* Get the command and info block */
|
||||
while ( fgets(line,MAX_LINE,input) )
|
||||
{
|
||||
int err;
|
||||
|
||||
if(line[0]=='\n')
|
||||
break;
|
||||
|
||||
err = parse_ks_options (line, opt);
|
||||
if (err > 0)
|
||||
{
|
||||
ret = err;
|
||||
goto leave;
|
||||
}
|
||||
else if (!err)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (opt->timeout && register_timeout() == -1 )
|
||||
{
|
||||
fprintf (console, PGM": unable to register timeout handler\n");
|
||||
return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
|
||||
if (opt->verbose)
|
||||
{
|
||||
fprintf (console, PGM": HOST=%s\n", opt->host? opt->host:"(none)");
|
||||
fprintf (console, PGM": PATH=%s\n", opt->path? opt->path:"(none)");
|
||||
}
|
||||
if (opt->path && *opt->path == '/')
|
||||
{
|
||||
char *p, *pend;
|
||||
|
||||
kdns_root = opt->path+1;
|
||||
p = strchr (opt->path+1, '?');
|
||||
if (p)
|
||||
{
|
||||
*p++ = 0;
|
||||
do
|
||||
{
|
||||
pend = strchr (p, '&');
|
||||
if (pend)
|
||||
*pend++ = 0;
|
||||
if (!strncmp (p, "at=", 3))
|
||||
kdns_at_repl = p+3;
|
||||
else if (!strncmp (p, "usevc=", 6))
|
||||
kdns_usevc = !!atoi (p+6);
|
||||
}
|
||||
while ((p = pend));
|
||||
}
|
||||
}
|
||||
if (strchr (kdns_root, '/'))
|
||||
{
|
||||
fprintf (console, PGM": invalid character in KDNS root\n");
|
||||
return KEYSERVER_GENERAL_ERROR;
|
||||
}
|
||||
if (!strcmp (kdns_at_repl, "."))
|
||||
kdns_at_repl = "";
|
||||
|
||||
if (opt->verbose)
|
||||
{
|
||||
fprintf (console, PGM": kdns_root=%s\n", kdns_root);
|
||||
fprintf (console, PGM": kdns_at=%s\n", kdns_at_repl);
|
||||
fprintf (console, PGM": kdns_usevc=%d\n", kdns_usevc);
|
||||
}
|
||||
|
||||
if (opt->debug)
|
||||
my_adns_initflags |= adns_if_debug;
|
||||
if (opt->host)
|
||||
{
|
||||
char cfgtext[200];
|
||||
|
||||
snprintf (cfgtext, sizeof cfgtext, "nameserver %s\n", opt->host);
|
||||
tmprc = adns_init_strcfg (&adns_ctx, my_adns_initflags, console,cfgtext);
|
||||
}
|
||||
else
|
||||
tmprc = adns_init (&adns_ctx, my_adns_initflags, console);
|
||||
if (tmprc)
|
||||
{
|
||||
fprintf (console, PGM": error initializing ADNS: %s\n",
|
||||
strerror (errno));
|
||||
goto leave;
|
||||
}
|
||||
|
||||
if (opt->action == KS_GETNAME)
|
||||
{
|
||||
while ( fgets (line,MAX_LINE,input) )
|
||||
{
|
||||
if (line[0]=='\n' || !line[0] )
|
||||
break;
|
||||
line[strlen(line)-1] = 0; /* Trim the trailing LF. */
|
||||
|
||||
akey = xtrymalloc (sizeof *akey);
|
||||
if (!akey)
|
||||
{
|
||||
fprintf (console,
|
||||
PGM": out of memory while building key list\n");
|
||||
ret = KEYSERVER_NO_MEMORY;
|
||||
goto leave;
|
||||
}
|
||||
assert (sizeof (akey->str) > strlen(line));
|
||||
strcpy (akey->str, line);
|
||||
akey->next = NULL;
|
||||
*keylist_tail = akey;
|
||||
keylist_tail = &akey->next;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fprintf (console,
|
||||
PGM": this keyserver type only supports "
|
||||
"key retrieval by name\n");
|
||||
goto leave;
|
||||
}
|
||||
|
||||
/* Send the response */
|
||||
fprintf (output, "VERSION %d\n", KEYSERVER_PROTO_VERSION);
|
||||
fprintf (output, "PROGRAM %s\n\n", VERSION);
|
||||
|
||||
if (opt->verbose > 1)
|
||||
{
|
||||
if (opt->opaque)
|
||||
fprintf (console, "User:\t\t%s\n", opt->opaque);
|
||||
fprintf (console, "Command:\tGET\n");
|
||||
}
|
||||
|
||||
for (akey = keylist; akey; akey = akey->next)
|
||||
{
|
||||
set_timeout (opt->timeout);
|
||||
if ( get_key (adns_ctx, akey->str) )
|
||||
failed++;
|
||||
}
|
||||
if (!failed)
|
||||
ret = KEYSERVER_OK;
|
||||
|
||||
|
||||
leave:
|
||||
if (adns_ctx)
|
||||
adns_finish (adns_ctx);
|
||||
while (keylist)
|
||||
{
|
||||
akey = keylist->next;
|
||||
xfree (keylist);
|
||||
keylist = akey;
|
||||
}
|
||||
if (input != stdin)
|
||||
fclose (input);
|
||||
if (output != stdout)
|
||||
fclose (output);
|
||||
kdns_root = "";
|
||||
kdns_at_repl = ".";
|
||||
free_ks_options (opt);
|
||||
return ret;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,624 +0,0 @@
|
||||
/* ksutil.c - general keyserver utility functions
|
||||
* Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the Free Software Foundation
|
||||
* gives permission to link the code of the keyserver helper tools:
|
||||
* gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
|
||||
* project's "OpenSSL" library (or with modified versions of it that
|
||||
* use the same license as the "OpenSSL" library), and distribute the
|
||||
* linked executables. You must obey the GNU General Public License
|
||||
* in all respects for all of the code used other than "OpenSSL". If
|
||||
* you modify this file, you may extend this exception to your version
|
||||
* of the file, but you are not obligated to do so. If you do not
|
||||
* wish to do so, delete this exception statement from your version.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#ifdef HAVE_SIGNAL_H
|
||||
# include <signal.h>
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBCURL
|
||||
#include <curl/curl.h>
|
||||
#else
|
||||
#include "curl-shim.h"
|
||||
#endif
|
||||
#include "util.h"
|
||||
#include "keyserver.h"
|
||||
#include "ksutil.h"
|
||||
|
||||
#ifdef HAVE_DOSISH_SYSTEM
|
||||
|
||||
unsigned int set_timeout(unsigned int seconds) {return 0;}
|
||||
int register_timeout(void) {return 0;}
|
||||
|
||||
#else
|
||||
|
||||
static void
|
||||
catch_alarm(int foo)
|
||||
{
|
||||
(void)foo;
|
||||
_exit(KEYSERVER_TIMEOUT);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
set_timeout(unsigned int seconds)
|
||||
{
|
||||
return alarm(seconds);
|
||||
}
|
||||
|
||||
int
|
||||
register_timeout(void)
|
||||
{
|
||||
#if defined(HAVE_SIGACTION) && defined(HAVE_STRUCT_SIGACTION)
|
||||
struct sigaction act;
|
||||
|
||||
act.sa_handler=catch_alarm;
|
||||
sigemptyset(&act.sa_mask);
|
||||
act.sa_flags=0;
|
||||
return sigaction(SIGALRM,&act,NULL);
|
||||
#else
|
||||
if(signal(SIGALRM,catch_alarm)==SIG_ERR)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* !HAVE_DOSISH_SYSTEM */
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
void
|
||||
w32_init_sockets (void)
|
||||
{
|
||||
static int initialized;
|
||||
static WSADATA wsdata;
|
||||
|
||||
if (!initialized)
|
||||
{
|
||||
WSAStartup (0x0202, &wsdata);
|
||||
initialized = 1;
|
||||
}
|
||||
}
|
||||
#endif /*HAVE_W32_SYSTEM*/
|
||||
|
||||
|
||||
struct ks_options *
|
||||
init_ks_options(void)
|
||||
{
|
||||
struct ks_options *opt;
|
||||
|
||||
opt=calloc(1,sizeof(struct ks_options));
|
||||
|
||||
if(opt)
|
||||
{
|
||||
opt->action=KS_UNKNOWN;
|
||||
opt->flags.include_revoked=1;
|
||||
opt->flags.include_subkeys=1;
|
||||
opt->flags.check_cert=1;
|
||||
opt->timeout=DEFAULT_KEYSERVER_TIMEOUT;
|
||||
opt->path=strdup("/");
|
||||
if(!opt->path)
|
||||
{
|
||||
free(opt);
|
||||
opt=NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return opt;
|
||||
}
|
||||
|
||||
void
|
||||
free_ks_options(struct ks_options *opt)
|
||||
{
|
||||
if(opt)
|
||||
{
|
||||
free(opt->host);
|
||||
free(opt->port);
|
||||
free(opt->scheme);
|
||||
free(opt->auth);
|
||||
free(opt->path);
|
||||
free(opt->opaque);
|
||||
free(opt->ca_cert_file);
|
||||
free(opt);
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns 0 if we "ate" the line. Returns >0, a KEYSERVER_ error
|
||||
code if that error applies. Returns -1 if we did not match the
|
||||
line at all. */
|
||||
int
|
||||
parse_ks_options(char *line,struct ks_options *opt)
|
||||
{
|
||||
int version;
|
||||
char command[MAX_COMMAND+1];
|
||||
char host[MAX_HOST+1];
|
||||
char port[MAX_PORT+1];
|
||||
char scheme[MAX_SCHEME+1];
|
||||
char auth[MAX_AUTH+1];
|
||||
char path[URLMAX_PATH+1];
|
||||
char opaque[MAX_OPAQUE+1];
|
||||
char option[MAX_OPTION+1];
|
||||
|
||||
if(line[0]=='#')
|
||||
return 0;
|
||||
|
||||
if(sscanf(line,"COMMAND %" MKSTRING(MAX_COMMAND) "s\n",command)==1)
|
||||
{
|
||||
command[MAX_COMMAND]='\0';
|
||||
|
||||
if(strcasecmp(command,"get")==0)
|
||||
opt->action=KS_GET;
|
||||
else if(strcasecmp(command,"getname")==0)
|
||||
opt->action=KS_GETNAME;
|
||||
else if(strcasecmp(command,"send")==0)
|
||||
opt->action=KS_SEND;
|
||||
else if(strcasecmp(command,"search")==0)
|
||||
opt->action=KS_SEARCH;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"HOST %" MKSTRING(MAX_HOST) "s\n",host)==1)
|
||||
{
|
||||
host[MAX_HOST]='\0';
|
||||
free(opt->host);
|
||||
opt->host=strdup(host);
|
||||
if(!opt->host)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"PORT %" MKSTRING(MAX_PORT) "s\n",port)==1)
|
||||
{
|
||||
port[MAX_PORT]='\0';
|
||||
free(opt->port);
|
||||
opt->port=strdup(port);
|
||||
if(!opt->port)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"SCHEME %" MKSTRING(MAX_SCHEME) "s\n",scheme)==1)
|
||||
{
|
||||
scheme[MAX_SCHEME]='\0';
|
||||
free(opt->scheme);
|
||||
opt->scheme=strdup(scheme);
|
||||
if(!opt->scheme)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"AUTH %" MKSTRING(MAX_AUTH) "s\n",auth)==1)
|
||||
{
|
||||
auth[MAX_AUTH]='\0';
|
||||
free(opt->auth);
|
||||
opt->auth=strdup(auth);
|
||||
if(!opt->auth)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"PATH %" MKSTRING(URLMAX_PATH) "s\n",path)==1)
|
||||
{
|
||||
path[URLMAX_PATH]='\0';
|
||||
free(opt->path);
|
||||
opt->path=strdup(path);
|
||||
if(!opt->path)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"OPAQUE %" MKSTRING(MAX_OPAQUE) "s\n",opaque)==1)
|
||||
{
|
||||
opaque[MAX_OPAQUE]='\0';
|
||||
free(opt->opaque);
|
||||
opt->opaque=strdup(opaque);
|
||||
if(!opt->opaque)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"VERSION %d\n",&version)==1)
|
||||
{
|
||||
if(version!=KEYSERVER_PROTO_VERSION)
|
||||
return KEYSERVER_VERSION_ERROR;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
if(sscanf(line,"OPTION %" MKSTRING(MAX_OPTION) "[^\n]\n",option)==1)
|
||||
{
|
||||
int no=0;
|
||||
char *start=&option[0];
|
||||
|
||||
option[MAX_OPTION]='\0';
|
||||
|
||||
if(strncasecmp(option,"no-",3)==0)
|
||||
{
|
||||
no=1;
|
||||
start=&option[3];
|
||||
}
|
||||
|
||||
if(strncasecmp(start,"verbose",7)==0)
|
||||
{
|
||||
if(no)
|
||||
opt->verbose=0;
|
||||
else if(start[7]=='=')
|
||||
opt->verbose=atoi(&start[8]);
|
||||
else
|
||||
opt->verbose++;
|
||||
}
|
||||
else if(strcasecmp(start,"include-disabled")==0)
|
||||
{
|
||||
if(no)
|
||||
opt->flags.include_disabled=0;
|
||||
else
|
||||
opt->flags.include_disabled=1;
|
||||
}
|
||||
else if(strcasecmp(start,"include-revoked")==0)
|
||||
{
|
||||
if(no)
|
||||
opt->flags.include_revoked=0;
|
||||
else
|
||||
opt->flags.include_revoked=1;
|
||||
}
|
||||
else if(strcasecmp(start,"include-subkeys")==0)
|
||||
{
|
||||
if(no)
|
||||
opt->flags.include_subkeys=0;
|
||||
else
|
||||
opt->flags.include_subkeys=1;
|
||||
}
|
||||
else if(strcasecmp(start,"check-cert")==0)
|
||||
{
|
||||
if(no)
|
||||
opt->flags.check_cert=0;
|
||||
else
|
||||
opt->flags.check_cert=1;
|
||||
}
|
||||
else if(strncasecmp(start,"debug",5)==0)
|
||||
{
|
||||
if(no)
|
||||
opt->debug=0;
|
||||
else if(start[5]=='=')
|
||||
opt->debug=atoi(&start[6]);
|
||||
else if(start[5]=='\0')
|
||||
opt->debug=1;
|
||||
}
|
||||
else if(strncasecmp(start,"timeout",7)==0)
|
||||
{
|
||||
if(no)
|
||||
opt->timeout=0;
|
||||
else if(start[7]=='=')
|
||||
opt->timeout=atoi(&start[8]);
|
||||
else if(start[7]=='\0')
|
||||
opt->timeout=DEFAULT_KEYSERVER_TIMEOUT;
|
||||
}
|
||||
else if(strncasecmp(start,"ca-cert-file",12)==0)
|
||||
{
|
||||
if(no)
|
||||
{
|
||||
free(opt->ca_cert_file);
|
||||
opt->ca_cert_file=NULL;
|
||||
}
|
||||
else if(start[12]=='=')
|
||||
{
|
||||
free(opt->ca_cert_file);
|
||||
opt->ca_cert_file = make_filename_try (start+13, NULL);
|
||||
if(!opt->ca_cert_file)
|
||||
return KEYSERVER_NO_MEMORY;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
const char *
|
||||
ks_action_to_string(enum ks_action action)
|
||||
{
|
||||
switch(action)
|
||||
{
|
||||
case KS_UNKNOWN: return "UNKNOWN";
|
||||
case KS_GET: return "GET";
|
||||
case KS_GETNAME: return "GETNAME";
|
||||
case KS_SEND: return "SEND";
|
||||
case KS_SEARCH: return "SEARCH";
|
||||
}
|
||||
|
||||
return "?";
|
||||
}
|
||||
|
||||
/* Canonicalize CRLF to just LF by stripping CRs. This actually makes
|
||||
sense, since on Unix-like machines LF is correct, and on win32-like
|
||||
machines, our output buffer is opened in textmode and will
|
||||
re-canonicalize line endings back to CRLF. Since we only need to
|
||||
handle armored keys, we don't have to worry about odd cases like
|
||||
CRCRCR and the like. */
|
||||
|
||||
void
|
||||
print_nocr(FILE *stream,const char *str)
|
||||
{
|
||||
while(*str)
|
||||
{
|
||||
if(*str!='\r')
|
||||
fputc(*str,stream);
|
||||
str++;
|
||||
}
|
||||
}
|
||||
|
||||
enum ks_search_type
|
||||
classify_ks_search(const char **search)
|
||||
{
|
||||
switch(**search)
|
||||
{
|
||||
case '*':
|
||||
(*search)++;
|
||||
return KS_SEARCH_SUBSTR;
|
||||
case '=':
|
||||
(*search)++;
|
||||
return KS_SEARCH_EXACT;
|
||||
case '<':
|
||||
(*search)++;
|
||||
return KS_SEARCH_MAIL;
|
||||
case '@':
|
||||
(*search)++;
|
||||
return KS_SEARCH_MAILSUB;
|
||||
case '0':
|
||||
if((*search)[1]=='x')
|
||||
{
|
||||
if(strlen(*search)==10
|
||||
&& strspn(*search,"abcdefABCDEF1234567890x")==10)
|
||||
{
|
||||
(*search)+=2;
|
||||
return KS_SEARCH_KEYID_SHORT;
|
||||
}
|
||||
else if(strlen(*search)==18
|
||||
&& strspn(*search,"abcdefABCDEF1234567890x")==18)
|
||||
{
|
||||
(*search)+=2;
|
||||
return KS_SEARCH_KEYID_LONG;
|
||||
}
|
||||
}
|
||||
/* fall through */
|
||||
default:
|
||||
return KS_SEARCH_SUBSTR;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
curl_err_to_gpg_err(CURLcode error)
|
||||
{
|
||||
switch(error)
|
||||
{
|
||||
case CURLE_OK: return KEYSERVER_OK;
|
||||
case CURLE_UNSUPPORTED_PROTOCOL: return KEYSERVER_SCHEME_NOT_FOUND;
|
||||
case CURLE_COULDNT_CONNECT: return KEYSERVER_UNREACHABLE;
|
||||
case CURLE_FTP_COULDNT_RETR_FILE: return KEYSERVER_KEY_NOT_FOUND;
|
||||
default: return KEYSERVER_INTERNAL_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
#define B64 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
||||
|
||||
static void
|
||||
curl_armor_writer(const unsigned char *buf,size_t size,void *cw_ctx)
|
||||
{
|
||||
struct curl_writer_ctx *ctx=cw_ctx;
|
||||
size_t idx=0;
|
||||
|
||||
while(idx<size)
|
||||
{
|
||||
for(;ctx->armor_remaining<3 && idx<size;ctx->armor_remaining++,idx++)
|
||||
ctx->armor_ctx[ctx->armor_remaining]=buf[idx];
|
||||
|
||||
if(ctx->armor_remaining==3)
|
||||
{
|
||||
/* Top 6 bytes of ctx->armor_ctx[0] */
|
||||
fputc(B64[(ctx->armor_ctx[0]>>2)&0x3F],ctx->stream);
|
||||
/* Bottom 2 bytes of ctx->armor_ctx[0] and top 4 bytes of
|
||||
ctx->armor_ctx[1] */
|
||||
fputc(B64[(((ctx->armor_ctx[0]<<4)&0x30)
|
||||
|((ctx->armor_ctx[1]>>4)&0x0F))&0x3F],ctx->stream);
|
||||
/* Bottom 4 bytes of ctx->armor_ctx[1] and top 2 bytes of
|
||||
ctx->armor_ctx[2] */
|
||||
fputc(B64[(((ctx->armor_ctx[1]<<2)&0x3C)
|
||||
|((ctx->armor_ctx[2]>>6)&0x03))&0x3F],ctx->stream);
|
||||
/* Bottom 6 bytes of ctx->armor_ctx[2] */
|
||||
fputc(B64[(ctx->armor_ctx[2]&0x3F)],ctx->stream);
|
||||
|
||||
ctx->linelen+=4;
|
||||
if(ctx->linelen>=70)
|
||||
{
|
||||
fputc('\n',ctx->stream);
|
||||
ctx->linelen=0;
|
||||
}
|
||||
|
||||
ctx->armor_remaining=0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
size_t
|
||||
curl_writer(const void *ptr,size_t size,size_t nmemb,void *cw_ctx)
|
||||
{
|
||||
struct curl_writer_ctx *ctx=cw_ctx;
|
||||
const char *buf=ptr;
|
||||
size_t i;
|
||||
|
||||
if(!ctx->flags.initialized)
|
||||
{
|
||||
if(size*nmemb==0)
|
||||
return 0;
|
||||
|
||||
/* The object we're fetching is in binary form */
|
||||
if(*buf&0x80)
|
||||
{
|
||||
ctx->flags.armor=1;
|
||||
fprintf(ctx->stream,BEGIN"\n\n");
|
||||
}
|
||||
else
|
||||
ctx->marker=BEGIN;
|
||||
|
||||
ctx->flags.initialized=1;
|
||||
}
|
||||
|
||||
if(ctx->flags.armor)
|
||||
curl_armor_writer(ptr,size*nmemb,cw_ctx);
|
||||
else
|
||||
{
|
||||
/* scan the incoming data for our marker */
|
||||
for(i=0;!ctx->flags.done && i<(size*nmemb);i++)
|
||||
{
|
||||
if(buf[i]==ctx->marker[ctx->markeridx])
|
||||
{
|
||||
ctx->markeridx++;
|
||||
if(ctx->marker[ctx->markeridx]=='\0')
|
||||
{
|
||||
if(ctx->flags.begun)
|
||||
ctx->flags.done=1;
|
||||
else
|
||||
{
|
||||
/* We've found the BEGIN marker, so now we're
|
||||
looking for the END marker. */
|
||||
ctx->flags.begun=1;
|
||||
ctx->marker=END;
|
||||
ctx->markeridx=0;
|
||||
fprintf(ctx->stream,BEGIN);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
ctx->markeridx=0;
|
||||
|
||||
if(ctx->flags.begun)
|
||||
{
|
||||
/* Canonicalize CRLF to just LF by stripping CRs. This
|
||||
actually makes sense, since on Unix-like machines LF
|
||||
is correct, and on win32-like machines, our output
|
||||
buffer is opened in textmode and will re-canonicalize
|
||||
line endings back to CRLF. Since this code is just
|
||||
for handling armored keys, we don't have to worry
|
||||
about odd cases like CRCRCR and the like. */
|
||||
|
||||
if(buf[i]!='\r')
|
||||
fputc(buf[i],ctx->stream);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return size*nmemb;
|
||||
}
|
||||
|
||||
void
|
||||
curl_writer_finalize(struct curl_writer_ctx *ctx)
|
||||
{
|
||||
if(ctx->flags.armor)
|
||||
{
|
||||
if(ctx->armor_remaining==2)
|
||||
{
|
||||
/* Top 6 bytes of ctx->armorctx[0] */
|
||||
fputc(B64[(ctx->armor_ctx[0]>>2)&0x3F],ctx->stream);
|
||||
/* Bottom 2 bytes of ctx->armor_ctx[0] and top 4 bytes of
|
||||
ctx->armor_ctx[1] */
|
||||
fputc(B64[(((ctx->armor_ctx[0]<<4)&0x30)
|
||||
|((ctx->armor_ctx[1]>>4)&0x0F))&0x3F],ctx->stream);
|
||||
/* Bottom 4 bytes of ctx->armor_ctx[1] */
|
||||
fputc(B64[((ctx->armor_ctx[1]<<2)&0x3C)],ctx->stream);
|
||||
/* Pad */
|
||||
fputc('=',ctx->stream);
|
||||
}
|
||||
else if(ctx->armor_remaining==1)
|
||||
{
|
||||
/* Top 6 bytes of ctx->armor_ctx[0] */
|
||||
fputc(B64[(ctx->armor_ctx[0]>>2)&0x3F],ctx->stream);
|
||||
/* Bottom 2 bytes of ctx->armor_ctx[0] */
|
||||
fputc(B64[((ctx->armor_ctx[0]<<4)&0x30)],ctx->stream);
|
||||
/* Pad */
|
||||
fputc('=',ctx->stream);
|
||||
/* Pad */
|
||||
fputc('=',ctx->stream);
|
||||
}
|
||||
|
||||
fprintf(ctx->stream,"\n"END);
|
||||
ctx->flags.done=1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
ks_hextobyte (const char *s)
|
||||
{
|
||||
int c;
|
||||
|
||||
if ( *s >= '0' && *s <= '9' )
|
||||
c = 16 * (*s - '0');
|
||||
else if ( *s >= 'A' && *s <= 'F' )
|
||||
c = 16 * (10 + *s - 'A');
|
||||
else if ( *s >= 'a' && *s <= 'f' )
|
||||
c = 16 * (10 + *s - 'a');
|
||||
else
|
||||
return -1;
|
||||
s++;
|
||||
if ( *s >= '0' && *s <= '9' )
|
||||
c += *s - '0';
|
||||
else if ( *s >= 'A' && *s <= 'F' )
|
||||
c += 10 + *s - 'A';
|
||||
else if ( *s >= 'a' && *s <= 'f' )
|
||||
c += 10 + *s - 'a';
|
||||
else
|
||||
return -1;
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/* Non localized version of toupper. */
|
||||
int
|
||||
ks_toupper (int c)
|
||||
{
|
||||
if (c >= 'a' && c <= 'z')
|
||||
c &= ~0x20;
|
||||
return c;
|
||||
}
|
||||
|
||||
|
||||
/* Non localized version of strcasecmp. */
|
||||
int
|
||||
ks_strcasecmp (const char *a, const char *b)
|
||||
{
|
||||
if (a == b)
|
||||
return 0;
|
||||
|
||||
for (; *a && *b; a++, b++)
|
||||
{
|
||||
if (*a != *b && ks_toupper (*a) != ks_toupper (*b))
|
||||
break;
|
||||
}
|
||||
return *a == *b? 0 : (ks_toupper (*a) - ks_toupper (*b));
|
||||
}
|
@ -1,149 +0,0 @@
|
||||
/* ksutil.h
|
||||
* Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is part of GnuPG.
|
||||
*
|
||||
* GnuPG is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* GnuPG is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* In addition, as a special exception, the Free Software Foundation
|
||||
* gives permission to link the code of the keyserver helper tools:
|
||||
* gpgkeys_ldap, gpgkeys_curl and gpgkeys_hkp with the OpenSSL
|
||||
* project's "OpenSSL" library (or with modified versions of it that
|
||||
* use the same license as the "OpenSSL" library), and distribute the
|
||||
* linked executables. You must obey the GNU General Public License
|
||||
* in all respects for all of the code used other than "OpenSSL". If
|
||||
* you modify this file, you may extend this exception to your version
|
||||
* of the file, but you are not obligated to do so. If you do not
|
||||
* wish to do so, delete this exception statement from your version.
|
||||
*/
|
||||
|
||||
#ifndef _KSUTIL_H_
|
||||
#define _KSUTIL_H_
|
||||
|
||||
#ifdef HAVE_LIBCURL
|
||||
#include <curl/curl.h>
|
||||
#else
|
||||
#include "curl-shim.h"
|
||||
#endif
|
||||
|
||||
/* MAX_LINE must be at least 1 larger than the largest item we expect
|
||||
to receive, including the name tag ("COMMAND", "PORT", etc) and
|
||||
space between. In practice, that means it should be
|
||||
strlen("OPAQUE")+1+sizeof_opaque+1 */
|
||||
#define MAX_LINE (6+1+1024+1)
|
||||
|
||||
#define MAX_COMMAND 7
|
||||
#define MAX_OPTION 256
|
||||
#define MAX_SCHEME 20
|
||||
#define MAX_OPAQUE 1024
|
||||
#define MAX_AUTH 128
|
||||
#define MAX_HOST 80
|
||||
#define MAX_PORT 10
|
||||
#define URLMAX_PATH 1024
|
||||
#define MAX_PROXY 128
|
||||
#define MAX_URL (MAX_SCHEME+1+3+MAX_AUTH+1+1+MAX_HOST+1+1 \
|
||||
+MAX_PORT+1+1+URLMAX_PATH+1+50)
|
||||
|
||||
#define STRINGIFY(x) #x
|
||||
#define MKSTRING(x) STRINGIFY(x)
|
||||
|
||||
#define BEGIN "-----BEGIN PGP PUBLIC KEY BLOCK-----"
|
||||
#define END "-----END PGP PUBLIC KEY BLOCK-----"
|
||||
|
||||
#ifdef __riscos__
|
||||
#define HTTP_PROXY_ENV "GnuPG$HttpProxy"
|
||||
#else
|
||||
#define HTTP_PROXY_ENV "http_proxy"
|
||||
#endif
|
||||
|
||||
struct keylist
|
||||
{
|
||||
char str[MAX_LINE];
|
||||
struct keylist *next;
|
||||
};
|
||||
|
||||
/* 2 minutes seems reasonable */
|
||||
#define DEFAULT_KEYSERVER_TIMEOUT 120
|
||||
|
||||
unsigned int set_timeout(unsigned int seconds);
|
||||
int register_timeout(void);
|
||||
|
||||
#ifdef HAVE_W32_SYSTEM
|
||||
void w32_init_sockets (void);
|
||||
#endif
|
||||
|
||||
|
||||
enum ks_action {KS_UNKNOWN=0,KS_GET,KS_GETNAME,KS_SEND,KS_SEARCH};
|
||||
|
||||
enum ks_search_type {KS_SEARCH_SUBSTR,KS_SEARCH_EXACT,
|
||||
KS_SEARCH_MAIL,KS_SEARCH_MAILSUB,
|
||||
KS_SEARCH_KEYID_LONG,KS_SEARCH_KEYID_SHORT};
|
||||
|
||||
struct ks_options
|
||||
{
|
||||
enum ks_action action;
|
||||
char *host;
|
||||
char *port;
|
||||
char *scheme;
|
||||
char *auth;
|
||||
char *path;
|
||||
char *opaque;
|
||||
struct
|
||||
{
|
||||
unsigned int include_disabled:1;
|
||||
unsigned int include_revoked:1;
|
||||
unsigned int include_subkeys:1;
|
||||
unsigned int check_cert:1;
|
||||
} flags;
|
||||
unsigned int verbose;
|
||||
unsigned int debug;
|
||||
unsigned int timeout;
|
||||
char *ca_cert_file;
|
||||
};
|
||||
|
||||
struct ks_options *init_ks_options(void);
|
||||
void free_ks_options(struct ks_options *opt);
|
||||
int parse_ks_options(char *line,struct ks_options *opt);
|
||||
const char *ks_action_to_string(enum ks_action action);
|
||||
void print_nocr(FILE *stream,const char *str);
|
||||
enum ks_search_type classify_ks_search(const char **search);
|
||||
|
||||
int curl_err_to_gpg_err(CURLcode error);
|
||||
|
||||
struct curl_writer_ctx
|
||||
{
|
||||
struct
|
||||
{
|
||||
unsigned int initialized:1;
|
||||
unsigned int begun:1;
|
||||
unsigned int done:1;
|
||||
unsigned int armor:1;
|
||||
} flags;
|
||||
|
||||
int armor_remaining;
|
||||
unsigned char armor_ctx[3];
|
||||
int markeridx,linelen;
|
||||
const char *marker;
|
||||
FILE *stream;
|
||||
};
|
||||
|
||||
size_t curl_writer(const void *ptr,size_t size,size_t nmemb,void *cw_ctx);
|
||||
void curl_writer_finalize(struct curl_writer_ctx *ctx);
|
||||
|
||||
int ks_hextobyte (const char *s);
|
||||
int ks_toupper (int c);
|
||||
int ks_strcasecmp (const char *a, const char *b);
|
||||
|
||||
|
||||
#endif /* !_KSUTIL_H_ */
|
@ -1,107 +0,0 @@
|
||||
/* no-libgcrypt.c - Replacement functions for libgcrypt.
|
||||
* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
*
|
||||
* This file is free software; as a special exception the author gives
|
||||
* unlimited permission to copy and/or distribute it, with or without
|
||||
* modifications, as long as this notice is preserved.
|
||||
*
|
||||
* This file is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
|
||||
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*/
|
||||
|
||||
#include <config.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "../common/util.h"
|
||||
#include "i18n.h"
|
||||
|
||||
|
||||
/* Replace libgcrypt's malloc functions which are used by
|
||||
../jnlib/libjnlib.a . ../common/util.h defines macros to map them
|
||||
to xmalloc etc. */
|
||||
static void
|
||||
out_of_memory (void)
|
||||
{
|
||||
fprintf (stderr, "error allocating enough memory: %s\n", strerror (errno));
|
||||
exit (2);
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
gcry_malloc (size_t n)
|
||||
{
|
||||
return malloc (n);
|
||||
}
|
||||
|
||||
void *
|
||||
gcry_xmalloc (size_t n)
|
||||
{
|
||||
void *p = malloc (n);
|
||||
if (!p)
|
||||
out_of_memory ();
|
||||
return p;
|
||||
}
|
||||
|
||||
char *
|
||||
gcry_strdup (const char *string)
|
||||
{
|
||||
char *p = malloc (strlen (string)+1);
|
||||
if (p)
|
||||
strcpy (p, string);
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
gcry_realloc (void *a, size_t n)
|
||||
{
|
||||
return realloc (a, n);
|
||||
}
|
||||
|
||||
void *
|
||||
gcry_xrealloc (void *a, size_t n)
|
||||
{
|
||||
void *p = realloc (a, n);
|
||||
if (!p)
|
||||
out_of_memory ();
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void *
|
||||
gcry_calloc (size_t n, size_t m)
|
||||
{
|
||||
return calloc (n, m);
|
||||
}
|
||||
|
||||
void *
|
||||
gcry_xcalloc (size_t n, size_t m)
|
||||
{
|
||||
void *p = calloc (n, m);
|
||||
if (!p)
|
||||
out_of_memory ();
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
char *
|
||||
gcry_xstrdup (const char *string)
|
||||
{
|
||||
void *p = malloc (strlen (string)+1);
|
||||
if (!p)
|
||||
out_of_memory ();
|
||||
strcpy( p, string );
|
||||
return p;
|
||||
}
|
||||
|
||||
void
|
||||
gcry_free (void *a)
|
||||
{
|
||||
if (a)
|
||||
free (a);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user