On 06/27/2018 04:50 PM, Jacob Adams wrote: > I've got another pinentry problem unfortunately. > The tty is owned by the correct user this time and $GPG_TTY is set > correctly. > > I have two gpgme contexts, one for openpgp and another for assuan > commands to the smartcard. Pinentry triggered by the openpgp context > works perfectly, but any pinentry launched in service of the assuan > context fails with the error in the subject. They're both using the same > gpg-agent launched shortly after the creation of the openpgp context > with gpgconf --launch gpg-agent. > > The relevant logs are available at: > https://salsa.debian.org/tookmund-guest/pgpcr/issues/10 >
I've now done a bit of poking around into this. Attached is the patch I used to try and get some information out of pinentry-curses. It appears that tty_name is not being set, despite the fact that GPG_TTY is set and thus gpg-agent has this information from the previous Context. > I'm really not sure what's going wrong here and any insight would be > much appreciated. The above is still definitely true. Thanks, Jacob
--- a/pinentry/pinentry-curses.c
+++ b/pinentry/pinentry-curses.c
@@ -26,6 +26,7 @@
#include <signal.h>
#include <fcntl.h>
#include <unistd.h>
+#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <iconv.h>
@@ -820,6 +821,16 @@
dialog_run (pinentry_t pinentry, const char *tty_name, const char *tty_type)
{
int confirm_mode = !pinentry->pin;
+ FILE *log = fopen("/tmp/pinentry-curses.log", "a");
+ if (log == NULL)
+ {
+ pinentry->specific_err = gpg_error_from_syserror ();
+ pinentry->specific_err_loc = "log_setup";
+ return confirm_mode? 0 : -1;
+ }
+ fputs("Pinentry\n", log);
+ fprintf(log, "TTY Name: %s\nTTY Type: %s\n", tty_name, tty_type);
+ fprintf(log, "Title: %s\nDescription: %s\n", pinentry->title,
pinentry->description);
struct dialog diag;
FILE *ttyfi = NULL;
FILE *ttyfo = NULL;
@@ -853,6 +864,7 @@
pinentry->specific_err_loc = "open_tty_for_read";
return confirm_mode? 0 : -1;
}
+ fputs("Open TTY for reading\n", log);
ttyfo = fopen (tty_name, "w");
if (!ttyfo)
{
@@ -863,15 +875,19 @@
pinentry->specific_err_loc = "open_tty_for_write";
return confirm_mode? 0 : -1;
}
+ fputs("Open TTY for writing\n", log);
screen = newterm (tty_type, ttyfo, ttyfi);
set_term (screen);
+ fputs("Setup screen\n", log);
}
else
{
if (!init_screen)
{
+ fputs("No init screen\n", log);
if (!(isatty(fileno(stdin)) && isatty(fileno(stdout))))
{
+ fputs("ENOTTY\n", log);
errno = ENOTTY;
pinentry->specific_err = gpg_error_from_syserror ();
pinentry->specific_err_loc = "isatty";
@@ -879,6 +895,7 @@
}
init_screen = 1;
initscr ();
+ fputs("Setup ncurses\n", log);
}
else
clear ();
@@ -921,10 +938,11 @@
}
}
refresh ();
-
+fputs("Create dialog\n", log);
/* Create the dialog. */
if (dialog_create (pinentry, &diag))
{
+ fputs("Failed to create dialog\n", log);
/* Note: pinentry->specific_err has already been set. */
endwin ();
if (screen)
@@ -951,6 +969,7 @@
do
{
+ fputs("Made it to event loop\n", log);
int c;
c = wgetch (stdscr); /* Refresh, accept single keystroke of input.
*/
--- a/curses/pinentry-curses.c
+++ b/curses/pinentry-curses.c
@@ -34,8 +34,17 @@
int
main (int argc, char *argv[])
{
+ FILE *log = fopen("/tmp/pinentry-args.log", "a");
+ if (log == NULL)
+ {
+ return 1;
+ }
+ fputs("Begin Pinentry\n", log);
pinentry_init ("pinentry-curses");
-
+ for (int i = 0; i < argc; i++)
+ {
+ fprintf(log, "%d: %s\n", i, argv[i]);
+ }
pinentry_parse_opts (argc, argv);
if (pinentry_loop ())
signature.asc
Description: OpenPGP digital signature
_______________________________________________ Gnupg-users mailing list [email protected] http://lists.gnupg.org/mailman/listinfo/gnupg-users
