223d59f0c1db5100b6967da3329d0ebb2f30db1e
[gentoo.git] /
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
6
7 ---
8  auth-dialog/main.c | 90 +++++++++++++++++++++++++++++-------------------------
9  1 file changed, 49 insertions(+), 41 deletions(-)
10
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)
16  
17  typedef struct cert_data {
18         auth_ui_data *ui_data;
19 -       OPENCONNECT_X509 *peer_cert;
20 +       char *cert_details;
21         const char *reason;
22  } cert_data;
23  
24 @@ -722,13 +722,10 @@ static gboolean user_validate_cert(cert_data *data)
25  {
26         auth_ui_data *ui_data = _ui_data; /* FIXME global */
27         char *title;
28 -       char *details;
29         GtkWidget *dlg, *text, *scroll;
30         GtkTextBuffer *buffer;
31         int result;
32  
33 -       details = openconnect_get_cert_details(ui_data->vpninfo, data->peer_cert);
34 -
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)
39  
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)
49  
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,
55 +#endif
56 +                             const char *reason)
57  {
58         auth_ui_data *ui_data = cbdata;
59 -       char fingerprint[41];
60 -       char *certs_data;
61         int ret = 0;
62         cert_data *data;
63 +       char *certkey;
64 +       char *accepted_hash = NULL;
65 +#if OPENCONNECT_CHECK_VER(5,0)
66 +       const char *fingerprint = openconnect_get_peer_cert_hash(ui_data->vpninfo);
67 +#else
68 +       char fingerprint[41];
69  
70         ret = openconnect_get_cert_sha1(ui_data->vpninfo, peer_cert, fingerprint);
71         if (ret)
72                 return ret;
73  
74 -       certs_data = g_hash_table_lookup (ui_data->secrets, "certsigs");
75 -       if (certs_data) {
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);
80 +#endif
81  
82 -               while (*this) {
83 -                       if (!strcmp(*this, fingerprint)) {
84 -                               g_strfreev(certs);
85 -                               goto out;
86 -                       }
87 -                       this++;
88 -               }
89 -               g_strfreev(certs);
90 -       }
91 +       certkey = g_strdup_printf ("certificate:%s:%d",
92 +                                  openconnect_get_hostname(ui_data->vpninfo),
93 +                                  openconnect_get_port(ui_data->vpninfo));
94 +
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))
97 +               goto accepted;
98  
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;
104  
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);
108  
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);
113 -       }
114 -       if (ui_data->cert_response == CERT_ACCEPTED) {
115 -               if (certs_data) {
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);
119 -               } else {
120 -                       g_hash_table_insert (ui_data->secrets, g_strdup ("certsigs"),
121 -                                            g_strdup (fingerprint));
122 -               }
123 +
124 +       openconnect_free_cert_info(data->ui_data->vpninfo, data->cert_details);
125 +       g_slice_free(cert_data, data);
126 +
127 +       if (ui_data->cert_response == CERT_ACCEPTED)
128                 ret = 0;
129 -       } else {
130 +       else
131                 ret = -EINVAL;
132 -       }
133 +
134         g_mutex_unlock (&ui_data->form_mutex);
135  
136 -       g_slice_free(cert_data, data);
137 + accepted:
138 +       if (!ret) {
139 +               g_hash_table_insert (ui_data->secrets, certkey,
140 +                                    g_strdup(fingerprint));
141 +               certkey = NULL;
142 +       }
143  
144 - out:
145 +       g_free (certkey);
146         return ret;
147  }
148  
149 @@ -1196,7 +1196,7 @@ static gboolean cookie_obtained(auth_ui_data *ui_data)
150                         gtk_widget_set_sensitive(ui_data->cancel_button, FALSE);
151                 }
152         } else if (!ui_data->cookie_retval) {
153 -               OPENCONNECT_X509 *cert;
154 +               const void *cert;
155                 gchar *key, *value;
156  
157                 /* got cookie */
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);
161  
162 +#if OPENCONNECT_CHECK_VER(5,0)
163 +               cert = openconnect_get_peer_cert_hash (ui_data->vpninfo);
164 +               if (cert) {
165 +                       key = g_strdup (NM_OPENCONNECT_KEY_GWCERT);
166 +                       value = g_strdup (cert);
167 +                       g_hash_table_insert (ui_data->secrets, key, value);
168 +               }
169 +#else
170                 cert = openconnect_get_peer_cert (ui_data->vpninfo);
171                 if (cert) {
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);
177                 }
178 -
179 +#endif
180                 if (get_save_passwords(ui_data->secrets)) {
181                         g_hash_table_foreach(ui_data->success_passwords,
182                                              keyring_store_passwords,
183 -- 
184 2.2.0
185