Use a shared function to construct the title.
authorWerner Koch <wk@gnupg.org>
Fri, 3 Feb 2017 20:00:52 +0000 (21:00 +0100)
committerWerner Koch <wk@gnupg.org>
Fri, 3 Feb 2017 20:00:52 +0000 (21:00 +0100)
* pinentry/pinentry.c (pinentry_get_title): New.
* qt/main.cpp (qt_cmd_handler): Use that function for the title.
* tty/pinentry-tty.c (confirm, password): Ditto.
* gnome3/pinentry-gnome3.c (create_prompt): Ditto.
* gtk+-2/pinentry-gtk-2.c (create_window): Ditto.
* pinentry/pinentry-emacs.c (set_labels): Ditto.

Signed-off-by: Werner Koch <wk@gnupg.org>
gnome3/pinentry-gnome3.c
gtk+-2/pinentry-gtk-2.c
pinentry/pinentry-emacs.c
pinentry/pinentry.c
pinentry/pinentry.h
qt/main.cpp
tty/pinentry-tty.c

index c148fd9..27d2132 100644 (file)
@@ -121,7 +121,7 @@ create_prompt (pinentry_t pe, int confirm)
 {
   GcrPrompt *prompt;
   GError *error = NULL;
-  char *msg;
+  char *msg, *p;
   char window_id[32];
 
   /* Create the prompt.  */
@@ -149,9 +149,17 @@ create_prompt (pinentry_t pe, int confirm)
     }
 
   /* Set the messages for the various buttons, etc.  */
-  msg = pinentry_utf8_validate (pe->title ? pe->title : PGMNAME);
-  gcr_prompt_set_title (prompt, msg);
-  g_free (msg);
+  p = pinentry_get_title (pe);
+  if (p)
+    {
+      msg = pinentry_utf8_validate (p);
+      if (msg)
+        {
+          gcr_prompt_set_title (prompt, msg);
+          g_free (msg);
+        }
+      free (p);
+    }
 
   if (pe->description)
     {
index 79cecda..dee0360 100644 (file)
@@ -563,6 +563,7 @@ create_window (pinentry_t ctx)
   GtkWidget *wvbox, *chbox, *bbox;
   GtkAccelGroup *acc;
   gchar *msg;
+  char *p;
 
   repeat_entry = NULL;
 
@@ -626,22 +627,16 @@ create_window (pinentry_t ctx)
   box = gtk_vbox_new (FALSE, HIG_SMALL);
   gtk_box_pack_start (GTK_BOX (chbox), box, TRUE, TRUE, 0);
 
-  if (pinentry->title)
+  p = pinentry_get_title (pinentry);
+  if (p)
     {
-      msg = pinentry_utf8_validate (pinentry->title);
-      gtk_window_set_title (GTK_WINDOW(win), msg);
-    }
-  else if (pinentry->owner_pid)
-    {
-      char buf[100];
-      snprintf (buf, sizeof buf, "%s [%lu]",
-                pinentry->owner_host? pinentry->owner_host:"",
-                pinentry->owner_pid);
-      buf[sizeof buf - 1] = 0;
-      gtk_window_set_title (GTK_WINDOW(win), buf);
+      msg = pinentry_utf8_validate (p);
+      if (msg)
+        gtk_window_set_title (GTK_WINDOW(win), msg);
+      g_free (msg);
+      free (p);
     }
 
-
   if (pinentry->description)
     {
       msg = pinentry_utf8_validate (pinentry->description);
index 50ba406..2f7693b 100644 (file)
@@ -467,8 +467,14 @@ set_label (pinentry_t pe, const char *name, const char *value)
 static void
 set_labels (pinentry_t pe)
 {
-  if (pe->title)
-    set_label (pe, "SETTITLE", pe->title);
+  char *p;
+
+  p = pinentry_get_title (pe);
+  if (p)
+    {
+      set_label (pe, "SETTITLE", p);
+      free (p);
+    }
   if (pe->description)
     set_label (pe, "SETDESC", pe->description);
   if (pe->error)
index d33ebe9..7251899 100644 (file)
@@ -390,6 +390,33 @@ copy_and_escape (char *buffer, const void *text, size_t textlen)
 }
 
 
+/* Return a malloced string with the title.  The caller mus free the
+ * string.  If no title is available or the title string has an error
+ * NULL is returned.  */
+char *
+pinentry_get_title (pinentry_t pe)
+{
+  char *title;
+
+  if (pe->title)
+    title = strdup (pe->title);
+  else if (pe->owner_pid)
+    {
+      char buf[100];
+      if (pe->owner_host)
+        snprintf (buf, sizeof buf, "[%lu]@%s", pe->owner_pid, pe->owner_host);
+      else
+        snprintf (buf, sizeof buf, "[%lu]",
+                  pe->owner_pid);
+      buf[sizeof buf - 1] = 0;
+      title = strdup (buf);
+    }
+  else
+    title = strdup (this_pgmname);
+
+  return title;
+}
+
 
 /* Run a quality inquiry for PASSPHRASE of LENGTH.  (We need LENGTH
    because not all backends might be able to return a proper
index 1e891b7..868b4d8 100644 (file)
@@ -256,6 +256,7 @@ char *pinentry_utf8_to_local (const char *lc_ctype, const char *text);
    Return NULL on error. */
 char *pinentry_local_to_utf8 (char *lc_ctype, char *text, int secure);
 
+char *pinentry_get_title (pinentry_t pe);
 
 /* Run a quality inquiry for PASSPHRASE of LENGTH. */
 int pinentry_inq_quality (pinentry_t pin,
index 225c06b..e2af686 100644 (file)
@@ -145,6 +145,7 @@ static int
 qt_cmd_handler(pinentry_t pe)
 {
     QWidget *parent = 0;
+    char *str;
 
     /* FIXME: Add parent window ID to pinentry and GTK.  */
     if (pe->parent_wid) {
@@ -161,9 +162,13 @@ qt_cmd_handler(pinentry_t pe)
         pe->cancel         ? escape_accel(from_utf8(pe->cancel)) :
         pe->default_cancel ? escape_accel(from_utf8(pe->default_cancel)) :
         /* else */           QLatin1String("&Cancel") ;
+
+    str = pinentry_get_title (pe);
     const QString title =
-        pe->title ? from_utf8(pe->title) :
+        str       ? from_utf8(str) :
         /* else */  QLatin1String("pinentry-qt") ;
+    free (str);
+
     const QString repeatError =
         pe->repeat_error_string ? from_utf8(pe->repeat_error_string) :
                                   QLatin1String("Passphrases do not match");
@@ -179,6 +184,8 @@ qt_cmd_handler(pinentry_t pe)
 
 
     if (want_pass) {
+        char *str;
+
         PinEntryDialog pinentry(parent, 0, pe->timeout, true, !!pe->quality_bar,
                                 repeatString, visibilityTT, hideTT);
 
@@ -186,8 +193,11 @@ qt_cmd_handler(pinentry_t pe)
         pinentry.setPrompt(escape_accel(from_utf8(pe->prompt)));
         pinentry.setDescription(from_utf8(pe->description));
         pinentry.setRepeatErrorText(repeatError);
-        if (pe->title) {
-            pinentry.setWindowTitle(from_utf8(pe->title));
+
+        str = pinentry_get_title (pe);
+        if (str) {
+            pinentry.setWindowTitle(from_utf8(str));
+            free (str);
         }
 
         /* If we reuse the same dialog window.  */
index a509d79..8b37340 100644 (file)
@@ -173,6 +173,7 @@ static int
 confirm (pinentry_t pinentry, FILE *ttyfi, FILE *ttyfo)
 {
   char *msg;
+  char *msgbuffer = NULL;
 
   char ok = 0;
   char notok = 0;
@@ -184,8 +185,10 @@ confirm (pinentry_t pinentry, FILE *ttyfi, FILE *ttyfo)
 
   msg = pinentry->description;
   if (! msg)
-    /* If there is no description, fallback to the title.  */
-    msg = pinentry->title;
+    {
+      /* If there is no description, fallback to the title.  */
+      msg = msgbuffer = pinentry_get_title (pinentry);
+    }
   if (! msg)
     msg = "Confirm:";
 
@@ -194,6 +197,7 @@ confirm (pinentry_t pinentry, FILE *ttyfi, FILE *ttyfo)
       fputs (msg, ttyfo);
       fputc ('\n', ttyfo);
     }
+  free (msgbuffer);
 
   fflush (ttyfo);
 
@@ -377,17 +381,19 @@ static int
 password (pinentry_t pinentry, FILE *ttyfi, FILE *ttyfo)
 {
   char *msg;
+  char *msgbuffer = NULL;
   int done = 0;
 
   msg = pinentry->description;
   if (! msg)
-    msg = pinentry->title;
+    msg = msgbuffer = pinentry_get_title (pinentry);
   if (! msg)
     msg = "Enter your passphrase.";
 
   dump_error_text (ttyfo, pinentry->error);
 
   fprintf (ttyfo, "%s\n", msg);
+  free (msgbuffer);
 
   while (! done)
     {