You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/app-crypt/pinentry/files/pinentry-0.9.2-gnome3.patch

519 lines
14 KiB

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

From be87785005d256b7f3dacc607ba5ea0a14de8593 Mon Sep 17 00:00:00 2001
From: "Neal H. Walfield" <neal@gnu.org>
Date: Tue, 12 May 2015 17:07:49 +0200
Subject: [PATCH] Add a GNOME3 pinentry based on gcr.
* configure.ac (--enable-pinentry-gnome3): Option to enable the GNOME3
pinentry.
(pinentry_gnome_3): Set to yes if enabled and gcr-3 and gcr-base-3 gcr
is available.
(GNOME3CFLAGS): Define and AC_SUBST.
(GNOME3LIBS): Define and AC_SUBST.
(GCR_API_SUBJECT_TO_CHANGE): Define.
(BUILD_PINENTRY_GNOME_3): Define.
* Makefile.am (pinentry_gnome_3): Define.
(SUBDIRS): Add ${pinentry_gnome_3}.
* gnome3/Makefile.am: New file.
* gnome3/pinentry-gnome3.c: New file.
---
Makefile.am | 11 +-
configure.ac | 62 +++++++++--
gnome3/Makefile.am | 39 +++++++
gnome3/pinentry-gnome3.c | 271 +++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 370 insertions(+), 13 deletions(-)
create mode 100644 gnome3/Makefile.am
create mode 100644 gnome3/pinentry-gnome3.c
diff --git a/Makefile.am b/Makefile.am
index f8f7aac..177f37e 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
# Makefile.am
-# Copyright (C) 2002, 2012 g10 Code GmbH
+# Copyright (C) 2002, 2012, 2015 g10 Code GmbH
#
# This file is part of PINENTRY.
#
@@ -46,6 +46,12 @@ else
pinentry_gtk_2 =
endif
+if BUILD_PINENTRY_GNOME_3
+pinentry_gnome_3 = gnome3
+else
+pinentry_gnome_3 =
+endif
+
if BUILD_PINENTRY_QT4
pinentry_qt4 = qt4
else
@@ -59,7 +65,8 @@ pinentry_w32 =
endif
SUBDIRS = assuan secmem pinentry ${pinentry_curses} ${pinentry_tty} \
- ${pinentry_gtk_2} ${pinentry_qt4} ${pinentry_w32} doc
+ ${pinentry_gtk_2} ${pinentry_gnome_3} ${pinentry_qt4} \
+ ${pinentry_w32} doc
install-exec-local:
diff --git a/configure.ac b/configure.ac
index c50ce68..9948d1f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -274,28 +274,34 @@ fi
dnl
-dnl Check for GTK+-2 pinentry program.
+dnl Check for GTK+-2 / GNOME3 pinentry programs.
dnl
AC_ARG_ENABLE(pinentry-gtk2,
AC_HELP_STRING([--enable-pinentry-gtk2], [build GTK+-2 pinentry]),
pinentry_gtk_2=$enableval, pinentry_gtk_2=maybe)
+AC_ARG_ENABLE(pinentry-gnome3,
+ AC_HELP_STRING([--enable-pinentry-gnome3], [build GNOME 3 pinentry]),
+ pinentry_gnome_3=$enableval, pinentry_gnome_3=maybe)
+
dnl check for pkg-config
-if test "$pinentry_gtk_2" != "no"; then
+if test "$pinentry_gtk_2" != "no" -o "$pinentry_gnome_3" != "no"; then
AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
if test x"${PKG_CONFIG}" = xno ; then
pinentry_gtk_2=no
+ pinentry_gnome_3=no
fi
fi
dnl check if the module gtk+-2.0 exists
-if test "$pinentry_gtk_2" != "no"; then
+if test "$pinentry_gtk_2" != "no" -o "$pinentry_gnome_3" != "no"; then
AC_MSG_CHECKING([for gtk+-2])
"${PKG_CONFIG}" --exists gtk+-2.0
if test $? -ne 0 ; then
AC_MSG_RESULT([no])
AC_MSG_WARN([pkg-config could not find the module gtk+-2.0])
pinentry_gtk_2=no
+ pinentry_gnome_3=no
else
AC_MSG_RESULT([yes])
AC_MSG_CHECKING([gtk+-2 version >= 2.4.0])
@@ -305,17 +311,45 @@ if test "$pinentry_gtk_2" != "no"; then
if test $? -ne 0 ; then
AC_MSG_WARN([building GTK+-2 pinentry disabled])
pinentry_gtk_2=no
+ pinentry_gnome_3=no
else
GTK2CFLAGS=`"${PKG_CONFIG}" --cflags gtk+-2.0`
GTK2LIBS=`"${PKG_CONFIG}" --libs gtk+-2.0`
AC_SUBST(GTK2CFLAGS)
AC_SUBST(GTK2LIBS)
- pinentry_gtk_2=yes
+ if test "$pinentry_gtk_2" != "no"
+ then
+ pinentry_gtk_2=yes
+ fi
+ if test "$pinentry_gnome_3" != "no"
+ then
+ pinentry_gnome_3=yes
+ fi
fi
fi
fi
AM_CONDITIONAL(BUILD_PINENTRY_GTK_2, test "$pinentry_gtk_2" = "yes")
+if test "$pinentry_gnome_3" != "no"; then
+ AC_MSG_CHECKING([for gcr])
+ "${PKG_CONFIG}" --exists gcr-3,gcr-base-3
+ if test $? -ne 0 ; then
+ AC_MSG_RESULT([no])
+ AC_MSG_WARN([pkg-config could not find the module gcr-3,gcr-base-3])
+ pinentry_gnome_3=no
+ else
+ AC_MSG_RESULT([yes])
+ GNOME3CFLAGS=`"${PKG_CONFIG}" --cflags gcr-3,gcr-base-3`
+ GNOME3LIBS=`"${PKG_CONFIG}" --libs gcr-3,gcr-base-3`
+ AC_SUBST(GNOME3CFLAGS)
+ AC_SUBST(GNOME3LIBS)
+ AC_DEFINE(GCR_API_SUBJECT_TO_CHANGE, 1, [Nod nod])
+ pinentry_gnome_3=yes
+ fi
+fi
+
+AM_CONDITIONAL(BUILD_PINENTRY_GNOME_3, test "$pinentry_gnome_3" = "yes")
+
dnl
dnl Check for libsecret.
dnl
@@ -450,16 +484,20 @@ else
if test "$pinentry_qt4" = "yes"; then
PINENTRY_DEFAULT=pinentry-qt4
else
- if test "$pinentry_curses" = "yes"; then
- PINENTRY_DEFAULT=pinentry-curses
+ if test "$pinentry_gnome_3" = "yes"; then
+ PINENTRY_DEFAULT=pinentry-gnome3
else
- if test "$pinentry_tty" = "yes"; then
- PINENTRY_DEFAULT=pinentry-tty
+ if test "$pinentry_curses" = "yes"; then
+ PINENTRY_DEFAULT=pinentry-curses
else
- if test "$pinentry_w32" = "yes"; then
- PINENTRY_DEFAULT=pinentry-w32
+ if test "$pinentry_tty" = "yes"; then
+ PINENTRY_DEFAULT=pinentry-tty
else
- AC_MSG_ERROR([[No pinentry enabled.]])
+ if test "$pinentry_w32" = "yes"; then
+ PINENTRY_DEFAULT=pinentry-w32
+ else
+ AC_MSG_ERROR([[No pinentry enabled.]])
+ fi
fi
fi
fi
@@ -475,6 +513,7 @@ pinentry/Makefile
curses/Makefile
tty/Makefile
gtk+-2/Makefile
+gnome3/Makefile
qt4/Makefile
w32/Makefile
doc/Makefile
@@ -493,6 +532,7 @@ AC_MSG_NOTICE([
Curses Pinentry ..: $pinentry_curses
TTY Pinentry .....: $pinentry_tty
GTK+-2 Pinentry ..: $pinentry_gtk_2
+ GNOME 3 Pinentry .: $pinentry_gnome_3
Qt4 Pinentry .....: $pinentry_qt4 $pinentry_qt4_clip_msg
W32 Pinentry .....: $pinentry_w32
diff --git a/gnome3/Makefile.am b/gnome3/Makefile.am
new file mode 100644
index 0000000..78df706
--- /dev/null
+++ b/gnome3/Makefile.am
@@ -0,0 +1,39 @@
+# Makefile.am - PIN entry GTK+ frontend.
+# Copyright (C) 2002, 2015 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, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+
+## Process this file with automake to produce Makefile.in
+
+bin_PROGRAMS = pinentry-gnome3
+
+if FALLBACK_CURSES
+ncurses_include = $(NCURSES_INCLUDE)
+libcurses = ../pinentry/libpinentry-curses.a $(LIBCURSES) $(LIBICONV)
+else
+ncurses_include =
+libcurses =
+endif
+
+AM_CPPFLAGS = $(COMMON_CFLAGS) $(GNOME3CFLAGS) \
+ $(ncurses_include) -I$(top_srcdir)/assuan \
+ -I$(top_srcdir)/secmem -I$(top_srcdir)/pinentry
+LDADD = $(COMMON_LIBS) \
+ ../pinentry/libpinentry.a ../assuan/libassuan.a ../secmem/libsecmem.a \
+ $(LIBCAP) $(GNOME3LIBS) $(libcurses)
+
+pinentry_gnome3_SOURCES = pinentry-gnome3.c
diff --git a/gnome3/pinentry-gnome3.c b/gnome3/pinentry-gnome3.c
new file mode 100644
index 0000000..74ec89c
--- /dev/null
+++ b/gnome3/pinentry-gnome3.c
@@ -0,0 +1,271 @@
+/* pinentry-gnome3.c
+ Copyright (C) 2015 g10 Code GmbH
+
+ pinentry-gnome-3 is a pinentry application for GNOME 3. It tries
+ to follow the Gnome Human Interface Guide as close as possible.
+
+ This program 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.
+
+ This program 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, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <gtk/gtk.h>
+#include <gcr/gcr-base.h>
+
+#include <string.h>
+
+#include "assuan.h"
+
+#include "memory.h"
+
+#include "pinentry.h"
+
+#ifdef FALLBACK_CURSES
+#include "pinentry-curses.h"
+#endif
+
+
+#define PGMNAME "pinentry-gnome3"
+
+#ifndef VERSION
+# define VERSION
+#endif
+
+static gchar *
+pinentry_utf8_validate (gchar *text)
+{
+ gchar *result;
+
+ if (!text)
+ return NULL;
+
+ if (g_utf8_validate (text, -1, NULL))
+ return g_strdup (text);
+
+ /* Failure: Assume that it was encoded in the current locale and
+ convert it to utf-8. */
+ result = g_locale_to_utf8 (text, -1, NULL, NULL, NULL);
+ if (!result)
+ {
+ gchar *p;
+
+ result = p = g_strdup (text);
+ while (!g_utf8_validate (p, -1, (const gchar **) &p))
+ *p = '?';
+ }
+ return result;
+}
+
+static GcrPrompt *
+create_prompt (pinentry_t pe, int confirm)
+{
+ GcrPrompt *prompt;
+ GError *error = NULL;
+ char *msg;
+
+ /* Create the prompt. */
+ prompt = GCR_PROMPT (gcr_system_prompt_open (-1, NULL, &error));
+ if (! prompt)
+ {
+ g_warning ("couldn't create prompt for gnupg passphrase: %s",
+ error->message);
+ g_error_free (error);
+ return NULL;
+ }
+
+ /* Set the messages for the various buttons, etc. */
+ if (pe->title)
+ {
+ msg = pinentry_utf8_validate (pe->title);
+ gcr_prompt_set_title (prompt, msg);
+ g_free (msg);
+ }
+
+ if (pe->description)
+ {
+ msg = pinentry_utf8_validate (pe->description);
+ gcr_prompt_set_description (prompt, msg);
+ g_free (msg);
+ }
+
+ /* An error occured during the last prompt. */
+ if (pe->error)
+ {
+ msg = pinentry_utf8_validate (pe->error);
+ gcr_prompt_set_warning (prompt, msg);
+ g_free (msg);
+ }
+
+ if (! pe->prompt && confirm)
+ gcr_prompt_set_message (prompt, "Message");
+ else if (! pe->prompt && ! confirm)
+ gcr_prompt_set_message (prompt, "Enter Passphrase");
+ else
+ {
+ msg = pinentry_utf8_validate (pe->prompt);
+ gcr_prompt_set_message (prompt, msg);
+ g_free (msg);
+ }
+
+ if (! confirm)
+ gcr_prompt_set_password_new (prompt, !!pe->repeat_passphrase);
+
+ if (pe->ok || pe->default_ok)
+ {
+ msg = pinentry_utf8_validate (pe->ok ?: pe->default_ok);
+ gcr_prompt_set_continue_label (prompt, msg);
+ g_free (msg);
+ }
+ /* XXX: Disable this button if pe->one_button is set. */
+ if (pe->cancel || pe->default_cancel)
+ {
+ msg = pinentry_utf8_validate (pe->cancel ?: pe->default_cancel);
+ gcr_prompt_set_cancel_label (prompt, msg);
+ g_free (msg);
+ }
+
+ if (confirm && pe->notok)
+ {
+ /* XXX: Add support for the third option. */
+ }
+
+ /* XXX: gcr expects a string; we have a int. */
+ // gcr_prompt_set_caller_window (prompt, pe->parent_wid);
+
+ if (! confirm && pe->allow_external_password_cache && pe->keyinfo)
+ {
+ if (pe->default_pwmngr)
+ {
+ msg = pinentry_utf8_validate (pe->default_pwmngr);
+ gcr_prompt_set_choice_label (prompt, msg);
+ g_free (msg);
+ }
+ else
+ gcr_prompt_set_choice_label
+ (prompt, "Automatically unlock this key, whenever I'm logged in");
+ }
+
+ return prompt;
+}
+
+static int
+gnome3_cmd_handler (pinentry_t pe)
+{
+ GcrPrompt *prompt = NULL;
+ GError *error = NULL;
+ int ret = -1;
+
+ if (pe->pin)
+ /* Passphrase mode. */
+ {
+ const char *password;
+
+ prompt = create_prompt (pe, 0);
+ if (! prompt)
+ /* Something went wrong. */
+ {
+ pe->canceled = 1;
+ return -1;
+ }
+
+ /* "The returned password is valid until the next time a method
+ is called to display another prompt." */
+ password = gcr_prompt_password_run (prompt, NULL, &error);
+ if (error)
+ /* Error. */
+ {
+ pe->specific_err = ASSUAN_General_Error;
+ g_error_free (error);
+ ret = -1;
+ }
+ else if (! password && ! error)
+ /* User cancelled the operation. */
+ ret = -1;
+ else
+ {
+ pinentry_setbufferlen (pe, strlen (password) + 1);
+ if (pe->pin)
+ strcpy (pe->pin, password);
+
+ if (pe->repeat_passphrase)
+ pe->repeat_okay = 1;
+
+ ret = 1;
+ }
+ }
+ else
+ /* Message box mode. */
+ {
+ GcrPromptReply reply;
+
+ prompt = create_prompt (pe, 1);
+ if (! prompt)
+ /* Something went wrong. */
+ {
+ pe->canceled = 1;
+ return -1;
+ }
+
+ /* XXX: We don't support a third button! */
+
+ reply = gcr_prompt_confirm_run (prompt, NULL, &error);
+ if (error)
+ {
+ pe->specific_err = ASSUAN_General_Error;
+ ret = 0;
+ }
+ else if (reply == GCR_PROMPT_REPLY_CONTINUE
+ /* XXX: Hack since gcr doesn't yet support one button
+ message boxes treat cancel the same as okay. */
+ || pe->one_button)
+ /* Confirmation. */
+ ret = 1;
+ else
+ /* GCR_PROMPT_REPLY_CANCEL */
+ {
+ pe->canceled = 1;
+ ret = 0;
+ }
+ }
+
+ if (prompt)
+ g_clear_object (&prompt);
+ return ret;
+}
+
+pinentry_cmd_handler_t pinentry_cmd_handler = gnome3_cmd_handler;
+
+int
+main (int argc, char *argv[])
+{
+ pinentry_init (PGMNAME);
+
+#ifdef FALLBACK_CURSES
+ if (pinentry_have_display (argc, argv))
+ gtk_init (&argc, &argv);
+ else
+ pinentry_cmd_handler = curses_cmd_handler;
+#else
+ gtk_init (&argc, &argv);
+#endif
+
+ pinentry_parse_opts (argc, argv);
+
+ if (pinentry_loop ())
+ return 1;
+
+ return 0;
+}
--
2.1.4