Add commands to allow implementing a "repeat passphrase" field.
authorWerner Koch <wk@gnupg.org>
Fri, 24 Oct 2014 14:20:20 +0000 (16:20 +0200)
committerWerner Koch <wk@gnupg.org>
Fri, 24 Oct 2014 14:20:48 +0000 (16:20 +0200)
* pinentry/pinentry.c (cmd_setrepeat): New.
(cmd_setrepeaterror): New.
(register_commands): Add new commands.
(cmd_getpin): Print "PIN_REPEATED" status.

pinentry/pinentry.c
pinentry/pinentry.h

index 4f7958a..0030754 100644 (file)
@@ -85,6 +85,9 @@ struct pinentry pinentry =
     0,         /* Close button flag.  */
     0,          /* Locale error flag. */
     0,          /* One-button flag.  */
+    NULL,       /* Repeat passphrase flag.  */
+    NULL,       /* Repeat error string.  */
+    0,          /* Correctly repeated flag.  */
     NULL,       /* Quality-Bar flag and description.  */
     NULL,       /* Quality-Bar tooltip.  */
     PINENTRY_COLOR_DEFAULT,
@@ -759,6 +762,38 @@ cmd_setprompt (ASSUAN_CONTEXT ctx, char *line)
 
 
 static int
+cmd_setrepeat (ASSUAN_CONTEXT ctx, char *line)
+{
+  char *p;
+
+  p = malloc (strlen (line) + 1);
+  if (!p)
+    return ASSUAN_Out_Of_Core;
+
+  strcpy_escaped (p, line);
+  free (pinentry.repeat_passphrase);
+  pinentry.repeat_passphrase = p;
+  return 0;
+}
+
+
+static int
+cmd_setrepeaterror (ASSUAN_CONTEXT ctx, char *line)
+{
+  char *p;
+
+  p = malloc (strlen (line) + 1);
+  if (!p)
+    return ASSUAN_Out_Of_Core;
+
+  strcpy_escaped (p, line);
+  free (pinentry.repeat_error_string);
+  pinentry.repeat_error_string = p;
+  return 0;
+}
+
+
+static int
 cmd_seterror (ASSUAN_CONTEXT ctx, char *line)
 {
   char *newe;
@@ -909,6 +944,7 @@ cmd_getpin (ASSUAN_CONTEXT ctx, char *line)
     }
   pinentry.locale_err = 0;
   pinentry.close_button = 0;
+  pinentry.repeat_okay = 0;
   pinentry.one_button = 0;
   pinentry.ctx_assuan = ctx;
   result = (*pinentry_cmd_handler) (&pinentry);
@@ -918,6 +954,11 @@ cmd_getpin (ASSUAN_CONTEXT ctx, char *line)
       free (pinentry.error);
       pinentry.error = NULL;
     }
+  if (pinentry.repeat_passphrase)
+    {
+      free (pinentry.repeat_passphrase);
+      pinentry.repeat_passphrase = NULL;
+    }
   if (set_prompt)
     pinentry.prompt = NULL;
 
@@ -938,6 +979,8 @@ cmd_getpin (ASSUAN_CONTEXT ctx, char *line)
 
   if (result)
     {
+      if (pinentry.repeat_okay)
+        assuan_write_status (ctx, "PIN_REPEATED", "");
       result = assuan_send_data (ctx, pinentry.pin, result);
       if (!result)
        result = assuan_send_data (ctx, NULL, 0);
@@ -1058,6 +1101,8 @@ register_commands (ASSUAN_CONTEXT ctx)
     {
       { "SETDESC",    0,  cmd_setdesc },
       { "SETPROMPT",  0,  cmd_setprompt },
+      { "SETREPEAT",  0,  cmd_setrepeat },
+      { "SETREPEATERROR",0, cmd_setrepeaterror },
       { "SETERROR",   0,  cmd_seterror },
       { "SETOK",      0,  cmd_setok },
       { "SETNOTOK",   0,  cmd_setnotok },
index d4f86f9..d419550 100644 (file)
@@ -1,20 +1,20 @@
 /* pinentry.h - The interface for the PIN entry support library.
    Copyright (C) 2002, 2003, 2010 g10 Code GmbH
-   
+
    This file is part of PINENTRY.
-   
+
    PINENTRY 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 2 of the License, or
    (at your option) any later version.
+
    PINENTRY 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/>. 
+   along with this program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #ifndef PINENTRY_H
@@ -22,7 +22,7 @@
 
 #ifdef __cplusplus
 extern "C" {
-#if 0 
+#if 0
 }
 #endif
 #endif
@@ -111,6 +111,18 @@ struct pinentry
      dismiss button is required. */
   int one_button;
 
+  /* If true a second prompt for the passphrase is show and the user
+     is expected to enter the same passphrase again.  Pinentry checks
+     that both match.  */
+  char *repeat_passphrase;
+
+  /* The string to show if a repeated passphrase does not match.  */
+  char *repeat_error_string;
+
+  /* Set to true if the passphrase has been entered a second time and
+     matches the first passphrase.  */
+  int repeat_okay;
+
   /* If this is not NULL, a passphrase quality indicator is shown.
      There will also be an inquiry back to the caller to get an
      indication of the quality for the passphrase entered so far.  The
@@ -170,7 +182,7 @@ char *pinentry_local_to_utf8 (char *lc_ctype, char *text, int secure);
 
 
 /* Run a quality inquiry for PASSPHRASE of LENGTH. */
-int pinentry_inq_quality (pinentry_t pin, 
+int pinentry_inq_quality (pinentry_t pin,
                           const char *passphrase, size_t length);
 
 /* Try to make room for at least LEN bytes for the pin in the pinentry
@@ -206,7 +218,7 @@ extern pinentry_cmd_handler_t pinentry_cmd_handler;
 
 
 
-#if 0 
+#if 0
 {
 #endif
 #ifdef __cplusplus