* assuan.h (ASSUAN_Locale_Problem): Added.
authorWerner Koch <wk@gnupg.org>
Mon, 22 Dec 2003 12:48:39 +0000 (12:48 +0000)
committerWerner Koch <wk@gnupg.org>
Mon, 22 Dec 2003 12:48:39 +0000 (12:48 +0000)
* pinentry/pinentry.h (struct pinentry): Added LOCALE_ERR.
* gtk/pinentry-gtk.c (button_clicked): Set the LOCAE_ERR flag.
* pinentry/pinentry-curses.c (dialog_run): Ditto.
* pinentry/pinentry.c (cmd_getpin, cms_confirm): Check this flag.
(pinentry_local_to_utf8): Release the correct buffer in the error
case. Print diagnostics.
(pinentry_utf8_to_local): Print diagnostics.

* gtk/pinentry-gtk.c (button_clicked): Use the right value as
input for the conversion.

ChangeLog
NEWS
assuan/ChangeLog
assuan/assuan.h
gtk/pinentry-gtk.c
pinentry/pinentry-curses.c
pinentry/pinentry.c
pinentry/pinentry.h

index 76695fc..b980989 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
 2003-12-22  Werner Koch  <wk@gnupg.org>
 
+       * pinentry/pinentry.h (struct pinentry): Added LOCALE_ERR.
+       * gtk/pinentry-gtk.c (button_clicked): Set the LOCAE_ERR flag.
+       * pinentry/pinentry-curses.c (dialog_run): Ditto.
+       * pinentry/pinentry.c (cmd_getpin, cms_confirm): Check this flag.
+       (pinentry_local_to_utf8): Release the correct buffer in the error
+       case. Print diagnostics.
+       (pinentry_utf8_to_local): Print diagnostics.
+
+       * gtk/pinentry-gtk.c (button_clicked): Use the right value as
+       input for the conversion.
+
        * pinentry/pinentry.c: New variable THIS_PGMNAME.
        (pinentry_init): Add arg PGMNAME and store it.  Use it at all
        marked placed instead of the constant "pinentry".
diff --git a/NEWS b/NEWS
index 1bf6907..4f558f8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,9 @@ Noteworthy changes in version 0.7.0 (unreleased)
 
  * Disabled undo/redo in Qt pinentry.
 
+ * Print diagnostics for locale problems and return a new error code
+   instead of Canceled or Not Confirmed. 
+
 
 Noteworthy changes in version 0.6.8 (2003-02-07)
 ------------------------------------------------
index 2b95d56..6089d7e 100644 (file)
@@ -1,3 +1,7 @@
+2003-12-22  Werner Koch  <wk@gnupg.org>
+
+       * assuan.h (ASSUAN_Locale_Problem): Added.
+
 2002-04-04  Werner Koch  <wk@gnupg.org>
 
        * assuan-buffer.c (my_log_prefix): New.  Use it for all i/o debug
index a934001..44fd005 100644 (file)
@@ -77,7 +77,7 @@ typedef enum {
   ASSUAN_Unexpected_Status = 124,
   ASSUAN_Unexpected_Data = 125,
   ASSUAN_Invalid_Status = 126,
-
+  ASSUAN_Locale_Problem = 127,
   ASSUAN_Not_Confirmed = 128,
 
   ASSUAN_Bad_Certificate = 201,
index 5213920..57e9176 100644 (file)
@@ -131,9 +131,10 @@ static void
 button_clicked (GtkWidget *widget, gpointer data)
 {
   if (data)
-    { /* okay button or enter used inntext field */
+    { /* Okay button hit or Enter used in the text field. */
       const char *s;
       char *s_utf8;
+      char *s_buffer;
 
       if (pinentry->enhanced)
         {
@@ -144,18 +145,26 @@ button_clicked (GtkWidget *widget, gpointer data)
                  gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(time_out)));
         }
 
+      pinentry->locale_err = 1;
       s = gtk_secure_entry_get_text (GTK_SECURE_ENTRY(entry));
       if (!s)
         s = "";
-      s_utf8 = pinentry_local_to_utf8 (pinentry->lc_ctype, pinentry->pin, 1);
-      if (s_utf8)
-       {
-         passphrase_ok = 1;
-         pinentry_setbufferlen (pinentry, strlen (s_utf8) + 1);
-         if (pinentry->pin)
-           strcpy (pinentry->pin, s_utf8);
-         secmem_free (s_utf8);
-       }
+      s_buffer = secmem_malloc (strlen (s) + 1);
+      if (s_buffer)
+        {
+          strcpy (s_buffer, s);
+          s_utf8 = pinentry_local_to_utf8 (pinentry->lc_ctype, s_buffer, 1);
+          secmem_free (s_buffer);
+          if (s_utf8)
+            {
+              passphrase_ok = 1;
+              pinentry_setbufferlen (pinentry, strlen (s_utf8) + 1);
+              if (pinentry->pin)
+                strcpy (pinentry->pin, s_utf8);
+              secmem_free (s_utf8);
+              pinentry->locale_err = 0;
+            }
+        }
     }
   gtk_main_quit ();
 }
index 0a75f07..3fc9e25 100644 (file)
@@ -692,6 +692,7 @@ dialog_run (pinentry_t pinentry, const char *tty_name, const char *tty_type)
   free (diag.ok);
   free (diag.cancel);
 
+  pinentry->locale_err = 1;
   pin_utf8 = pinentry_local_to_utf8 (pinentry->lc_ctype, pinentry->pin, 1);
   if (pin_utf8)
     {
@@ -699,6 +700,7 @@ dialog_run (pinentry_t pinentry, const char *tty_name, const char *tty_type)
       if (pinentry->pin)
        strcpy (pinentry->pin, pin_utf8);
       secmem_free (pin_utf8);
+      pinentry->locale_err = 0;
     }
 
   return diag.pin ? (done < 0 ? -1 : diag.pin_len) : (done < 0 ? 0 : 1);
index 20cbbd1..5526131 100644 (file)
@@ -60,7 +60,8 @@ struct pinentry pinentry =
     0,         /* Enhanced mode.  */
     1,         /* Global grab.  */
     0,         /* Parent Window ID.  */
-    0          /* Result.  */
+    0,         /* Result.  */
+    0           /* Locale error flag. */
   };
 
 \f
@@ -78,7 +79,11 @@ pinentry_utf8_to_local (char *lc_ctype, char *text)
   /* If no locale setting could be determined, simply copy the
      string.  */
   if (!lc_ctype)
-    return strdup (text);
+    {
+      fprintf (stderr, "%s: no LC_CTYPE known - assuming UTF-8\n",
+               this_pgmname);
+      return strdup (text);
+    }
 
   /* This is overkill, but simplifies the iconv invocation greatly.  */
   output_len = input_len * MB_LEN_MAX;
@@ -89,20 +94,24 @@ pinentry_utf8_to_local (char *lc_ctype, char *text)
   cd = iconv_open (lc_ctype, "UTF-8");
   if (cd == (iconv_t) -1)
     {
-      free (output);
+      fprintf (stderr, "%s: can't convert from UTF-8 to local code set: %s\n",
+               this_pgmname, strerror (errno));
+      free (output_buf);
       return NULL;
     }
   processed = iconv (cd, &input, &input_len, &output, &output_len);
   iconv_close (cd);
   if (processed == (size_t) -1 || input_len)
     {
+      fprintf (stderr, "%s: error converting from UTF-8 to local code set: %s\n"
+               , this_pgmname, strerror (errno));
       free (output_buf);
       return NULL;
     }
   return output_buf;
 }
 
-/* Convert TEXT whcih is encoded according to LC_CTYPE to UTF-8.  With
+/* Convert TEXT which is encoded according to LC_CTYPE to UTF-8.  With
    SECURE set to true, use secure memory for the returned buffer.
    Return NULL on error. */
 char *
@@ -122,6 +131,8 @@ pinentry_local_to_utf8 (char *lc_ctype, char *text, int secure)
      string.  */
   if (!lc_ctype)
     {
+      fprintf (stderr, "%s: no LC_CTYPE known - assuming UTF-8\n",
+               this_pgmname);
       output_buf = secure? secmem_malloc (input_len) : malloc (input_len);
       if (output_buf)
         strcpy (output_buf, input);
@@ -145,18 +156,24 @@ pinentry_local_to_utf8 (char *lc_ctype, char *text, int secure)
   cd = iconv_open ("UTF-8", source_encoding);
   if (cd == (iconv_t) -1)
     {
+      fprintf (stderr, "%s: can't convert from %s to UTF-8: %s\n",
+               this_pgmname, source_encoding? source_encoding : "?",
+               strerror (errno));
       if (secure)
-        secmem_free (output);
+        secmem_free (output_buf);
       else
-        free (output);
+        free (output_buf);
       return NULL;
     }
   processed = iconv (cd, &input, &input_len, &output, &output_len);
   iconv_close (cd);
   if (processed == (size_t) -1 || input_len)
     {
+      fprintf (stderr, "%s: error converting from %s to UTF-8: %s\n",
+               this_pgmname, source_encoding? source_encoding : "?",
+               strerror (errno));
       if (secure)
-        secmem_free (output);
+        secmem_free (output_buf);
       else
         free (output_buf);
       return NULL;
@@ -231,7 +248,6 @@ pinentry_have_display (int argc, char **argv)
 static void 
 usage (void)
 {
-  /* FIXME: replace the "?" by the real program name. */
   fprintf (stderr, "Usage: %s [OPTION]...\n\
 Ask securely for a secret and print it to stdout.\n\
 \n\
@@ -523,6 +539,7 @@ cmd_getpin (ASSUAN_CONTEXT ctx, char *line)
       pinentry.prompt = "PIN:";
       set_prompt = 1;
     }
+  pinentry.locale_err = 0;
 
   result = (*pinentry_cmd_handler) (&pinentry);
   if (pinentry.error)
@@ -540,7 +557,7 @@ cmd_getpin (ASSUAN_CONTEXT ctx, char *line)
          secmem_free (pinentry.pin);
          pinentry.pin = NULL;
        }
-      return ASSUAN_Canceled;
+      return pinentry.locale_err? ASSUAN_Locale_Problem: ASSUAN_Canceled;
     }
 
   if (result)
@@ -565,6 +582,7 @@ cmd_confirm (ASSUAN_CONTEXT ctx, char *line)
 {
   int result;
 
+  pinentry.locale_err = 0;
   result = (*pinentry_cmd_handler) (&pinentry);
   if (pinentry.error)
     {
@@ -572,7 +590,9 @@ cmd_confirm (ASSUAN_CONTEXT ctx, char *line)
       pinentry.error = NULL;
     }
 
-  return result ? 0 : ASSUAN_Not_Confirmed;
+  return result ? 0
+                : (pinentry.locale_err? ASSUAN_Locale_Problem
+                                      : ASSUAN_Not_Confirmed);
 }
 
 
index 9a44268..b5d4228 100644 (file)
@@ -1,5 +1,5 @@
 /* pinentry.h - The interface for the PIN entry support library.
-   Copyright (C) 2002 g10 Code GmbH
+   Copyright (C) 2002, 2003 g10 Code GmbH
    
    This file is part of PINENTRY.
    
@@ -66,6 +66,11 @@ struct pinentry
   /* The user should set this to -1 if the user canceled the request,
      and to the length of the PIN stored in pin otherwise.  */
   int result;
+
+  /* The user should set this to true if an error with the local
+     conversion occured. */
+  int locale_err;
+
 };
 typedef struct pinentry *pinentry_t;