* pinentry/pinentry.c (cmd_message): New.
authorWerner Koch <wk@gnupg.org>
Wed, 24 Jan 2007 18:25:10 +0000 (18:25 +0000)
committerWerner Koch <wk@gnupg.org>
Wed, 24 Jan 2007 18:25:10 +0000 (18:25 +0000)
(cmd_confirm): New command option --one-button.
(cmd_getpin): Zeroise ONE_BUTTON.
* pinentry/pinentry.h (struct pinentry): Add field ONE_BUTTON.
        * gtk/pinentry-gtk.c (create_window): Take care of new option.
        * gtk+-2/pinentry-gtk-2.c (create_window): Ditto.
        * pinentry/pinentry-curses.c (dialog_create): Ditto.
     (dialog_create, dialog_switch_pos): Allow CANCEL to be optional.

ChangeLog
NEWS
TODO
doc/pinentry.texi
gtk+-2/pinentry-gtk-2.c
gtk/pinentry-gtk.c
pinentry/pinentry-curses.c
pinentry/pinentry.c
pinentry/pinentry.h

index 58866dc..116aba2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2007-01-24  Werner Koch  <wk@g10code.com>
+
+       * pinentry/pinentry.c (cmd_message): New.
+       (cmd_confirm): New command option --one-button.
+       (cmd_getpin): Zeroise ONE_BUTTON.
+       * pinentry/pinentry.h (struct pinentry): Add field ONE_BUTTON.
+       * gtk/pinentry-gtk.c (create_window): Take care of new option.
+       * gtk+-2/pinentry-gtk-2.c (create_window): Ditto.
+       * pinentry/pinentry-curses.c (dialog_create): Ditto.
+       (dialog_create, dialog_switch_pos): Allow CANCEL to be optional.
+
 2006-07-29  Marcus Brinkmann  <marcus@g10code.de>
 
        * secmem/secmem.c (init_pool): Close FD after establishing the
 2006-07-29  Marcus Brinkmann  <marcus@g10code.de>
 
        * secmem/secmem.c (init_pool): Close FD after establishing the
diff --git a/NEWS b/NEWS
index 377ffee..81c487f 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,9 @@
 Noteworthy changes in version 0.7.3
 ------------------------------------------------
 
 Noteworthy changes in version 0.7.3
 ------------------------------------------------
 
+ * New command MESSAGE and --one-button compatibility option to
+   CONFIRM.
+
 
 Noteworthy changes in version 0.7.2 (2005-01-27)
 ------------------------------------------------
 
 Noteworthy changes in version 0.7.2 (2005-01-27)
 ------------------------------------------------
diff --git a/TODO b/TODO
index 468be03..94731c9 100644 (file)
--- a/TODO
+++ b/TODO
@@ -15,3 +15,5 @@
   the gpg-agent is better able to cope with jammed pinentries.
 
 * The gtk+-2 pinentry needs auditing.
   the gpg-agent is better able to cope with jammed pinentries.
 
 * The gtk+-2 pinentry needs auditing.
+
+* Implement the one_button feature in Qt.
index ad4c01e..7721d23 100644 (file)
@@ -298,6 +298,21 @@ issuing this command, and may use SETPROMPT to set the button texts.
 The value returned is either OK for YES or the error code
 @code{ASSUAN_Not_Confirmed}.
 
 The value returned is either OK for YES or the error code
 @code{ASSUAN_Not_Confirmed}.
 
+@item Show a message
+To show a message, you can use this command:
+@example
+  C: MESSAGE
+  S: OK
+@end example
+alternativly you may add an option to confirm:
+@example
+  C: CONFIRM --one-button
+  S: OK
+@end example
+The client should use SETDESC to set an appropriate text before issuing
+this command, and may use SETOK to set the text for the dismiss button.
+The value returned is OK or an error message.
+
 @item Set the output device
 When using X, the @pinentry{} program must be invoked with an
 appropriate @code{DISPLAY} environment variable or the
 @item Set the output device
 When using X, the @pinentry{} program must be invoked with an
 appropriate @code{DISPLAY} environment variable or the
index 219d405..a085933 100644 (file)
@@ -304,19 +304,22 @@ create_window (int confirm_mode)
   gtk_box_set_spacing (GTK_BOX (bbox), 6);
   gtk_box_pack_start (GTK_BOX (wvbox), bbox, TRUE, FALSE, 0);
 
   gtk_box_set_spacing (GTK_BOX (bbox), 6);
   gtk_box_pack_start (GTK_BOX (wvbox), bbox, TRUE, FALSE, 0);
 
-  if (pinentry->cancel)
+  if (!pinentry->one_button)
     {
     {
-      msg = pinentry_utf8_validate (pinentry->cancel);
-      w = gtk_button_new_with_label (msg);
-      g_free (msg);
+      if (pinentry->cancel)
+        {
+          msg = pinentry_utf8_validate (pinentry->cancel);
+          w = gtk_button_new_with_label (msg);
+          g_free (msg);
+        }
+      else
+        w = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
+      gtk_container_add (GTK_CONTAINER (bbox), w);
+      g_signal_connect (G_OBJECT (w), "clicked",
+                        G_CALLBACK (confirm_mode ? confirm_button_clicked
+                                    : button_clicked), NULL);
+      GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
     }
     }
-  else
-    w = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
-  gtk_container_add (GTK_CONTAINER (bbox), w);
-  g_signal_connect (G_OBJECT (w), "clicked",
-                   G_CALLBACK (confirm_mode ? confirm_button_clicked
-                               : button_clicked), NULL);
-  GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
   
   if (pinentry->ok)
     {
   
   if (pinentry->ok)
     {
index 57e9176..80ee984 100644 (file)
@@ -345,13 +345,17 @@ create_window (int confirm_mode)
 
   gtk_widget_show (w);
   
 
   gtk_widget_show (w);
   
-  w = gtk_button_new_with_label (pinentry->cancel ? pinentry->cancel : "Cancel");
-  gtk_container_add (GTK_CONTAINER(bbox), w);
-  gtk_accel_group_add (acc, GDK_Escape, 0, 0, GTK_OBJECT(w), "clicked");
-  gtk_signal_connect (GTK_OBJECT(w), "clicked", 
-                      confirm_mode? confirm_button_clicked: button_clicked,
-                      NULL);
-  GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+  if (!pinentry->one_button)
+    {
+      w = gtk_button_new_with_label (pinentry->cancel 
+                                     ? pinentry->cancel : "Cancel");
+      gtk_container_add (GTK_CONTAINER(bbox), w);
+      gtk_accel_group_add (acc, GDK_Escape, 0, 0, GTK_OBJECT(w), "clicked");
+      gtk_signal_connect (GTK_OBJECT(w), "clicked", 
+                          confirm_mode? confirm_button_clicked: button_clicked,
+                          NULL);
+      GTK_WIDGET_SET_FLAGS (w, GTK_CAN_DEFAULT);
+    }
 
   gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
 
 
   gtk_window_set_position (GTK_WINDOW (win), GTK_WIN_POS_CENTER);
 
index 585b48e..a356480 100644 (file)
@@ -181,7 +181,10 @@ dialog_create (pinentry_t pinentry, dialog_t dialog)
   while (0)
 
   MAKE_BUTTON (ok, STRING_OK);
   while (0)
 
   MAKE_BUTTON (ok, STRING_OK);
-  MAKE_BUTTON (cancel, STRING_CANCEL);
+  if (!pinentry->one_button)
+    MAKE_BUTTON (cancel, STRING_CANCEL);
+  else
+    dialog->cancel = NULL;
 
   getmaxyx (stdscr, size_y, size_x);
 
 
   getmaxyx (stdscr, size_y, size_x);
 
@@ -272,8 +275,9 @@ dialog_create (pinentry_t pinentry, dialog_t dialog)
      width.  Account for rounding.  */
   if (x < 2 * strlen (dialog->ok))
     x = 2 * strlen (dialog->ok);
      width.  Account for rounding.  */
   if (x < 2 * strlen (dialog->ok))
     x = 2 * strlen (dialog->ok);
-  if (x < 2 * strlen (dialog->cancel))
-    x = 2 * strlen (dialog->cancel);
+  if (dialog->cancel)
+    if (x < 2 * strlen (dialog->cancel))
+      x = 2 * strlen (dialog->cancel);
 
   /* Add the frame.  */
   x += 4;
 
   /* Add the frame.  */
   x += 4;
@@ -399,11 +403,13 @@ dialog_create (pinentry_t pinentry, dialog_t dialog)
   dialog->ok_x = xpos + 2 + ((x - 4) / 2 - strlen (dialog->ok)) / 2;
   move (dialog->ok_y, dialog->ok_x);
   addstr (dialog->ok);
   dialog->ok_x = xpos + 2 + ((x - 4) / 2 - strlen (dialog->ok)) / 2;
   move (dialog->ok_y, dialog->ok_x);
   addstr (dialog->ok);
-  dialog->cancel_y = ypos;
-  /* Calculating the left edge of the right button, rounding up.  */
-  dialog->cancel_x = xpos + x - 2 - ((x - 4) / 2 + strlen (dialog->cancel)) / 2;
-  move (dialog->cancel_y, dialog->cancel_x);
-  addstr (dialog->cancel);
+  if ( dialog->cancel)
+    {
+      dialog->cancel_y = ypos;
+      /* Calculating the left edge of the right button, rounding up.  */
+      move (dialog->cancel_y, dialog->cancel_x);
+      addstr (dialog->cancel);
+    }
 
  out:
   if (description)
 
  out:
   if (description)
@@ -446,8 +452,11 @@ dialog_switch_pos (dialog_t diag, dialog_pos_t new_pos)
          addstr (diag->ok);
          break;
        case DIALOG_POS_CANCEL:
          addstr (diag->ok);
          break;
        case DIALOG_POS_CANCEL:
-         move (diag->cancel_y, diag->cancel_x);
-         addstr (diag->cancel);
+          if (diag->cancel)
+            {
+              move (diag->cancel_y, diag->cancel_x);
+              addstr (diag->cancel);
+            }
          break;
        default:
          break;
          break;
        default:
          break;
@@ -468,12 +477,15 @@ dialog_switch_pos (dialog_t diag, dialog_pos_t new_pos)
          move (diag->ok_y, diag->ok_x);
          break;
        case DIALOG_POS_CANCEL:
          move (diag->ok_y, diag->ok_x);
          break;
        case DIALOG_POS_CANCEL:
-         set_cursor_state (0);
-         move (diag->cancel_y, diag->cancel_x);
-         standout ();
-         addstr (diag->cancel);
-         standend ();
-         move (diag->cancel_y, diag->cancel_x);
+          if (diag->cancel)
+            {
+              set_cursor_state (0);
+              move (diag->cancel_y, diag->cancel_x);
+              standout ();
+              addstr (diag->cancel);
+              standend ();
+              move (diag->cancel_y, diag->cancel_x);
+            }
          break;
        case DIALOG_POS_NONE:
          set_cursor_state (0);
          break;
        case DIALOG_POS_NONE:
          set_cursor_state (0);
index 6be7ffb..7aa7456 100644 (file)
@@ -66,7 +66,8 @@ struct pinentry pinentry =
     1,         /* Global grab.  */
     0,         /* Parent Window ID.  */
     0,         /* Result.  */
     1,         /* Global grab.  */
     0,         /* Parent Window ID.  */
     0,         /* Result.  */
-    0           /* Locale error flag. */
+    0,          /* Locale error flag. */
+    0           /* One-button flag.  */
   };
 
 \f
   };
 
 \f
@@ -576,6 +577,7 @@ cmd_getpin (ASSUAN_CONTEXT ctx, char *line)
       set_prompt = 1;
     }
   pinentry.locale_err = 0;
       set_prompt = 1;
     }
   pinentry.locale_err = 0;
+  pinentry.one_button = 0;
 
   result = (*pinentry_cmd_handler) (&pinentry);
   if (pinentry.error)
 
   result = (*pinentry_cmd_handler) (&pinentry);
   if (pinentry.error)
@@ -613,11 +615,19 @@ cmd_getpin (ASSUAN_CONTEXT ctx, char *line)
 }
 
 
 }
 
 
+/* Note that the option --one-button is hack to allow the use of old
+   pinentries while the caller is ignoring the result.  Given that
+   options have never been used or flagged as an error the new option
+   is an easy way to enable the messsage mode while not requiring to
+   update pinentry or to have the caller test for the message
+   command.  New applications which are free to require an updated
+   pinentry should use MESSAGE instead. */
 static int
 cmd_confirm (ASSUAN_CONTEXT ctx, char *line)
 {
   int result;
 
 static int
 cmd_confirm (ASSUAN_CONTEXT ctx, char *line)
 {
   int result;
 
+  pinentry.one_button = !!strstr (line, "--one-button");
   pinentry.locale_err = 0;
   result = (*pinentry_cmd_handler) (&pinentry);
   if (pinentry.error)
   pinentry.locale_err = 0;
   result = (*pinentry_cmd_handler) (&pinentry);
   if (pinentry.error)
@@ -628,7 +638,29 @@ cmd_confirm (ASSUAN_CONTEXT ctx, char *line)
 
   return result ? 0
                 : (pinentry.locale_err? ASSUAN_Locale_Problem
 
   return result ? 0
                 : (pinentry.locale_err? ASSUAN_Locale_Problem
-                                      : ASSUAN_Not_Confirmed);
+                                      : (pinentry.one_button 
+                                         ? 0
+                                         : ASSUAN_Not_Confirmed));
+}
+
+
+static int
+cmd_message (ASSUAN_CONTEXT ctx, char *line)
+{
+  int result;
+
+  pinentry.one_button = 1;
+  pinentry.locale_err = 0;
+  result = (*pinentry_cmd_handler) (&pinentry);
+  if (pinentry.error)
+    {
+      free (pinentry.error);
+      pinentry.error = NULL;
+    }
+
+  return result ? 0 
+                : (pinentry.locale_err? ASSUAN_Locale_Problem
+                                      : 0);
 }
 
 
 }
 
 
@@ -650,6 +682,7 @@ register_commands (ASSUAN_CONTEXT ctx)
       { "SETCANCEL",  0,  cmd_setcancel },
       { "GETPIN",     0,  cmd_getpin },
       { "CONFIRM",    0,  cmd_confirm },
       { "SETCANCEL",  0,  cmd_setcancel },
       { "GETPIN",     0,  cmd_getpin },
       { "CONFIRM",    0,  cmd_confirm },
+      { "MESSAGE",    0,  cmd_message },
       { NULL }
     };
   int i, j, rc;
       { NULL }
     };
   int i, j, rc;
index 00e77fa..9f63255 100644 (file)
@@ -75,6 +75,11 @@ struct pinentry
      conversion occured. */
   int locale_err;
 
      conversion occured. */
   int locale_err;
 
+  /* The caller should set this to true if only one button is
+     required.  This is useful for notification dialogs where only a
+     dismiss button is required. */
+  int one_button;
+
 };
 typedef struct pinentry *pinentry_t;
 
 };
 typedef struct pinentry *pinentry_t;