r17092 - gnucash/branches/aqbanking3/src/import-export/aqbanking - Remember accepted certificates as long as GnuCash is running.
Andreas Köhler
andi5 at cvs.gnucash.org
Sat Apr 19 16:13:12 EDT 2008
Author: andi5
Date: 2008-04-19 16:13:12 -0400 (Sat, 19 Apr 2008)
New Revision: 17092
Trac: http://svn.gnucash.org/trac/changeset/17092
Modified:
gnucash/branches/aqbanking3/src/import-export/aqbanking/gnc-gwen-gui.c
Log:
Remember accepted certificates as long as GnuCash is running.
Modified: gnucash/branches/aqbanking3/src/import-export/aqbanking/gnc-gwen-gui.c
===================================================================
--- gnucash/branches/aqbanking3/src/import-export/aqbanking/gnc-gwen-gui.c 2008-04-19 20:13:02 UTC (rev 17091)
+++ gnucash/branches/aqbanking3/src/import-export/aqbanking/gnc-gwen-gui.c 2008-04-19 20:13:12 UTC (rev 17092)
@@ -42,6 +42,7 @@
#include "gnc-gwen-gui.h"
#include "gnc-session.h"
#include "gnc-ui.h"
+#include "md5.h"
#include "qof.h"
/* This static indicates the debugging module that this .o belongs to. */
@@ -129,6 +130,8 @@
GWEN_GUI_PASSWORD_STATUS status, guint32 guiid);
static gint loghook_cb(GWEN_GUI *gwen_gui, const gchar *log_domain,
GWEN_LOGGER_LEVEL priority, const gchar *text);
+static gint checkcert_cb(GWEN_GUI *gwen_gui, const GWEN_SSLCERTDESCR *cert,
+ GWEN_IO_LAYER *io, guint32 guiid);
gboolean ggg_delete_event_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data);
void ggg_abort_clicked_cb(GtkButton *button, gpointer user_data);
@@ -177,8 +180,12 @@
gboolean cache_passwords;
GHashTable *passwords;
+ /* Certificates handling */
+ GHashTable *accepted_certs;
+ GWEN_GUI_CHECKCERT_FN builtin_checkcert;
+
/* Dialogs */
- int showbox_id;
+ guint showbox_id;
GHashTable *showbox_hash;
GtkWidget *showbox_last;
@@ -276,6 +283,8 @@
g_hash_table_destroy(gui->passwords);
if (gui->showbox_hash)
g_hash_table_destroy(gui->showbox_hash);
+ if (gui->accepted_certs)
+ g_hash_table_destroy(gui->accepted_certs);
gtk_widget_destroy(gui->dialog);
g_free(gui);
@@ -306,6 +315,7 @@
GWEN_Gui_SetGetPasswordFn(gwen_gui, getpassword_cb);
GWEN_Gui_SetSetPasswordStatusFn(gwen_gui, setpasswordstatus_cb);
GWEN_Gui_SetLogHookFn(gwen_gui, loghook_cb);
+ gui->builtin_checkcert = GWEN_Gui_SetCheckCertFn(gwen_gui, checkcert_cb);
GWEN_Gui_SetGui(gwen_gui);
SETDATA_GUI(gwen_gui, gui);
@@ -354,12 +364,13 @@
gui->second_entry = glade_xml_get_widget(xml, "second_entry");
gui->other_entries_box = NULL;
gui->progresses = NULL;
- gui->showbox_hash = NULL;
- gui->showbox_id = 1;
gui->log_text = glade_xml_get_widget(xml, "log_text");
gui->abort_button = glade_xml_get_widget(xml, "abort_button");
gui->close_button = glade_xml_get_widget(xml, "close_button");
gui->close_checkbutton = glade_xml_get_widget(xml, "close_checkbutton");
+ gui->accepted_certs = NULL;
+ gui->showbox_hash = NULL;
+ gui->showbox_id = 1;
gtk_toggle_button_set_active(
GTK_TOGGLE_BUTTON(gui->close_checkbutton),
@@ -421,6 +432,10 @@
gui->passwords = NULL;
}
+ if (!gui->accepted_certs)
+ gui->accepted_certs = g_hash_table_new_full(
+ g_str_hash, g_str_equal, (GDestroyNotify) g_free, NULL);
+
LEAVE(" ");
}
@@ -1189,6 +1204,45 @@
return 1;
}
+static gint
+checkcert_cb(GWEN_GUI *gwen_gui, const GWEN_SSLCERTDESCR *cert,
+ GWEN_IO_LAYER *io, guint32 guiid)
+{
+ GncGWENGui *gui = GETDATA_GUI(gwen_gui);
+ const gchar *hash, *status;
+ struct md5_ctx md5_context;
+ gchar cert_hash[16];
+ gint retval;
+
+ g_return_val_if_fail(gui && gui->accepted_certs, -1);
+
+ ENTER("gui=%p, cert=%p", gui, cert);
+
+ hash = GWEN_SslCertDescr_GetFingerPrint(cert);
+ status = GWEN_SslCertDescr_GetStatusText(cert);
+
+ /* Operate on an md5sum of the pair of hash and status */
+ md5_init_ctx(&md5_context);
+ md5_process_bytes(hash, strlen(hash), &md5_context);
+ md5_process_bytes(status, strlen(status), &md5_context);
+ md5_finish_ctx(&md5_context, cert_hash);
+
+ if (g_hash_table_lookup(gui->accepted_certs, cert_hash)) {
+ /* Certificate has been accepted before */
+ LEAVE("Automatically accepting certificate");
+ return 0;
+ }
+
+ retval = gui->builtin_checkcert(gwen_gui, cert, io, guiid);
+ if (retval == 0) {
+ /* Certificate has been accepted */
+ g_hash_table_insert(gui->accepted_certs, g_strdup(cert_hash), cert_hash);
+ }
+
+ LEAVE("retval=%d", retval);
+ return retval;
+}
+
gboolean
ggg_delete_event_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data){
GncGWENGui *gui = user_data;
More information about the gnucash-changes
mailing list