mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
c091816b4a
* dirmngr/dirmngr.h (opt): Add field "use_tor". * dirmngr/dirmngr.c (oUseTor): New. (opts): Add --use-tor. (parse_rereadable_options): Set option. (main): Tell gpgconf about that option. * dirmngr/crlfetch.c (crl_fetch): Pass TOR flag to the http module and return an error if LDAP is used in TOR mode. (ca_cert_fetch): Return an error in TOR mode. (start_cert_fetch): Ditto. * dirmngr/ks-engine-finger.c (ks_finger_fetch): Pass TOR flag to the http module. * dirmngr/ks-engine-hkp.c (send_request): Ditto. * dirmngr/ks-engine-http.c (ks_http_fetch): Ditto. * dirmngr/ks-engine-ldap.c (ks_ldap_get): Return an error in TOR mode. (ks_ldap_search): Ditto. (ks_ldap_put): Ditto. * dirmngr/ocsp.c (do_ocsp_request): Ditto. Also pass TOR flag to the http module. * dirmngr/server.c (option_handler): Add "honor-keyserver-url-used". (cmd_dns_cert): Return an error in TOR mode. (cmd_getinfo): Add subcommand "tor" * tools/gpgconf-comp.c (gc_options_dirmngr): Add TOR group. -- More work is required to actually make --use-tor useful. For now it returns an error for almost all network access but as soon as we have added the TOR feature to the http module some parts will start to work. Signed-off-by: Werner Koch <wk@gnupg.org>
125 lines
2.8 KiB
C
125 lines
2.8 KiB
C
/* ks-engine-finger.c - Finger OpenPGP key access
|
|
* Copyright (C) 2011 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 <stdlib.h>
|
|
#include <string.h>
|
|
#include <assert.h>
|
|
|
|
#include "dirmngr.h"
|
|
#include "misc.h"
|
|
#include "userids.h"
|
|
#include "ks-engine.h"
|
|
|
|
/* Print a help output for the schemata supported by this module. */
|
|
gpg_error_t
|
|
ks_finger_help (ctrl_t ctrl, parsed_uri_t uri)
|
|
{
|
|
char const data[] =
|
|
"Handler for FINGER:\n"
|
|
" finger:<user>@<host>\n"
|
|
"Supported methods: fetch\n"
|
|
"Example:\n"
|
|
" finger:joe@example.org\n";
|
|
gpg_error_t err;
|
|
|
|
if (!uri)
|
|
err = ks_print_help (ctrl, " finger");
|
|
else if (!strcmp (uri->scheme, "finger"))
|
|
err = ks_print_help (ctrl, data);
|
|
else
|
|
err = 0;
|
|
|
|
return err;
|
|
}
|
|
|
|
|
|
/* Get the key from URI which is expected to specify a finger scheme.
|
|
On success R_FP has an open stream to read the data. */
|
|
gpg_error_t
|
|
ks_finger_fetch (ctrl_t ctrl, parsed_uri_t uri, estream_t *r_fp)
|
|
{
|
|
gpg_error_t err;
|
|
estream_t fp;
|
|
char *server;
|
|
char *name;
|
|
http_t http;
|
|
|
|
(void)ctrl;
|
|
*r_fp = NULL;
|
|
|
|
if (strcmp (uri->scheme, "finger") || !uri->opaque || !uri->path)
|
|
return gpg_error (GPG_ERR_INV_ARG);
|
|
|
|
name = xtrystrdup (uri->path);
|
|
if (!name)
|
|
return gpg_error_from_syserror ();
|
|
|
|
server = strchr (name, '@');
|
|
if (!server)
|
|
{
|
|
err = gpg_error (GPG_ERR_INV_URI);
|
|
xfree (name);
|
|
return err;
|
|
}
|
|
*server++ = 0;
|
|
|
|
err = http_raw_connect (&http, server, 79,
|
|
(opt.use_tor? HTTP_FLAG_FORCE_TOR : 0), NULL);
|
|
if (err)
|
|
{
|
|
xfree (name);
|
|
return err;
|
|
}
|
|
|
|
fp = http_get_write_ptr (http);
|
|
if (!fp)
|
|
{
|
|
err = gpg_error (GPG_ERR_INTERNAL);
|
|
http_close (http, 0);
|
|
xfree (name);
|
|
return err;
|
|
}
|
|
|
|
if (es_fputs (name, fp) || es_fputs ("\r\n", fp) || es_fflush (fp))
|
|
{
|
|
err = gpg_error_from_syserror ();
|
|
http_close (http, 0);
|
|
xfree (name);
|
|
return err;
|
|
}
|
|
xfree (name);
|
|
es_fclose (fp);
|
|
|
|
fp = http_get_read_ptr (http);
|
|
if (!fp)
|
|
{
|
|
err = gpg_error (GPG_ERR_INTERNAL);
|
|
http_close (http, 0);
|
|
return err;
|
|
}
|
|
|
|
http_close (http, 1 /* Keep read ptr. */);
|
|
|
|
*r_fp = fp;
|
|
return 0;
|
|
}
|