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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
35 /*#include <glib/gprintf.h> */
39 #include <epan/filesystem.h>
40 #include <epan/emem.h>
41 #include <epan/prefs.h>
42 #include <epan/prefs-int.h>
43 #include <epan/frequency-utils.h>
44 #include <epan/crypt/wep-wpadefs.h>
48 #include "../simple_dialog.h"
51 #include "gtk/dlg_utils.h"
52 #include "gtk/gui_utils.h"
53 #include "gtk/dfilter_expr_dlg.h"
54 #include "gtk/stock_icons.h"
55 #include "gtk/gtkglobals.h"
56 #include "gtk/help_dlg.h"
60 #include "airpcap_loader.h"
61 #include "airpcap_gui_utils.h"
62 #include "airpcap_dlg.h"
65 * This function is used to write the preferences to the preferences file.
66 * It has the same behaviour as prefs_main_write() in prefs_dlg.c
69 write_prefs_to_file(void)
75 /* Create the directory that holds personal configuration files, if
77 if (create_persconffile_dir(&pf_dir_path) == -1) {
78 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
79 "Can't create directory\n\"%s\"\nfor preferences file: %s.", pf_dir_path,
83 /* Write the preferencs out. */
84 err = write_prefs(&pf_path);
86 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
87 "Can't open preferences file\n\"%s\": %s.", pf_path,
95 * Callback for the select row event in the key list widget
98 on_key_ls_select_row(GtkWidget *widget _U_,
101 GdkEventButton *event _U_,
104 airpcap_key_ls_selected_info_t* selected_item;
106 selected_item = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
108 selected_item->row = row;
109 selected_item->column = column;
113 * Callback for the unselect row event in the key list widget
116 on_key_ls_unselect_row(GtkWidget *widget _U_,
119 GdkEventButton *event _U_,
122 airpcap_key_ls_selected_info_t* selected_item;
124 selected_item = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
126 selected_item->row = NO_ROW_SELECTED;
127 selected_item->column = NO_COLUMN_SELECTED;
131 * Callback for the click column event in the key list widget
134 on_key_ls_click_column(GtkWidget *widget _U_,
141 * Callback for the crc checkbox
144 on_fcs_ck_toggled(GtkWidget *w _U_, gpointer user_data _U_)
147 if (airpcap_if_selected != NULL)
149 if (airpcap_if_selected->IsFcsPresent)
151 airpcap_if_selected->IsFcsPresent = FALSE;
152 airpcap_if_selected->saved = FALSE;
156 airpcap_if_selected->IsFcsPresent = TRUE;
157 airpcap_if_selected->saved = FALSE;
163 * Callback for the wrong crc combo
166 on_edit_type_cb_changed(GtkWidget *w, gpointer data)
168 GtkWidget *edit_key_w;
169 GtkWidget *edit_ssid_te;
174 gchar* type_text = NULL;
176 edit_key_w = GTK_WIDGET(data);
179 edit_ssid_te = g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
180 key_lb = g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY);
181 ssid_lb = g_object_get_data(G_OBJECT(edit_key_w),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY);
183 type_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_cb));
185 if (string_is_not_empty(type_text))
188 * If it is a WEP key, no SSID is required! Gray out the entry text so
189 * it doesn't create confusion ...
191 if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_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 WEP...
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_BIN_KEY_STRING) == 0)
204 gtk_widget_set_sensitive(edit_ssid_te,FALSE);
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),"Key");
211 gtk_label_set_text(GTK_LABEL(ssid_lb),"");
213 else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
215 gtk_widget_set_sensitive(edit_ssid_te,TRUE);
217 * Maybe the user has already entered some text into the SSID field
218 * and then switched to WPA...
220 gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),"");
221 gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
222 gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
225 gtk_widget_show(edit_ssid_te);
231 * Callback for the wrong crc combo
234 on_add_type_cb_changed(GtkWidget *w, gpointer data)
236 GtkWidget *add_key_w;
237 GtkWidget *add_ssid_te;
242 gchar* type_text = NULL;
244 add_key_w = GTK_WIDGET(data);
247 add_ssid_te = g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
248 key_lb = g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY);
249 ssid_lb = g_object_get_data(G_OBJECT(add_key_w),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY);
251 type_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_cb));
253 if (string_is_not_empty(type_text))
256 * If it is a WEP key, no SSID is required! Gray out rhe entry text so
257 * it doesn't create confusion ...
259 if (g_ascii_strcasecmp(type_text,AIRPCAP_WEP_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 WEP...
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_BIN_KEY_STRING) == 0)
272 gtk_widget_set_sensitive(add_ssid_te,FALSE);
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),"Key");
279 gtk_label_set_text(GTK_LABEL(ssid_lb),"");
281 else if (g_ascii_strcasecmp(type_text,AIRPCAP_WPA_PWD_KEY_STRING) == 0)
283 gtk_widget_set_sensitive(add_ssid_te,TRUE);
285 * Maybe the user has already entered some text into the SSID field
286 * and then switched to WPA...
288 gtk_entry_set_text(GTK_ENTRY(add_ssid_te),"");
289 gtk_label_set_text(GTK_LABEL(key_lb),"Passphrase");
290 gtk_label_set_text(GTK_LABEL(ssid_lb),"SSID");
293 gtk_widget_show(add_ssid_te);
299 * Returns FALSE if a text string has length 0, i.e. the first char
300 * is '\0', TRUE otherwise
303 string_is_not_empty(gchar *s)
305 if (g_ascii_strcasecmp(s,"") != 0)
312 * Callback for the wrong crc combo
315 on_fcs_filter_cb_changed(GtkWidget *fcs_filter_cb, gpointer data _U_)
317 gchar *fcs_filter_str;
319 if (fcs_filter_cb != NULL)
321 fcs_filter_str = gtk_combo_box_get_active_text(GTK_COMBO_BOX(fcs_filter_cb));
322 if (fcs_filter_str && (g_ascii_strcasecmp("", fcs_filter_str)))
324 airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(fcs_filter_str);
325 airpcap_if_selected->saved = FALSE;
327 g_free(fcs_filter_str);
333 * Changed callback for the capture type combobox
336 on_capture_type_cb_changed(GtkWidget *cb, gpointer data _U_)
344 s = gtk_combo_box_get_active_text(GTK_COMBO_BOX(cb));
346 if ((g_ascii_strcasecmp("",s)))
348 airpcap_if_selected->linkType = airpcap_get_link_type(s);
349 airpcap_if_selected->saved = FALSE;
355 * Thread function used to blink the led
357 gboolean update_blink(gpointer data)
359 airpcap_if_info_t* sel;
361 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
363 sel = (airpcap_if_info_t*)data;
365 ad = airpcap_if_open(sel->name, ebuf);
370 airpcap_if_turn_led_off(ad, 0);
375 airpcap_if_turn_led_on(ad, 0);
378 airpcap_if_close(ad);
384 * Blink button callback
387 on_blink_bt_clicked( GtkWidget *blink_bt, gpointer if_data _U_)
389 PAirpcapHandle ad = NULL;
390 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
392 if (airpcap_if_selected != NULL) {
393 if (!(airpcap_if_selected->blinking))
395 gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
396 airpcap_if_selected->tag = g_timeout_add(500,update_blink,airpcap_if_selected);
397 airpcap_if_selected->blinking = TRUE;
401 gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led ");
402 g_source_remove(airpcap_if_selected->tag);
403 airpcap_if_selected->blinking = FALSE;
404 /* Switch on the led! */
405 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
408 g_source_remove(airpcap_if_selected->tag);
409 airpcap_if_turn_led_on(ad, 0);
410 airpcap_if_selected->blinking = FALSE;
411 airpcap_if_selected->led = TRUE;
412 airpcap_if_close(ad);
419 * Callback for the 'Any' adapter What's This button.
422 on_what_s_this_bt_clicked( GtkWidget *blink_bt _U_, gpointer if_data _U_)
424 simple_dialog(ESD_TYPE_INFO,ESD_BTN_OK,
425 "The Multi-Channel Aggregator is a virtual device "
426 "that can be used to capture packets from all the "
427 "AirPcap adapters at the same time.\n"
428 "The Capture Type, FCS and Encryption settings of "
429 "this virtual device can be configured as for any "
430 "real adapter.\nThe channel cannot be changed for "
432 "Refer to the AirPcap manual for more information.");
435 /* the window was closed, cleanup things */
437 on_key_management_destroy(GtkWidget *w _U_, gpointer data _U_)
439 GtkWidget *airpcap_advanced_w,
442 gint *from_widget = NULL;
444 /* Retrieve the GUI object pointers */
445 airpcap_advanced_w = GTK_WIDGET(data);
447 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
450 from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
451 /* gray out the toolbar (if we came here from the toolbar advanced button)*/
452 if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
453 gtk_widget_set_sensitive(toolbar,TRUE);
455 gtk_widget_set_sensitive(toolbar,FALSE);
459 /* reload the configuration!!! Configuration has not been saved but
460 the corresponding structure has been modified probably...*/
461 if (airpcap_if_selected != NULL)
463 if (!airpcap_if_selected->saved)
465 airpcap_load_selected_if_configuration(airpcap_if_selected);
471 /* the Advenced wireless Settings window was closed, cleanup things */
473 on_airpcap_advanced_destroy(GtkWidget *w _U_, gpointer data)
475 GtkWidget *airpcap_advanced_w,
478 gint *from_widget = NULL;
480 /* Retrieve the GUI object pointers */
481 airpcap_advanced_w = GTK_WIDGET(data);
483 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
486 from_widget = (gint*)g_object_get_data(G_OBJECT(toolbar),AIRPCAP_ADVANCED_FROM_KEY);
487 /* gray out the toolbar (if we came here from the toolbar advanced button)*/
488 if ( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
489 gtk_widget_set_sensitive(toolbar,TRUE);
491 gtk_widget_set_sensitive(toolbar,FALSE);
495 /* reload the configuration!!! Configuration has not been saved but
496 the corresponding structure has been modified probably...*/
497 if (!airpcap_if_selected->saved)
499 airpcap_load_selected_if_configuration(airpcap_if_selected);
504 * Callback for the 'Apply' button.
507 * XXX - Pressing 'Apply' has the same effect as pressing 'OK' -- you
508 * can't revert back to the old set of keys by pressing 'Cancel'. We
509 * either need to fix reversion or get rid of the 'Apply' button.
512 on_key_management_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
514 /* advenced window */
515 GtkWidget *key_management_w;
517 /* widgets in the toolbar */
519 GtkWidget *toolbar_cb;
521 GtkWidget *decryption_mode_cb;
523 module_t *wlan_module = prefs_find_module("wlan");
524 gchar *decryption_mode_string;
526 /* retrieve main window */
527 key_management_w = GTK_WIDGET(data);
528 decryption_mode_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY));
529 key_ls = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY));
530 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY));
531 toolbar_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
533 #define CANT_SAVE_ERR_STR "Cannot save configuration! Another application " \
534 "might be using AirPcap, or you might not have sufficient privileges."
535 /* Set the Decryption Mode */
537 decryption_mode_string = gtk_combo_box_get_active_text (GTK_COMBO_BOX(decryption_mode_cb));
538 if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0)
540 set_wireshark_decryption(TRUE);
541 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
543 else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
545 set_wireshark_decryption(FALSE);
546 if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
548 else if (g_ascii_strcasecmp(decryption_mode_string, AIRPCAP_DECRYPTION_TYPE_STRING_NONE) == 0)
550 set_wireshark_decryption(FALSE);
551 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
554 /* Save the configuration */
555 airpcap_read_and_save_decryption_keys_from_clist(key_ls,airpcap_if_selected,airpcap_if_list); /* This will save the keys for every adapter */
557 /* The update will make redissect al the packets... no need to do it here again */
558 update_decryption_mode(toolbar_cb);
560 /* Redissect all the packets, and re-evaluate the display filter. */
561 prefs_apply(wlan_module);
565 * Callback for the 'Reset Configuration' button.
568 on_reset_configuration_bt_clicked(GtkWidget *button _U_, gpointer data _U_)
574 * Callback used to add a WEP key in the add new key box;
577 on_add_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data _U_)
585 GString *new_type_string,
589 gchar *type_entered = NULL;
590 gchar *key_entered = NULL;
591 gchar *ssid_entered = NULL;
593 airpcap_key_ls_selected_info_t *selected_item;
595 int keys_in_list = 0;
599 gint r = NO_ROW_SELECTED;
600 gint c = NO_COLUMN_SELECTED;
602 key_ls = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY);
603 selected_item = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
604 type_cb = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY);
605 key_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY);
606 ssid_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
608 r = selected_item->row;
609 c = selected_item->column;
611 keys_in_list = GTK_CLIST(key_ls)->rows;
613 type_entered = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_cb));
614 key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
615 ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
617 /* Check if key is correct */
618 new_type_string = g_string_new(type_entered);
619 new_key_string = g_string_new(key_entered);
620 new_ssid_string = g_string_new(ssid_entered);
622 g_free(type_entered);
623 g_free(key_entered );
624 g_free(ssid_entered);
626 g_strchug(new_key_string->str);
627 g_strchomp(new_key_string->str);
629 g_strchug(new_ssid_string->str);
630 g_strchomp(new_ssid_string->str);
632 /* Check which type of key the user has entered */
633 if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
636 if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
638 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);
640 g_string_free(new_type_string,TRUE);
641 g_string_free(new_key_string, TRUE);
642 g_string_free(new_ssid_string,TRUE);
647 if ((new_key_string->len % 2) != 0)
649 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
651 g_string_free(new_type_string,TRUE);
652 g_string_free(new_key_string, TRUE);
653 g_string_free(new_ssid_string,TRUE);
658 for (i = 0; i < new_key_string->len; i++)
660 if (!g_ascii_isxdigit(new_key_string->str[i]))
662 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be a hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
664 g_string_free(new_type_string,TRUE);
665 g_string_free(new_key_string, TRUE);
666 g_string_free(new_ssid_string,TRUE);
672 /* If so... add key */
673 airpcap_add_key_to_list(key_ls, new_type_string->str, new_key_string->str, new_ssid_string->str);
675 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
677 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
679 /* XXX - Perform some WPA related input fields check */
680 /* If everything is ok, modify the entry in the list */
682 if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
684 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);
686 g_string_free(new_type_string,TRUE);
687 g_string_free(new_key_string, TRUE);
688 g_string_free(new_ssid_string,TRUE);
694 * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
696 if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
698 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);
700 g_string_free(new_type_string,TRUE);
701 g_string_free(new_key_string, TRUE);
702 g_string_free(new_ssid_string,TRUE);
707 /* If so... add key */
708 airpcap_add_key_to_list(key_ls, new_type_string->str, new_key_string->str, new_ssid_string->str);
710 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
712 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
714 /* XXX - Perform some WPA_BIN related input fields check */
715 /* If everything is ok, modify the entry int he list */
717 if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
719 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);
721 g_string_free(new_type_string,TRUE);
722 g_string_free(new_key_string, TRUE);
723 g_string_free(new_ssid_string,TRUE);
728 for (i = 0; i < new_key_string->len; i++)
730 if (!g_ascii_isxdigit(new_key_string->str[i]))
732 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
734 g_string_free(new_type_string,TRUE);
735 g_string_free(new_key_string, TRUE);
736 g_string_free(new_ssid_string,TRUE);
742 /* If so... add key */
743 airpcap_add_key_to_list(key_ls, new_type_string->str, new_key_string->str, new_ssid_string->str);
745 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
747 else /* Should never happen!!! */
749 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!");
752 g_string_free(new_type_string,TRUE);
753 g_string_free(new_key_string, TRUE);
754 g_string_free(new_ssid_string,TRUE);
756 window_destroy(GTK_WIDGET(data));
761 * Callback used to edit a WEP key in the edit key box;
764 on_edit_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data _U_)
772 GString *new_type_string,
776 gchar *type_entered = NULL;
777 gchar *key_entered = NULL;
778 gchar *ssid_entered = NULL;
780 airpcap_key_ls_selected_info_t *selected_item;
782 int keys_in_list = 0;
786 gint r = NO_ROW_SELECTED;
787 gint c = NO_COLUMN_SELECTED;
789 key_ls = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY);
790 selected_item = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_SELECTED_KEY);
791 type_cb = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY);
792 key_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY);
793 ssid_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
795 r = selected_item->row;
796 c = selected_item->column;
798 keys_in_list = GTK_CLIST(key_ls)->rows;
800 type_entered = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_cb));
801 key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
802 ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
804 /* Check if key is correct */
805 new_type_string = g_string_new(type_entered);
806 new_key_string = g_string_new(key_entered);
807 new_ssid_string = g_string_new(ssid_entered);
809 g_free(type_entered);
810 g_free(key_entered );
811 g_free(ssid_entered);
813 g_strchug(new_key_string->str);
814 g_strchomp(new_key_string->str);
816 g_strchug(new_ssid_string->str);
817 g_strchomp(new_ssid_string->str);
819 /* Check which type of key the user has entered */
820 if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
823 if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
825 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);
827 g_string_free(new_type_string,TRUE);
828 g_string_free(new_key_string, TRUE);
829 g_string_free(new_ssid_string,TRUE);
834 if ((new_key_string->len % 2) != 0)
836 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
838 g_string_free(new_type_string,TRUE);
839 g_string_free(new_key_string, TRUE);
840 g_string_free(new_ssid_string,TRUE);
845 for (i = 0; i < new_key_string->len; i++)
847 if (!g_ascii_isxdigit(new_key_string->str[i]))
849 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
851 g_string_free(new_type_string,TRUE);
852 g_string_free(new_key_string, TRUE);
853 g_string_free(new_ssid_string,TRUE);
859 /* If so... Modify key */
860 airpcap_modify_key_in_list(key_ls, r, new_type_string->str, new_key_string->str, new_ssid_string->str);
862 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
864 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
866 /* XXX - Perform some WPA related input fields check */
867 /* If everything is ok, modify the entry in the list */
869 if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
871 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);
873 g_string_free(new_type_string,TRUE);
874 g_string_free(new_key_string, TRUE);
875 g_string_free(new_ssid_string,TRUE);
881 * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
883 if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
885 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);
887 g_string_free(new_type_string,TRUE);
888 g_string_free(new_key_string, TRUE);
889 g_string_free(new_ssid_string,TRUE);
894 /* If so... Modify key */
895 airpcap_modify_key_in_list(key_ls, r, new_type_string->str, new_key_string->str, new_ssid_string->str);
897 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
899 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
901 /* XXX - Perform some WPA_BIN related input fields check */
902 /* If everything is ok, modify the entry in the list */
904 if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
906 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);
908 g_string_free(new_type_string,TRUE);
909 g_string_free(new_key_string, TRUE);
910 g_string_free(new_ssid_string,TRUE);
915 for (i = 0; i < new_key_string->len; i++)
917 if (!g_ascii_isxdigit(new_key_string->str[i]))
919 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
921 g_string_free(new_type_string,TRUE);
922 g_string_free(new_key_string, TRUE);
923 g_string_free(new_ssid_string,TRUE);
929 /* If so... Modify key */
930 airpcap_modify_key_in_list(key_ls, r, new_type_string->str, new_key_string->str, new_ssid_string->str);
932 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
934 else /* Should never happen!!! */
936 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!");
939 g_string_free(new_type_string,TRUE);
940 g_string_free(new_key_string, TRUE);
941 g_string_free(new_ssid_string,TRUE);
943 window_destroy(GTK_WIDGET(data));
948 * Callback for the 'Add Key' button.
951 on_add_new_key_bt_clicked(GtkWidget *button _U_, gpointer data _U_)
953 GtkWidget *add_key_window;
954 GtkWidget *add_frame;
955 GtkWidget *main_v_box;
957 GtkWidget *add_frame_al;
958 GtkWidget *add_type_cb;
959 GtkWidget *add_key_te;
960 GtkWidget *add_ssid_te;
961 GtkWidget *add_type_lb;
962 GtkWidget *add_key_lb;
963 GtkWidget *add_ssid_lb;
964 GtkWidget *low_h_button_box;
966 GtkWidget *cancel_bt;
967 GtkWidget *add_frame_lb;
969 GtkWidget *airpcap_advanced_w;
971 /* Key List Widget */
974 gint keys_in_list = 0;
976 /* Selected entry in the key list (if any)*/
977 airpcap_key_ls_selected_info_t* selected_item;
981 airpcap_advanced_w = GTK_WIDGET(data);
983 /* Retrieve the selected item... if no row is selected, this is null... */
984 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
986 r = selected_item->row;
987 c = selected_item->column;
989 /* Retrieve the key list widget pointer, and add it to the add_key_w */
990 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
992 keys_in_list = GTK_CLIST(key_ls)->rows;
994 if (keys_in_list >= MAX_ENCRYPTION_KEYS) /* Check if we have already reached the maximum number of allowed keys... */
996 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Maximum number (%d) of decryption keys reached! You cannot add another key!\n",MAX_ENCRYPTION_KEYS);
1000 /* Gray out the Advanced Wireless Setting window */
1001 gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
1003 /* Pop-up a new window */
1004 add_key_window = window_new (GTK_WINDOW_TOPLEVEL, "Add Decryption Key");
1005 gtk_widget_set_name (add_key_window, "add_key_window");
1006 gtk_container_set_border_width (GTK_CONTAINER (add_key_window), 5);
1007 gtk_window_set_resizable (GTK_WINDOW (add_key_window), FALSE);
1009 main_v_box = gtk_vbox_new (FALSE, 0);
1010 gtk_widget_set_name (main_v_box, "main_v_box");
1011 gtk_widget_show (main_v_box);
1012 gtk_container_add (GTK_CONTAINER (add_key_window), main_v_box);
1014 add_frame = gtk_frame_new (NULL);
1015 gtk_widget_set_name (add_frame, "add_frame");
1016 gtk_widget_show (add_frame);
1017 gtk_box_pack_start (GTK_BOX (main_v_box), add_frame, TRUE, TRUE, 0);
1019 add_frame_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1020 gtk_widget_set_name (add_frame_al, "add_frame_al");
1021 gtk_widget_show (add_frame_al);
1022 gtk_container_add (GTK_CONTAINER (add_frame), add_frame_al);
1023 gtk_alignment_set_padding (GTK_ALIGNMENT (add_frame_al), 0, 0, 12, 0);
1025 add_tb = gtk_table_new (2, 3, FALSE);
1026 gtk_widget_set_name (add_tb, "add_tb");
1027 gtk_container_set_border_width(GTK_CONTAINER(add_tb),5);
1028 gtk_widget_show (add_tb);
1029 gtk_container_add (GTK_CONTAINER (add_frame_al), add_tb);
1031 add_type_cb = gtk_combo_box_new_text();
1032 gtk_combo_box_append_text(GTK_COMBO_BOX(add_type_cb), AIRPCAP_WEP_KEY_STRING);
1034 #ifdef HAVE_AIRPDCAP
1035 gtk_combo_box_append_text(GTK_COMBO_BOX(add_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
1036 gtk_combo_box_append_text(GTK_COMBO_BOX(add_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
1038 gtk_combo_box_set_active(GTK_COMBO_BOX(add_type_cb), 0);
1039 gtk_widget_set_name (add_type_cb, "add_type_cb");
1040 gtk_widget_show (add_type_cb);
1041 gtk_table_attach (GTK_TABLE (add_tb), add_type_cb, 0, 1, 1, 2,
1042 (GtkAttachOptions) (GTK_FILL),
1043 (GtkAttachOptions) (0), 0, 0);
1044 gtk_widget_set_size_request (add_type_cb, 83, -1);
1046 add_key_te = gtk_entry_new ();
1047 gtk_widget_set_name (add_key_te, "add_key_te");
1049 gtk_widget_show (add_key_te);
1050 gtk_table_attach (GTK_TABLE (add_tb), add_key_te, 1, 2, 1, 2,
1051 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1052 gtk_widget_set_size_request (add_key_te, 178, -1);
1054 add_ssid_te = gtk_entry_new ();
1055 gtk_widget_set_name (add_ssid_te, "add_ssid_te");
1056 gtk_widget_set_sensitive(add_ssid_te,FALSE);
1057 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1058 gtk_widget_show (add_ssid_te);
1059 gtk_table_attach (GTK_TABLE (add_tb), add_ssid_te, 2, 3, 1, 2,
1060 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1062 add_type_lb = gtk_label_new ("Type");
1063 gtk_widget_set_name (add_type_lb, "add_type_lb");
1064 gtk_widget_show (add_type_lb);
1065 gtk_table_attach (GTK_TABLE (add_tb), add_type_lb, 0, 1, 0, 1,
1066 (GtkAttachOptions) (GTK_FILL),
1067 (GtkAttachOptions) (0), 0, 0);
1068 gtk_label_set_justify (GTK_LABEL (add_type_lb), GTK_JUSTIFY_CENTER);
1070 add_key_lb = gtk_label_new ("Key");
1071 gtk_widget_set_name (add_key_lb, "add_key_lb");
1072 gtk_widget_show (add_key_lb);
1073 gtk_table_attach (GTK_TABLE (add_tb), add_key_lb, 1, 2, 0, 1,
1074 (GtkAttachOptions) (GTK_FILL),
1075 (GtkAttachOptions) (0), 0, 0);
1076 gtk_label_set_justify (GTK_LABEL (add_key_lb), GTK_JUSTIFY_CENTER);
1078 add_ssid_lb = gtk_label_new ("");
1079 gtk_widget_set_name (add_ssid_lb, "add_ssid_lb");
1080 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1081 gtk_widget_show (add_ssid_lb);
1082 gtk_table_attach (GTK_TABLE (add_tb), add_ssid_lb, 2, 3, 0, 1,
1083 (GtkAttachOptions) (GTK_FILL),
1084 (GtkAttachOptions) (0), 0, 0);
1085 gtk_label_set_justify (GTK_LABEL (add_ssid_lb), GTK_JUSTIFY_CENTER);
1087 low_h_button_box = gtk_hbutton_box_new ();
1088 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
1089 gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
1090 gtk_widget_show (low_h_button_box);
1091 gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
1092 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
1095 ok_bt = gtk_button_new_with_mnemonic ("OK");
1096 gtk_widget_set_name (ok_bt, "ok_bt");
1097 gtk_widget_show (ok_bt);
1098 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
1099 GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
1101 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
1102 gtk_widget_set_name (cancel_bt, "cancel_bt");
1103 gtk_widget_show (cancel_bt);
1104 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
1105 GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
1107 add_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
1108 gtk_widget_set_name (add_frame_lb, "add_frame_lb");
1109 gtk_widget_show (add_frame_lb);
1110 gtk_frame_set_label_widget (GTK_FRAME (add_frame), add_frame_lb);
1111 gtk_label_set_use_markup (GTK_LABEL (add_frame_lb), TRUE);
1114 g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_add_key_ok_bt_clicked), add_key_window );
1115 g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), add_key_window );
1116 g_signal_connect(add_type_cb, "changed", G_CALLBACK(on_add_type_cb_changed), add_key_window);
1117 g_signal_connect(add_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), add_key_window);
1118 g_signal_connect(add_key_window, "destroy", G_CALLBACK(on_add_key_w_destroy), data);
1120 /* Add widget data */
1121 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY,key_ls);
1122 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY,selected_item);
1123 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY,add_type_cb);
1124 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY,add_key_te);
1125 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY,add_ssid_te);
1126 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY,add_key_lb);
1127 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY,add_ssid_lb);
1129 gtk_widget_show(add_key_window);
1133 * Edit key window destroy callback
1136 on_edit_key_w_destroy(GtkWidget *button _U_, gpointer data)
1138 GtkWidget *airpcap_advanced_w;
1140 airpcap_advanced_w = GTK_WIDGET(data);
1142 gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
1148 * Add key window destroy callback
1151 on_add_key_w_destroy(GtkWidget *button _U_, gpointer data)
1153 GtkWidget *airpcap_advanced_w;
1155 airpcap_advanced_w = GTK_WIDGET(data);
1157 gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
1163 * Callback for the 'Remove Key' button.
1166 on_remove_key_bt_clicked(GtkWidget *button _U_, gpointer data)
1169 GtkWidget *airpcap_advanced_w;
1173 airpcap_key_ls_selected_info_t *selected_item;
1175 gint c = NO_COLUMN_SELECTED;
1176 gint r = NO_ROW_SELECTED;
1178 airpcap_advanced_w = GTK_WIDGET(data);
1180 /* retrieve needed stuff */
1181 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1182 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1185 * Better to store the selected_item data in two new variables, because maybe some
1186 * select_row signal will be emitted somewhere...
1188 r = selected_item->row;
1189 c = selected_item->column;
1191 keys_in_list = GTK_CLIST(key_ls)->rows;
1193 if ( r == NO_ROW_SELECTED ) /* No key selected */
1196 /* Remove selected key */
1197 gtk_clist_remove(GTK_CLIST(key_ls),r);
1199 /* Reselect another row, if any... */
1200 if ( r < (keys_in_list-1) )
1201 gtk_clist_select_row(GTK_CLIST(key_ls),r,c);
1203 gtk_clist_select_row(GTK_CLIST(key_ls),r-1,c);
1205 /* Need to save config... */
1206 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
1210 * Callback for the 'Edit Key' button.
1213 on_edit_key_bt_clicked(GtkWidget *button _U_, gpointer data)
1215 GtkWidget *edit_key_window;
1216 GtkWidget *edit_frame;
1217 GtkWidget *main_v_box;
1219 GtkWidget *edit_frame_al;
1220 GtkWidget *edit_type_cb;
1221 GtkWidget *edit_key_te;
1222 GtkWidget *edit_ssid_te;
1223 GtkWidget *edit_type_lb;
1224 GtkWidget *edit_key_lb;
1225 GtkWidget *edit_ssid_lb;
1226 GtkWidget *low_h_button_box;
1228 GtkWidget *cancel_bt;
1229 GtkWidget *edit_frame_lb;
1231 GtkWidget *airpcap_advanced_w;
1233 /* Key List Widget */
1236 /* Selected entry in the key list (if any)*/
1237 airpcap_key_ls_selected_info_t* selected_item;
1245 airpcap_advanced_w = GTK_WIDGET(data);
1247 /* Retrieve the selected item... if no row is selected, this is null... */
1248 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1250 r = selected_item->row;
1251 c = selected_item->column;
1253 /* Retrieve the key list widget pointer, and add it to the edit_key_w */
1254 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1256 if ((r != NO_ROW_SELECTED) && (c != NO_COLUMN_SELECTED))
1258 gtk_clist_get_text(GTK_CLIST(key_ls),r,0,&row_type);
1259 gtk_clist_get_text(GTK_CLIST(key_ls),r,1,&row_key);
1260 gtk_clist_get_text(GTK_CLIST(key_ls),r,2,&row_ssid);
1262 /* Gray out the Advanced Wireless Setting window */
1263 gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
1265 /* Pop-up a new window */
1266 edit_key_window = window_new (GTK_WINDOW_TOPLEVEL, "Edit Decryption Key");
1267 gtk_widget_set_name (edit_key_window, "edit_key_window");
1268 gtk_container_set_border_width (GTK_CONTAINER (edit_key_window), 5);
1269 gtk_window_set_resizable (GTK_WINDOW (edit_key_window), FALSE);
1271 main_v_box = gtk_vbox_new (FALSE, 0);
1272 gtk_widget_set_name (main_v_box, "main_v_box");
1273 gtk_widget_show (main_v_box);
1274 gtk_container_add (GTK_CONTAINER (edit_key_window), main_v_box);
1276 edit_frame = gtk_frame_new (NULL);
1277 gtk_widget_set_name (edit_frame, "edit_frame");
1278 gtk_widget_show (edit_frame);
1279 gtk_box_pack_start (GTK_BOX (main_v_box), edit_frame, TRUE, TRUE, 0);
1281 edit_frame_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1282 gtk_widget_set_name (edit_frame_al, "edit_frame_al");
1283 gtk_widget_show (edit_frame_al);
1284 gtk_container_add (GTK_CONTAINER (edit_frame), edit_frame_al);
1285 gtk_alignment_set_padding (GTK_ALIGNMENT (edit_frame_al), 0, 0, 12, 0);
1287 edit_tb = gtk_table_new (2, 3, FALSE);
1288 gtk_widget_set_name (edit_tb, "edit_tb");
1289 gtk_container_set_border_width(GTK_CONTAINER(edit_tb),5);
1290 gtk_widget_show (edit_tb);
1291 gtk_container_add (GTK_CONTAINER (edit_frame_al), edit_tb);
1293 edit_type_cb = gtk_combo_box_new_text();
1294 gtk_combo_box_append_text(GTK_COMBO_BOX(edit_type_cb), AIRPCAP_WEP_KEY_STRING);
1296 #ifdef HAVE_AIRPDCAP
1297 gtk_combo_box_append_text(GTK_COMBO_BOX(edit_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
1298 gtk_combo_box_append_text(GTK_COMBO_BOX(edit_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
1300 /* Set current type */
1301 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 0);
1302 #ifdef HAVE_AIRPDCAP
1303 if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_PWD_KEY_STRING) == 0) {
1304 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 1);
1305 } else if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_BIN_KEY_STRING) == 0) {
1306 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 2);
1309 gtk_widget_set_name (edit_type_cb, "edit_type_cb");
1310 gtk_widget_show (edit_type_cb);
1311 gtk_table_attach (GTK_TABLE (edit_tb), edit_type_cb, 0, 1, 1, 2,
1312 (GtkAttachOptions) (GTK_FILL),
1313 (GtkAttachOptions) (0), 0, 0);
1314 gtk_widget_set_size_request (edit_type_cb, 83, -1);
1316 edit_key_te = gtk_entry_new ();
1317 gtk_widget_set_name (edit_key_te, "edit_key_te");
1318 /* Set current key */
1319 gtk_entry_set_text(GTK_ENTRY(edit_key_te),row_key);
1320 gtk_widget_show (edit_key_te);
1321 gtk_table_attach (GTK_TABLE (edit_tb), edit_key_te, 1, 2, 1, 2,
1322 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1323 gtk_widget_set_size_request (edit_key_te, 178, -1);
1325 edit_ssid_te = gtk_entry_new ();
1326 gtk_widget_set_name (edit_ssid_te, "edit_ssid_te");
1328 /* Set current ssid (if key type is not WEP!)*/
1329 if (g_ascii_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
1331 gtk_widget_set_sensitive(edit_ssid_te,FALSE);
1335 gtk_widget_set_sensitive(edit_ssid_te,TRUE);
1336 gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),row_ssid);
1339 /* XXX - Decomment only when WPA and WPA@ will be ready */
1340 #ifdef HAVE_AIRPDCAP
1341 gtk_widget_show (edit_ssid_te);
1343 gtk_table_attach (GTK_TABLE (edit_tb), edit_ssid_te, 2, 3, 1, 2,
1344 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1346 edit_type_lb = gtk_label_new ("Type");
1347 gtk_widget_set_name (edit_type_lb, "edit_type_lb");
1348 gtk_widget_show (edit_type_lb);
1349 gtk_table_attach (GTK_TABLE (edit_tb), edit_type_lb, 0, 1, 0, 1,
1350 (GtkAttachOptions) (GTK_FILL),
1351 (GtkAttachOptions) (0), 0, 0);
1352 gtk_label_set_justify (GTK_LABEL (edit_type_lb), GTK_JUSTIFY_CENTER);
1354 edit_key_lb = gtk_label_new ("Key");
1355 gtk_widget_set_name (edit_key_lb, "edit_key_lb");
1356 gtk_widget_show (edit_key_lb);
1357 gtk_table_attach (GTK_TABLE (edit_tb), edit_key_lb, 1, 2, 0, 1,
1358 (GtkAttachOptions) (GTK_FILL),
1359 (GtkAttachOptions) (0), 0, 0);
1360 gtk_label_set_justify (GTK_LABEL (edit_key_lb), GTK_JUSTIFY_CENTER);
1362 edit_ssid_lb = gtk_label_new ("");
1363 gtk_widget_set_name (edit_ssid_lb, "edit_ssid_lb");
1364 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1365 gtk_widget_show (edit_ssid_lb);
1366 gtk_table_attach (GTK_TABLE (edit_tb), edit_ssid_lb, 2, 3, 0, 1,
1367 (GtkAttachOptions) (GTK_FILL),
1368 (GtkAttachOptions) (0), 0, 0);
1369 gtk_label_set_justify (GTK_LABEL (edit_ssid_lb), GTK_JUSTIFY_CENTER);
1371 low_h_button_box = gtk_hbutton_box_new ();
1372 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
1373 gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
1374 gtk_widget_show (low_h_button_box);
1375 gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
1376 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
1379 ok_bt = gtk_button_new_with_mnemonic ("OK");
1380 gtk_widget_set_name (ok_bt, "ok_bt");
1381 gtk_widget_show (ok_bt);
1382 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
1383 GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
1385 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
1386 gtk_widget_set_name (cancel_bt, "cancel_bt");
1387 gtk_widget_show (cancel_bt);
1388 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
1389 GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
1391 edit_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
1392 gtk_widget_set_name (edit_frame_lb, "edit_frame_lb");
1393 gtk_widget_show (edit_frame_lb);
1394 gtk_frame_set_label_widget (GTK_FRAME (edit_frame), edit_frame_lb);
1395 gtk_label_set_use_markup (GTK_LABEL (edit_frame_lb), TRUE);
1398 g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_edit_key_ok_bt_clicked), edit_key_window );
1399 g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), edit_key_window );
1400 g_signal_connect(edit_type_cb, "changed", G_CALLBACK(on_edit_type_cb_changed), edit_key_window);
1401 g_signal_connect(edit_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), edit_key_window);
1402 g_signal_connect(edit_key_window, "destroy", G_CALLBACK(on_edit_key_w_destroy), data);
1404 /* Add widget data */
1405 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY,key_ls);
1406 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SELECTED_KEY,selected_item);
1407 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY,edit_type_cb);
1408 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY,edit_key_te);
1409 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY,edit_ssid_te);
1410 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY,edit_key_lb);
1411 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY,edit_ssid_lb);
1413 gtk_widget_show(edit_key_window);
1418 * Callback for the 'Move Key Up' button.
1421 on_move_key_up_bt_clicked(GtkWidget *button _U_, gpointer data)
1423 GtkWidget *airpcap_advanced_w;
1428 airpcap_key_ls_selected_info_t *selected_item;
1430 gint c = NO_COLUMN_SELECTED;
1431 gint r = NO_ROW_SELECTED;
1433 airpcap_advanced_w = GTK_WIDGET(data);
1435 /* retrieve needed stuff */
1436 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1437 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1440 * Better to store the selected_item data in two new variables, because maybe some
1441 * select_row signal will be emitted somewhere...
1443 r = selected_item->row;
1444 c = selected_item->column;
1446 keys_in_list = GTK_CLIST(key_ls)->rows;
1448 if (keys_in_list < 2) /* With less than 2 keys, nothing can be moved ... */
1451 if ( r == 0 ) /* Cannot move up the first row */
1454 /* Move up selected key */
1455 gtk_clist_swap_rows (GTK_CLIST(key_ls),r-1,r);
1458 * Re-select the just moved key... so the user can keep pressing 'Move Key Up'
1459 * without re-select the row...
1461 gtk_clist_select_row (GTK_CLIST(key_ls),r-1,c);
1463 /* Need to save config... */
1464 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
1468 * Callback for the 'Move Key Down' button.
1471 on_move_key_down_bt_clicked(GtkWidget *button _U_, gpointer data)
1473 GtkWidget *airpcap_advanced_w;
1478 airpcap_key_ls_selected_info_t *selected_item;
1480 gint c = NO_COLUMN_SELECTED;
1481 gint r = NO_ROW_SELECTED;
1483 airpcap_advanced_w = GTK_WIDGET(data);
1485 /* retrieve needed stuff */
1486 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1487 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1490 * Better to store the selected_item data in two new variables, because maybe some
1491 * select_row signal will be emitted somewhere...
1493 r = selected_item->row;
1494 c = selected_item->column;
1496 keys_in_list = GTK_CLIST(key_ls)->rows;
1498 if (keys_in_list < 2) /* With less than 2 keys, nothing can be moved ... */
1501 if ( (r+1) == keys_in_list ) /* Cannot move down the last row */
1504 /* Move down selected key */
1505 gtk_clist_swap_rows (GTK_CLIST(key_ls),r,r+1);
1508 * Re-select the just moved key... so the user can keep pressing 'Move Key Down'
1509 * without re-select the row...
1511 gtk_clist_select_row (GTK_CLIST(key_ls),r+1,c);
1513 /* Need to save config... */
1514 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
1517 /* Turns the decryption on or off */
1519 on_decryption_mode_cb_changed(GtkWidget *cb, gpointer data _U_)
1527 cur_active = gtk_combo_box_get_active(GTK_COMBO_BOX(cb));
1529 if (cur_active < 0) {
1533 switch(cur_active) {
1534 /* XXX - Don't use magic numbers here */
1535 case 1: /* Wireshark */
1536 set_wireshark_decryption(TRUE);
1537 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
1539 case 2: /* Driver */
1540 set_wireshark_decryption(FALSE);
1541 if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
1544 set_wireshark_decryption(FALSE);
1545 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
1549 /* Redissect all the packets, and re-evaluate the display filter. */
1550 redissect_packets();
1554 * Selects the current decryption mode string in the decryption mode combo box
1557 update_decryption_mode(GtkWidget *cb)
1563 /* Wireshark decryption is on */
1564 if (wireshark_decryption_on())
1566 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
1568 /* AirPcap decryption is on */
1569 else if (airpcap_decryption_on())
1571 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
1573 /* No decryption enabled */
1576 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
1583 * Creates the list of available decryption modes, depending on the adapters found
1586 update_decryption_mode_list(GtkWidget *cb)
1588 gchar *current_text;
1593 current_text = NULL;
1596 * XXX - Retrieve the current 'decryption mode'. It would be better just block the
1597 * signal handler, but it doesn't work... one of these days I'll try to figure out why...
1599 current_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(cb));
1601 while (gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(cb)), NULL) > 0) {
1602 gtk_combo_box_remove_text(GTK_COMBO_BOX(cb), 0);
1605 gtk_combo_box_append_text(GTK_COMBO_BOX(cb), AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
1606 gtk_combo_box_append_text(GTK_COMBO_BOX(cb), AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK);
1608 if (airpcap_if_list != NULL && g_list_length(airpcap_if_list) > 0)
1610 gtk_combo_box_append_text(GTK_COMBO_BOX(cb), AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP);
1614 /* The last decryption mode was 'Driver', but no more AirPcap adapter are found */
1615 if (g_ascii_strcasecmp(current_text,AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
1617 g_free(current_text);
1618 current_text = g_strdup(AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
1622 if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0) {
1623 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
1624 } else if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0) {
1625 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
1626 } else { /* None / Invalid */
1627 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
1630 g_free(current_text);
1633 /* Called to create the airpcap settings' window */
1635 display_airpcap_advanced_cb(GtkWidget *w _U_, gpointer data)
1637 GtkWidget *airpcap_advanced_w;
1638 GtkWidget *main_box;
1639 GtkWidget *settings_sub_box;
1640 GtkWidget *interface_fr;
1641 GtkWidget *interface_al;
1642 GtkWidget *interface_sub_h_box;
1643 GtkWidget *interface_name_lb;
1644 GtkWidget *blink_bt;
1645 GtkWidget *interface_frame_lb;
1646 GtkWidget *basic_parameters_fr;
1647 GtkWidget *basic_parameters_al;
1648 GtkWidget *basic_parameters_tb;
1649 GtkWidget *channel_lb;
1650 GtkWidget *channel_offset_lb;
1651 GtkWidget *capture_type_lb;
1652 GtkWidget *channel_cb;
1653 GtkWidget *channel_offset_cb;
1654 GtkWidget *capture_type_cb;
1656 GtkWidget *basic_parameters_fcs_h_box;
1657 GtkWidget *basic_parameters_fcs_filter_lb;
1658 GtkWidget *fcs_filter_cb;
1659 GtkWidget *basic_parameters_frame_lb;
1660 GtkWidget *low_buttons_h_box;
1661 GtkWidget *left_h_button_box;
1662 GtkWidget *reset_configuration_bt;
1663 GtkWidget *right_h_button_box;
1665 GtkWidget *apply_bt;
1666 GtkWidget *cancel_bt;
1668 /* widgets in the toolbar */
1671 *toolbar_channel_cb,
1672 *toolbar_wrong_crc_cb;
1674 /* user data - RETRIEVE pointers of toolbar widgets */
1675 toolbar = GTK_WIDGET(data);
1676 toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
1677 toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
1678 toolbar_wrong_crc_cb= GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
1680 /* gray out the toolbar */
1681 gtk_widget_set_sensitive(toolbar,FALSE);
1686 /* the selected is the active, for now */
1687 airpcap_if_selected = airpcap_if_active;
1689 /* Create the new window */
1690 airpcap_advanced_w = dlg_window_new("Advanced Wireless Settings"); /* transient_for top_level */
1691 gtk_window_set_destroy_with_parent (GTK_WINDOW(airpcap_advanced_w), TRUE);
1693 gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 5);
1694 gtk_window_set_position (GTK_WINDOW (airpcap_advanced_w),
1695 GTK_WIN_POS_CENTER);
1697 gtk_window_set_resizable (GTK_WINDOW (airpcap_advanced_w), FALSE);
1698 gtk_window_set_type_hint (GTK_WINDOW (airpcap_advanced_w), GDK_WINDOW_TYPE_HINT_DIALOG);
1700 main_box = gtk_vbox_new (FALSE, 0);
1701 gtk_widget_set_name (main_box, "main_box");
1702 gtk_widget_show (main_box);
1703 gtk_container_add (GTK_CONTAINER (airpcap_advanced_w), main_box);
1705 settings_sub_box = gtk_vbox_new (FALSE, 0);
1706 gtk_widget_set_name (settings_sub_box, "settings_sub_box");
1707 gtk_widget_show (settings_sub_box);
1708 gtk_box_pack_start (GTK_BOX (main_box), settings_sub_box, FALSE, TRUE, 0);
1710 interface_fr = gtk_frame_new (NULL);
1711 gtk_widget_set_name (interface_fr, "interface_fr");
1712 gtk_widget_show (interface_fr);
1713 gtk_box_pack_start (GTK_BOX (settings_sub_box), interface_fr, FALSE, FALSE,
1715 gtk_container_set_border_width (GTK_CONTAINER (interface_fr), 10);
1717 interface_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1718 gtk_widget_set_name (interface_al, "interface_al");
1719 gtk_widget_show (interface_al);
1720 gtk_container_add (GTK_CONTAINER (interface_fr), interface_al);
1721 gtk_alignment_set_padding (GTK_ALIGNMENT (interface_al), 5, 5, 0, 0);
1723 interface_sub_h_box = gtk_hbox_new (FALSE, 0);
1724 gtk_widget_set_name (interface_sub_h_box, "interface_sub_h_box");
1725 gtk_widget_show (interface_sub_h_box);
1726 gtk_container_add (GTK_CONTAINER (interface_al), interface_sub_h_box);
1727 gtk_container_set_border_width (GTK_CONTAINER (interface_sub_h_box), 5);
1729 /* Fill the interface_box */
1730 if (airpcap_if_active != NULL)
1732 interface_name_lb = gtk_label_new(airpcap_if_active->description);
1736 interface_name_lb = gtk_label_new("No airpcap interface found!");
1737 gtk_widget_set_sensitive(main_box,FALSE);
1740 gtk_widget_set_name (interface_name_lb, "interface_name_lb");
1741 gtk_widget_show (interface_name_lb);
1742 gtk_box_pack_start (GTK_BOX (interface_sub_h_box), interface_name_lb, TRUE,
1745 /* If it is NOT the 'Any' Interface */
1746 if (!airpcap_if_is_any(airpcap_if_selected))
1748 blink_bt = gtk_button_new_with_mnemonic ("Blink Led");
1750 else /* It is the any interface, so it doesn't make sense to have 'Blink' button... */
1752 blink_bt = gtk_button_new_with_mnemonic ("What's This?");
1754 gtk_widget_set_name (blink_bt, "blink_bt");
1755 gtk_widget_show (blink_bt);
1756 gtk_box_pack_end (GTK_BOX (interface_sub_h_box), blink_bt, FALSE, FALSE, 0);
1758 interface_frame_lb = gtk_label_new ("<b>Interface</b>");
1759 gtk_widget_set_name (interface_frame_lb, "interface_frame_lb");
1760 gtk_widget_show (interface_frame_lb);
1761 gtk_frame_set_label_widget (GTK_FRAME (interface_fr), interface_frame_lb);
1762 gtk_label_set_use_markup (GTK_LABEL (interface_frame_lb), TRUE);
1764 basic_parameters_fr = gtk_frame_new (NULL);
1765 gtk_widget_set_name (basic_parameters_fr, "basic_parameters_fr");
1766 gtk_widget_show (basic_parameters_fr);
1767 gtk_box_pack_start (GTK_BOX (settings_sub_box), basic_parameters_fr, TRUE,FALSE, 0);
1768 gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_fr), 10);
1770 basic_parameters_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1771 gtk_widget_set_name (basic_parameters_al, "basic_parameters_al");
1772 gtk_widget_show (basic_parameters_al);
1773 gtk_container_add (GTK_CONTAINER (basic_parameters_fr),basic_parameters_al);
1774 gtk_alignment_set_padding (GTK_ALIGNMENT (basic_parameters_al), 10, 10, 0, 0);
1776 basic_parameters_tb = gtk_table_new (2, 3, FALSE);
1777 gtk_widget_set_name (basic_parameters_tb, "basic_parameters_tb");
1778 gtk_widget_show (basic_parameters_tb);
1779 gtk_container_add (GTK_CONTAINER (basic_parameters_al),
1780 basic_parameters_tb);
1781 gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_tb), 5);
1782 gtk_table_set_col_spacings (GTK_TABLE (basic_parameters_tb), 20);
1784 channel_lb = gtk_label_new ("Channel:");
1785 gtk_widget_set_name (channel_lb, "channel_lb");
1786 gtk_widget_show (channel_lb);
1787 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_lb, 0, 1, 0, 1,
1788 (GtkAttachOptions) (GTK_FILL),
1789 (GtkAttachOptions) (0), 0, 0);
1790 gtk_misc_set_alignment (GTK_MISC (channel_lb), 0, 0.5);
1792 capture_type_lb = gtk_label_new ("Capture Type:");
1793 gtk_widget_set_name (capture_type_lb, "capture_type_lb");
1794 gtk_widget_show (capture_type_lb);
1795 gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_lb, 0, 1, 2,
1796 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0),
1798 gtk_misc_set_alignment (GTK_MISC (capture_type_lb), 0, 0.5);
1800 /* Start: Channel offset label */
1801 channel_offset_lb = gtk_label_new ("Channel Offset:");
1802 gtk_widget_set_name (channel_offset_lb, "channel_offset_lb");
1803 gtk_widget_show (channel_offset_lb);
1804 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_lb, 0, 1, 1, 2,
1805 (GtkAttachOptions) (GTK_FILL),
1806 (GtkAttachOptions) (0), 0, 0);
1807 gtk_misc_set_alignment (GTK_MISC (channel_offset_lb), 0, 0.5);
1808 /* End: Channel offset label */
1810 /* Start: Channel offset combo box */
1811 channel_offset_cb = gtk_combo_box_new_text();
1812 gtk_widget_set_name (channel_offset_cb, "channel_offset_cb");
1814 airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, channel_offset_cb, FALSE);
1816 gtk_widget_show(channel_offset_cb);
1818 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_cb, 1, 2, 1, 2,
1819 (GtkAttachOptions) (GTK_FILL),
1820 (GtkAttachOptions) (0), 0, 0);
1821 /* End: Channel offset combo box */
1823 channel_cb = gtk_combo_box_new_text();
1824 gtk_widget_set_name (channel_cb, "channel_cb");
1825 gtk_widget_show (channel_cb);
1826 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_cb, 1, 2, 0, 1,
1827 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1828 (GtkAttachOptions) (0), 0, 0);
1830 /* Select the current channel */
1831 airpcap_update_channel_combo(GTK_WIDGET(channel_cb), airpcap_if_selected);
1833 capture_type_cb = gtk_combo_box_new_text();
1834 gtk_combo_box_append_text(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
1835 gtk_combo_box_append_text(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
1836 if (airpcap_get_dll_state() == AIRPCAP_DLL_OK) {
1837 gtk_combo_box_append_text(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI);
1840 gtk_widget_set_name (capture_type_cb, "capture_type_cb");
1841 gtk_widget_show (capture_type_cb);
1842 gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_cb, 1, 2, 2,
1843 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1844 (GtkAttachOptions) (0), 0, 0);
1846 /* Current interface value */
1847 if (airpcap_if_selected != NULL)
1849 if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO){
1850 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_RADIO);
1851 }else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_PPI){
1852 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_PPI);
1854 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_ONLY);
1858 fcs_ck = gtk_check_button_new_with_label ("Include 802.11 FCS in Frames");
1860 gtk_widget_set_name (fcs_ck, "fcs_ck");
1862 /* Fcs Presence check box */
1863 if (airpcap_if_selected != NULL)
1865 if (airpcap_if_selected->IsFcsPresent)
1866 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),TRUE);
1868 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),FALSE);
1871 gtk_widget_show (fcs_ck);
1872 gtk_table_attach (GTK_TABLE (basic_parameters_tb), fcs_ck, 2, 3, 0, 1,
1873 (GtkAttachOptions) (GTK_FILL),
1874 (GtkAttachOptions) (0), 0, 0);
1876 basic_parameters_fcs_h_box = gtk_hbox_new (FALSE, 1);
1877 gtk_widget_set_name (basic_parameters_fcs_h_box,
1878 "basic_parameters_fcs_h_box");
1879 gtk_widget_show (basic_parameters_fcs_h_box);
1880 gtk_table_attach (GTK_TABLE (basic_parameters_tb),
1881 basic_parameters_fcs_h_box, 2, 3, 2, 3,
1882 (GtkAttachOptions) (GTK_FILL),
1883 (GtkAttachOptions) (GTK_FILL), 3, 0);
1885 basic_parameters_fcs_filter_lb = gtk_label_new ("FCS Filter:");
1886 gtk_widget_set_name (basic_parameters_fcs_filter_lb,
1887 "basic_parameters_fcs_filter_lb");
1888 gtk_widget_show (basic_parameters_fcs_filter_lb);
1889 gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box),
1890 basic_parameters_fcs_filter_lb, FALSE, FALSE, 0);
1892 fcs_filter_cb = gtk_combo_box_new_text();
1893 gtk_combo_box_append_text(GTK_COMBO_BOX(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_EVERYTHING));
1894 gtk_combo_box_append_text(GTK_COMBO_BOX(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRECT_FRAMES));
1895 gtk_combo_box_append_text(GTK_COMBO_BOX(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES));
1896 gtk_combo_box_set_active(GTK_COMBO_BOX(fcs_filter_cb), 0);
1897 gtk_widget_set_name (fcs_filter_cb, "fcs_filter_cb");
1898 gtk_widget_show (fcs_filter_cb);
1899 gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box), fcs_filter_cb,
1901 gtk_widget_set_size_request (fcs_filter_cb, 112, -1);
1903 if (airpcap_if_selected != NULL)
1905 airpcap_validation_type_combo_set_by_type(fcs_filter_cb, airpcap_if_selected->CrcValidationOn);
1908 basic_parameters_frame_lb = gtk_label_new ("<b>Basic Parameters</b>");
1909 gtk_widget_set_name (basic_parameters_frame_lb,
1910 "basic_parameters_frame_lb");
1911 gtk_widget_show (basic_parameters_frame_lb);
1913 gtk_frame_set_label_widget (GTK_FRAME (basic_parameters_fr),basic_parameters_frame_lb);
1914 gtk_label_set_use_markup (GTK_LABEL (basic_parameters_frame_lb), TRUE);
1916 low_buttons_h_box = gtk_hbox_new (FALSE, 0);
1917 gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
1918 gtk_widget_show (low_buttons_h_box);
1919 gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
1921 left_h_button_box = gtk_hbutton_box_new ();
1922 gtk_widget_set_name (left_h_button_box, "left_h_button_box");
1923 gtk_widget_show (left_h_button_box);
1924 gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
1927 reset_configuration_bt = gtk_button_new_with_mnemonic ("Reset Configuration");
1928 gtk_widget_set_name (reset_configuration_bt, "reset_configuration_bt");
1929 /* gtk_widget_show (reset_configuration_bt); */
1930 gtk_container_add (GTK_CONTAINER (low_buttons_h_box),
1931 reset_configuration_bt);
1932 GTK_WIDGET_SET_FLAGS (reset_configuration_bt, GTK_CAN_DEFAULT);
1934 right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
1935 gtk_widget_show (right_h_button_box);
1936 gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
1938 gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
1941 ok_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
1942 apply_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
1943 cancel_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
1945 /* Connect the callbacks */
1946 g_signal_connect (airpcap_advanced_w, "delete_event", G_CALLBACK(window_delete_event_cb), airpcap_advanced_w);
1947 g_signal_connect (airpcap_advanced_w, "destroy", G_CALLBACK(on_airpcap_advanced_destroy), airpcap_advanced_w);
1949 if (!airpcap_if_is_any(airpcap_if_selected))
1951 g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_blink_bt_clicked), airpcap_advanced_w);
1955 g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_what_s_this_bt_clicked), airpcap_advanced_w);
1958 g_signal_connect (channel_cb, "changed", G_CALLBACK(airpcap_channel_changed_noset_cb), channel_offset_cb);
1959 /* We don't attach the channel offset combo because we don't want it changing anything yet. */
1960 g_signal_connect (capture_type_cb, "changed", G_CALLBACK(on_capture_type_cb_changed), airpcap_advanced_w);
1961 g_signal_connect (fcs_ck, "toggled", G_CALLBACK(on_fcs_ck_toggled), airpcap_advanced_w);
1962 g_signal_connect (fcs_filter_cb, "changed", G_CALLBACK(on_fcs_filter_cb_changed), NULL);
1963 g_signal_connect (reset_configuration_bt, "clicked", G_CALLBACK(on_reset_configuration_bt_clicked), airpcap_advanced_w);
1964 g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_advanced_apply_bt_clicked), airpcap_advanced_w);
1965 g_signal_connect (ok_bt,"clicked", G_CALLBACK(on_advanced_ok_bt_clicked), airpcap_advanced_w);
1966 g_signal_connect (cancel_bt,"clicked", G_CALLBACK(on_advanced_cancel_bt_clicked), airpcap_advanced_w);
1968 /* Different because the window will be closed ... */
1969 /*window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
1970 window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);*/
1973 /* Store pointers to all widgets, for use by lookup_widget(). */
1974 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_BLINK_KEY, blink_bt);
1975 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_KEY,channel_cb);
1976 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY, channel_offset_cb);
1977 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_type_cb);
1978 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_CHECK_KEY, fcs_ck);
1979 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_FILTER_KEY, fcs_filter_cb);
1980 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
1981 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
1984 * I will need the toolbar and the main widget in some callback,
1985 * so I will add the toolbar pointer to the airpcap_advanced_w
1987 g_object_set_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY,toolbar);
1989 /* At the end, so that it appears completely all together ... */
1990 gtk_widget_show (airpcap_advanced_w);
1994 * Callback for the Wireless Advanced Settings 'Apply' button.
1997 on_advanced_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
1999 /* advenced window */
2000 GtkWidget *airpcap_advanced_w;
2001 GtkWidget *channel_cb, *channel_offset_cb;
2003 /* widgets in the toolbar */
2006 *toolbar_channel_cb,
2007 *toolbar_channel_offset_cb,
2008 *toolbar_fcs_filter_cb;
2010 /* retrieve main window */
2011 airpcap_advanced_w = GTK_WIDGET(data);
2013 /* Set the channel and offset */
2014 channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
2015 channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY));
2016 airpcap_channel_offset_changed_cb(channel_offset_cb, NULL);
2017 airpcap_channel_changed_set_cb(channel_cb, channel_offset_cb);
2020 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
2022 /* retrieve toolbar info */
2023 toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
2024 toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
2025 toolbar_channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY));
2026 toolbar_fcs_filter_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
2028 /* Save the configuration (for all ) */
2029 airpcap_save_selected_if_configuration(airpcap_if_selected);
2031 /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
2032 if ( g_ascii_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
2034 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)));
2035 airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cb),airpcap_if_selected);
2036 airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, toolbar_channel_offset_cb, TRUE);
2037 airpcap_validation_type_combo_set_by_type(toolbar_fcs_filter_cb,airpcap_if_selected->CrcValidationOn);
2042 * Callback for the OK button 'clicked' in the Advanced Wireless Settings window.
2045 on_advanced_ok_bt_clicked(GtkWidget *button _U_, gpointer data)
2047 PAirpcapHandle ad = NULL;
2048 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
2050 /* Retrieve object data */
2051 GtkWidget *airpcap_advanced_w = GTK_WIDGET(data);
2053 if (airpcap_if_selected == NULL) { /* There's not much we can do. */
2054 gtk_widget_destroy(airpcap_advanced_w);
2058 on_advanced_apply_bt_clicked(button, data);
2060 /* Stop blinking our LED */
2061 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
2064 g_source_remove(airpcap_if_selected->tag);
2065 airpcap_if_turn_led_on(ad, 0);
2066 airpcap_if_selected->blinking = FALSE;
2067 airpcap_if_selected->led = TRUE;
2068 airpcap_if_close(ad);
2071 /* Remove GLIB timeout */
2072 g_source_remove(airpcap_if_selected->tag);
2074 gtk_widget_destroy(airpcap_advanced_w);
2078 * Callback for the CANCEL button 'clicked' in the Advanced Wireless Settings window.
2081 on_advanced_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
2083 PAirpcapHandle ad = NULL;
2084 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
2086 /* Retrieve object data */
2087 GtkWidget *airpcap_advanced_w;
2088 GtkWidget *channel_combo;
2089 GtkWidget *capture_combo;
2090 GtkWidget *crc_check;
2091 GtkWidget *wrong_crc_combo;
2092 GtkWidget *blink_bt;
2093 GtkWidget *interface_combo;
2094 GtkWidget *cancel_bt;
2097 /* widgets in the toolbar */
2100 *toolbar_channel_cb,
2101 *toolbar_wrong_crc_cb,
2104 /* Retrieve the GUI object pointers */
2105 airpcap_advanced_w = GTK_WIDGET(data);
2106 interface_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_INTERFACE_KEY));
2107 channel_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
2108 capture_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_LINK_TYPE_KEY));
2109 crc_check = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_FCS_CHECK_KEY));
2110 wrong_crc_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_FCS_FILTER_KEY));
2111 blink_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_BLINK_KEY));
2112 cancel_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CANCEL_KEY));
2113 ok_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_OK_KEY));
2114 advanced_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEY));
2116 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
2118 /* retrieve toolbar info */
2119 toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
2120 toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
2121 toolbar_wrong_crc_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
2123 /* Stop blinking ALL leds (go through the airpcap_if_list) */
2124 if (airpcap_if_selected != NULL)
2126 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
2129 g_source_remove(airpcap_if_selected->tag);
2130 airpcap_if_turn_led_on(ad, 0);
2131 airpcap_if_selected->blinking = FALSE;
2132 airpcap_if_selected->led = TRUE;
2133 airpcap_if_close(ad);
2137 /* reload the configuration!!! Configuration has not been saved but
2138 the corresponding structure has been modified probably...*/
2139 if (!airpcap_if_selected->saved)
2141 airpcap_load_selected_if_configuration(airpcap_if_selected);
2144 gtk_widget_destroy(airpcap_advanced_w);
2147 /* Called to create the key management window */
2149 display_airpcap_key_management_cb(GtkWidget *w _U_, gpointer data)
2151 GtkWidget *key_management_w;
2152 GtkWidget *main_box;
2155 GtkWidget *keys_h_sub_box;
2156 GtkWidget *decryption_mode_tb;
2157 GtkWidget *decryption_mode_lb;
2158 GtkWidget *decryption_mode_cb;
2159 GtkWidget *keys_v_sub_box;
2160 GtkWidget *keys_scrolled_w;
2162 GtkWidget *key_list_decryption_type_col_lb;
2163 GtkWidget *key_list_decryption_key_col_lb;
2164 GtkWidget *key_ls_decryption_ssid_col_lb;
2165 GtkWidget *key_v_button_box;
2166 GtkWidget *add_new_key_bt;
2167 GtkWidget *remove_key_bt;
2168 GtkWidget *edit_key_bt;
2169 GtkWidget *move_key_up_bt;
2170 GtkWidget *move_key_down_bt;
2171 GtkWidget *keys_frame_lb;
2172 GtkWidget *low_buttons_h_box;
2173 GtkWidget *left_h_button_box;
2174 GtkWidget *reset_configuration_bt;
2175 GtkWidget *right_h_button_box;
2177 GtkWidget *apply_bt;
2178 GtkWidget *cancel_bt;
2180 /* widgets in the toolbar */
2182 *toolbar_decryption_ck;
2185 /*GList *channel_list,*capture_list;*/
2186 /*GList *linktype_list = NULL;*/
2188 /* Selected row/column structure */
2189 airpcap_key_ls_selected_info_t *key_ls_selected_item;
2190 key_ls_selected_item = (airpcap_key_ls_selected_info_t*)g_malloc(sizeof(airpcap_key_ls_selected_info_t));
2191 key_ls_selected_item->row = NO_ROW_SELECTED;
2192 key_ls_selected_item->column = NO_COLUMN_SELECTED;
2194 /* user data - RETRIEVE pointers of toolbar widgets */
2195 toolbar = GTK_WIDGET(data);
2196 toolbar_decryption_ck = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
2198 /* gray out the toolbar */
2199 gtk_widget_set_sensitive(toolbar,FALSE);
2204 /* the selected is the active, for now */
2205 airpcap_if_selected = airpcap_if_active;
2207 /* Create the new window */
2208 key_management_w = dlg_window_new("Decryption Key Management"); /* transient_for top_level */
2209 gtk_window_set_destroy_with_parent (GTK_WINDOW(key_management_w), TRUE);
2211 gtk_container_set_border_width (GTK_CONTAINER (key_management_w), 5);
2212 gtk_window_set_position (GTK_WINDOW (key_management_w),
2213 GTK_WIN_POS_CENTER);
2215 gtk_window_set_resizable (GTK_WINDOW (key_management_w), FALSE);
2216 gtk_window_set_type_hint (GTK_WINDOW (key_management_w), GDK_WINDOW_TYPE_HINT_DIALOG);
2218 main_box = gtk_vbox_new (FALSE, 0);
2219 gtk_widget_set_name (main_box, "main_box");
2220 gtk_widget_show (main_box);
2221 gtk_container_add (GTK_CONTAINER (key_management_w), main_box);
2223 keys_fr = gtk_frame_new (NULL);
2224 gtk_widget_set_name (keys_fr, "keys_fr");
2225 gtk_widget_show (keys_fr);
2226 gtk_box_pack_start (GTK_BOX (main_box), keys_fr, FALSE, FALSE, 0);
2227 gtk_container_set_border_width (GTK_CONTAINER (keys_fr), 10);
2229 keys_al = gtk_alignment_new (0.5, 0.5, 1, 1);
2230 gtk_widget_set_name (keys_al, "keys_al");
2231 gtk_widget_show (keys_al);
2232 gtk_container_add (GTK_CONTAINER (keys_fr), keys_al);
2233 gtk_container_set_border_width (GTK_CONTAINER (keys_al), 5);
2235 gtk_alignment_set_padding (GTK_ALIGNMENT (keys_al), 0, 0, 12, 0);
2237 keys_h_sub_box = gtk_vbox_new (FALSE, 0);
2238 gtk_widget_set_name (keys_h_sub_box, "keys_h_sub_box");
2239 gtk_widget_show (keys_h_sub_box);
2240 gtk_container_add (GTK_CONTAINER (keys_al), keys_h_sub_box);
2242 decryption_mode_tb = gtk_table_new (1, 2, FALSE);
2243 gtk_widget_set_name (decryption_mode_tb, "decryption_mode_tb");
2244 gtk_widget_show (decryption_mode_tb);
2245 gtk_box_pack_start (GTK_BOX (keys_h_sub_box), decryption_mode_tb, FALSE,
2247 gtk_table_set_col_spacings (GTK_TABLE (decryption_mode_tb), 6);
2249 decryption_mode_lb = gtk_label_new ("Select Decryption Mode");
2250 gtk_widget_set_name (decryption_mode_lb, "decryption_mode_lb");
2251 gtk_widget_show (decryption_mode_lb);
2252 gtk_table_attach (GTK_TABLE (decryption_mode_tb), decryption_mode_lb, 1,
2253 2, 0, 1, (GtkAttachOptions) (GTK_FILL),
2254 (GtkAttachOptions) (0), 0, 0);
2255 gtk_misc_set_alignment (GTK_MISC (decryption_mode_lb), 0, 0.5);
2257 decryption_mode_cb = gtk_combo_box_new_text();
2258 update_decryption_mode_list(decryption_mode_cb);
2259 gtk_widget_set_name (decryption_mode_cb, "decryption_mode_cb");
2260 gtk_widget_show (decryption_mode_cb);
2261 gtk_table_attach (GTK_TABLE (decryption_mode_tb), decryption_mode_cb, 0,
2262 1, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0),
2264 gtk_widget_set_size_request (decryption_mode_cb, 83, -1);
2266 /* Set correct decryption mode!!!! */
2267 update_decryption_mode(decryption_mode_cb);
2269 keys_v_sub_box = gtk_hbox_new (FALSE, 0);
2270 gtk_widget_set_name (keys_v_sub_box, "keys_v_sub_box");
2271 gtk_widget_show (keys_v_sub_box);
2272 gtk_box_pack_start (GTK_BOX (keys_h_sub_box), keys_v_sub_box, TRUE, TRUE, 0);
2274 keys_scrolled_w = gtk_scrolled_window_new (NULL, NULL);
2275 gtk_widget_set_name (keys_scrolled_w, "keys_scrolled_w");
2276 gtk_widget_show (keys_scrolled_w);
2277 gtk_box_pack_start (GTK_BOX (keys_v_sub_box), keys_scrolled_w, TRUE, TRUE,
2279 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (keys_scrolled_w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2281 #ifdef HAVE_AIRPDCAP
2282 key_ls = gtk_clist_new (3);
2284 key_ls = gtk_clist_new (2);
2287 gtk_widget_set_name (key_ls, "key_ls");
2288 gtk_widget_show (key_ls);
2290 gtk_container_add (GTK_CONTAINER (keys_scrolled_w), key_ls);
2291 gtk_clist_set_column_width (GTK_CLIST (key_ls), 0, 54);
2292 gtk_clist_set_column_width (GTK_CLIST (key_ls), 1, 113);
2293 #ifdef HAVE_AIRPDCAP
2294 gtk_clist_set_column_width (GTK_CLIST (key_ls), 2, 80);
2296 gtk_clist_column_titles_show (GTK_CLIST (key_ls));
2297 gtk_clist_set_shadow_type (GTK_CLIST (key_ls), GTK_SHADOW_ETCHED_IN);
2298 gtk_clist_set_column_justification(GTK_CLIST (key_ls),0,GTK_JUSTIFY_CENTER);
2300 key_list_decryption_type_col_lb = gtk_label_new ("Type");
2301 gtk_widget_set_name (key_list_decryption_type_col_lb,
2302 "key_list_decryption_type_col_lb");
2303 gtk_widget_show (key_list_decryption_type_col_lb);
2304 gtk_clist_set_column_widget (GTK_CLIST (key_ls), 0, key_list_decryption_type_col_lb);
2306 key_list_decryption_key_col_lb = gtk_label_new ("Key");
2307 gtk_widget_set_name (key_list_decryption_key_col_lb,
2308 "key_list_decryption_key_col_lb");
2309 gtk_widget_show (key_list_decryption_key_col_lb);
2310 gtk_clist_set_column_widget (GTK_CLIST (key_ls), 1,
2311 key_list_decryption_key_col_lb);
2313 #ifdef HAVE_AIRPDCAP
2314 key_ls_decryption_ssid_col_lb = gtk_label_new ("SSID");
2315 gtk_widget_set_name (key_ls_decryption_ssid_col_lb,
2316 "key_ls_decryption_ssid_col_lb");
2317 gtk_widget_show (key_ls_decryption_ssid_col_lb);
2318 gtk_clist_set_column_widget (GTK_CLIST (key_ls), 2,
2319 key_ls_decryption_ssid_col_lb);
2323 key_v_button_box = gtk_vbutton_box_new ();
2324 gtk_widget_set_name (key_v_button_box, "key_v_button_box");
2325 gtk_widget_show (key_v_button_box);
2326 gtk_box_pack_start (GTK_BOX (keys_v_sub_box), key_v_button_box, FALSE, TRUE,
2329 add_new_key_bt = gtk_button_new_from_stock(GTK_STOCK_NEW);
2330 gtk_widget_set_name (add_new_key_bt, "add_new_key_bt");
2331 gtk_widget_show (add_new_key_bt);
2332 gtk_container_add (GTK_CONTAINER (key_v_button_box), add_new_key_bt);
2333 GTK_WIDGET_SET_FLAGS (add_new_key_bt, GTK_CAN_DEFAULT);
2335 edit_key_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
2336 gtk_widget_set_name (edit_key_bt, "edit_key_bt");
2337 gtk_widget_show (edit_key_bt);
2338 gtk_container_add (GTK_CONTAINER (key_v_button_box), edit_key_bt);
2339 GTK_WIDGET_SET_FLAGS (edit_key_bt, GTK_CAN_DEFAULT);
2341 remove_key_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
2342 gtk_widget_set_name (remove_key_bt, "remove_key_bt");
2343 gtk_widget_show (remove_key_bt);
2344 gtk_container_add (GTK_CONTAINER (key_v_button_box), remove_key_bt);
2345 GTK_WIDGET_SET_FLAGS (remove_key_bt, GTK_CAN_DEFAULT);
2347 move_key_up_bt = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
2348 gtk_widget_set_name (move_key_up_bt, "move_key_up_bt");
2349 gtk_widget_show (move_key_up_bt);
2350 gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_up_bt);
2351 GTK_WIDGET_SET_FLAGS (move_key_up_bt, GTK_CAN_DEFAULT);
2353 move_key_down_bt = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
2354 gtk_widget_set_name (move_key_down_bt, "move_key_down_bt");
2355 gtk_widget_show (move_key_down_bt);
2356 gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_down_bt);
2357 GTK_WIDGET_SET_FLAGS (move_key_down_bt, GTK_CAN_DEFAULT);
2359 keys_frame_lb = gtk_label_new ("<b>Decryption Keys</b>");
2360 gtk_widget_set_name (keys_frame_lb, "keys_frame_lb");
2361 gtk_widget_show (keys_frame_lb);
2363 gtk_frame_set_label_widget (GTK_FRAME (keys_fr), keys_frame_lb);
2364 gtk_label_set_use_markup (GTK_LABEL (keys_frame_lb), TRUE);
2366 low_buttons_h_box = gtk_hbox_new (FALSE, 0);
2367 gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
2368 gtk_widget_show (low_buttons_h_box);
2369 gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
2371 left_h_button_box = gtk_hbutton_box_new ();
2372 gtk_widget_set_name (left_h_button_box, "left_h_button_box");
2373 gtk_widget_show (left_h_button_box);
2374 gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
2377 reset_configuration_bt = gtk_button_new_with_mnemonic ("Reset Configuration");
2378 gtk_widget_set_name (reset_configuration_bt, "reset_configuration_bt");
2379 /* gtk_widget_show (reset_configuration_bt); */
2380 gtk_container_add (GTK_CONTAINER (left_h_button_box),
2381 reset_configuration_bt);
2382 GTK_WIDGET_SET_FLAGS (reset_configuration_bt, GTK_CAN_DEFAULT);
2384 right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
2385 gtk_widget_set_name (right_h_button_box, "right_h_button_box");
2386 gtk_widget_show (right_h_button_box);
2387 gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
2389 gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
2392 ok_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
2393 apply_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
2394 cancel_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
2396 /* Connect the callbacks */
2397 g_signal_connect (key_management_w, "delete_event", G_CALLBACK(window_delete_event_cb), key_management_w);
2398 g_signal_connect (key_management_w, "destroy", G_CALLBACK(on_key_management_destroy), key_management_w);
2399 g_signal_connect (add_new_key_bt, "clicked", G_CALLBACK(on_add_new_key_bt_clicked), key_management_w);
2400 g_signal_connect (remove_key_bt, "clicked", G_CALLBACK(on_remove_key_bt_clicked), key_management_w);
2401 g_signal_connect (edit_key_bt, "clicked", G_CALLBACK(on_edit_key_bt_clicked), key_management_w);
2402 g_signal_connect (move_key_up_bt, "clicked", G_CALLBACK(on_move_key_up_bt_clicked), key_management_w);
2403 g_signal_connect (move_key_down_bt, "clicked", G_CALLBACK(on_move_key_down_bt_clicked), key_management_w);
2404 g_signal_connect (reset_configuration_bt, "clicked", G_CALLBACK(on_reset_configuration_bt_clicked), key_management_w);
2405 g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_key_management_apply_bt_clicked), key_management_w);
2406 g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_key_management_ok_bt_clicked), key_management_w);
2407 g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_key_management_cancel_bt_clicked), key_management_w);
2408 g_signal_connect (key_ls, "select_row", G_CALLBACK(on_key_ls_select_row), key_management_w);
2409 g_signal_connect (key_ls, "unselect_row", G_CALLBACK(on_key_ls_unselect_row), key_management_w);
2410 g_signal_connect (key_ls, "click_column", G_CALLBACK(on_key_ls_click_column), key_management_w);
2412 /* Different because the window will be closed ... */
2413 /*window_set_cancel_button(key_management_w, ok_bt, window_cancel_button_cb);
2414 window_set_cancel_button(key_management_w, cancel_bt, window_cancel_button_cb);*/
2416 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY,key_ls_selected_item);
2418 /* Store pointers to all widgets, for use by lookup_widget(). */
2419 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY, decryption_mode_cb);
2420 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_KEYLIST_KEY, key_ls);
2421 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
2422 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
2425 * I will need the toolbar and the main widget in some callback,
2426 * so I will add the toolbar pointer to the key_management_w
2428 g_object_set_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY,toolbar);
2429 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_TOOLBAR_DECRYPTION_KEY, toolbar_decryption_ck);
2431 /* FIRST OF ALL, CHECK THE KEY COLLECTIONS */
2433 * This will read the decryption keys from the preferences file, and will store
2434 * them into the registry...
2436 if (!airpcap_check_decryption_keys(airpcap_if_list))
2438 /* Ask the user what to do ...*/
2439 airpcap_keys_check_w(key_management_w,NULL);
2441 else /* Keys from lists are equals, or Wireshark has got no keys */
2443 airpcap_load_decryption_keys(airpcap_if_list);
2444 airpcap_fill_key_list(key_ls);
2445 /* At the end, so that it appears completely all together ... */
2446 gtk_widget_show (key_management_w);
2451 * Callback for the OK button 'clicked' in the Decryption Key Management window.
2454 on_key_management_ok_bt_clicked(GtkWidget *button, gpointer data)
2456 /* advanced window */
2457 GtkWidget *key_management_w;
2459 /* retrieve main window */
2460 key_management_w = GTK_WIDGET(data);
2462 /* Apply the current decryption preferences */
2463 on_key_management_apply_bt_clicked(button, data);
2465 /* Save the preferences to preferences file!!! */
2466 write_prefs_to_file();
2468 gtk_widget_destroy(key_management_w);
2472 * Callback for the CANCEL button 'clicked' in the Decryption Key Management window.
2475 on_key_management_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
2477 /* Retrieve object data */
2478 GtkWidget *key_management_w;
2479 GtkWidget *cancel_bt;
2483 /* widgets in the toolbar */
2485 *toolbar_decryption_ck,
2488 /* Row selected structure */
2489 airpcap_key_ls_selected_info_t *selected_item;
2491 /* Retrieve the GUI object pointers */
2492 key_management_w = GTK_WIDGET(data);
2493 cancel_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_CANCEL_KEY));
2494 ok_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_OK_KEY));
2495 key_ls = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY));
2496 key_management_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEY));
2498 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY));
2500 /* retrieve toolbar info */
2501 toolbar_decryption_ck = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
2503 /* Retrieve the selected row item pointer... */
2504 selected_item = (airpcap_key_ls_selected_info_t*)(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY));
2506 g_free(selected_item);
2508 gtk_widget_destroy(key_management_w);
2512 * Dialog box that appears whenever keys are not consistent between Wireshark and AirPcap
2515 airpcap_keys_check_w(GtkWidget *w, gpointer data _U_)
2517 GtkWidget *keys_check_w;
2518 GtkWidget *main_v_box;
2519 GtkWidget *warning_lb;
2520 GtkWidget *radio_tb;
2522 GSList *radio_bt_group = NULL;
2523 GtkWidget *merge_rb;
2524 GtkWidget *import_rb;
2525 GtkWidget *ignore_rb;
2527 GtkWidget *merge_lb;
2528 GtkWidget *import_lb;
2529 GtkWidget *ignore_lb;
2530 GtkWidget *low_h_button_box;
2532 GtkWidget *cancel_bt;
2534 keys_check_w = window_new (GTK_WINDOW_TOPLEVEL, "Decryption Key Warning");
2535 gtk_widget_set_name (keys_check_w, "keys_check_w");
2536 gtk_window_set_resizable (GTK_WINDOW (keys_check_w), FALSE);
2538 main_v_box = gtk_vbox_new (FALSE, 0);
2539 gtk_widget_set_name (main_v_box, "main_v_box");
2540 gtk_widget_show (main_v_box);
2541 gtk_container_add (GTK_CONTAINER (keys_check_w), main_v_box);
2543 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:");
2544 gtk_label_set_use_markup (GTK_LABEL (warning_lb), TRUE);
2545 gtk_widget_set_name (warning_lb, "warning_lb");
2546 gtk_widget_show (warning_lb);
2547 gtk_box_pack_start (GTK_BOX (main_v_box), warning_lb, FALSE, FALSE, 0);
2548 gtk_label_set_justify (GTK_LABEL (warning_lb), GTK_JUSTIFY_CENTER);
2549 gtk_label_set_line_wrap (GTK_LABEL (warning_lb), TRUE);
2551 radio_tb = gtk_table_new (4, 2, FALSE);
2552 gtk_widget_set_name (radio_tb, "radio_tb");
2553 gtk_widget_show (radio_tb);
2554 gtk_box_pack_start (GTK_BOX (main_v_box), radio_tb, TRUE, FALSE, 0);
2555 gtk_container_set_border_width (GTK_CONTAINER (radio_tb), 5);
2556 gtk_table_set_col_spacings (GTK_TABLE (radio_tb), 8);
2558 keep_rb = gtk_radio_button_new_with_mnemonic (NULL, "Keep");
2559 gtk_widget_set_name (keep_rb, "keep_rb");
2560 gtk_widget_show (keep_rb);
2561 gtk_table_attach (GTK_TABLE (radio_tb), keep_rb, 0, 1, 0, 1,
2562 (GtkAttachOptions) (GTK_FILL),
2563 (GtkAttachOptions) (0), 0, 0);
2564 gtk_radio_button_set_group (GTK_RADIO_BUTTON (keep_rb), radio_bt_group);
2565 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (keep_rb));
2567 merge_rb = gtk_radio_button_new_with_mnemonic (NULL, "Merge");
2568 gtk_widget_set_name (merge_rb, "merge_rb");
2569 gtk_widget_show (merge_rb);
2570 gtk_table_attach (GTK_TABLE (radio_tb), merge_rb, 0, 1, 1, 2,
2571 (GtkAttachOptions) (GTK_FILL),
2572 (GtkAttachOptions) (0), 0, 0);
2573 gtk_radio_button_set_group (GTK_RADIO_BUTTON (merge_rb), radio_bt_group);
2574 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (merge_rb));
2576 import_rb = gtk_radio_button_new_with_mnemonic (NULL, "Import");
2577 gtk_widget_set_name (import_rb, "import_rb");
2578 gtk_widget_show (import_rb);
2579 gtk_table_attach (GTK_TABLE (radio_tb), import_rb, 0, 1, 2, 3,
2580 (GtkAttachOptions) (GTK_FILL),
2581 (GtkAttachOptions) (0), 0, 0);
2582 gtk_radio_button_set_group (GTK_RADIO_BUTTON (import_rb), radio_bt_group);
2583 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (import_rb));
2585 ignore_rb = gtk_radio_button_new_with_mnemonic (NULL, "Ignore");
2586 gtk_widget_set_name (ignore_rb, "ignore_rb");
2587 gtk_widget_show (ignore_rb);
2588 gtk_table_attach (GTK_TABLE (radio_tb), ignore_rb, 0, 1, 3, 4,
2589 (GtkAttachOptions) (GTK_FILL),
2590 (GtkAttachOptions) (0), 0, 0);
2591 gtk_radio_button_set_group (GTK_RADIO_BUTTON (ignore_rb), radio_bt_group);
2592 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (ignore_rb));
2596 ("Use Wireshark keys, thus overwriting AirPcap adapter(s) ones.");
2597 gtk_widget_set_name (keep_lb, "keep_lb");
2598 gtk_widget_show (keep_lb);
2599 gtk_table_attach (GTK_TABLE (radio_tb), keep_lb, 1, 2, 0, 1,
2600 (GtkAttachOptions) (GTK_FILL),
2601 (GtkAttachOptions) (0), 0, 0);
2602 gtk_misc_set_alignment (GTK_MISC (keep_lb), 0, 0.5);
2604 merge_lb = gtk_label_new ("Merge Wireshark and AirPcap adapter(s) keys.");
2605 gtk_widget_set_name (merge_lb, "merge_lb");
2606 gtk_widget_show (merge_lb);
2607 gtk_table_attach (GTK_TABLE (radio_tb), merge_lb, 1, 2, 1, 2,
2608 (GtkAttachOptions) (GTK_FILL),
2609 (GtkAttachOptions) (0), 0, 0);
2610 gtk_misc_set_alignment (GTK_MISC (merge_lb), 0, 0.5);
2614 ("Use AirPcap adapter(s) keys, thus overwriting Wireshark ones.");
2615 gtk_widget_set_name (import_lb, "import_lb");
2616 gtk_widget_show (import_lb);
2617 gtk_table_attach (GTK_TABLE (radio_tb), import_lb, 1, 2, 2, 3,
2618 (GtkAttachOptions) (GTK_FILL),
2619 (GtkAttachOptions) (0), 0, 0);
2620 gtk_misc_set_alignment (GTK_MISC (import_lb), 0, 0.5);
2624 ("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.");
2625 gtk_widget_set_name (ignore_lb, "ignore_lb");
2626 gtk_widget_show (ignore_lb);
2627 gtk_table_attach (GTK_TABLE (radio_tb), ignore_lb, 1, 2, 3, 4,
2628 (GtkAttachOptions) (GTK_FILL),
2629 (GtkAttachOptions) (0), 0, 0);
2630 gtk_label_set_line_wrap (GTK_LABEL (ignore_lb), TRUE);
2631 gtk_misc_set_alignment (GTK_MISC (ignore_lb), 0, 0.5);
2633 low_h_button_box = gtk_hbutton_box_new ();
2634 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
2635 gtk_widget_show (low_h_button_box);
2636 gtk_box_pack_start (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE,
2638 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
2639 GTK_BUTTONBOX_SPREAD);
2641 ok_bt = gtk_button_new_with_mnemonic ("OK");
2642 gtk_widget_set_name (ok_bt, "ok_bt");
2643 gtk_widget_show (ok_bt);
2644 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
2645 GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
2647 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
2648 gtk_widget_set_name (cancel_bt, "cancel_bt");
2649 gtk_widget_show (cancel_bt);
2650 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
2651 GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
2653 /* Store pointers to all widgets, for use by lookup_widget(). */
2654 g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_keys_check_ok_bt_clicked), keys_check_w);
2655 g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_keys_check_cancel_bt_clicked), keys_check_w);
2656 g_signal_connect (keys_check_w, "destroy", G_CALLBACK(on_keys_check_w_destroy), keys_check_w);
2658 /* Store pointers to all widgets, for use by lookup_widget(). */
2659 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY,w);
2660 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY,merge_rb);
2661 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY,keep_rb);
2662 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY,import_rb);
2663 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY,ignore_rb);
2664 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_GROUP_KEY,radio_bt_group);
2666 gtk_widget_set_sensitive(top_level,FALSE);
2667 gtk_widget_show(keys_check_w);
2671 on_keys_check_cancel_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2673 GtkWidget *key_management_w;
2674 GtkWidget *keys_check_w;
2677 keys_check_w = GTK_WIDGET(user_data);
2679 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2681 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2682 and is not NULL if it was called when the Key Management widget has been clicked */
2683 if (key_management_w != NULL)
2686 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2687 airpcap_fill_key_list(key_ls);
2688 gtk_widget_show (key_management_w);
2691 gtk_widget_destroy(keys_check_w);
2695 on_keys_check_ok_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2697 GtkWidget *key_management_w;
2698 GtkWidget *keys_check_w;
2700 GtkWidget *merge_rb,
2705 keys_check_w = GTK_WIDGET(user_data);
2707 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2708 merge_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY);
2709 keep_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY);
2710 import_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY);
2711 ignore_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY);
2713 /* Find out which radio button is selected and call the correct function */
2714 if (GTK_TOGGLE_BUTTON(merge_rb)->active) on_merge_bt_clicked (merge_rb,keys_check_w);
2715 else if (GTK_TOGGLE_BUTTON(keep_rb)->active) on_keep_bt_clicked (keep_rb,keys_check_w);
2716 else if (GTK_TOGGLE_BUTTON(import_rb)->active) on_import_bt_clicked (import_rb,keys_check_w);
2717 else if (GTK_TOGGLE_BUTTON(ignore_rb)->active) on_ignore_bt_clicked (ignore_rb,keys_check_w);
2718 else on_keys_check_cancel_bt_clicked(NULL,keys_check_w);
2722 on_keys_check_w_destroy (GtkWidget *w _U_, gpointer user_data)
2724 gtk_widget_set_sensitive(top_level,TRUE);
2725 gtk_widget_set_sensitive(GTK_WIDGET(user_data),TRUE);
2729 on_keep_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2731 GtkWidget *key_management_w;
2732 GtkWidget *keys_check_w;
2733 GtkWidget *key_ls=NULL;
2735 GList* wireshark_keys=NULL;
2736 guint n_wireshark_keys = 0;
2738 GList* merged_keys=NULL;
2739 guint n_merged_keys = 0;
2742 guint n_total_keys=0;
2744 keys_check_w = GTK_WIDGET(user_data);
2746 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2748 n_adapters = g_list_length(airpcap_if_list);
2750 /* Retrieve Wireshark keys */
2751 wireshark_keys = get_wireshark_keys();
2752 n_wireshark_keys = g_list_length(wireshark_keys);
2753 n_total_keys += n_wireshark_keys;
2755 merged_keys = merge_key_list(wireshark_keys,NULL);
2756 n_merged_keys = g_list_length(merged_keys);
2758 /* Set up this new list as default for Wireshark and Adapters... */
2759 airpcap_save_decryption_keys(merged_keys,airpcap_if_list);
2761 /* Write the preferences to the preferences file (here is not needed, by the way)*/
2762 write_prefs_to_file();
2764 /* Free the memory */
2765 free_key_list(wireshark_keys);
2767 /* Close the window */
2768 gtk_widget_destroy(keys_check_w);
2770 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2771 and is not NULL if it was called when the Key Management widget has been clicked */
2772 if (key_management_w != NULL)
2775 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2776 airpcap_fill_key_list(key_ls);
2777 gtk_widget_show (key_management_w);
2782 on_merge_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2784 GtkWidget *key_management_w;
2785 GtkWidget *keys_check_w;
2788 guint n_adapters = 0;
2789 guint n_wireshark_keys = 0;
2790 guint n_driver_keys = 0;
2791 guint n_curr_adapter_keys = 0;
2792 guint n_total_keys = 0;
2793 guint n_merged_keys = 0;
2796 GList* wireshark_keys=NULL;
2797 GList* driver_keys=NULL;
2798 GList* current_adapter_keys=NULL;
2799 GList* merged_list = NULL;
2800 GList* merged_list_tmp = NULL;
2802 airpcap_if_info_t* curr_adapter;
2804 keys_check_w = GTK_WIDGET(user_data);
2806 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2808 n_adapters = g_list_length(airpcap_if_list);
2810 /* Retrieve Wireshark keys */
2811 wireshark_keys = get_wireshark_keys();
2812 n_wireshark_keys = g_list_length(wireshark_keys);
2813 n_total_keys += n_wireshark_keys;
2815 merged_list = merge_key_list(wireshark_keys,NULL);
2817 /* Retrieve AirPcap driver's keys */
2818 driver_keys = get_airpcap_driver_keys();
2819 n_driver_keys = g_list_length(driver_keys);
2820 n_total_keys += n_driver_keys;
2822 merged_list = merge_key_list(merged_list,driver_keys);
2824 /* NOW wireshark_keys and driver_keys ARE no more needed... at the end, we will have to free them! */
2825 for (i = 0; i<n_adapters; i++)
2827 curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2828 current_adapter_keys = get_airpcap_device_keys(curr_adapter);
2829 n_curr_adapter_keys = g_list_length(current_adapter_keys);
2831 merged_list_tmp = merged_list;
2832 merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
2833 free_key_list(merged_list_tmp);
2835 n_total_keys += n_curr_adapter_keys;
2838 n_merged_keys = g_list_length(merged_list);
2840 /* Set up this new list as default for Wireshark and Adapters... */
2841 airpcap_save_decryption_keys(merged_list,airpcap_if_list);
2843 /* Write the preferences to the preferences file */
2844 write_prefs_to_file();
2846 free_key_list(wireshark_keys);
2847 free_key_list(driver_keys);
2849 gtk_widget_destroy(keys_check_w);
2851 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2852 and is not NULL if it was called when the Key Management widget has been clicked */
2853 if (key_management_w != NULL)
2856 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2857 airpcap_fill_key_list(key_ls);
2858 gtk_widget_show (key_management_w);
2864 on_import_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2866 GtkWidget *key_management_w;
2867 GtkWidget *keys_check_w;
2870 guint n_adapters = 0;
2871 guint n_wireshark_keys = 0;
2872 guint n_driver_keys = 0;
2873 guint n_curr_adapter_keys = 0;
2874 guint n_total_keys = 0;
2875 guint n_merged_keys = 0;
2878 GList* wireshark_keys=NULL;
2879 GList* driver_keys=NULL;
2880 GList* current_adapter_keys=NULL;
2881 GList* merged_list = NULL;
2882 GList* merged_list_tmp = NULL;
2884 airpcap_if_info_t* curr_adapter;
2886 keys_check_w = GTK_WIDGET(user_data);
2888 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2890 n_adapters = g_list_length(airpcap_if_list);
2892 wireshark_keys = get_wireshark_keys();
2893 n_wireshark_keys = g_list_length(wireshark_keys);
2894 n_total_keys += n_wireshark_keys;
2896 /* Retrieve AirPcap driver's keys */
2897 driver_keys = get_airpcap_driver_keys();
2898 n_driver_keys = g_list_length(driver_keys);
2899 n_total_keys += n_driver_keys;
2901 merged_list = merge_key_list(merged_list,driver_keys);
2903 /* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
2904 for (i = 0; i<n_adapters; i++)
2906 curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2907 current_adapter_keys = get_airpcap_device_keys(curr_adapter);
2908 n_curr_adapter_keys = g_list_length(current_adapter_keys);
2910 merged_list_tmp = merged_list;
2911 merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
2912 free_key_list(merged_list_tmp);
2914 n_total_keys += n_curr_adapter_keys;
2917 n_merged_keys = g_list_length(merged_list);
2919 /* Set up this new list as default for Wireshark and Adapters... */
2920 airpcap_save_decryption_keys(merged_list,airpcap_if_list);
2922 /* Write the preferences to the preferences file */
2923 write_prefs_to_file();
2925 free_key_list(wireshark_keys);
2926 free_key_list(driver_keys);
2928 gtk_widget_destroy(keys_check_w);
2930 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2931 and is not NULL if it was called when the Key Management widget has been clicked */
2932 if (key_management_w != NULL)
2935 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2936 airpcap_fill_key_list(key_ls);
2937 gtk_widget_show (key_management_w);
2943 on_ignore_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2945 GtkWidget *key_management_w;
2946 GtkWidget *keys_check_w;
2949 keys_check_w = GTK_WIDGET(user_data);
2951 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2953 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2954 and is not NULL if it was called when the Key Management widget has been clicked */
2955 if (key_management_w != NULL)
2958 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2959 airpcap_fill_key_list(key_ls);
2960 gtk_widget_show (key_management_w);
2963 gtk_widget_destroy(keys_check_w);
2967 #endif /* HAVE_AIRPCAP */
2975 * indent-tabs-mode: t
2978 * ex: set shiftwidth=4 tabstop=4 noexpandtab
2979 * :indentSize=4:tabSize=4:noTabs=false: