1 From 2dc45e25b200e1b70e862f46c9f7ad652e59c8a2 Mon Sep 17 00:00:00 2001
2 From: David Woodhouse <David.Woodhouse@intel.com>
3 Date: Mon, 3 Nov 2014 17:39:43 +0000
4 Subject: [PATCH 28/34] Update to new hash handling, fix to match stored certs
5 only for the same host/port
8 auth-dialog/main.c | 90 +++++++++++++++++++++++++++++-------------------------
9 1 file changed, 49 insertions(+), 41 deletions(-)
11 diff --git a/auth-dialog/main.c b/auth-dialog/main.c
12 index df0146c..38f3a8f 100644
13 --- a/auth-dialog/main.c
14 +++ b/auth-dialog/main.c
15 @@ -694,7 +694,7 @@ static char* get_title(const char *vpn_name)
17 typedef struct cert_data {
18 auth_ui_data *ui_data;
19 - OPENCONNECT_X509 *peer_cert;
24 @@ -722,13 +722,10 @@ static gboolean user_validate_cert(cert_data *data)
26 auth_ui_data *ui_data = _ui_data; /* FIXME global */
29 GtkWidget *dlg, *text, *scroll;
30 GtkTextBuffer *buffer;
33 - details = openconnect_get_cert_details(ui_data->vpninfo, data->peer_cert);
35 title = get_title(data->ui_data->vpn_name);
36 dlg = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_QUESTION,
37 GTK_BUTTONS_OK_CANCEL,
38 @@ -751,8 +748,7 @@ static gboolean user_validate_cert(cert_data *data)
40 text = gtk_text_view_new();
41 buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
42 - gtk_text_buffer_set_text(buffer, details, -1);
43 - openconnect_free_cert_info(data->ui_data->vpninfo, details);
44 + gtk_text_buffer_set_text(buffer, data->cert_details, -1);
45 gtk_text_view_set_editable(GTK_TEXT_VIEW(text), 0);
46 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text), FALSE);
47 gtk_container_add(GTK_CONTAINER(scroll), text);
48 @@ -775,36 +771,40 @@ static gboolean user_validate_cert(cert_data *data)
50 /* runs in worker thread */
51 static int validate_peer_cert(void *cbdata,
52 - OPENCONNECT_X509 *peer_cert, const char *reason)
53 +#if !OPENCONNECT_CHECK_VER(5,0)
54 + OPENCONNECT_X509 *peer_cert,
58 auth_ui_data *ui_data = cbdata;
59 - char fingerprint[41];
64 + char *accepted_hash = NULL;
65 +#if OPENCONNECT_CHECK_VER(5,0)
66 + const char *fingerprint = openconnect_get_peer_cert_hash(ui_data->vpninfo);
68 + char fingerprint[41];
70 ret = openconnect_get_cert_sha1(ui_data->vpninfo, peer_cert, fingerprint);
74 - certs_data = g_hash_table_lookup (ui_data->secrets, "certsigs");
76 - char **certs = g_strsplit_set(certs_data, "\t", 0);
77 - char **this = certs;
78 +#define openconnect_check_peer_cert_hash(v, h) strcmp(h, fingerprint)
79 +#define openconnect_get_peer_cert_details(v) openconnect_get_cert_details(v, peer_cert);
83 - if (!strcmp(*this, fingerprint)) {
91 + certkey = g_strdup_printf ("certificate:%s:%d",
92 + openconnect_get_hostname(ui_data->vpninfo),
93 + openconnect_get_port(ui_data->vpninfo));
95 + accepted_hash = g_hash_table_lookup (ui_data->secrets, certkey);
96 + if (accepted_hash && !openconnect_check_peer_cert_hash(ui_data->vpninfo, accepted_hash))
99 data = g_slice_new(cert_data);
100 data->ui_data = ui_data; /* FIXME uses global */
101 - data->peer_cert = peer_cert;
102 + data->cert_details = openconnect_get_peer_cert_details(ui_data->vpninfo);
103 data->reason = reason;
105 g_mutex_lock(&ui_data->form_mutex);
106 @@ -813,27 +813,27 @@ static int validate_peer_cert(void *cbdata,
107 g_idle_add((GSourceFunc)user_validate_cert, data);
109 /* wait for user to accept or cancel */
110 - while (ui_data->cert_response == CERT_USER_NOT_READY) {
111 + while (ui_data->cert_response == CERT_USER_NOT_READY)
112 g_cond_wait(&ui_data->cert_response_changed, &ui_data->form_mutex);
114 - if (ui_data->cert_response == CERT_ACCEPTED) {
116 - char *new = g_strdup_printf("%s\t%s", certs_data, fingerprint);
117 - g_hash_table_insert (ui_data->secrets,
118 - g_strdup ("certsigs"), new);
120 - g_hash_table_insert (ui_data->secrets, g_strdup ("certsigs"),
121 - g_strdup (fingerprint));
124 + openconnect_free_cert_info(data->ui_data->vpninfo, data->cert_details);
125 + g_slice_free(cert_data, data);
127 + if (ui_data->cert_response == CERT_ACCEPTED)
134 g_mutex_unlock (&ui_data->form_mutex);
136 - g_slice_free(cert_data, data);
139 + g_hash_table_insert (ui_data->secrets, certkey,
140 + g_strdup(fingerprint));
149 @@ -1196,7 +1196,7 @@ static gboolean cookie_obtained(auth_ui_data *ui_data)
150 gtk_widget_set_sensitive(ui_data->cancel_button, FALSE);
152 } else if (!ui_data->cookie_retval) {
153 - OPENCONNECT_X509 *cert;
158 @@ -1218,14 +1218,22 @@ static gboolean cookie_obtained(auth_ui_data *ui_data)
159 g_hash_table_insert (ui_data->secrets, key, value);
160 openconnect_clear_cookie(ui_data->vpninfo);
162 +#if OPENCONNECT_CHECK_VER(5,0)
163 + cert = openconnect_get_peer_cert_hash (ui_data->vpninfo);
165 + key = g_strdup (NM_OPENCONNECT_KEY_GWCERT);
166 + value = g_strdup (cert);
167 + g_hash_table_insert (ui_data->secrets, key, value);
170 cert = openconnect_get_peer_cert (ui_data->vpninfo);
172 key = g_strdup (NM_OPENCONNECT_KEY_GWCERT);
173 value = g_malloc0 (41);
174 - openconnect_get_cert_sha1(ui_data->vpninfo, cert, value);
175 + openconnect_get_cert_sha1(ui_data->vpninfo, (void *)cert, value);
176 g_hash_table_insert (ui_data->secrets, key, value);
180 if (get_save_passwords(ui_data->secrets)) {
181 g_hash_table_foreach(ui_data->success_passwords,
182 keyring_store_passwords,