aboutsummaryrefslogtreecommitdiff
path: root/src/namestore/plugin_gtk_namestore_tlsa.c
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2014-06-06 23:52:12 +0000
committerChristian Grothoff <christian@grothoff.org>2014-06-06 23:52:12 +0000
commitedf4fe1a7144f2719b5ca413b433bd0cee68a104 (patch)
treeb0c377190c68351090e0550a74db5a2f1b3a5595 /src/namestore/plugin_gtk_namestore_tlsa.c
parent21af94a8c53c88a908f4b69ec1d6ce1506c79060 (diff)
downloadgnunet-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.c266
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 */
41static void 44static void
42GNS_edit_dialog_tlsa_target_entry_changed_cb (GtkEditable *entry, 45GNS_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 */
236static int 317static int
237tlsa_validate (void *cls, 318tlsa_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 */
378static void
379tlsa_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 */
392static void
393GNS_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