diff options
author | Christian Grothoff <christian@grothoff.org> | 2014-06-06 23:52:12 +0000 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2014-06-06 23:52:12 +0000 |
commit | edf4fe1a7144f2719b5ca413b433bd0cee68a104 (patch) | |
tree | b0c377190c68351090e0550a74db5a2f1b3a5595 /src/namestore/plugin_gtk_namestore_tlsa.c | |
parent | 21af94a8c53c88a908f4b69ec1d6ce1506c79060 (diff) | |
download | gnunet-gtk-edf4fe1a7144f2719b5ca413b433bd0cee68a104.tar.gz gnunet-gtk-edf4fe1a7144f2719b5ca413b433bd0cee68a104.zip |
more work on TLSA dialog
Diffstat (limited to 'src/namestore/plugin_gtk_namestore_tlsa.c')
-rw-r--r-- | src/namestore/plugin_gtk_namestore_tlsa.c | 266 |
1 files changed, 212 insertions, 54 deletions
diff --git a/src/namestore/plugin_gtk_namestore_tlsa.c b/src/namestore/plugin_gtk_namestore_tlsa.c index a3ba28a4..12ab6d24 100644 --- a/src/namestore/plugin_gtk_namestore_tlsa.c +++ b/src/namestore/plugin_gtk_namestore_tlsa.c | |||
@@ -29,6 +29,8 @@ | |||
29 | */ | 29 | */ |
30 | #include "gnunet_gtk.h" | 30 | #include "gnunet_gtk.h" |
31 | #include "gnunet_gtk_namestore_plugin.h" | 31 | #include "gnunet_gtk_namestore_plugin.h" |
32 | #include <gnutls/gnutls.h> | ||
33 | #include <gnutls/x509.h> | ||
32 | 34 | ||
33 | 35 | ||
34 | /** | 36 | /** |
@@ -36,11 +38,13 @@ | |||
36 | * button depending on the validity of the value. | 38 | * button depending on the validity of the value. |
37 | * | 39 | * |
38 | * @param entry editing widget | 40 | * @param entry editing widget |
41 | * @param preedit | ||
39 | * @param user_data the plugin environment | 42 | * @param user_data the plugin environment |
40 | */ | 43 | */ |
41 | static void | 44 | static void |
42 | GNS_edit_dialog_tlsa_target_entry_changed_cb (GtkEditable *entry, | 45 | GNS_edit_dialog_tlsa_value_textview_preedit_changed_cb (GtkTextView *textview, |
43 | gpointer user_data) | 46 | gchar *preedit, |
47 | gpointer user_data) | ||
44 | { | 48 | { |
45 | struct GNUNET_GTK_NAMESTORE_PluginEnvironment *edc = user_data; | 49 | struct GNUNET_GTK_NAMESTORE_PluginEnvironment *edc = user_data; |
46 | 50 | ||
@@ -85,31 +89,37 @@ tlsa_load (void *cls, | |||
85 | unsigned int protocol; | 89 | unsigned int protocol; |
86 | GtkComboBox *cb; | 90 | GtkComboBox *cb; |
87 | GtkTreeIter iter; | 91 | GtkTreeIter iter; |
92 | GtkTreeModel *tm; | ||
88 | unsigned int service; | 93 | unsigned int service; |
89 | guint service_at_iter; | 94 | guint service_at_iter; |
90 | unsigned int priority; | ||
91 | unsigned int weight; | ||
92 | unsigned int port; | ||
93 | unsigned int record_type; | 95 | unsigned int record_type; |
94 | char target_name[253 + 1]; | 96 | unsigned int usage; |
95 | GtkTreeModel *tm; | 97 | unsigned int selector; |
98 | unsigned int matching_type; | ||
99 | GtkTextBuffer *tb; | ||
100 | size_t slen = strlen (n_value) + 1; | ||
101 | char cert_data[slen]; | ||
96 | 102 | ||
97 | if (7 != SSCANF (n_value, | 103 | if (7 != SSCANF (n_value, |
98 | "%u %u %u %d %d %d %253s", | 104 | "%u %u %u %u %u %u %s", |
99 | &protocol, | 105 | &protocol, |
100 | &service, | 106 | &service, |
101 | &record_type, | 107 | &record_type, |
102 | &priority, | 108 | &usage, |
103 | &weight, | 109 | &selector, |
104 | &port, | 110 | &matching_type, |
105 | target_name)) | 111 | cert_data)) |
106 | { | 112 | { |
107 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, | 113 | GNUNET_log (GNUNET_ERROR_TYPE_ERROR, |
108 | _("Unable to parse (boxed) TLSA record `%s'\n"), | 114 | _("Unable to parse (boxed) TLSA record `%s'\n"), |
109 | n_value); | 115 | n_value); |
110 | return; | 116 | return; |
111 | } | 117 | } |
112 | 118 | if (GNUNET_DNSPARSER_TYPE_TLSA != record_type) | |
119 | { | ||
120 | GNUNET_break (0); | ||
121 | return; | ||
122 | } | ||
113 | gtk_spin_button_set_value | 123 | gtk_spin_button_set_value |
114 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | 124 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, |
115 | "edit_dialog_port_spinbutton")), | 125 | "edit_dialog_port_spinbutton")), |
@@ -137,21 +147,87 @@ tlsa_load (void *cls, | |||
137 | while (gtk_tree_model_iter_next (tm, | 147 | while (gtk_tree_model_iter_next (tm, |
138 | &iter)); | 148 | &iter)); |
139 | } | 149 | } |
140 | gtk_spin_button_set_value | 150 | switch (usage) |
141 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | 151 | { |
142 | "edit_dialog_tlsa_priority_spinbutton")), | 152 | case 0: /* CA cert */ |
143 | priority); | 153 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON |
144 | gtk_spin_button_set_value | 154 | (gtk_builder_get_object |
145 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | 155 | (builder, |
146 | "edit_dialog_tlsa_weight_spinbutton")), | 156 | "edit_dialog_tlsa_usage_ca_radiobutton")), |
147 | weight); | 157 | TRUE); |
148 | gtk_spin_button_set_value | 158 | break; |
149 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | 159 | case 1: /* Entity cert */ |
150 | "edit_dialog_tlsa_value_port_spinbutton")), | 160 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON |
151 | port); | 161 | (gtk_builder_get_object |
152 | gtk_entry_set_text (GTK_ENTRY (gtk_builder_get_object (builder, | 162 | (builder, |
153 | "edit_dialog_tlsa_target_entry")), | 163 | "edit_dialog_tlsa_usage_service_cert_radiobutton")), |
154 | target_name); | 164 | TRUE); |
165 | break; | ||
166 | case 2: /* Trust anchor */ | ||
167 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON | ||
168 | (gtk_builder_get_object | ||
169 | (builder, | ||
170 | "edit_dialog_tlsa_usage_trust_anchor_radiobutton")), | ||
171 | TRUE); | ||
172 | break; | ||
173 | case 3: /* Domain-issued cert */ | ||
174 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON | ||
175 | (gtk_builder_get_object | ||
176 | (builder, | ||
177 | "edit_dialog_tlsa_usage_domain_issued_cert_radiobutton")), | ||
178 | TRUE); | ||
179 | break; | ||
180 | default: | ||
181 | GNUNET_break_op (0); | ||
182 | break; | ||
183 | } | ||
184 | switch (selector) | ||
185 | { | ||
186 | case 0: /* full cert, binary */ | ||
187 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON | ||
188 | (gtk_builder_get_object | ||
189 | (builder, | ||
190 | "edit_dialog_tlsa_selector_full_cert_radiobutton")), | ||
191 | TRUE); | ||
192 | break; | ||
193 | case 1: /* full cert, DER */ | ||
194 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON | ||
195 | (gtk_builder_get_object | ||
196 | (builder, | ||
197 | "edit_dialog_tlsa_selector_subject_public_key_radiobutton")), | ||
198 | TRUE); | ||
199 | break; | ||
200 | } | ||
201 | switch (matching_type) | ||
202 | { | ||
203 | case 0: /* exact match */ | ||
204 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON | ||
205 | (gtk_builder_get_object | ||
206 | (builder, | ||
207 | "edit_dialog_tlsa_matching_type_full_contents_radiobutton")), | ||
208 | TRUE); | ||
209 | break; | ||
210 | case 1: /* SHA-256 hash */ | ||
211 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON | ||
212 | (gtk_builder_get_object | ||
213 | (builder, | ||
214 | "edit_dialog_tlsa_matching_type_sha256_radiobutton")), | ||
215 | TRUE); | ||
216 | break; | ||
217 | case 2: /* SHA-512 hash */ | ||
218 | gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON | ||
219 | (gtk_builder_get_object | ||
220 | (builder, | ||
221 | "edit_dialog_tlsa_matching_type_sha512_radiobutton")), | ||
222 | TRUE); | ||
223 | break; | ||
224 | } | ||
225 | tb = gtk_text_view_get_buffer (GTK_TEXT_VIEW | ||
226 | (gtk_builder_get_object (builder, | ||
227 | "edit_dialog_tlsa_value_textview"))); | ||
228 | gtk_text_buffer_set_text (tb, | ||
229 | cert_data, | ||
230 | -1); | ||
155 | } | 231 | } |
156 | 232 | ||
157 | 233 | ||
@@ -171,13 +247,15 @@ tlsa_store (void *cls, | |||
171 | GtkComboBox *cb; | 247 | GtkComboBox *cb; |
172 | GtkTreeIter iter; | 248 | GtkTreeIter iter; |
173 | guint service; | 249 | guint service; |
174 | unsigned int priority; | 250 | unsigned int usage; |
175 | unsigned int weight; | 251 | unsigned int selector; |
176 | unsigned int port; | 252 | unsigned int matching_type; |
177 | GtkEntry *entry; | 253 | GtkTextBuffer *tb; |
178 | const gchar *target; | 254 | gchar *value; |
179 | char *result; | 255 | char *result; |
180 | GtkTreeModel *tm; | 256 | GtkTreeModel *tm; |
257 | GtkTextIter ti_start; | ||
258 | GtkTextIter ti_end; | ||
181 | 259 | ||
182 | protocol = gtk_spin_button_get_value | 260 | protocol = gtk_spin_button_get_value |
183 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | 261 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, |
@@ -196,28 +274,31 @@ tlsa_store (void *cls, | |||
196 | &iter, | 274 | &iter, |
197 | 1, &service, | 275 | 1, &service, |
198 | -1); | 276 | -1); |
199 | priority = gtk_spin_button_get_value | 277 | usage = 0; |
200 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | 278 | selector = 0; |
201 | "edit_dialog_tlsa_priority_spinbutton"))); | 279 | matching_type = 0; |
202 | weight = gtk_spin_button_get_value | ||
203 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | ||
204 | "edit_dialog_tlsa_weight_spinbutton"))); | ||
205 | port = gtk_spin_button_get_value | ||
206 | (GTK_SPIN_BUTTON (gtk_builder_get_object (builder, | ||
207 | "edit_dialog_tlsa_value_port_spinbutton"))); | ||
208 | entry = GTK_ENTRY (gtk_builder_get_object (builder, | ||
209 | "edit_dialog_tlsa_target_entry")); | ||
210 | target = gtk_entry_get_text (entry); | ||
211 | 280 | ||
281 | tb = gtk_text_view_get_buffer (GTK_TEXT_VIEW | ||
282 | (gtk_builder_get_object (builder, | ||
283 | "edit_dialog_tlsa_value_textview"))); | ||
284 | |||
285 | gtk_text_buffer_get_iter_at_offset (tb, &ti_start, 0); | ||
286 | gtk_text_buffer_get_iter_at_offset (tb, &ti_end, -1); | ||
287 | |||
288 | value = gtk_text_buffer_get_text (tb, | ||
289 | &ti_start, | ||
290 | &ti_end, | ||
291 | FALSE); | ||
212 | GNUNET_asprintf (&result, | 292 | GNUNET_asprintf (&result, |
213 | "%u %u %u %d %d %d %s", | 293 | "%u %u %u %u %u %u %s", |
214 | protocol, | 294 | protocol, |
215 | (unsigned int) service, | 295 | (unsigned int) service, |
216 | GNUNET_DNSPARSER_TYPE_TLSA, | 296 | GNUNET_DNSPARSER_TYPE_TLSA, |
217 | priority, | 297 | usage, |
218 | weight, | 298 | selector, |
219 | port, | 299 | matching_type, |
220 | target); | 300 | value); |
301 | g_free (value); | ||
221 | return result; | 302 | return result; |
222 | } | 303 | } |
223 | 304 | ||
@@ -235,12 +316,19 @@ tlsa_store (void *cls, | |||
235 | */ | 316 | */ |
236 | static int | 317 | static int |
237 | tlsa_validate (void *cls, | 318 | tlsa_validate (void *cls, |
238 | GtkBuilder *builder) | 319 | GtkBuilder *builder) |
239 | { | 320 | { |
240 | GtkEditable *entry; | 321 | GtkEditable *entry; |
241 | const gchar *preedit; | 322 | const gchar *preedit; |
242 | GtkComboBox *cb; | 323 | GtkComboBox *cb; |
243 | GtkTreeIter iter; | 324 | GtkTreeIter iter; |
325 | gchar *value; | ||
326 | GtkTextBuffer *tb; | ||
327 | GtkTextIter ti_start; | ||
328 | GtkTextIter ti_end; | ||
329 | gnutls_datum_t datum; | ||
330 | gnutls_pkcs7_t pkcs7; | ||
331 | int ret; | ||
244 | 332 | ||
245 | entry = GTK_EDITABLE (gtk_builder_get_object (builder, | 333 | entry = GTK_EDITABLE (gtk_builder_get_object (builder, |
246 | "edit_dialog_tlsa_target_entry")); | 334 | "edit_dialog_tlsa_target_entry")); |
@@ -253,7 +341,73 @@ tlsa_validate (void *cls, | |||
253 | if (! gtk_combo_box_get_active_iter (cb, | 341 | if (! gtk_combo_box_get_active_iter (cb, |
254 | &iter)) | 342 | &iter)) |
255 | return GNUNET_SYSERR; | 343 | return GNUNET_SYSERR; |
256 | return GNUNET_OK; | 344 | |
345 | tb = gtk_text_view_get_buffer (GTK_TEXT_VIEW | ||
346 | (gtk_builder_get_object (builder, | ||
347 | "edit_dialog_tlsa_value_textview"))); | ||
348 | gtk_text_buffer_get_iter_at_offset (tb, &ti_start, 0); | ||
349 | gtk_text_buffer_get_iter_at_offset (tb, &ti_end, -1); | ||
350 | |||
351 | value = gtk_text_buffer_get_text (tb, | ||
352 | &ti_start, | ||
353 | &ti_end, | ||
354 | FALSE); | ||
355 | datum.size = strlen (value); | ||
356 | datum.data = (void *) value; | ||
357 | gnutls_pkcs7_init (&pkcs7); | ||
358 | if (GNUTLS_E_SUCCESS != | ||
359 | gnutls_pkcs7_import (pkcs7, | ||
360 | &datum, | ||
361 | GNUTLS_X509_FMT_PEM)) | ||
362 | ret = GNUNET_SYSERR; | ||
363 | else | ||
364 | ret = GNUNET_OK; | ||
365 | gnutls_pkcs7_deinit (pkcs7); | ||
366 | g_free (value); | ||
367 | return ret; | ||
368 | } | ||
369 | |||
370 | |||
371 | /** | ||
372 | * The user clicked the "import" button. Try to import | ||
373 | * certificate from the server. | ||
374 | * | ||
375 | * @param button the 'import' button | ||
376 | * @param user_data the plugin environment | ||
377 | */ | ||
378 | static void | ||
379 | tlsa_import_button_clicked_cb (GtkButton *button, | ||
380 | gpointer user_data) | ||
381 | { | ||
382 | struct GNUNET_GTK_NAMESTORE_PluginEnvironment *edc = user_data; | ||
383 | |||
384 | GNUNET_break (0); // FIXME: import not implemented | ||
385 | } | ||
386 | |||
387 | |||
388 | /** | ||
389 | * The user has edited the hostname used for the import button. | ||
390 | * Update the import button's sensitivity. | ||
391 | */ | ||
392 | static void | ||
393 | GNS_edit_dialog_tlsa_entry_changed_cb (GtkEditable *entry, | ||
394 | gpointer user_data) | ||
395 | { | ||
396 | struct GNUNET_GTK_NAMESTORE_PluginEnvironment *edc = user_data; | ||
397 | GtkWidget *button; | ||
398 | const gchar *preedit; | ||
399 | gboolean sens; | ||
400 | |||
401 | button = GTK_WIDGET (gtk_builder_get_object (edc->builder, | ||
402 | "edit_dialog_tlsa_entry")); | ||
403 | preedit = gtk_editable_get_chars (entry, 0, -1); | ||
404 | if ( (NULL == preedit) || | ||
405 | (0 == strlen (preedit)) || | ||
406 | (GNUNET_OK != GNUNET_DNSPARSER_check_name (preedit)) ) | ||
407 | sens = FALSE; | ||
408 | else | ||
409 | sens = TRUE; | ||
410 | gtk_widget_set_sensitive (button, sens); | ||
257 | } | 411 | } |
258 | 412 | ||
259 | 413 | ||
@@ -269,10 +423,14 @@ libgnunet_plugin_gtk_namestore_tlsa_init (void *cls) | |||
269 | struct GNUNET_GTK_NAMESTORE_PluginEnvironment *env = cls; | 423 | struct GNUNET_GTK_NAMESTORE_PluginEnvironment *env = cls; |
270 | struct GNUNET_GTK_NAMESTORE_PluginFunctions *plugin; | 424 | struct GNUNET_GTK_NAMESTORE_PluginFunctions *plugin; |
271 | static struct GNUNET_GTK_NAMESTORE_Symbol symbols[] = { | 425 | static struct GNUNET_GTK_NAMESTORE_Symbol symbols[] = { |
272 | { "GNS_edit_dialog_tlsa_target_entry_changed_cb", | 426 | { "GNS_edit_dialog_tlsa_value_textview_preedit_changed_cb", |
273 | G_CALLBACK (GNS_edit_dialog_tlsa_target_entry_changed_cb) }, | 427 | G_CALLBACK (GNS_edit_dialog_tlsa_value_textview_preedit_changed_cb) }, |
274 | { "edit_dialog_protocol_combobox_changed_cb", | 428 | { "edit_dialog_protocol_combobox_changed_cb", |
275 | G_CALLBACK (edit_dialog_protocol_combobox_changed_cb) }, | 429 | G_CALLBACK (edit_dialog_protocol_combobox_changed_cb) }, |
430 | { "tlsa_import_button_clicked_cb", | ||
431 | G_CALLBACK (tlsa_import_button_clicked_cb) }, | ||
432 | { "GNS_edit_dialog_tlsa_entry_changed_cb", | ||
433 | G_CALLBACK (GNS_edit_dialog_tlsa_entry_changed_cb) }, | ||
276 | { NULL, NULL } | 434 | { NULL, NULL } |
277 | }; | 435 | }; |
278 | 436 | ||