add parameter dcerpc_info to PIDL_dissect_ipv?address()
[wireshark-wip.git] / ui / gtk / airpcap_dlg.c
blobf6891da48e488d8a29a371e90c00b531201804f0
1 /* airpcap_dlg.c
3 * $Id$
5 * Giorgio Tino <giorgio.tino@cacetech.com>
6 * Copyright (c) CACE Technologies, LLC 2006
8 * Wireshark - Network traffic analyzer
9 * By Gerald Combs <gerald@wireshark.org>
10 * Copyright 2000 Gerald Combs
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
27 #include "config.h"
29 #ifdef HAVE_AIRPCAP
31 #include <gtk/gtk.h>
33 #include <string.h>
35 #include <epan/filesystem.h>
36 #include <epan/emem.h>
37 #include <epan/prefs.h>
38 #include <epan/frequency-utils.h>
39 #include <epan/crypt/wep-wpadefs.h>
41 #include <pcap.h>
43 #include "ui/simple_dialog.h"
45 #include "ui/gtk/main.h"
46 #include "ui/gtk/dlg_utils.h"
47 #include "ui/gtk/gui_utils.h"
48 #include "ui/gtk/dfilter_expr_dlg.h"
49 #include "ui/gtk/stock_icons.h"
50 #include "ui/gtk/gtkglobals.h"
51 #include "ui/gtk/help_dlg.h"
52 #include "ui/gtk/keys.h"
53 #include "ui/gtk/old-gtk-compat.h"
54 #include "ui/gtk/packet_win.h"
56 #include <airpcap.h>
57 #include "airpcap_loader.h"
58 #include "airpcap_gui_utils.h"
59 #include "airpcap_dlg.h"
62 * Callback for the select row event in the key list widget
64 static void
65 on_key_list_select_row(GtkTreeSelection *selection, gpointer data)
67 GtkWidget *add_new_key_bt, *edit_key_bt, *remove_key_bt;
68 GtkWidget *move_key_up_bt, *move_key_down_bt;
69 GtkTreeIter iter;
70 GtkTreeModel *model;
71 GtkTreePath *path, *path_up, *path_down;
73 add_new_key_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_NEW_KEY);
74 edit_key_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_EDIT_KEY);
75 remove_key_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_DELETE_KEY);
76 move_key_up_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_UP_KEY);
77 move_key_down_bt = (GtkWidget *)g_object_get_data(G_OBJECT(data), AIRPCAP_KEY_MGMT_DOWN_KEY);
79 if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
80 path = gtk_tree_model_get_path(model, &iter);
81 path_up = gtk_tree_path_copy(path);
82 path_down = gtk_tree_path_copy(path);
83 gtk_tree_path_next(path_down);
85 if (gtk_tree_model_iter_n_children(model, NULL) >= MAX_ENCRYPTION_KEYS) {
86 gtk_widget_set_sensitive(add_new_key_bt, FALSE);
87 } else {
88 gtk_widget_set_sensitive(add_new_key_bt, TRUE);
91 gtk_widget_set_sensitive(edit_key_bt, TRUE);
92 gtk_widget_set_sensitive(remove_key_bt, TRUE);
94 /* ...and we have to use two different methods to figure out first/last because? */
95 if (gtk_tree_path_prev(path_up)) {
96 gtk_widget_set_sensitive(move_key_up_bt, TRUE);
97 } else {
98 gtk_widget_set_sensitive(move_key_up_bt, FALSE);
101 if (gtk_tree_model_get_iter(model, &iter, path_down)) {
102 gtk_widget_set_sensitive(move_key_down_bt, TRUE);
103 } else {
104 gtk_widget_set_sensitive(move_key_down_bt, FALSE);
107 gtk_tree_path_free(path);
108 gtk_tree_path_free(path_up);
109 gtk_tree_path_free(path_down);
110 } else {
111 gtk_widget_set_sensitive(add_new_key_bt, FALSE);
112 gtk_widget_set_sensitive(edit_key_bt, FALSE);
113 gtk_widget_set_sensitive(remove_key_bt, FALSE);
114 gtk_widget_set_sensitive(move_key_up_bt, FALSE);
115 gtk_widget_set_sensitive(move_key_down_bt, FALSE);
119 * Callback for the select row event in the key list widget
121 static void
122 on_key_list_reorder(GtkTreeModel *model _U_, GtkTreePath *path _U_, GtkTreeIter *iter _U_, gpointer no _U_, gpointer data) {
123 GtkTreeSelection *selection;
125 selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
126 on_key_list_select_row(selection, data);
130 * Callback for the crc checkbox
132 static void
133 on_fcs_ck_toggled(GtkWidget *w _U_, gpointer user_data _U_)
136 if (airpcap_if_selected != NULL)
138 if (airpcap_if_selected->IsFcsPresent)
140 airpcap_if_selected->IsFcsPresent = FALSE;
141 airpcap_if_selected->saved = FALSE;
143 else
145 airpcap_if_selected->IsFcsPresent = TRUE;
146 airpcap_if_selected->saved = FALSE;
152 * Callback for the wrong crc combo
154 static void
155 on_edit_type_cb_changed(GtkWidget *w, gpointer data)
157 GtkWidget *edit_key_w;
158 GtkWidget *edit_ssid_te;
159 GtkWidget *type_cb;
160 GtkWidget *key_lb;
161 GtkWidget *ssid_lb;
163 gchar* type_text = NULL;
165 edit_key_w = GTK_WIDGET(data);
166 type_cb = w;
168 edit_ssid_te = (GtkWidget *)g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
169 key_lb = (GtkWidget *)g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY);
170 ssid_lb = (GtkWidget *)g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY);
172 type_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
174 if (g_ascii_strcasecmp(type_text, ""))
177 * If it is a WEP key, no SSID is required! Gray out the entry text so
178 * it doesn't create confusion ...
180 if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
182 gtk_widget_set_sensitive(edit_ssid_te,FALSE);
184 * Maybe the user has already entered some text into the SSID field
185 * and then switched to WEP...
187 gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
188 gtk_label_set_text(GTK_LABEL(key_lb),"Key");
189 gtk_label_set_text(GTK_LABEL(ssid_lb),"");
191 else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_BIN_KEY_STRING) == 0)
193 gtk_widget_set_sensitive(edit_ssid_te,FALSE);
195 * Maybe the user has already entered some text into the SSID field
196 * and then switched to WPA...
198 gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
199 gtk_label_set_text(GTK_LABEL(key_lb),"Key");
200 gtk_label_set_text(GTK_LABEL(ssid_lb),"");
202 else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
204 gtk_widget_set_sensitive(edit_ssid_te,TRUE);
206 * Maybe the user has already entered some text into the SSID field
207 * and then switched to WPA...
209 gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
210 gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
211 gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
214 gtk_widget_show(edit_ssid_te);
216 g_free(type_text);
220 * Callback for the wrong crc combo
222 static void
223 on_add_type_cb_changed(GtkWidget *w, gpointer data)
225 GtkWidget *add_key_w;
226 GtkWidget *add_ssid_te;
227 GtkWidget *type_cb;
228 GtkWidget *key_lb;
229 GtkWidget *ssid_lb;
231 gchar* type_text = NULL;
233 add_key_w = GTK_WIDGET(data);
234 type_cb = w;
236 add_ssid_te = (GtkWidget *)g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
237 key_lb = (GtkWidget *)g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY);
238 ssid_lb = (GtkWidget *)g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY);
240 type_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
242 if (g_ascii_strcasecmp(type_text, ""))
245 * If it is a WEP key, no SSID is required! Gray out rhe entry text so
246 * it doesn't create confusion ...
248 if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_KEY_STRING) == 0)
250 gtk_widget_set_sensitive(add_ssid_te,FALSE);
252 * Maybe the user has already entered some text into the SSID field
253 * and then switched to WEP...
255 gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
256 gtk_label_set_text(GTK_LABEL(key_lb),"Key");
257 gtk_label_set_text(GTK_LABEL(ssid_lb),"");
259 else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_BIN_KEY_STRING) == 0)
261 gtk_widget_set_sensitive(add_ssid_te,FALSE);
263 * Maybe the user has already entered some text into the SSID field
264 * and then switched to WPA...
266 gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
267 gtk_label_set_text(GTK_LABEL(key_lb),"Key");
268 gtk_label_set_text(GTK_LABEL(ssid_lb),"");
270 else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
272 gtk_widget_set_sensitive(add_ssid_te,TRUE);
274 * Maybe the user has already entered some text into the SSID field
275 * and then switched to WPA...
277 gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
278 gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
279 gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
282 gtk_widget_show(add_ssid_te);
284 g_free(type_text);
288 * Callback for the wrong crc combo
290 static void
291 on_fcs_filter_cb_changed(GtkWidget *fcs_filter_cb, gpointer data _U_)
293 gchar *fcs_filter_str;
295 if (fcs_filter_cb != NULL)
297 fcs_filter_str = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb));
298 if (fcs_filter_str && (g_ascii_strcasecmp("", fcs_filter_str)))
300 airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(fcs_filter_str);
301 airpcap_if_selected->saved = FALSE;
303 g_free(fcs_filter_str);
309 * Changed callback for the capture type combobox
311 static void
312 on_capture_type_cb_changed(GtkWidget *cb, gpointer user_data _U_)
314 gchar *s;
316 if (cb == NULL) {
317 return;
320 s = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(cb));
322 if ((g_ascii_strcasecmp("",s)))
324 airpcap_if_selected->linkType = airpcap_get_link_type(s);
325 airpcap_if_selected->saved = FALSE;
327 g_free(s);
331 * Thread function used to blink the led
333 static gboolean
334 update_blink(gpointer data)
336 airpcap_if_info_t* sel;
337 PAirpcapHandle ad;
338 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
340 sel = (airpcap_if_info_t*)data;
342 ad = airpcap_if_open(sel->name, ebuf);
343 if (ad)
345 if (sel->led)
347 airpcap_if_turn_led_off(ad, 0);
348 sel->led = FALSE;
350 else
352 airpcap_if_turn_led_on(ad, 0);
353 sel->led = TRUE;
355 airpcap_if_close(ad);
357 return TRUE;
361 * Blink button callback
363 static void
364 on_blink_bt_clicked( GtkWidget *blink_bt, gpointer data _U_)
366 PAirpcapHandle ad = NULL;
367 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
369 if (airpcap_if_selected != NULL) {
370 if (!(airpcap_if_selected->blinking))
372 gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
373 airpcap_if_selected->tag = g_timeout_add(500,update_blink,airpcap_if_selected);
374 airpcap_if_selected->blinking = TRUE;
376 else
378 gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led ");
379 g_source_remove(airpcap_if_selected->tag);
380 airpcap_if_selected->blinking = FALSE;
381 /* Switch on the led! */
382 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
383 if (ad)
385 g_source_remove(airpcap_if_selected->tag);
386 airpcap_if_turn_led_on(ad, 0);
387 airpcap_if_selected->blinking = FALSE;
388 airpcap_if_selected->led = TRUE;
389 airpcap_if_close(ad);
396 * Callback for the 'Any' adapter What's This button.
398 static void
399 on_what_s_this_bt_clicked( GtkWidget *blink_bt _U_, gpointer data _U_)
401 simple_dialog(ESD_TYPE_INFO,ESD_BTN_OK,
402 "The Multi-Channel Aggregator is a virtual device "
403 "that can be used to capture packets from all the "
404 "AirPcap adapters at the same time.\n"
405 "The Capture Type, FCS and Encryption settings of "
406 "this virtual device can be configured as for any "
407 "real adapter.\nThe channel cannot be changed for "
408 "this adapter.\n"
409 "Refer to the AirPcap manual for more information.");
412 /* the window was closed, cleanup things */
413 static void
414 on_key_management_destroy(GtkWidget *w _U_, gpointer data)
416 GtkWidget *airpcap_advanced_w,
417 *toolbar;
419 gint *from_widget = NULL;
421 /* Retrieve the GUI object pointers */
422 airpcap_advanced_w = GTK_WIDGET(data);
424 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
426 /* ... */
427 from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
428 /* gray out the toolbar (if we came here from the toolbar advanced button)*/
429 if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
430 gtk_widget_set_sensitive(toolbar,TRUE);
431 else
432 gtk_widget_set_sensitive(toolbar,FALSE);
434 g_free(from_widget);
436 /* reload the configuration!!! Configuration has not been saved but
437 the corresponding structure has been modified probably...*/
438 if (airpcap_if_selected != NULL)
440 if (!airpcap_if_selected->saved)
442 airpcap_load_selected_if_configuration(airpcap_if_selected);
448 /* the Advenced wireless Settings window was closed, cleanup things */
449 static void
450 on_airpcap_advanced_destroy(GtkWidget *w _U_, gpointer data)
452 GtkWidget *airpcap_advanced_w,
453 *toolbar;
455 gint *from_widget = NULL;
457 /* Retrieve the GUI object pointers */
458 airpcap_advanced_w = GTK_WIDGET(data);
460 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
462 /* ... */
463 from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
464 /* gray out the toolbar (if we came here from the toolbar advanced button)*/
465 if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
466 gtk_widget_set_sensitive(toolbar,TRUE);
467 else
468 gtk_widget_set_sensitive(toolbar,FALSE);
470 g_free(from_widget);
472 /* reload the configuration!!! Configuration has not been saved but
473 the corresponding structure has been modified probably...*/
474 if (!airpcap_if_selected->saved)
476 airpcap_load_selected_if_configuration(airpcap_if_selected);
481 * Callback for the 'Apply' button.
484 * XXX - Pressing 'Apply' has the same effect as pressing 'OK' -- you
485 * can't revert back to the old set of keys by pressing 'Cancel'. We
486 * either need to fix reversion or get rid of the 'Apply' button.
488 static void
489 on_key_management_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
491 /* advenced window */
492 GtkWidget *key_management_w;
494 /* widgets in the toolbar */
495 GtkWidget *toolbar_cb;
496 GtkWidget *decryption_mode_cb;
498 GtkListStore *key_list_store;
500 module_t *wlan_module = prefs_find_module("wlan");
501 gchar *decryption_mode_string;
503 /* retrieve main window */
504 key_management_w = GTK_WIDGET(data);
505 decryption_mode_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY));
506 key_list_store = GTK_LIST_STORE(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY));
507 toolbar_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
509 #define CANT_SAVE_ERR_STR "Cannot save configuration! Another application " \
510 "might be using AirPcap, or you might not have sufficient privileges."
511 /* Set the Decryption Mode */
513 decryption_mode_string = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(decryption_mode_cb));
514 if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0)
516 set_wireshark_decryption(TRUE);
517 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
519 else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
521 set_wireshark_decryption(FALSE);
522 if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
524 else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_NONE) == 0)
526 set_wireshark_decryption(FALSE);
527 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
529 g_free(decryption_mode_string);
531 /* Save the configuration */
532 airpcap_read_and_save_decryption_keys_from_list_store(key_list_store,airpcap_if_selected,airpcap_if_list); /* This will save the keys for every adapter */
534 /* The update will make redissect al the packets... no need to do it here again */
535 update_decryption_mode(toolbar_cb);
537 /* Redissect all the packets, and re-evaluate the display filter. */
538 prefs_apply(wlan_module);
542 * Callback used to add a WEP key in the add new key box;
544 static void
545 on_add_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
547 GtkWidget *type_cb,
548 *key_en,
549 *ssid_en;
551 GtkListStore *key_list_store;
553 GString *new_type_string,
554 *new_key_string,
555 *new_ssid_string;
557 gchar *type_entered = NULL;
558 gchar *key_entered = NULL;
559 gchar *ssid_entered = NULL;
561 unsigned int i;
563 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY);
564 type_cb = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY);
565 key_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY);
566 ssid_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
568 type_entered = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
569 key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
570 ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
572 /* Check if key is correct */
573 new_type_string = g_string_new(type_entered);
574 new_key_string = g_string_new(key_entered);
575 new_ssid_string = g_string_new(ssid_entered);
577 g_free(type_entered);
578 g_free(key_entered );
579 g_free(ssid_entered);
581 g_strstrip(new_key_string->str);
582 g_strstrip(new_ssid_string->str);
584 /* Check which type of key the user has entered */
585 if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
588 if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
590 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is %d-%d characters (%d-%d bits).",WEP_KEY_MIN_CHAR_SIZE,WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MIN_BIT_SIZE,WEP_KEY_MAX_BIT_SIZE);
592 g_string_free(new_type_string,TRUE);
593 g_string_free(new_key_string, TRUE);
594 g_string_free(new_ssid_string,TRUE);
596 return;
599 if ((new_key_string->len % 2) != 0)
601 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
603 g_string_free(new_type_string,TRUE);
604 g_string_free(new_key_string, TRUE);
605 g_string_free(new_ssid_string,TRUE);
607 return;
610 for (i = 0; i < new_key_string->len; i++)
612 if (!g_ascii_isxdigit(new_key_string->str[i]))
614 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be a hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
616 g_string_free(new_type_string,TRUE);
617 g_string_free(new_key_string, TRUE);
618 g_string_free(new_ssid_string,TRUE);
620 return;
624 /* If so... add key */
625 airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
627 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
629 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
631 /* XXX - Perform some WPA related input fields check */
632 /* If everything is ok, modify the entry in the list */
634 if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
636 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA key size out of range!\nValid key size range is %d-%d ASCII characters (%d-%d bits).",WPA_KEY_MIN_CHAR_SIZE,WPA_KEY_MAX_CHAR_SIZE,WPA_KEY_MIN_BIT_SIZE,WPA_KEY_MAX_BIT_SIZE);
638 g_string_free(new_type_string,TRUE);
639 g_string_free(new_key_string, TRUE);
640 g_string_free(new_ssid_string,TRUE);
642 return;
646 * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
648 if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
650 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"SSID key size out of range!\nValid SSID size range is %d-%d ASCII characters (%d-%d bits).",WPA_SSID_MIN_CHAR_SIZE,WPA_SSID_MAX_CHAR_SIZE,WPA_SSID_MIN_BIT_SIZE,WPA_SSID_MAX_BIT_SIZE);
652 g_string_free(new_type_string,TRUE);
653 g_string_free(new_key_string, TRUE);
654 g_string_free(new_ssid_string,TRUE);
656 return;
659 /* If so... add key */
660 airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
662 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
664 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
666 /* XXX - Perform some WPA_BIN related input fields check */
667 /* If everything is ok, modify the entry int he list */
669 if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
671 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA PSK/PMK key size is wrong!\nValid key size is %d characters (%d bits).",WPA_PSK_KEY_CHAR_SIZE,WPA_PSK_KEY_BIT_SIZE);
673 g_string_free(new_type_string,TRUE);
674 g_string_free(new_key_string, TRUE);
675 g_string_free(new_ssid_string,TRUE);
677 return;
680 for (i = 0; i < new_key_string->len; i++)
682 if (!g_ascii_isxdigit(new_key_string->str[i]))
684 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
686 g_string_free(new_type_string,TRUE);
687 g_string_free(new_key_string, TRUE);
688 g_string_free(new_ssid_string,TRUE);
690 return;
694 /* If so... add key */
695 airpcap_add_key_to_list(key_list_store, new_type_string->str, new_key_string->str, new_ssid_string->str);
697 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
699 else /* Should never happen!!! */
701 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field.");
704 g_string_free(new_type_string,TRUE);
705 g_string_free(new_key_string, TRUE);
706 g_string_free(new_ssid_string,TRUE);
708 window_destroy(GTK_WIDGET(data));
709 return;
713 * Callback used to edit a WEP key in the edit key box;
715 static void
716 on_edit_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
718 GtkWidget *type_cb,
719 *key_en,
720 *ssid_en;
722 GtkListStore *key_list_store;
723 GtkTreeSelection *selection;
724 GtkTreeIter iter;
726 GString *new_type_string,
727 *new_key_string,
728 *new_ssid_string;
730 gchar *type_entered = NULL;
731 gchar *key_entered = NULL;
732 gchar *ssid_entered = NULL;
734 unsigned int i;
736 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY);
737 selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
738 type_cb = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY);
739 key_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY);
740 ssid_en = (GtkWidget *)g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
742 if (!gtk_tree_selection_get_selected(selection, NULL, &iter))
743 return;
745 type_entered = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(type_cb));
746 key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
747 ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
749 g_strstrip(key_entered);
750 g_strstrip(ssid_entered);
752 /* Check if key is correct */
753 new_type_string = g_string_new(type_entered);
754 new_key_string = g_string_new(key_entered);
755 new_ssid_string = g_string_new(ssid_entered);
757 g_free(type_entered);
758 g_free(key_entered );
759 g_free(ssid_entered);
761 /* Check which type of key the user has entered */
762 if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
765 if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
767 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is %d-%d characters (%d-%d bits).",WEP_KEY_MIN_CHAR_SIZE,WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MIN_BIT_SIZE,WEP_KEY_MAX_BIT_SIZE);
769 g_string_free(new_type_string,TRUE);
770 g_string_free(new_key_string, TRUE);
771 g_string_free(new_ssid_string,TRUE);
773 return;
776 if ((new_key_string->len % 2) != 0)
778 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
780 g_string_free(new_type_string,TRUE);
781 g_string_free(new_key_string, TRUE);
782 g_string_free(new_ssid_string,TRUE);
784 return;
787 for (i = 0; i < new_key_string->len; i++)
789 if (!g_ascii_isxdigit(new_key_string->str[i]))
791 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
793 g_string_free(new_type_string,TRUE);
794 g_string_free(new_key_string, TRUE);
795 g_string_free(new_ssid_string,TRUE);
797 return;
801 /* If so... Modify key */
802 gtk_list_store_set(key_list_store, &iter,
803 KL_COL_TYPE, new_type_string->str,
804 KL_COL_KEY, new_key_string->str,
805 KL_COL_SSID, new_ssid_string->str,
806 -1);
808 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
810 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
812 /* XXX - Perform some WPA related input fields check */
813 /* If everything is ok, modify the entry in the list */
815 if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
817 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA key size out of range!\nValid key size range is %d-%d ASCII characters (%d-%d bits).",WPA_KEY_MIN_CHAR_SIZE,WPA_KEY_MAX_CHAR_SIZE,WPA_KEY_MIN_BIT_SIZE,WPA_KEY_MAX_BIT_SIZE);
819 g_string_free(new_type_string,TRUE);
820 g_string_free(new_key_string, TRUE);
821 g_string_free(new_ssid_string,TRUE);
823 return;
827 * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
829 if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
831 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"SSID key size out of range!\nValid SSID size range is %d-%d ASCII characters (%d-%d bits).",WPA_SSID_MIN_CHAR_SIZE,WPA_SSID_MAX_CHAR_SIZE,WPA_SSID_MIN_BIT_SIZE,WPA_SSID_MAX_BIT_SIZE);
833 g_string_free(new_type_string,TRUE);
834 g_string_free(new_key_string, TRUE);
835 g_string_free(new_ssid_string,TRUE);
837 return;
840 /* If so... Modify key */
841 gtk_list_store_set(key_list_store, &iter,
842 KL_COL_TYPE, new_type_string->str,
843 KL_COL_KEY, new_key_string->str,
844 KL_COL_SSID, new_ssid_string->str,
845 -1);
847 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
849 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
851 /* XXX - Perform some WPA_BIN related input fields check */
852 /* If everything is ok, modify the entry in the list */
854 if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
856 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WPA PSK/PMK key size is wrong!\nValid key size is %d characters (%d bits).",WPA_PSK_KEY_CHAR_SIZE,WPA_PSK_KEY_BIT_SIZE);
858 g_string_free(new_type_string,TRUE);
859 g_string_free(new_key_string, TRUE);
860 g_string_free(new_ssid_string,TRUE);
862 return;
865 for (i = 0; i < new_key_string->len; i++)
867 if (!g_ascii_isxdigit(new_key_string->str[i]))
869 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
871 g_string_free(new_type_string,TRUE);
872 g_string_free(new_key_string, TRUE);
873 g_string_free(new_ssid_string,TRUE);
875 return;
879 /* If so... Modify key */
880 gtk_list_store_set(key_list_store, &iter,
881 KL_COL_TYPE, new_type_string->str,
882 KL_COL_KEY, new_key_string->str,
883 KL_COL_SSID, new_ssid_string->str,
884 -1);
886 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
888 else /* Should never happen!!! */
890 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field.");
893 g_string_free(new_type_string,TRUE);
894 g_string_free(new_key_string, TRUE);
895 g_string_free(new_ssid_string,TRUE);
897 window_destroy(GTK_WIDGET(data));
898 return;
902 * Add key window destroy callback
904 static void
905 on_add_key_w_destroy(GtkWidget *button _U_, gpointer data)
907 GtkWidget *airpcap_advanced_w;
909 airpcap_advanced_w = GTK_WIDGET(data);
911 gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
913 return;
917 * Callback for the 'Add Key' button.
919 static void
920 on_add_new_key_bt_clicked(GtkWidget *button _U_, gpointer data)
922 GtkWidget *add_key_window;
923 GtkWidget *add_frame;
924 GtkWidget *main_v_box;
925 GtkWidget *add_grid;
926 GtkWidget *add_frame_al;
927 GtkWidget *add_type_cb;
928 GtkWidget *add_key_te;
929 GtkWidget *add_ssid_te;
930 GtkWidget *add_type_lb;
931 GtkWidget *add_key_lb;
932 GtkWidget *add_ssid_lb;
933 GtkWidget *low_h_button_box;
934 GtkWidget *ok_bt;
935 GtkWidget *cancel_bt;
936 GtkWidget *add_frame_lb;
938 GtkWidget *airpcap_advanced_w;
940 GtkListStore *key_list_store;
942 airpcap_advanced_w = GTK_WIDGET(data);
944 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
946 if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(key_list_store), NULL) >= MAX_ENCRYPTION_KEYS)
948 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Maximum number (%d) of decryption keys reached! You cannot add another key!\n",MAX_ENCRYPTION_KEYS);
949 return;
952 /* Gray out the Advanced Wireless Setting window */
953 gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
955 /* Pop-up a new window */
956 add_key_window = dlg_window_new ("Add Decryption Key");
957 gtk_window_set_modal(GTK_WINDOW(add_key_window), TRUE);
958 gtk_window_set_transient_for(GTK_WINDOW(add_key_window), GTK_WINDOW(airpcap_advanced_w));
959 gtk_widget_set_name (add_key_window, "add_key_window");
960 gtk_container_set_border_width (GTK_CONTAINER (add_key_window), 5);
961 gtk_window_set_resizable (GTK_WINDOW (add_key_window), FALSE);
963 main_v_box = ws_gtk_box_new (GTK_ORIENTATION_VERTICAL, 0, FALSE);
964 gtk_widget_set_name (main_v_box, "main_v_box");
965 gtk_widget_show (main_v_box);
966 gtk_container_add (GTK_CONTAINER (add_key_window), main_v_box);
968 add_frame = gtk_frame_new (NULL);
969 gtk_widget_set_name (add_frame, "add_frame");
970 gtk_widget_show (add_frame);
971 gtk_box_pack_start (GTK_BOX (main_v_box), add_frame, TRUE, TRUE, 0);
973 add_frame_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
974 gtk_widget_set_name (add_frame_al, "add_frame_al");
975 gtk_widget_show (add_frame_al);
976 gtk_container_add (GTK_CONTAINER (add_frame), add_frame_al);
977 gtk_alignment_set_padding (GTK_ALIGNMENT (add_frame_al), 0, 0, 12, 0);
979 add_grid = ws_gtk_grid_new ();
980 gtk_widget_set_name (add_grid, "add_tb");
981 gtk_container_set_border_width(GTK_CONTAINER(add_grid),5);
982 gtk_widget_show (add_grid);
983 gtk_container_add (GTK_CONTAINER (add_frame_al), add_grid);
985 add_type_lb = gtk_label_new ("Type");
986 gtk_widget_set_name (add_type_lb, "add_type_lb");
987 gtk_widget_show (add_type_lb);
988 ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_type_lb, 0, 0, 1, 1);
989 gtk_label_set_justify (GTK_LABEL (add_type_lb), GTK_JUSTIFY_CENTER);
991 add_key_lb = gtk_label_new ("Key");
992 gtk_widget_set_name (add_key_lb, "add_key_lb");
993 gtk_widget_show (add_key_lb);
994 ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_key_lb, 1, 0, 1, 1);
995 gtk_label_set_justify (GTK_LABEL (add_key_lb), GTK_JUSTIFY_CENTER);
997 add_ssid_lb = gtk_label_new ("");
998 gtk_widget_set_name (add_ssid_lb, "add_ssid_lb");
999 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1000 gtk_widget_show (add_ssid_lb);
1001 ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_ssid_lb, 2, 0, 1, 1);
1002 gtk_label_set_justify (GTK_LABEL (add_ssid_lb), GTK_JUSTIFY_CENTER);
1004 add_type_cb = gtk_combo_box_text_new();
1005 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WEP_KEY_STRING);
1007 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
1008 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(add_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
1009 gtk_combo_box_set_active(GTK_COMBO_BOX(add_type_cb), 0);
1010 gtk_widget_set_name (add_type_cb, "add_type_cb");
1011 gtk_widget_show (add_type_cb);
1012 ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_type_cb, 0, 1, 1, 1);
1013 gtk_widget_set_size_request (add_type_cb, 83, -1);
1015 add_key_te = gtk_entry_new ();
1016 gtk_widget_set_name (add_key_te, "add_key_te");
1018 gtk_widget_show (add_key_te);
1019 ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_key_te, 1, 1, 1, 1);
1020 gtk_widget_set_size_request (add_key_te, 178, -1);
1022 add_ssid_te = gtk_entry_new ();
1023 gtk_widget_set_name (add_ssid_te, "add_ssid_te");
1024 gtk_widget_set_sensitive(add_ssid_te,FALSE);
1025 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1026 gtk_widget_show (add_ssid_te);
1027 ws_gtk_grid_attach_defaults (GTK_GRID (add_grid), add_ssid_te, 2, 1, 1, 1);
1028 low_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1029 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
1030 gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
1031 gtk_widget_show (low_h_button_box);
1032 gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
1033 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
1034 GTK_BUTTONBOX_END);
1036 ok_bt = gtk_button_new_with_mnemonic ("OK");
1037 gtk_widget_set_name (ok_bt, "ok_bt");
1038 gtk_widget_show (ok_bt);
1039 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
1040 gtk_widget_set_can_default (ok_bt, TRUE);
1042 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
1043 gtk_widget_set_name (cancel_bt, "cancel_bt");
1044 gtk_widget_show (cancel_bt);
1045 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
1046 gtk_widget_set_can_default (cancel_bt, TRUE);
1048 add_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
1049 gtk_widget_set_name (add_frame_lb, "add_frame_lb");
1050 gtk_widget_show (add_frame_lb);
1051 gtk_frame_set_label_widget (GTK_FRAME (add_frame), add_frame_lb);
1052 gtk_label_set_use_markup (GTK_LABEL (add_frame_lb), TRUE);
1054 /* Add callbacks */
1055 g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_add_key_ok_bt_clicked), add_key_window );
1056 g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), add_key_window );
1057 g_signal_connect(add_type_cb, "changed", G_CALLBACK(on_add_type_cb_changed), add_key_window);
1058 g_signal_connect(add_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1059 g_signal_connect(add_key_window, "destroy", G_CALLBACK(on_add_key_w_destroy), data);
1061 /* Add widget data */
1062 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY,key_list_store);
1063 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY,add_type_cb);
1064 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY,add_key_te);
1065 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY,add_ssid_te);
1066 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY,add_key_lb);
1067 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY,add_ssid_lb);
1069 gtk_widget_show(add_key_window);
1073 * Edit key window destroy callback
1075 static void
1076 on_edit_key_w_destroy(GtkWidget *button _U_, gpointer data)
1078 GtkWidget *airpcap_advanced_w;
1080 airpcap_advanced_w = GTK_WIDGET(data);
1082 gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
1084 return;
1088 * Callback for the 'Remove Key' button.
1090 static void
1091 on_remove_key_bt_clicked(GtkWidget *button _U_, gpointer data)
1093 GtkTreeModel *model;
1094 GtkTreeIter iter;
1095 GtkTreeSelection *selection;
1097 /* retrieve needed stuff */
1098 selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
1100 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
1101 return;
1103 /* Remove selected key */
1104 gtk_list_store_remove(GTK_LIST_STORE(model), &iter);
1105 gtk_tree_selection_select_iter(selection, &iter);
1106 /* XXX - select the last item if needed? */
1108 /* Need to save config... */
1109 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
1113 * Callback for the 'Edit Key' button.
1115 static void
1116 on_edit_key_bt_clicked(GtkWidget *button _U_, gpointer data)
1118 GtkWidget *edit_key_window;
1119 GtkWidget *edit_frame;
1120 GtkWidget *main_v_box;
1121 GtkWidget *edit_grid;
1122 GtkWidget *edit_frame_al;
1123 GtkWidget *edit_type_cb;
1124 GtkWidget *edit_key_te;
1125 GtkWidget *edit_ssid_te;
1126 GtkWidget *edit_type_lb;
1127 GtkWidget *edit_key_lb;
1128 GtkWidget *edit_ssid_lb;
1129 GtkWidget *low_h_button_box;
1130 GtkWidget *ok_bt;
1131 GtkWidget *cancel_bt;
1132 GtkWidget *edit_frame_lb;
1134 GtkWidget *airpcap_advanced_w;
1136 GtkTreeModel *model;
1137 GtkTreeIter iter;
1138 GtkTreeSelection *selection;
1140 /* Key List Store */
1141 GtkListStore *key_list_store;
1143 gchar *row_type,
1144 *row_key,
1145 *row_ssid = NULL;
1147 airpcap_advanced_w = GTK_WIDGET(data);
1149 /* Retrieve the selected item... if no row is selected, this is null... */
1150 selection = (GtkTreeSelection *)g_object_get_data(G_OBJECT(data), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY);
1151 key_list_store = (GtkListStore *)g_object_get_data (G_OBJECT(data), AIRPCAP_ADVANCED_KEYLIST_KEY);
1154 if (!gtk_tree_selection_get_selected(selection, &model, &iter))
1155 return;
1157 gtk_tree_model_get(model, &iter,
1158 KL_COL_TYPE, &row_type,
1159 KL_COL_KEY, &row_key,
1160 KL_COL_SSID, &row_ssid,
1161 -1);
1163 /* Gray out the Advanced Wireless Setting window */
1164 gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
1166 /* Pop-up a new window */
1167 edit_key_window = dlg_window_new("Edit Decryption Key");
1168 gtk_window_set_modal(GTK_WINDOW(edit_key_window), TRUE);
1169 gtk_window_set_transient_for(GTK_WINDOW(edit_key_window), GTK_WINDOW(airpcap_advanced_w));
1170 gtk_widget_set_name (edit_key_window, "edit_key_window");
1171 gtk_container_set_border_width (GTK_CONTAINER (edit_key_window), 5);
1172 gtk_window_set_resizable (GTK_WINDOW (edit_key_window), FALSE);
1174 main_v_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1175 gtk_widget_set_name (main_v_box, "main_v_box");
1176 gtk_widget_show (main_v_box);
1177 gtk_container_add (GTK_CONTAINER (edit_key_window), main_v_box);
1179 edit_frame = gtk_frame_new (NULL);
1180 gtk_widget_set_name (edit_frame, "edit_frame");
1181 gtk_widget_show (edit_frame);
1182 gtk_box_pack_start (GTK_BOX (main_v_box), edit_frame, TRUE, TRUE, 0);
1184 edit_frame_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
1185 gtk_widget_set_name (edit_frame_al, "edit_frame_al");
1186 gtk_widget_show (edit_frame_al);
1187 gtk_container_add (GTK_CONTAINER (edit_frame), edit_frame_al);
1188 gtk_alignment_set_padding (GTK_ALIGNMENT (edit_frame_al), 0, 0, 12, 0);
1190 edit_grid = ws_gtk_grid_new();
1192 gtk_widget_set_name (edit_grid, "edit_tb");
1193 gtk_container_set_border_width(GTK_CONTAINER(edit_grid),5);
1194 gtk_widget_show (edit_grid);
1195 gtk_container_add (GTK_CONTAINER (edit_frame_al), edit_grid);
1197 edit_type_lb = gtk_label_new ("Type");
1198 gtk_widget_set_name (edit_type_lb, "edit_type_lb");
1199 gtk_widget_show (edit_type_lb);
1200 ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_type_lb, 0, 0, 1, 1);
1201 gtk_label_set_justify (GTK_LABEL (edit_type_lb), GTK_JUSTIFY_CENTER);
1203 edit_key_lb = gtk_label_new ("Key");
1204 gtk_widget_set_name (edit_key_lb, "edit_key_lb");
1205 gtk_widget_show (edit_key_lb);
1206 ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_key_lb, 1, 0, 1, 1);
1207 gtk_label_set_justify (GTK_LABEL (edit_key_lb), GTK_JUSTIFY_CENTER);
1209 edit_ssid_lb = gtk_label_new ("");
1210 gtk_widget_set_name (edit_ssid_lb, "edit_ssid_lb");
1211 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1212 gtk_widget_show (edit_ssid_lb);
1213 ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_ssid_lb, 2, 0, 1, 1);
1214 gtk_label_set_justify (GTK_LABEL (edit_ssid_lb), GTK_JUSTIFY_CENTER);
1216 edit_type_cb = gtk_combo_box_text_new();
1217 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WEP_KEY_STRING);
1219 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
1220 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(edit_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
1221 /* Set current type */
1222 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 0);
1223 if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_PWD_KEY_STRING) == 0) {
1224 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 1);
1225 } else if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_BIN_KEY_STRING) == 0) {
1226 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 2);
1228 gtk_widget_set_name (edit_type_cb, "edit_type_cb");
1229 gtk_widget_show (edit_type_cb);
1230 ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_type_cb, 0, 1, 1, 1);
1231 gtk_widget_set_size_request (edit_type_cb, 83, -1);
1233 edit_key_te = gtk_entry_new ();
1234 gtk_widget_set_name (edit_key_te, "edit_key_te");
1235 /* Set current key */
1236 gtk_entry_set_text(GTK_ENTRY(edit_key_te),row_key);
1237 gtk_widget_show (edit_key_te);
1238 ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_key_te, 1, 1, 1, 1);
1239 gtk_widget_set_size_request (edit_key_te, 178, -1);
1241 edit_ssid_te = gtk_entry_new ();
1242 gtk_widget_set_name (edit_ssid_te, "edit_ssid_te");
1244 /* Set current ssid (if key type is not WEP!)*/
1245 if (g_ascii_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
1247 gtk_widget_set_sensitive(edit_ssid_te,FALSE);
1249 else
1251 gtk_widget_set_sensitive(edit_ssid_te,TRUE);
1252 gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),row_ssid?row_ssid:"");
1255 /* XXX - Decomment only when WPA and WPA@ will be ready */
1256 gtk_widget_show (edit_ssid_te);
1257 ws_gtk_grid_attach_defaults (GTK_GRID (edit_grid), edit_ssid_te, 2, 1, 1, 1);
1259 low_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1260 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
1261 gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
1262 gtk_widget_show (low_h_button_box);
1263 gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
1264 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
1265 GTK_BUTTONBOX_END);
1267 ok_bt = gtk_button_new_with_mnemonic ("OK");
1268 gtk_widget_set_name (ok_bt, "ok_bt");
1269 gtk_widget_show (ok_bt);
1270 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
1271 gtk_widget_set_can_default (ok_bt, TRUE);
1273 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
1274 gtk_widget_set_name (cancel_bt, "cancel_bt");
1275 gtk_widget_show (cancel_bt);
1276 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
1277 gtk_widget_set_can_default (cancel_bt, TRUE);
1279 edit_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
1280 gtk_widget_set_name (edit_frame_lb, "edit_frame_lb");
1281 gtk_widget_show (edit_frame_lb);
1282 gtk_frame_set_label_widget (GTK_FRAME (edit_frame), edit_frame_lb);
1283 gtk_label_set_use_markup (GTK_LABEL (edit_frame_lb), TRUE);
1285 /* Add callbacks */
1286 g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_edit_key_ok_bt_clicked), edit_key_window );
1287 g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), edit_key_window );
1288 g_signal_connect(edit_type_cb, "changed", G_CALLBACK(on_edit_type_cb_changed), edit_key_window);
1289 g_signal_connect(edit_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1290 g_signal_connect(edit_key_window, "destroy", G_CALLBACK(on_edit_key_w_destroy), data);
1292 /* Add widget data */
1293 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY,key_list_store);
1294 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY,selection);
1295 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY,edit_type_cb);
1296 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY,edit_key_te);
1297 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY,edit_ssid_te);
1298 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY,edit_key_lb);
1299 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY,edit_ssid_lb);
1302 g_free(row_type);
1303 g_free(row_key);
1304 g_free(row_ssid);
1305 gtk_widget_show(edit_key_window);
1309 * Callback for the 'Move Key Up' button.
1311 static void
1312 on_move_key_up_bt_clicked(GtkWidget *button _U_, gpointer key_list)
1314 tree_view_list_store_move_selection(GTK_TREE_VIEW(key_list), TRUE);
1318 * Callback for the 'Move Key Down' button.
1320 static void
1321 on_move_key_down_bt_clicked(GtkWidget *button _U_, gpointer list_view)
1323 tree_view_list_store_move_selection(GTK_TREE_VIEW(list_view), FALSE);
1326 /* Turns the decryption on or off */
1327 void
1328 on_decryption_mode_cb_changed(GtkWidget *cb, gpointer data _U_)
1330 gint cur_active;
1332 if (cb == NULL) {
1333 return;
1336 cur_active = gtk_combo_box_get_active(GTK_COMBO_BOX(cb));
1338 if (cur_active < 0) {
1339 return;
1342 switch(cur_active) {
1343 /* XXX - Don't use magic numbers here */
1344 case 1: /* Wireshark */
1345 set_wireshark_decryption(TRUE);
1346 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
1347 break;
1348 case 2: /* Driver */
1349 set_wireshark_decryption(FALSE);
1350 if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
1351 break;
1352 default:
1353 set_wireshark_decryption(FALSE);
1354 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
1355 break;
1358 /* Redissect all the packets, and re-evaluate the display filter. */
1359 redissect_packets();
1360 redissect_all_packet_windows();
1364 * Selects the current decryption mode string in the decryption mode combo box
1366 void
1367 update_decryption_mode(GtkWidget *cb)
1369 if (cb == NULL) {
1370 return;
1373 /* Wireshark decryption is on */
1374 if (wireshark_decryption_on())
1376 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
1378 /* AirPcap decryption is on */
1379 else if (airpcap_decryption_on())
1381 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
1383 /* No decryption enabled */
1384 else
1386 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
1389 return;
1393 * Creates the list of available decryption modes, depending on the adapters found
1395 void
1396 update_decryption_mode_list(GtkWidget *cb)
1398 gchar *current_text;
1400 if (cb == NULL)
1401 return;
1403 current_text = NULL;
1406 * XXX - Retrieve the current 'decryption mode'. It would be better just block the
1407 * signal handler, but it doesn't work... one of these days I'll try to figure out why...
1409 current_text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT(cb));
1411 while (gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(cb)), NULL) > 0) {
1412 gtk_combo_box_text_remove(GTK_COMBO_BOX_TEXT(cb), 0);
1415 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
1416 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK);
1418 if (airpcap_if_list != NULL && g_list_length(airpcap_if_list) > 0)
1420 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(cb), AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP);
1422 else
1424 /* The last decryption mode was 'Driver', but no more AirPcap adapter are found */
1425 if (current_text == NULL || g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
1427 g_free(current_text);
1428 current_text = g_strdup(AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
1432 if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0) {
1433 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
1434 } else if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0) {
1435 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
1436 } else { /* None / Invalid */
1437 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
1440 g_free(current_text);
1445 * Callback for the Wireless Advanced Settings 'Apply' button.
1447 static void
1448 on_advanced_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
1450 /* advenced window */
1451 GtkWidget *airpcap_advanced_w;
1452 GtkWidget *channel_cb, *channel_offset_cb;
1454 /* widgets in the toolbar */
1455 GtkWidget *toolbar,
1456 *toolbar_if_lb,
1457 *toolbar_channel_cb,
1458 *toolbar_channel_offset_cb,
1459 *toolbar_fcs_filter_cb;
1461 /* retrieve main window */
1462 airpcap_advanced_w = GTK_WIDGET(data);
1464 /* Set the channel and offset */
1465 channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
1466 channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY));
1467 airpcap_channel_offset_changed_cb(channel_offset_cb, NULL);
1468 airpcap_channel_changed_set_cb(channel_cb, channel_offset_cb);
1471 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
1473 /* retrieve toolbar info */
1474 toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
1475 toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
1476 toolbar_channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY));
1477 toolbar_fcs_filter_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
1479 /* Save the configuration (for all ) */
1480 airpcap_save_selected_if_configuration(airpcap_if_selected);
1482 /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
1483 if ( g_ascii_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
1485 gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected)));
1486 airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cb),airpcap_if_selected);
1487 airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, toolbar_channel_offset_cb, TRUE);
1488 airpcap_validation_type_combo_set_by_type(toolbar_fcs_filter_cb,airpcap_if_selected->CrcValidationOn);
1493 * Callback for the OK button 'clicked' in the Advanced Wireless Settings window.
1495 static void
1496 on_advanced_ok_bt_clicked(GtkWidget *button _U_, gpointer data)
1498 PAirpcapHandle ad = NULL;
1499 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1501 /* Retrieve object data */
1502 GtkWidget *airpcap_advanced_w = GTK_WIDGET(data);
1504 if (airpcap_if_selected == NULL) { /* There's not much we can do. */
1505 gtk_widget_destroy(airpcap_advanced_w);
1506 return;
1509 on_advanced_apply_bt_clicked(button, data);
1511 /* Stop blinking our LED */
1512 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
1513 if (ad)
1515 g_source_remove(airpcap_if_selected->tag);
1516 airpcap_if_turn_led_on(ad, 0);
1517 airpcap_if_selected->blinking = FALSE;
1518 airpcap_if_selected->led = TRUE;
1519 airpcap_if_close(ad);
1522 /* Remove GLIB timeout */
1523 g_source_remove(airpcap_if_selected->tag);
1525 gtk_widget_destroy(airpcap_advanced_w);
1529 * Callback for the CANCEL button 'clicked' in the Advanced Wireless Settings window.
1531 static void
1532 on_advanced_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
1534 PAirpcapHandle ad = NULL;
1535 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1537 /* Retrieve object data */
1538 GtkWidget *airpcap_advanced_w;
1540 /* Retrieve the GUI object pointers */
1541 airpcap_advanced_w = GTK_WIDGET(data);
1543 /* Stop blinking ALL leds (go through the airpcap_if_list) */
1544 if (airpcap_if_selected != NULL)
1546 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
1547 if (ad)
1549 g_source_remove(airpcap_if_selected->tag);
1550 airpcap_if_turn_led_on(ad, 0);
1551 airpcap_if_selected->blinking = FALSE;
1552 airpcap_if_selected->led = TRUE;
1553 airpcap_if_close(ad);
1556 /* reload the configuration!!! Configuration has not been saved but
1557 the corresponding structure has been modified probably...*/
1558 if (!airpcap_if_selected->saved)
1560 airpcap_load_selected_if_configuration(airpcap_if_selected);
1564 gtk_widget_destroy(airpcap_advanced_w);
1568 /* Called to create the airpcap settings' window */
1569 void
1570 display_airpcap_advanced_cb(GtkWidget *w _U_, gpointer data)
1572 GtkWidget *airpcap_advanced_w;
1573 GtkWidget *main_box;
1574 GtkWidget *settings_sub_box;
1575 GtkWidget *interface_fr;
1576 GtkWidget *interface_al;
1577 GtkWidget *interface_sub_h_box;
1578 GtkWidget *interface_name_lb;
1579 GtkWidget *blink_bt;
1580 GtkWidget *interface_frame_lb;
1581 GtkWidget *basic_parameters_fr;
1582 GtkWidget *basic_parameters_al;
1583 GtkWidget *basic_parameters_grid;
1584 GtkWidget *channel_lb;
1585 GtkWidget *channel_offset_lb;
1586 GtkWidget *capture_type_lb;
1587 GtkWidget *channel_cb;
1588 GtkWidget *channel_offset_cb;
1589 GtkWidget *capture_type_cb;
1590 GtkWidget *fcs_ck;
1591 GtkWidget *basic_parameters_fcs_h_box;
1592 GtkWidget *basic_parameters_fcs_filter_lb;
1593 GtkWidget *fcs_filter_cb;
1594 GtkWidget *basic_parameters_frame_lb;
1595 GtkWidget *low_buttons_h_box;
1596 GtkWidget *left_h_button_box;
1597 GtkWidget *right_h_button_box;
1598 GtkWidget *ok_bt;
1599 GtkWidget *apply_bt;
1600 GtkWidget *cancel_bt;
1602 /* widgets in the toolbar */
1603 GtkWidget *toolbar;
1605 /* user data - RETRIEVE pointers of toolbar widgets */
1606 toolbar = GTK_WIDGET(data);
1608 /* gray out the toolbar */
1609 gtk_widget_set_sensitive(toolbar,FALSE);
1611 /* main window */
1612 /* global */
1614 /* the selected is the active, for now */
1615 airpcap_if_selected = airpcap_if_active;
1617 /* Create the new window */
1618 airpcap_advanced_w = dlg_window_new("Advanced Wireless Settings"); /* transient_for top_level */
1619 gtk_window_set_modal(GTK_WINDOW(airpcap_advanced_w), TRUE);
1620 gtk_window_set_transient_for(GTK_WINDOW(airpcap_advanced_w), GTK_WINDOW(gtk_widget_get_toplevel(w)));
1621 gtk_window_set_destroy_with_parent (GTK_WINDOW(airpcap_advanced_w), TRUE);
1623 gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 5);
1624 gtk_window_set_position (GTK_WINDOW (airpcap_advanced_w),
1625 GTK_WIN_POS_CENTER);
1627 gtk_window_set_resizable (GTK_WINDOW (airpcap_advanced_w), FALSE);
1628 gtk_window_set_type_hint (GTK_WINDOW (airpcap_advanced_w), GDK_WINDOW_TYPE_HINT_DIALOG);
1630 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1631 gtk_widget_set_name (main_box, "main_box");
1632 gtk_widget_show (main_box);
1633 gtk_container_add (GTK_CONTAINER (airpcap_advanced_w), main_box);
1635 settings_sub_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
1636 gtk_widget_set_name (settings_sub_box, "settings_sub_box");
1637 gtk_widget_show (settings_sub_box);
1638 gtk_box_pack_start (GTK_BOX (main_box), settings_sub_box, FALSE, TRUE, 0);
1640 interface_fr = gtk_frame_new (NULL);
1641 gtk_widget_set_name (interface_fr, "interface_fr");
1642 gtk_widget_show (interface_fr);
1643 gtk_box_pack_start (GTK_BOX (settings_sub_box), interface_fr, FALSE, FALSE,
1645 gtk_container_set_border_width (GTK_CONTAINER (interface_fr), 10);
1647 interface_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
1648 gtk_widget_set_name (interface_al, "interface_al");
1649 gtk_widget_show (interface_al);
1650 gtk_container_add (GTK_CONTAINER (interface_fr), interface_al);
1651 gtk_alignment_set_padding (GTK_ALIGNMENT (interface_al), 5, 5, 0, 0);
1653 interface_sub_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
1654 gtk_widget_set_name (interface_sub_h_box, "interface_sub_h_box");
1655 gtk_widget_show (interface_sub_h_box);
1656 gtk_container_add (GTK_CONTAINER (interface_al), interface_sub_h_box);
1657 gtk_container_set_border_width (GTK_CONTAINER (interface_sub_h_box), 5);
1659 /* Fill the interface_box */
1660 if (airpcap_if_active != NULL)
1662 interface_name_lb = gtk_label_new(airpcap_if_active->description);
1664 else
1666 interface_name_lb = gtk_label_new("Couldn't find an airpcap interface.");
1667 gtk_widget_set_sensitive(main_box,FALSE);
1670 gtk_widget_set_name (interface_name_lb, "interface_name_lb");
1671 gtk_widget_show (interface_name_lb);
1672 gtk_box_pack_start (GTK_BOX (interface_sub_h_box), interface_name_lb, TRUE,
1673 FALSE, 0);
1675 /* If it is NOT the 'Any' Interface */
1676 if (!airpcap_if_is_any(airpcap_if_selected))
1678 blink_bt = gtk_button_new_with_mnemonic ("Blink Led");
1680 else /* It is the any interface, so it doesn't make sense to have 'Blink' button... */
1682 blink_bt = gtk_button_new_with_mnemonic ("What's This?");
1684 gtk_widget_set_name (blink_bt, "blink_bt");
1685 gtk_widget_show (blink_bt);
1686 gtk_box_pack_end (GTK_BOX (interface_sub_h_box), blink_bt, FALSE, FALSE, 0);
1688 interface_frame_lb = gtk_label_new ("<b>Interface</b>");
1689 gtk_widget_set_name (interface_frame_lb, "interface_frame_lb");
1690 gtk_widget_show (interface_frame_lb);
1691 gtk_frame_set_label_widget (GTK_FRAME (interface_fr), interface_frame_lb);
1692 gtk_label_set_use_markup (GTK_LABEL (interface_frame_lb), TRUE);
1694 basic_parameters_fr = gtk_frame_new (NULL);
1695 gtk_widget_set_name (basic_parameters_fr, "basic_parameters_fr");
1696 gtk_widget_show (basic_parameters_fr);
1697 gtk_box_pack_start (GTK_BOX (settings_sub_box), basic_parameters_fr, TRUE,FALSE, 0);
1698 gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_fr), 10);
1700 basic_parameters_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
1701 gtk_widget_set_name (basic_parameters_al, "basic_parameters_al");
1702 gtk_widget_show (basic_parameters_al);
1703 gtk_container_add (GTK_CONTAINER (basic_parameters_fr),basic_parameters_al);
1704 gtk_alignment_set_padding (GTK_ALIGNMENT (basic_parameters_al), 10, 10, 0, 0);
1706 basic_parameters_grid = ws_gtk_grid_new ();
1707 gtk_widget_set_name (basic_parameters_grid, "basic_parameters_grid");
1708 gtk_widget_show (basic_parameters_grid);
1709 gtk_container_add (GTK_CONTAINER (basic_parameters_al),
1710 basic_parameters_grid);
1711 gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_grid), 5);
1712 ws_gtk_grid_set_column_spacing(GTK_GRID(basic_parameters_grid), 20);
1714 channel_lb = gtk_label_new ("Channel:");
1715 gtk_widget_set_name (channel_lb, "channel_lb");
1716 gtk_widget_show (channel_lb);
1717 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_lb, 0, 0, 1, 1,
1718 (GtkAttachOptions) (GTK_FILL),
1719 (GtkAttachOptions) (0), 0, 0);
1720 gtk_misc_set_alignment (GTK_MISC (channel_lb), 0, 0.5f);
1722 capture_type_lb = gtk_label_new ("Capture Type:");
1723 gtk_widget_set_name (capture_type_lb, "capture_type_lb");
1724 gtk_widget_show (capture_type_lb);
1725 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), capture_type_lb, 0, 2, 1,
1726 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0),
1727 0, 0);
1728 gtk_misc_set_alignment (GTK_MISC (capture_type_lb), 0, 0.5f);
1730 /* Start: Channel offset label */
1731 channel_offset_lb = gtk_label_new ("Channel Offset:");
1732 gtk_widget_set_name (channel_offset_lb, "channel_offset_lb");
1733 gtk_widget_show (channel_offset_lb);
1734 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_offset_lb, 0, 1, 1, 1,
1735 (GtkAttachOptions) (GTK_FILL),
1736 (GtkAttachOptions) (0), 0, 0);
1737 gtk_misc_set_alignment (GTK_MISC (channel_offset_lb), 0, 0.5f);
1738 /* End: Channel offset label */
1740 /* Start: Channel offset combo box */
1741 channel_offset_cb = gtk_combo_box_text_new();
1742 gtk_widget_set_name (channel_offset_cb, "channel_offset_cb");
1744 airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, channel_offset_cb, FALSE);
1746 gtk_widget_show(channel_offset_cb);
1748 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_offset_cb, 1, 1, 1, 1,
1749 (GtkAttachOptions) (GTK_FILL),
1750 (GtkAttachOptions) (0), 0, 0);
1751 /* End: Channel offset combo box */
1753 channel_cb = gtk_combo_box_text_new();
1754 gtk_widget_set_name (channel_cb, "channel_cb");
1755 gtk_widget_show (channel_cb);
1756 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), channel_cb, 1, 0, 1, 1,
1757 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1758 (GtkAttachOptions) (0), 0, 0);
1760 /* Select the current channel */
1761 airpcap_update_channel_combo(GTK_WIDGET(channel_cb), airpcap_if_selected);
1763 capture_type_cb = gtk_combo_box_text_new();
1764 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
1765 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
1766 if (airpcap_get_dll_state() == AIRPCAP_DLL_OK) {
1767 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI);
1770 gtk_widget_set_name (capture_type_cb, "capture_type_cb");
1771 gtk_widget_show (capture_type_cb);
1772 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), capture_type_cb, 1, 2, 1,
1773 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1774 (GtkAttachOptions) (0), 0, 0);
1776 /* Current interface value */
1777 if (airpcap_if_selected != NULL)
1779 if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO){
1780 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_RADIO);
1781 }else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_PPI){
1782 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_PPI);
1783 } else {
1784 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_ONLY);
1788 fcs_ck = gtk_check_button_new_with_label ("Include 802.11 FCS in Frames");
1790 gtk_widget_set_name (fcs_ck, "fcs_ck");
1792 /* Fcs Presence check box */
1793 if (airpcap_if_selected != NULL)
1795 if (airpcap_if_selected->IsFcsPresent)
1796 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),TRUE);
1797 else
1798 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),FALSE);
1801 gtk_widget_show (fcs_ck);
1802 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid), fcs_ck, 3, 0, 2, 1,
1803 (GtkAttachOptions) (GTK_FILL),
1804 (GtkAttachOptions) (0), 0, 0);
1806 basic_parameters_fcs_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1, FALSE);
1807 gtk_widget_set_name (basic_parameters_fcs_h_box,
1808 "basic_parameters_fcs_h_box");
1809 gtk_widget_show (basic_parameters_fcs_h_box);
1810 ws_gtk_grid_attach_extended (GTK_GRID (basic_parameters_grid),
1811 basic_parameters_fcs_h_box, 3, 2, 2, 1,
1812 (GtkAttachOptions) (GTK_FILL),
1813 (GtkAttachOptions) (GTK_FILL), 3, 0);
1815 basic_parameters_fcs_filter_lb = gtk_label_new ("FCS Filter:");
1816 gtk_widget_set_name (basic_parameters_fcs_filter_lb,
1817 "basic_parameters_fcs_filter_lb");
1818 gtk_widget_show (basic_parameters_fcs_filter_lb);
1819 gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box),
1820 basic_parameters_fcs_filter_lb, FALSE, FALSE, 0);
1822 fcs_filter_cb = gtk_combo_box_text_new();
1823 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_EVERYTHING));
1824 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRECT_FRAMES));
1825 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES));
1826 gtk_combo_box_set_active(GTK_COMBO_BOX(fcs_filter_cb), 0);
1827 gtk_widget_set_name (fcs_filter_cb, "fcs_filter_cb");
1828 gtk_widget_show (fcs_filter_cb);
1829 gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box), fcs_filter_cb,
1830 FALSE, FALSE, 0);
1831 gtk_widget_set_size_request (fcs_filter_cb, 112, -1);
1833 if (airpcap_if_selected != NULL)
1835 airpcap_validation_type_combo_set_by_type(fcs_filter_cb, airpcap_if_selected->CrcValidationOn);
1838 basic_parameters_frame_lb = gtk_label_new ("<b>Basic Parameters</b>");
1839 gtk_widget_set_name (basic_parameters_frame_lb,
1840 "basic_parameters_frame_lb");
1841 gtk_widget_show (basic_parameters_frame_lb);
1843 gtk_frame_set_label_widget (GTK_FRAME (basic_parameters_fr),basic_parameters_frame_lb);
1844 gtk_label_set_use_markup (GTK_LABEL (basic_parameters_frame_lb), TRUE);
1846 low_buttons_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
1847 gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
1848 gtk_widget_show (low_buttons_h_box);
1849 gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
1851 left_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
1852 gtk_widget_set_name (left_h_button_box, "left_h_button_box");
1853 gtk_widget_show (left_h_button_box);
1854 gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
1855 FALSE, 0);
1857 /* dlg_button_row_new() returns an (h)box */
1858 right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
1859 gtk_widget_show (right_h_button_box);
1860 gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
1861 FALSE, 0);
1863 ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
1864 apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
1865 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
1867 /* Connect the callbacks */
1868 g_signal_connect (airpcap_advanced_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1869 g_signal_connect (airpcap_advanced_w, "destroy", G_CALLBACK(on_airpcap_advanced_destroy), airpcap_advanced_w);
1871 if (!airpcap_if_is_any(airpcap_if_selected))
1873 g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_blink_bt_clicked), NULL);
1875 else
1877 g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_what_s_this_bt_clicked), NULL);
1880 g_signal_connect (channel_cb, "changed", G_CALLBACK(airpcap_channel_changed_noset_cb), channel_offset_cb);
1881 /* We don't attach the channel offset combo because we don't want it changing anything yet. */
1882 g_signal_connect (capture_type_cb, "changed", G_CALLBACK(on_capture_type_cb_changed), NULL);
1883 g_signal_connect (fcs_ck, "toggled", G_CALLBACK(on_fcs_ck_toggled), NULL);
1884 g_signal_connect (fcs_filter_cb, "changed", G_CALLBACK(on_fcs_filter_cb_changed), NULL);
1885 g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_advanced_apply_bt_clicked), airpcap_advanced_w);
1886 g_signal_connect (ok_bt,"clicked", G_CALLBACK(on_advanced_ok_bt_clicked), airpcap_advanced_w);
1887 g_signal_connect (cancel_bt,"clicked", G_CALLBACK(on_advanced_cancel_bt_clicked), airpcap_advanced_w);
1889 /* Different because the window will be closed ... */
1890 /*window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
1891 window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);*/
1894 /* Store pointers to all widgets, for use by lookup_widget(). */
1895 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_BLINK_KEY, blink_bt);
1896 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_KEY,channel_cb);
1897 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY, channel_offset_cb);
1898 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_type_cb);
1899 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_CHECK_KEY, fcs_ck);
1900 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_FILTER_KEY, fcs_filter_cb);
1901 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
1902 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
1905 * I will need the toolbar and the main widget in some callback,
1906 * so I will add the toolbar pointer to the airpcap_advanced_w
1908 g_object_set_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY,toolbar);
1910 /* At the end, so that it appears completely all together ... */
1911 gtk_widget_show (airpcap_advanced_w);
1915 * Callback for the OK button 'clicked' in the Decryption Key Management window.
1917 static void
1918 on_key_management_ok_bt_clicked(GtkWidget *button, gpointer data)
1920 /* advanced window */
1921 GtkWidget *key_management_w;
1923 /* retrieve main window */
1924 key_management_w = GTK_WIDGET(data);
1926 /* Apply the current decryption preferences */
1927 on_key_management_apply_bt_clicked(button, data);
1929 gtk_widget_destroy(key_management_w);
1933 * Callback for the CANCEL button 'clicked' in the Decryption Key Management window.
1935 static void
1936 on_key_management_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
1938 /* Retrieve object data */
1939 GtkWidget *key_management_w;
1941 /* Retrieve the GUI object pointers */
1942 key_management_w = GTK_WIDGET(data);
1944 gtk_widget_destroy(key_management_w);
1947 /* Called to create the key management window */
1948 void
1949 display_airpcap_key_management_cb(GtkWidget *w _U_, gpointer data)
1951 GtkWidget *key_management_w;
1952 GtkWidget *main_box;
1953 GtkWidget *keys_fr;
1954 GtkWidget *keys_al;
1955 GtkWidget *keys_h_sub_box;
1956 GtkWidget *decryption_mode_grid;
1957 GtkWidget *decryption_mode_lb;
1958 GtkWidget *decryption_mode_cb;
1959 GtkWidget *keys_v_sub_box;
1960 GtkWidget *keys_scrolled_w;
1961 GtkListStore *key_list_store;
1962 GtkWidget *key_list;
1963 GtkWidget *key_v_button_box;
1964 GtkWidget *add_new_key_bt;
1965 GtkWidget *remove_key_bt;
1966 GtkWidget *edit_key_bt;
1967 GtkWidget *move_key_up_bt;
1968 GtkWidget *move_key_down_bt;
1969 GtkWidget *keys_frame_lb;
1970 GtkWidget *low_buttons_h_box;
1971 GtkWidget *left_h_button_box;
1972 GtkWidget *right_h_button_box;
1973 GtkWidget *ok_bt;
1974 GtkWidget *apply_bt;
1975 GtkWidget *cancel_bt;
1977 /* widgets in the toolbar */
1978 GtkWidget *toolbar,
1979 *toolbar_decryption_ck;
1981 /* key list */
1982 GtkTreeViewColumn *column;
1983 GtkCellRenderer *renderer;
1984 GtkTreeSelection *selection;
1985 GtkTreeIter iter;
1987 /* user data - RETRIEVE pointers of toolbar widgets */
1988 toolbar = GTK_WIDGET(data);
1989 toolbar_decryption_ck = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
1991 /* gray out the toolbar */
1992 gtk_widget_set_sensitive(toolbar,FALSE);
1994 /* main window */
1995 /* global */
1997 /* the selected is the active, for now */
1998 airpcap_if_selected = airpcap_if_active;
2000 /* Create the new window */
2001 key_management_w = dlg_window_new("Decryption Key Management"); /* transient_for top_level */
2002 gtk_window_set_destroy_with_parent(GTK_WINDOW(key_management_w), TRUE);
2003 gtk_window_set_modal(GTK_WINDOW(key_management_w), TRUE);
2005 gtk_container_set_border_width (GTK_CONTAINER (key_management_w), 5);
2006 gtk_window_set_position (GTK_WINDOW (key_management_w),
2007 GTK_WIN_POS_CENTER);
2009 gtk_window_set_resizable (GTK_WINDOW (key_management_w), FALSE);
2010 gtk_window_set_type_hint (GTK_WINDOW (key_management_w), GDK_WINDOW_TYPE_HINT_DIALOG);
2012 main_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2013 gtk_widget_set_name (main_box, "main_box");
2014 gtk_widget_show (main_box);
2015 gtk_container_add (GTK_CONTAINER (key_management_w), main_box);
2017 keys_fr = gtk_frame_new (NULL);
2018 gtk_widget_set_name (keys_fr, "keys_fr");
2019 gtk_widget_show (keys_fr);
2020 gtk_box_pack_start (GTK_BOX (main_box), keys_fr, FALSE, FALSE, 0);
2021 gtk_container_set_border_width (GTK_CONTAINER (keys_fr), 10);
2023 keys_al = gtk_alignment_new (0.5f, 0.5f, 1, 1);
2024 gtk_widget_set_name (keys_al, "keys_al");
2025 gtk_widget_show (keys_al);
2026 gtk_container_add (GTK_CONTAINER (keys_fr), keys_al);
2027 gtk_container_set_border_width (GTK_CONTAINER (keys_al), 5);
2029 gtk_alignment_set_padding (GTK_ALIGNMENT (keys_al), 0, 0, 12, 0);
2031 keys_h_sub_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2032 gtk_widget_set_name (keys_h_sub_box, "keys_h_sub_box");
2033 gtk_widget_show (keys_h_sub_box);
2034 gtk_container_add (GTK_CONTAINER (keys_al), keys_h_sub_box);
2036 decryption_mode_grid = ws_gtk_grid_new ();
2037 gtk_widget_set_name (decryption_mode_grid, "decryption_mode_grid");
2038 gtk_widget_show (decryption_mode_grid);
2039 gtk_box_pack_start (GTK_BOX (keys_h_sub_box), decryption_mode_grid, FALSE,
2040 FALSE, 0);
2041 ws_gtk_grid_set_row_spacing(GTK_GRID(decryption_mode_grid), 6);
2043 decryption_mode_lb = gtk_label_new ("Select Decryption Mode");
2044 gtk_widget_set_name (decryption_mode_lb, "decryption_mode_lb");
2045 gtk_widget_show (decryption_mode_lb);
2046 ws_gtk_grid_attach_extended (GTK_GRID (decryption_mode_grid), decryption_mode_lb, 1,
2047 0, 1, 1, (GtkAttachOptions) (GTK_FILL),
2048 (GtkAttachOptions) (0), 0, 0);
2049 gtk_misc_set_alignment (GTK_MISC (decryption_mode_lb), 0, 0.5f);
2051 decryption_mode_cb = gtk_combo_box_text_new();
2052 update_decryption_mode_list(decryption_mode_cb);
2053 gtk_widget_set_name (decryption_mode_cb, "decryption_mode_cb");
2054 gtk_widget_show (decryption_mode_cb);
2055 ws_gtk_grid_attach_extended (GTK_GRID (decryption_mode_grid), decryption_mode_cb, 0,
2056 0, 1, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0),
2057 0, 0);
2058 gtk_widget_set_size_request (decryption_mode_cb, 83, -1);
2060 /* Set correct decryption mode!!!! */
2061 update_decryption_mode(decryption_mode_cb);
2063 keys_v_sub_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
2064 gtk_widget_set_name (keys_v_sub_box, "keys_v_sub_box");
2065 gtk_widget_show (keys_v_sub_box);
2066 gtk_box_pack_start (GTK_BOX (keys_h_sub_box), keys_v_sub_box, TRUE, TRUE, 0);
2068 keys_scrolled_w = gtk_scrolled_window_new (NULL, NULL);
2069 gtk_widget_set_name (keys_scrolled_w, "keys_scrolled_w");
2070 gtk_widget_show (keys_scrolled_w);
2071 gtk_box_pack_start (GTK_BOX (keys_v_sub_box), keys_scrolled_w, TRUE, TRUE,
2073 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (keys_scrolled_w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2077 /* Create the store */
2078 key_list_store = gtk_list_store_new(KL_NUM_COLS,
2079 G_TYPE_STRING, /* Type */
2080 G_TYPE_STRING /* Key */
2081 , G_TYPE_STRING /* SSID */
2084 /* Create a view */
2085 key_list = gtk_tree_view_new_with_model(GTK_TREE_MODEL(key_list_store));
2087 /* Speed up the list display */
2088 gtk_tree_view_set_fixed_height_mode(GTK_TREE_VIEW(key_list), TRUE);
2090 /* Setup the sortable columns */
2091 gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(key_list), FALSE);
2093 /* The view now holds a reference. We can get rid of our own reference */
2094 g_object_unref(G_OBJECT(key_list_store));
2097 * Create the first column packet, associating the "text" attribute of the
2098 * cell_renderer to the first column of the model
2100 renderer = gtk_cell_renderer_text_new();
2101 column = gtk_tree_view_column_new_with_attributes("Type", renderer,
2102 "text", KL_COL_TYPE, NULL);
2103 gtk_tree_view_column_set_sort_column_id(column, KL_COL_TYPE);
2104 gtk_tree_view_column_set_resizable(column, TRUE);
2105 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
2106 gtk_tree_view_column_set_min_width(column, 60);
2107 gtk_tree_view_column_set_fixed_width(column, 100);
2108 /* Add the column to the view. */
2109 gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
2111 /* Key */
2112 renderer = gtk_cell_renderer_text_new();
2113 column = gtk_tree_view_column_new_with_attributes("Key", renderer,
2114 "text", KL_COL_KEY, NULL);
2115 gtk_tree_view_column_set_sort_column_id(column, KL_COL_KEY);
2116 gtk_tree_view_column_set_resizable(column, TRUE);
2117 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
2118 gtk_tree_view_column_set_min_width(column, 120);
2119 gtk_tree_view_column_set_fixed_width(column, 200);
2120 gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
2122 /* SSID */
2123 renderer = gtk_cell_renderer_text_new();
2124 column = gtk_tree_view_column_new_with_attributes("SSID", renderer,
2125 "text", KL_COL_SSID,
2126 NULL);
2127 gtk_tree_view_column_set_sort_column_id(column, KL_COL_SSID);
2128 gtk_tree_view_column_set_resizable(column, TRUE);
2129 gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
2130 gtk_tree_view_column_set_min_width(column, 80);
2131 gtk_tree_view_column_set_fixed_width(column, 150);
2132 gtk_tree_view_append_column(GTK_TREE_VIEW(key_list), column);
2134 /* Now enable the sorting of each column */
2135 gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(key_list), TRUE);
2136 gtk_tree_view_set_headers_clickable(GTK_TREE_VIEW(key_list), TRUE);
2138 /* Setup the selection handler */
2139 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(key_list));
2140 gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE);
2142 gtk_widget_show (key_list);
2144 gtk_container_add (GTK_CONTAINER (keys_scrolled_w), key_list);
2146 key_v_button_box = gtk_button_box_new (GTK_ORIENTATION_VERTICAL);
2147 gtk_widget_set_name (key_v_button_box, "key_v_button_box");
2148 gtk_widget_show (key_v_button_box);
2149 gtk_box_pack_start (GTK_BOX (keys_v_sub_box), key_v_button_box, FALSE, TRUE,
2152 add_new_key_bt = gtk_button_new_from_stock(GTK_STOCK_NEW);
2153 gtk_widget_set_name (add_new_key_bt, "add_new_key_bt");
2154 gtk_widget_show (add_new_key_bt);
2155 gtk_container_add (GTK_CONTAINER (key_v_button_box), add_new_key_bt);
2156 gtk_widget_set_can_default (add_new_key_bt, TRUE);
2158 edit_key_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
2159 gtk_widget_set_name (edit_key_bt, "edit_key_bt");
2160 gtk_widget_show (edit_key_bt);
2161 gtk_container_add (GTK_CONTAINER (key_v_button_box), edit_key_bt);
2162 gtk_widget_set_can_default (edit_key_bt, TRUE);
2164 remove_key_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
2165 gtk_widget_set_name (remove_key_bt, "remove_key_bt");
2166 gtk_widget_show (remove_key_bt);
2167 gtk_container_add (GTK_CONTAINER (key_v_button_box), remove_key_bt);
2168 gtk_widget_set_can_default (remove_key_bt, TRUE);
2170 move_key_up_bt = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
2171 gtk_widget_set_name (move_key_up_bt, "move_key_up_bt");
2172 gtk_widget_show (move_key_up_bt);
2173 gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_up_bt);
2174 gtk_widget_set_can_default (move_key_up_bt, TRUE);
2176 move_key_down_bt = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
2177 gtk_widget_set_name (move_key_down_bt, "move_key_down_bt");
2178 gtk_widget_show (move_key_down_bt);
2179 gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_down_bt);
2180 gtk_widget_set_can_default (move_key_down_bt, TRUE);
2182 keys_frame_lb = gtk_label_new ("<b>Decryption Keys</b>");
2183 gtk_widget_set_name (keys_frame_lb, "keys_frame_lb");
2184 gtk_widget_show (keys_frame_lb);
2186 gtk_frame_set_label_widget (GTK_FRAME (keys_fr), keys_frame_lb);
2187 gtk_label_set_use_markup (GTK_LABEL (keys_frame_lb), TRUE);
2189 low_buttons_h_box = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0, FALSE);
2190 gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
2191 gtk_widget_show (low_buttons_h_box);
2192 gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
2194 left_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
2195 gtk_widget_set_name (left_h_button_box, "left_h_button_box");
2196 gtk_widget_show (left_h_button_box);
2197 gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
2198 FALSE, 0);
2200 /* dlg_button_row_new() returns an (h)box */
2201 right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
2202 gtk_widget_set_name (right_h_button_box, "right_h_button_box");
2203 gtk_widget_show (right_h_button_box);
2204 gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
2205 FALSE, 0);
2207 ok_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
2208 apply_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
2209 cancel_bt = (GtkWidget *)g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
2211 /* Connect the callbacks */
2212 g_signal_connect (key_management_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2213 g_signal_connect (key_management_w, "destroy", G_CALLBACK(on_key_management_destroy), key_management_w);
2214 g_signal_connect (add_new_key_bt, "clicked", G_CALLBACK(on_add_new_key_bt_clicked), key_management_w);
2215 g_signal_connect (remove_key_bt, "clicked", G_CALLBACK(on_remove_key_bt_clicked), key_management_w);
2216 g_signal_connect (edit_key_bt, "clicked", G_CALLBACK(on_edit_key_bt_clicked), key_management_w);
2217 g_signal_connect (move_key_up_bt, "clicked", G_CALLBACK(on_move_key_up_bt_clicked), key_list);
2218 g_signal_connect (move_key_down_bt, "clicked", G_CALLBACK(on_move_key_down_bt_clicked), key_list);
2219 g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_key_management_apply_bt_clicked), key_management_w);
2220 g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_key_management_ok_bt_clicked), key_management_w);
2221 g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_key_management_cancel_bt_clicked), key_management_w);
2222 g_signal_connect (selection, "changed", G_CALLBACK(on_key_list_select_row), key_management_w);
2223 g_signal_connect (key_list_store, "rows_reordered", G_CALLBACK(on_key_list_reorder), key_management_w);
2225 /* Different because the window will be closed ... */
2226 /*window_set_cancel_button(key_management_w, ok_bt, window_cancel_button_cb);
2227 window_set_cancel_button(key_management_w, cancel_bt, window_cancel_button_cb);*/
2229 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_EDIT_KEY_SELECTION_KEY,selection);
2231 /* Store pointers to all widgets, for use by lookup_widget(). */
2232 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY, decryption_mode_cb);
2233 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_KEYLIST_KEY, key_list_store);
2234 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
2235 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
2237 /* Enable / disable buttons */
2238 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_NEW_KEY, add_new_key_bt);
2239 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_EDIT_KEY, edit_key_bt);
2240 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_DELETE_KEY, remove_key_bt);
2241 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_UP_KEY, move_key_up_bt);
2242 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_KEY_MGMT_DOWN_KEY, move_key_down_bt);
2245 * I will need the toolbar and the main widget in some callback,
2246 * so I will add the toolbar pointer to the key_management_w
2248 g_object_set_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY,toolbar);
2249 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_TOOLBAR_DECRYPTION_KEY, toolbar_decryption_ck);
2251 /* FIRST OF ALL, CHECK THE KEY COLLECTIONS */
2253 * This will read the decryption keys from the preferences file, and will store
2254 * them into the registry...
2256 if (!airpcap_check_decryption_keys(airpcap_if_list))
2258 /* Ask the user what to do ...*/
2259 airpcap_keys_check_w(key_management_w,NULL);
2261 else /* Keys from lists are equals, or Wireshark has got no keys */
2263 airpcap_load_decryption_keys(airpcap_if_list);
2264 airpcap_fill_key_list(key_list_store);
2265 /* At the end, so that it appears completely all together ... */
2266 gtk_widget_show (key_management_w);
2269 if(gtk_tree_model_get_iter_first(GTK_TREE_MODEL(key_list_store), &iter))
2271 gtk_tree_selection_select_iter(selection, &iter);
2276 static void
2277 on_keys_check_cancel_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2279 GtkWidget *key_management_w;
2280 GtkWidget *keys_check_w;
2281 GtkListStore *key_list_store;
2283 keys_check_w = GTK_WIDGET(user_data);
2285 key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2287 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2288 and is not NULL if it was called when the Key Management widget has been clicked */
2289 if (key_management_w != NULL)
2291 /* ... */
2292 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2293 airpcap_fill_key_list(key_list_store);
2294 gtk_widget_show (key_management_w);
2297 gtk_widget_destroy(keys_check_w);
2300 static void
2301 on_merge_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2303 GtkWidget *key_management_w;
2304 GtkWidget *keys_check_w;
2305 GtkListStore *key_list_store;
2307 guint n_adapters = 0;
2308 guint i = 0;
2310 GList* wireshark_keys=NULL;
2311 GList* driver_keys=NULL;
2312 GList* current_adapter_keys=NULL;
2313 GList* merged_list = NULL;
2314 GList* merged_list_tmp = NULL;
2316 airpcap_if_info_t* curr_adapter;
2318 keys_check_w = GTK_WIDGET(user_data);
2320 key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2322 n_adapters = g_list_length(airpcap_if_list);
2324 /* Retrieve Wireshark keys */
2325 wireshark_keys = get_wireshark_keys();
2327 merged_list = merge_key_list(wireshark_keys,NULL);
2329 /* Retrieve AirPcap driver's keys */
2330 driver_keys = get_airpcap_driver_keys();
2332 merged_list = merge_key_list(merged_list,driver_keys);
2334 /* NOW wireshark_keys and driver_keys ARE no more needed... at the end, we will have to free them! */
2335 for (i = 0; i<n_adapters; i++)
2337 curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2338 current_adapter_keys = get_airpcap_device_keys(curr_adapter);
2340 merged_list_tmp = merged_list;
2341 merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
2342 free_key_list(merged_list_tmp);
2346 /* Set up this new list as default for Wireshark and Adapters... */
2347 airpcap_save_decryption_keys(merged_list,airpcap_if_list);
2349 free_key_list(wireshark_keys);
2350 free_key_list(driver_keys);
2352 gtk_widget_destroy(keys_check_w);
2354 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2355 and is not NULL if it was called when the Key Management widget has been clicked */
2356 if (key_management_w != NULL)
2358 /* ... */
2359 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2360 airpcap_fill_key_list(key_list_store);
2361 gtk_widget_show (key_management_w);
2365 static void
2366 on_keep_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2368 GtkWidget *key_management_w;
2369 GtkWidget *keys_check_w;
2370 GtkListStore *key_list_store=NULL;
2372 GList* wireshark_keys=NULL;
2374 GList* merged_keys=NULL;
2376 keys_check_w = GTK_WIDGET(user_data);
2378 key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2380 /* Retrieve Wireshark keys */
2381 wireshark_keys = get_wireshark_keys();
2383 merged_keys = merge_key_list(wireshark_keys,NULL);
2385 /* Set up this new list as default for Wireshark and Adapters... */
2386 airpcap_save_decryption_keys(merged_keys,airpcap_if_list);
2388 /* Free the memory */
2389 free_key_list(wireshark_keys);
2391 /* Close the window */
2392 gtk_widget_destroy(keys_check_w);
2394 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2395 and is not NULL if it was called when the Key Management widget has been clicked */
2396 if (key_management_w != NULL)
2398 /* ... */
2399 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2400 airpcap_fill_key_list(key_list_store);
2401 gtk_widget_show (key_management_w);
2405 static void
2406 on_import_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2408 GtkWidget *key_management_w;
2409 GtkWidget *keys_check_w;
2410 GtkListStore *key_list_store;
2412 guint n_adapters = 0;
2413 guint i = 0;
2415 GList* wireshark_keys=NULL;
2416 GList* driver_keys=NULL;
2417 GList* current_adapter_keys=NULL;
2418 GList* merged_list = NULL;
2419 GList* merged_list_tmp = NULL;
2421 airpcap_if_info_t* curr_adapter;
2423 keys_check_w = GTK_WIDGET(user_data);
2425 key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2427 n_adapters = g_list_length(airpcap_if_list);
2429 wireshark_keys = get_wireshark_keys();
2431 /* Retrieve AirPcap driver's keys */
2432 driver_keys = get_airpcap_driver_keys();
2434 merged_list = merge_key_list(merged_list,driver_keys);
2436 /* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
2437 for (i = 0; i<n_adapters; i++)
2439 curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2440 current_adapter_keys = get_airpcap_device_keys(curr_adapter);
2442 merged_list_tmp = merged_list;
2443 merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
2444 free_key_list(merged_list_tmp);
2448 /* Set up this new list as default for Wireshark and Adapters... */
2449 airpcap_save_decryption_keys(merged_list,airpcap_if_list);
2451 free_key_list(wireshark_keys);
2452 free_key_list(driver_keys);
2454 gtk_widget_destroy(keys_check_w);
2456 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2457 and is not NULL if it was called when the Key Management widget has been clicked */
2458 if (key_management_w != NULL)
2460 /* ... */
2461 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2462 airpcap_fill_key_list(key_list_store);
2463 gtk_widget_show (key_management_w);
2467 static void
2468 on_ignore_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2470 GtkWidget *key_management_w;
2471 GtkWidget *keys_check_w;
2472 GtkListStore *key_list_store;
2474 keys_check_w = GTK_WIDGET(user_data);
2476 key_management_w = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2478 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2479 and is not NULL if it was called when the Key Management widget has been clicked */
2480 if (key_management_w != NULL)
2482 /* ... */
2483 key_list_store = (GtkListStore *)g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2484 airpcap_fill_key_list(key_list_store);
2485 gtk_widget_show (key_management_w);
2488 gtk_widget_destroy(keys_check_w);
2491 static void
2492 on_keys_check_ok_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2494 GtkWidget *keys_check_w;
2496 GtkWidget *merge_rb,
2497 *keep_rb,
2498 *import_rb,
2499 *ignore_rb;
2501 keys_check_w = GTK_WIDGET(user_data);
2503 merge_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY);
2504 keep_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY);
2505 import_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY);
2506 ignore_rb = (GtkWidget *)g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY);
2508 /* Find out which radio button is selected and call the correct function */
2509 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(merge_rb)))
2510 on_merge_bt_clicked (merge_rb,keys_check_w);
2511 else if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(keep_rb)))
2512 on_keep_bt_clicked (keep_rb,keys_check_w);
2513 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(import_rb)))
2514 on_import_bt_clicked (import_rb,keys_check_w);
2515 else if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(ignore_rb)))
2516 on_ignore_bt_clicked (ignore_rb,keys_check_w);
2517 else on_keys_check_cancel_bt_clicked(NULL,keys_check_w);
2520 static void
2521 on_keys_check_w_destroy (GtkWidget *w _U_, gpointer user_data)
2523 gtk_widget_set_sensitive(top_level,TRUE);
2524 gtk_widget_set_sensitive(GTK_WIDGET(user_data),TRUE);
2528 * Dialog box that appears whenever keys are not consistent between Wireshark and AirPcap
2530 void
2531 airpcap_keys_check_w(GtkWidget *w, gpointer data _U_)
2533 GtkWidget *keys_check_w;
2534 GtkWidget *main_v_box;
2535 GtkWidget *warning_lb;
2536 GtkWidget *radio_grid;
2537 GtkWidget *keep_rb;
2538 GSList *radio_bt_group = NULL;
2539 GtkWidget *merge_rb;
2540 GtkWidget *import_rb;
2541 GtkWidget *ignore_rb;
2542 GtkWidget *keep_lb;
2543 GtkWidget *merge_lb;
2544 GtkWidget *import_lb;
2545 GtkWidget *ignore_lb;
2546 GtkWidget *low_h_button_box;
2547 GtkWidget *ok_bt;
2548 GtkWidget *cancel_bt;
2550 keys_check_w = window_new (GTK_WINDOW_TOPLEVEL, "Decryption Key Warning");
2551 gtk_widget_set_name (keys_check_w, "keys_check_w");
2552 gtk_window_set_resizable (GTK_WINDOW (keys_check_w), FALSE);
2554 main_v_box = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 0, FALSE);
2555 gtk_widget_set_name (main_v_box, "main_v_box");
2556 gtk_widget_show (main_v_box);
2557 gtk_container_add (GTK_CONTAINER (keys_check_w), main_v_box);
2559 warning_lb = gtk_label_new("<b>WARNING!</b> Decryption keys specified in Wireshark's preferences file differ from those specified for the AirPcap adapter(s). You can choose to:");
2560 gtk_label_set_use_markup (GTK_LABEL (warning_lb), TRUE);
2561 gtk_widget_set_name (warning_lb, "warning_lb");
2562 gtk_widget_show (warning_lb);
2563 gtk_box_pack_start (GTK_BOX (main_v_box), warning_lb, FALSE, FALSE, 0);
2564 gtk_label_set_justify (GTK_LABEL (warning_lb), GTK_JUSTIFY_CENTER);
2565 gtk_label_set_line_wrap (GTK_LABEL (warning_lb), TRUE);
2567 radio_grid = ws_gtk_grid_new();
2568 gtk_widget_set_name (radio_grid, "radio_grid");
2569 gtk_widget_show (radio_grid);
2570 gtk_box_pack_start (GTK_BOX (main_v_box), radio_grid, TRUE, FALSE, 0);
2571 gtk_container_set_border_width (GTK_CONTAINER (radio_grid), 5);
2572 ws_gtk_grid_set_column_spacing (GTK_GRID (radio_grid), 8);
2574 keep_rb = gtk_radio_button_new_with_mnemonic (NULL, "Keep");
2575 gtk_widget_set_name (keep_rb, "keep_rb");
2576 gtk_widget_show (keep_rb);
2577 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), keep_rb, 0, 0, 1, 1,
2578 (GtkAttachOptions) (GTK_FILL),
2579 (GtkAttachOptions) (0), 0, 0);
2580 gtk_radio_button_set_group (GTK_RADIO_BUTTON (keep_rb), radio_bt_group);
2581 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (keep_rb));
2583 merge_rb = gtk_radio_button_new_with_mnemonic (NULL, "Merge");
2584 gtk_widget_set_name (merge_rb, "merge_rb");
2585 gtk_widget_show (merge_rb);
2586 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), merge_rb, 0, 1, 1, 1,
2587 (GtkAttachOptions) (GTK_FILL),
2588 (GtkAttachOptions) (0), 0, 0);
2589 gtk_radio_button_set_group (GTK_RADIO_BUTTON (merge_rb), radio_bt_group);
2590 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (merge_rb));
2592 import_rb = gtk_radio_button_new_with_mnemonic (NULL, "Import");
2593 gtk_widget_set_name (import_rb, "import_rb");
2594 gtk_widget_show (import_rb);
2595 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), import_rb, 0, 2, 1, 1,
2596 (GtkAttachOptions) (GTK_FILL),
2597 (GtkAttachOptions) (0), 0, 0);
2598 gtk_radio_button_set_group (GTK_RADIO_BUTTON (import_rb), radio_bt_group);
2599 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (import_rb));
2601 ignore_rb = gtk_radio_button_new_with_mnemonic (NULL, "Ignore");
2602 gtk_widget_set_name (ignore_rb, "ignore_rb");
2603 gtk_widget_show (ignore_rb);
2604 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), ignore_rb, 0, 3, 1, 1,
2605 (GtkAttachOptions) (GTK_FILL),
2606 (GtkAttachOptions) (0), 0, 0);
2607 gtk_radio_button_set_group (GTK_RADIO_BUTTON (ignore_rb), radio_bt_group);
2608 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (ignore_rb));
2610 keep_lb =
2611 gtk_label_new
2612 ("Use Wireshark keys, thus overwriting AirPcap adapter(s) ones.");
2613 gtk_widget_set_name (keep_lb, "keep_lb");
2614 gtk_widget_show (keep_lb);
2615 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), keep_lb, 1, 0, 1, 1,
2616 (GtkAttachOptions) (GTK_FILL),
2617 (GtkAttachOptions) (0), 0, 0);
2618 gtk_misc_set_alignment (GTK_MISC (keep_lb), 0, 0.5f);
2620 merge_lb = gtk_label_new ("Merge Wireshark and AirPcap adapter(s) keys.");
2621 gtk_widget_set_name (merge_lb, "merge_lb");
2622 gtk_widget_show (merge_lb);
2623 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), merge_lb, 1, 1, 1, 1,
2624 (GtkAttachOptions) (GTK_FILL),
2625 (GtkAttachOptions) (0), 0, 0);
2626 gtk_misc_set_alignment (GTK_MISC (merge_lb), 0, 0.5f);
2628 import_lb =
2629 gtk_label_new
2630 ("Use AirPcap adapter(s) keys, thus overwriting Wireshark ones.");
2631 gtk_widget_set_name (import_lb, "import_lb");
2632 gtk_widget_show (import_lb);
2633 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), import_lb, 1, 2, 1, 1,
2634 (GtkAttachOptions) (GTK_FILL),
2635 (GtkAttachOptions) (0), 0, 0);
2636 gtk_misc_set_alignment (GTK_MISC (import_lb), 0, 0.5f);
2638 ignore_lb =
2639 gtk_label_new
2640 ("Keep using different set of keys. Remember that in this case, this dialog box will appear whenever you will attempt to modify/add/remove decryption keys.");
2641 gtk_widget_set_name (ignore_lb, "ignore_lb");
2642 gtk_widget_show (ignore_lb);
2643 ws_gtk_grid_attach_extended (GTK_GRID (radio_grid), ignore_lb, 1, 3, 1, 1,
2644 (GtkAttachOptions) (GTK_FILL),
2645 (GtkAttachOptions) (0), 0, 0);
2646 gtk_label_set_line_wrap (GTK_LABEL (ignore_lb), TRUE);
2647 gtk_misc_set_alignment (GTK_MISC (ignore_lb), 0, 0.5f);
2649 low_h_button_box = gtk_button_box_new (GTK_ORIENTATION_HORIZONTAL);
2650 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
2651 gtk_widget_show (low_h_button_box);
2652 gtk_box_pack_start (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE,
2654 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
2655 GTK_BUTTONBOX_SPREAD);
2657 ok_bt = gtk_button_new_with_mnemonic ("OK");
2658 gtk_widget_set_name (ok_bt, "ok_bt");
2659 gtk_widget_show (ok_bt);
2660 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
2661 gtk_widget_set_can_default (ok_bt, TRUE);
2663 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
2664 gtk_widget_set_name (cancel_bt, "cancel_bt");
2665 gtk_widget_show (cancel_bt);
2666 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
2667 gtk_widget_set_can_default (cancel_bt, TRUE);
2669 /* Store pointers to all widgets, for use by lookup_widget(). */
2670 g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_keys_check_ok_bt_clicked), keys_check_w);
2671 g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_keys_check_cancel_bt_clicked), keys_check_w);
2672 g_signal_connect (keys_check_w, "destroy", G_CALLBACK(on_keys_check_w_destroy), keys_check_w);
2674 /* Store pointers to all widgets, for use by lookup_widget(). */
2675 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY,w);
2676 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY,merge_rb);
2677 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY,keep_rb);
2678 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY,import_rb);
2679 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY,ignore_rb);
2680 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_GROUP_KEY,radio_bt_group);
2682 gtk_widget_set_sensitive(top_level,FALSE);
2683 gtk_widget_show(keys_check_w);
2687 #endif /* HAVE_AIRPCAP */
2690 * Editor modelines
2692 * Local Variables:
2693 * c-basic-offset: 4
2694 * tab-width: 8
2695 * indent-tabs-mode: nil
2696 * End:
2698 * ex: set shiftwidth=4 tabstop=8 expandtab:
2699 * :indentSize=4:tabSize=8:noTabs=true: