---
 src/common/server.c     |   16 +++++++++++
 src/fe-gtk/Makefile.am  |    2 -
 src/fe-gtk/fe-gtk.h     |    3 ++
 src/fe-gtk/passphrase.c |   69 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/fe-gtk/passphrase.h |    3 ++
 5 files changed, 92 insertions(+), 1 deletion(-)

Index: xchat-2.8.6/src/common/server.c
===================================================================
--- xchat-2.8.6.orig/src/common/server.c
+++ xchat-2.8.6/src/common/server.c
@@ -60,6 +60,7 @@
 #include <openssl/ssl.h>		  /* SSL_() */
 #include <openssl/err.h>		  /* ERR_() */
 #include "ssl.h"
+#include "../fe-gtk/passphrase.h"
 #endif
 
 #ifdef USE_MSPROXY
@@ -84,6 +85,18 @@ static void server_disconnect (session *
 static int server_cleanup (server * serv);
 static void server_connect (server *serv, char *hostname, int port, int no_login);
 
+#ifdef USE_OPENSSL
+static int
+pem_passwd_cb (char *buf, int size, int rwflag, void *userdata)
+{
+   char *passwd = NULL;
+   server *serv = userdata;
+   passwd = passphrase_dialog(serv);
+   if (passwd) { strncpy(buf, passwd, size);
+   buf[size - 1] = '\0';
+   return (strlen(buf)); } else return 0;
+}
+#endif
 
 /* actually send to the socket. This might do a character translation or
    send via SSL. server/dcc both use this function. */
@@ -1666,6 +1679,9 @@ server_connect (server *serv, char *host
 	{
 		char cert_file[256];
 
+		SSL_CTX_set_default_passwd_cb(ctx, pem_passwd_cb);
+		SSL_CTX_set_default_passwd_cb_userdata(ctx, serv);
+
 		/* first try network specific cert/key */
 		snprintf (cert_file, sizeof (cert_file), "%s/%s.pem",
 					 get_xdir_fs (), server_get_network (serv, TRUE));
Index: xchat-2.8.6/src/fe-gtk/Makefile.am
===================================================================
--- xchat-2.8.6.orig/src/fe-gtk/Makefile.am
+++ xchat-2.8.6/src/fe-gtk/Makefile.am
@@ -29,4 +29,4 @@ xchat_SOURCES = about.c ascii.c banlist.
 	dccgui.c editlist.c fe-gtk.c fkeys.c gtkutil.c ignoregui.c joind.c menu.c \
 	maingui.c $(mmx_cmod_S) notifygui.c palette.c pixmaps.c plugin-tray.c $(plugingui_c) \
 	rawlog.c search.c servlistgui.c setup.c $(sexy_spell_entry_c) textgui.c \
-	urlgrab.c userlistgui.c xtext.c
+	urlgrab.c userlistgui.c xtext.c passphrase.c
Index: xchat-2.8.6/src/fe-gtk/fe-gtk.h
===================================================================
--- xchat-2.8.6.orig/src/fe-gtk/fe-gtk.h
+++ xchat-2.8.6/src/fe-gtk/fe-gtk.h
@@ -52,6 +52,9 @@ struct server_gui
 	GtkWidget *rawlog_window;
 	GtkWidget *rawlog_textlist;
 
+	/* passphrase dialog */
+	GtkWidget *passphrase_win;
+
 	/* join dialog */
 	GtkWidget *joind_win;
 	GtkWidget *joind_entry;
Index: xchat-2.8.6/src/fe-gtk/passphrase.c
===================================================================
--- /dev/null
+++ xchat-2.8.6/src/fe-gtk/passphrase.c
@@ -0,0 +1,69 @@
+/* X-Chat
+ * Passphrase dialog
+ * Copyright (C) 2006 Wolfgang Rosenauer.
+ *
+ * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#include <gtk/gtk.h>
+#include "../common/xchat.h"
+#include "../common/xchatc.h"
+#include "../common/server.h"
+#include "fe-gtk.h"
+
+
+static void 
+accept_passphrase_cb (GtkWidget *IGNORED, GtkDialog *dialog) 
+{
+   gtk_dialog_response (dialog, GTK_RESPONSE_ACCEPT);
+}
+
+
+char *
+passphrase_dialog (server *serv)
+{
+    GtkWidget *dialog;
+    GtkWidget *entry;
+    char *res = NULL;
+    
+    serv->gui->passphrase_win = dialog = gtk_dialog_new_with_buttons(
+                                         "Passphrase",
+                                         NULL,
+                                         GTK_DIALOG_NO_SEPARATOR,
+                                         GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+                                         GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+                                         NULL);
+    
+    gtk_window_set_position (GTK_WINDOW(dialog), GTK_WIN_POS_MOUSE);
+    gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
+
+    /* passphrase field */
+    entry = gtk_entry_new();
+    gtk_entry_set_max_length (GTK_ENTRY(entry), 255);
+    gtk_entry_set_visibility (GTK_ENTRY(entry), FALSE);
+    gtk_signal_connect(GTK_OBJECT(entry), "activate", 
+	               G_CALLBACK(accept_passphrase_cb), 
+		       dialog);
+   
+    /* show all */
+    gtk_container_add (GTK_CONTAINER (GTK_DIALOG(dialog)->vbox), entry);
+    gtk_widget_show_all (dialog);
+
+    if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+          res = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+    gtk_widget_destroy (dialog);
+    serv->gui->passphrase_win = NULL;
+    return res;
+}
Index: xchat-2.8.6/src/fe-gtk/passphrase.h
===================================================================
--- /dev/null
+++ xchat-2.8.6/src/fe-gtk/passphrase.h
@@ -0,0 +1,3 @@
+
+
+char *passphrase_dialog (server *serv);
