1
0
mirror of git://git.gnupg.org/gnupg.git synced 2024-12-22 10:19:57 +01:00

sm: Print diagnostic about CRL problems due to Tor mode.

* dirmngr/crlfetch.c (crl_fetch, crl_fetch_default)
(ca_cert_fetch, start_cert_fetch): Factor Tor error out to ...
(no_crl_due_to_tor): new.  Print status note.

* dirmngr/ks-engine-ldap.c (ks_ldap_get)
(ks_ldap_search, ks_ldap_put): Factor Tor error out to ...
(no_ldap_due_to_tor): new.  Print status note.

* dirmngr/ocsp.c (do_ocsp_request): Print status note.
* sm/misc.c (gpgsm_print_further_info): New.
* sm/call-dirmngr.c (warning_and_note_printer): New.
(isvalid_status_cb): Call it.
(lookup_status_cb): Ditto.
(run_command_status_cb): Ditto.

* common/asshelp2.c (vprint_assuan_status): Strip a possible trailing
LF.

--
This commit is contained in:
Werner Koch 2022-04-11 17:57:14 +02:00
parent 0dcc249852
commit 137e59a6a5
No known key found for this signature in database
GPG Key ID: E3FDFF218E45B72B
7 changed files with 122 additions and 23 deletions

View File

@ -63,11 +63,15 @@ vprint_assuan_status (assuan_context_t ctx,
const char *format, va_list arg_ptr) const char *format, va_list arg_ptr)
{ {
int rc; int rc;
size_t n;
char *buf; char *buf;
rc = gpgrt_vasprintf (&buf, format, arg_ptr); rc = gpgrt_vasprintf (&buf, format, arg_ptr);
if (rc < 0) if (rc < 0)
return gpg_err_make (default_errsource, gpg_err_code_from_syserror ()); return gpg_err_make (default_errsource, gpg_err_code_from_syserror ());
n = strlen (buf);
if (n && buf[n-1] == '\n')
buf[n-1] = 0; /* Strip trailing LF to avoid earning from Assuan */
rc = assuan_write_status (ctx, keyword, buf); rc = assuan_write_status (ctx, keyword, buf);
xfree (buf); xfree (buf);
return rc; return rc;

View File

@ -147,6 +147,19 @@ my_es_read (void *opaque, char *buffer, size_t nbytes, size_t *nread)
} }
/* For now we do not support LDAP over Tor. */
static gpg_error_t
no_crl_due_to_tor (ctrl_t ctrl)
{
gpg_error_t err = gpg_error (GPG_ERR_NOT_SUPPORTED);
const char *text = _("CRL access not possible due to Tor mode");
log_error ("%s", text);
dirmngr_status_printf (ctrl, "NOTE", "no_crl_due_to_tor %u %s", err, text);
return gpg_error (GPG_ERR_NOT_SUPPORTED);
}
/* Fetch CRL from URL and return the entire CRL using new ksba reader /* Fetch CRL from URL and return the entire CRL using new ksba reader
object in READER. Note that this reader object should be closed object in READER. Note that this reader object should be closed
only using ldap_close_reader. */ only using ldap_close_reader. */
@ -233,9 +246,7 @@ crl_fetch (ctrl_t ctrl, const char *url, ksba_reader_t *reader)
} }
else if (dirmngr_use_tor ()) else if (dirmngr_use_tor ())
{ {
/* For now we do not support LDAP over Tor. */ err = no_crl_due_to_tor (ctrl);
log_error (_("CRL access not possible due to Tor mode\n"));
err = gpg_error (GPG_ERR_NOT_SUPPORTED);
} }
else else
{ {
@ -259,9 +270,7 @@ crl_fetch_default (ctrl_t ctrl, const char *issuer, ksba_reader_t *reader)
{ {
if (dirmngr_use_tor ()) if (dirmngr_use_tor ())
{ {
/* For now we do not support LDAP over Tor. */ return no_crl_due_to_tor (ctrl);
log_error (_("CRL access not possible due to Tor mode\n"));
return gpg_error (GPG_ERR_NOT_SUPPORTED);
} }
if (opt.disable_ldap) if (opt.disable_ldap)
{ {
@ -291,9 +300,7 @@ ca_cert_fetch (ctrl_t ctrl, cert_fetch_context_t *context, const char *dn)
{ {
if (dirmngr_use_tor ()) if (dirmngr_use_tor ())
{ {
/* For now we do not support LDAP over Tor. */ return no_crl_due_to_tor (ctrl);
log_error (_("CRL access not possible due to Tor mode\n"));
return gpg_error (GPG_ERR_NOT_SUPPORTED);
} }
if (opt.disable_ldap) if (opt.disable_ldap)
{ {
@ -318,9 +325,7 @@ start_cert_fetch (ctrl_t ctrl, cert_fetch_context_t *context,
{ {
if (dirmngr_use_tor ()) if (dirmngr_use_tor ())
{ {
/* For now we do not support LDAP over Tor. */ return no_crl_due_to_tor (ctrl);
log_error (_("CRL access not possible due to Tor mode\n"));
return gpg_error (GPG_ERR_NOT_SUPPORTED);
} }
if (opt.disable_ldap) if (opt.disable_ldap)
{ {

View File

@ -847,6 +847,20 @@ extract_keys (estream_t output,
es_fprintf (output, "INFO %s END\n", certid); es_fprintf (output, "INFO %s END\n", certid);
} }
/* For now we do not support LDAP over Tor. */
static gpg_error_t
no_ldap_due_to_tor (ctrl_t ctrl)
{
gpg_error_t err = gpg_error (GPG_ERR_NOT_SUPPORTED);
const char *msg = _("LDAP access not possible due to Tor mode");
log_error ("%s", msg);
dirmngr_status_printf (ctrl, "NOTE", "no_ldap_due_to_tor %u %s", err, msg);
return gpg_error (GPG_ERR_NOT_SUPPORTED);
}
/* Get the key described key the KEYSPEC string from the keyserver /* Get the key described key the KEYSPEC string from the keyserver
identified by URI. On success R_FP has an open stream to read the identified by URI. On success R_FP has an open stream to read the
data. */ data. */
@ -869,9 +883,7 @@ ks_ldap_get (ctrl_t ctrl, parsed_uri_t uri, const char *keyspec,
if (dirmngr_use_tor ()) if (dirmngr_use_tor ())
{ {
/* For now we do not support LDAP over Tor. */ return no_ldap_due_to_tor (ctrl);
log_error (_("LDAP access not possible due to Tor mode\n"));
return gpg_error (GPG_ERR_NOT_SUPPORTED);
} }
/* Make sure we are talking to an OpenPGP LDAP server. */ /* Make sure we are talking to an OpenPGP LDAP server. */
@ -1067,9 +1079,7 @@ ks_ldap_search (ctrl_t ctrl, parsed_uri_t uri, const char *pattern,
if (dirmngr_use_tor ()) if (dirmngr_use_tor ())
{ {
/* For now we do not support LDAP over Tor. */ return no_ldap_due_to_tor (ctrl);
log_error (_("LDAP access not possible due to Tor mode\n"));
return gpg_error (GPG_ERR_NOT_SUPPORTED);
} }
/* Make sure we are talking to an OpenPGP LDAP server. */ /* Make sure we are talking to an OpenPGP LDAP server. */
@ -1959,9 +1969,7 @@ ks_ldap_put (ctrl_t ctrl, parsed_uri_t uri,
if (dirmngr_use_tor ()) if (dirmngr_use_tor ())
{ {
/* For now we do not support LDAP over Tor. */ return no_ldap_due_to_tor (ctrl);
log_error (_("LDAP access not possible due to Tor mode\n"));
return gpg_error (GPG_ERR_NOT_SUPPORTED);
} }
err = my_ldap_connect (uri, &ldap_conn, &basedn, NULL, NULL, &serverinfo); err = my_ldap_connect (uri, &ldap_conn, &basedn, NULL, NULL, &serverinfo);

View File

@ -145,8 +145,11 @@ do_ocsp_request (ctrl_t ctrl, ksba_ocsp_t ocsp,
{ {
/* For now we do not allow OCSP via Tor due to possible privacy /* For now we do not allow OCSP via Tor due to possible privacy
concerns. Needs further research. */ concerns. Needs further research. */
log_error (_("OCSP request not possible due to Tor mode\n")); const char *msg = _("OCSP request not possible due to Tor mode");
return gpg_error (GPG_ERR_NOT_SUPPORTED); err = gpg_error (GPG_ERR_NOT_SUPPORTED);
log_error ("%s", msg);
dirmngr_status_printf (ctrl, "NOTE", "no_ocsp_due_to_tor %u %s", err,msg);
return err;
} }
if (opt.disable_http) if (opt.disable_http)

View File

@ -425,6 +425,51 @@ unhexify_fpr (const char *hexstr, unsigned char *fpr)
} }
/* This is a helper to print diagnostics from dirmngr indicated by
* WARNING or NOTE status lines. Returns true if the status LINE was
* processed. */
static int
warning_and_note_printer (const char *line)
{
const char *s, *s2;
const char *warn = NULL;
int is_note = 0;
if ((s = has_leading_keyword (line, "WARNING")))
;
else if ((is_note = !!(s = has_leading_keyword (line, "NOTE"))))
;
else
return 0; /* Nothing to process. */
if ((s2 = has_leading_keyword (s, "no_crl_due_to_tor"))
|| (s2 = has_leading_keyword (s, "no_ldap_due_to_tor"))
|| (s2 = has_leading_keyword (s, "no_ocsp_due_to_tor")))
warn = _("Tor might be in use - network access is limited");
else
warn = NULL;
if (warn)
{
if (is_note)
log_info (_("Note: %s\n"), warn);
else
log_info (_("WARNING: %s\n"), warn);
if (s2)
{
while (*s2 && !spacep (s2))
s2++;
while (*s2 && spacep (s2))
s2++;
if (*s2)
gpgsm_print_further_info ("%s", s2);
}
}
return 1; /* Status line processed. */
}
static gpg_error_t static gpg_error_t
isvalid_status_cb (void *opaque, const char *line) isvalid_status_cb (void *opaque, const char *line)
{ {
@ -446,6 +491,10 @@ isvalid_status_cb (void *opaque, const char *line)
if (!*s || !unhexify_fpr (s, parm->fpr)) if (!*s || !unhexify_fpr (s, parm->fpr))
parm->seen++; /* Bump it to indicate an error. */ parm->seen++; /* Bump it to indicate an error. */
} }
else if (warning_and_note_printer (line))
{
}
return 0; return 0;
} }
@ -722,6 +771,10 @@ lookup_status_cb (void *opaque, const char *line)
gpgsm_status (parm->ctrl, STATUS_TRUNCATED, line); gpgsm_status (parm->ctrl, STATUS_TRUNCATED, line);
} }
} }
else if (warning_and_note_printer (line))
{
}
return 0; return 0;
} }
@ -969,6 +1022,10 @@ run_command_status_cb (void *opaque, const char *line)
return gpg_error (GPG_ERR_ASS_CANCELED); return gpg_error (GPG_ERR_ASS_CANCELED);
} }
} }
else if (warning_and_note_printer (line))
{
}
return 0; return 0;
} }

View File

@ -489,6 +489,7 @@ int gpgsm_dirmngr_run_command (ctrl_t ctrl, const char *command,
/*-- misc.c --*/ /*-- misc.c --*/
void gpgsm_print_further_info (const char *format, ...) GPGRT_ATTR_PRINTF(1,2);
void setup_pinentry_env (void); void setup_pinentry_env (void);
gpg_error_t transform_sigval (const unsigned char *sigval, size_t sigvallen, gpg_error_t transform_sigval (const unsigned char *sigval, size_t sigvallen,
int mdalgo, int mdalgo,

View File

@ -35,6 +35,27 @@
#include "../common/sexp-parse.h" #include "../common/sexp-parse.h"
/* Print a message
* "(further info: %s)\n
* in verbose mode to further explain an error. That message is
* intended to help debug a problem and should not be translated.
*/
void
gpgsm_print_further_info (const char *format, ...)
{
va_list arg_ptr;
if (!opt.verbose)
return;
log_info (_("(further info: "));
va_start (arg_ptr, format);
log_logv (GPGRT_LOGLVL_CONT, format, arg_ptr);
va_end (arg_ptr);
log_printf (")\n");
}
/* Setup the environment so that the pinentry is able to get all /* Setup the environment so that the pinentry is able to get all
required information. This is used prior to an exec of the required information. This is used prior to an exec of the
protect-tool. */ protect-tool. */