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 user_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 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 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)
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);
553 g_free(decryption_mode_string);
555 /* Save the configuration */
556 airpcap_read_and_save_decryption_keys_from_clist(key_ls,airpcap_if_selected,airpcap_if_list); /* This will save the keys for every adapter */
558 /* The update will make redissect al the packets... no need to do it here again */
559 update_decryption_mode(toolbar_cb);
561 /* Redissect all the packets, and re-evaluate the display filter. */
562 prefs_apply(wlan_module);
566 * Callback for the 'Reset Configuration' button.
569 on_reset_configuration_bt_clicked(GtkWidget *button _U_, gpointer data _U_)
575 * Callback used to add a WEP key in the add new key box;
578 on_add_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
586 GString *new_type_string,
590 gchar *type_entered = NULL;
591 gchar *key_entered = NULL;
592 gchar *ssid_entered = NULL;
594 airpcap_key_ls_selected_info_t *selected_item;
596 int keys_in_list = 0;
600 gint r = NO_ROW_SELECTED;
601 gint c = NO_COLUMN_SELECTED;
603 key_ls = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY);
604 selected_item = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
605 type_cb = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY);
606 key_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY);
607 ssid_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY);
609 r = selected_item->row;
610 c = selected_item->column;
612 keys_in_list = GTK_CLIST(key_ls)->rows;
614 type_entered = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_cb));
615 key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
616 ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
618 /* Check if key is correct */
619 new_type_string = g_string_new(type_entered);
620 new_key_string = g_string_new(key_entered);
621 new_ssid_string = g_string_new(ssid_entered);
623 g_free(type_entered);
624 g_free(key_entered );
625 g_free(ssid_entered);
627 g_strchug(new_key_string->str);
628 g_strchomp(new_key_string->str);
630 g_strchug(new_ssid_string->str);
631 g_strchomp(new_ssid_string->str);
633 /* Check which type of key the user has entered */
634 if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
637 if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
639 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);
641 g_string_free(new_type_string,TRUE);
642 g_string_free(new_key_string, TRUE);
643 g_string_free(new_ssid_string,TRUE);
648 if ((new_key_string->len % 2) != 0)
650 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
652 g_string_free(new_type_string,TRUE);
653 g_string_free(new_key_string, TRUE);
654 g_string_free(new_ssid_string,TRUE);
659 for (i = 0; i < new_key_string->len; i++)
661 if (!g_ascii_isxdigit(new_key_string->str[i]))
663 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be a hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
665 g_string_free(new_type_string,TRUE);
666 g_string_free(new_key_string, TRUE);
667 g_string_free(new_ssid_string,TRUE);
673 /* If so... add key */
674 airpcap_add_key_to_list(key_ls, new_type_string->str, new_key_string->str, new_ssid_string->str);
676 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
678 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
680 /* XXX - Perform some WPA related input fields check */
681 /* If everything is ok, modify the entry in the list */
683 if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
685 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);
687 g_string_free(new_type_string,TRUE);
688 g_string_free(new_key_string, TRUE);
689 g_string_free(new_ssid_string,TRUE);
695 * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
697 if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
699 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);
701 g_string_free(new_type_string,TRUE);
702 g_string_free(new_key_string, TRUE);
703 g_string_free(new_ssid_string,TRUE);
708 /* If so... add key */
709 airpcap_add_key_to_list(key_ls, new_type_string->str, new_key_string->str, new_ssid_string->str);
711 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
713 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
715 /* XXX - Perform some WPA_BIN related input fields check */
716 /* If everything is ok, modify the entry int he list */
718 if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
720 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);
722 g_string_free(new_type_string,TRUE);
723 g_string_free(new_key_string, TRUE);
724 g_string_free(new_ssid_string,TRUE);
729 for (i = 0; i < new_key_string->len; i++)
731 if (!g_ascii_isxdigit(new_key_string->str[i]))
733 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
735 g_string_free(new_type_string,TRUE);
736 g_string_free(new_key_string, TRUE);
737 g_string_free(new_ssid_string,TRUE);
743 /* If so... add key */
744 airpcap_add_key_to_list(key_ls, new_type_string->str, new_key_string->str, new_ssid_string->str);
746 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
748 else /* Should never happen!!! */
750 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!");
753 g_string_free(new_type_string,TRUE);
754 g_string_free(new_key_string, TRUE);
755 g_string_free(new_ssid_string,TRUE);
757 window_destroy(GTK_WIDGET(data));
762 * Callback used to edit a WEP key in the edit key box;
765 on_edit_key_ok_bt_clicked(GtkWidget *widget _U_, gpointer data)
773 GString *new_type_string,
777 gchar *type_entered = NULL;
778 gchar *key_entered = NULL;
779 gchar *ssid_entered = NULL;
781 airpcap_key_ls_selected_info_t *selected_item;
783 int keys_in_list = 0;
787 gint r = NO_ROW_SELECTED;
788 gint c = NO_COLUMN_SELECTED;
790 key_ls = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY);
791 selected_item = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_SELECTED_KEY);
792 type_cb = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY);
793 key_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY);
794 ssid_en = g_object_get_data(G_OBJECT(data),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY);
796 r = selected_item->row;
797 c = selected_item->column;
799 keys_in_list = GTK_CLIST(key_ls)->rows;
801 type_entered = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_cb));
802 key_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(key_en)));
803 ssid_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(ssid_en)));
805 /* Check if key is correct */
806 new_type_string = g_string_new(type_entered);
807 new_key_string = g_string_new(key_entered);
808 new_ssid_string = g_string_new(ssid_entered);
810 g_free(type_entered);
811 g_free(key_entered );
812 g_free(ssid_entered);
814 g_strchug(new_key_string->str);
815 g_strchomp(new_key_string->str);
817 g_strchug(new_ssid_string->str);
818 g_strchomp(new_ssid_string->str);
820 /* Check which type of key the user has entered */
821 if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WEP_KEY_STRING) == 0) /* WEP key */
824 if ( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WEP_KEY_MIN_CHAR_SIZE))
826 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);
828 g_string_free(new_type_string,TRUE);
829 g_string_free(new_key_string, TRUE);
830 g_string_free(new_ssid_string,TRUE);
835 if ((new_key_string->len % 2) != 0)
837 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nThe number of characters must be even.");
839 g_string_free(new_type_string,TRUE);
840 g_string_free(new_key_string, TRUE);
841 g_string_free(new_ssid_string,TRUE);
846 for (i = 0; i < new_key_string->len; i++)
848 if (!g_ascii_isxdigit(new_key_string->str[i]))
850 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
852 g_string_free(new_type_string,TRUE);
853 g_string_free(new_key_string, TRUE);
854 g_string_free(new_ssid_string,TRUE);
860 /* If so... Modify key */
861 airpcap_modify_key_in_list(key_ls, r, new_type_string->str, new_key_string->str, new_ssid_string->str);
863 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
865 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_PWD_KEY_STRING) == 0) /* WPA Key */
867 /* XXX - Perform some WPA related input fields check */
868 /* If everything is ok, modify the entry in the list */
870 if ( ((new_key_string->len) > WPA_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < WPA_KEY_MIN_CHAR_SIZE))
872 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);
874 g_string_free(new_type_string,TRUE);
875 g_string_free(new_key_string, TRUE);
876 g_string_free(new_ssid_string,TRUE);
882 * XXX - Maybe we need some check on the characters? I'm not sure if only standard ASCII are ok...
884 if ((new_ssid_string->len) > WPA_SSID_MAX_CHAR_SIZE)
886 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);
888 g_string_free(new_type_string,TRUE);
889 g_string_free(new_key_string, TRUE);
890 g_string_free(new_ssid_string,TRUE);
895 /* If so... Modify key */
896 airpcap_modify_key_in_list(key_ls, r, new_type_string->str, new_key_string->str, new_ssid_string->str);
898 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
900 else if (g_ascii_strcasecmp(new_type_string->str,AIRPCAP_WPA_BIN_KEY_STRING) == 0) /* WPA_BIN Key */
902 /* XXX - Perform some WPA_BIN related input fields check */
903 /* If everything is ok, modify the entry in the list */
905 if ( ((new_key_string->len) != WPA_PSK_KEY_CHAR_SIZE))
907 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);
909 g_string_free(new_type_string,TRUE);
910 g_string_free(new_key_string, TRUE);
911 g_string_free(new_ssid_string,TRUE);
916 for (i = 0; i < new_key_string->len; i++)
918 if (!g_ascii_isxdigit(new_key_string->str[i]))
920 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Invalid WPA PSK/PMK key!\nKey must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
922 g_string_free(new_type_string,TRUE);
923 g_string_free(new_key_string, TRUE);
924 g_string_free(new_ssid_string,TRUE);
930 /* If so... Modify key */
931 airpcap_modify_key_in_list(key_ls, r, new_type_string->str, new_key_string->str, new_ssid_string->str);
933 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
935 else /* Should never happen!!! */
937 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Unknown error in the key \"Type\" field!");
940 g_string_free(new_type_string,TRUE);
941 g_string_free(new_key_string, TRUE);
942 g_string_free(new_ssid_string,TRUE);
944 window_destroy(GTK_WIDGET(data));
949 * Callback for the 'Add Key' button.
952 on_add_new_key_bt_clicked(GtkWidget *button _U_, gpointer data)
954 GtkWidget *add_key_window;
955 GtkWidget *add_frame;
956 GtkWidget *main_v_box;
958 GtkWidget *add_frame_al;
959 GtkWidget *add_type_cb;
960 GtkWidget *add_key_te;
961 GtkWidget *add_ssid_te;
962 GtkWidget *add_type_lb;
963 GtkWidget *add_key_lb;
964 GtkWidget *add_ssid_lb;
965 GtkWidget *low_h_button_box;
967 GtkWidget *cancel_bt;
968 GtkWidget *add_frame_lb;
970 GtkWidget *airpcap_advanced_w;
972 /* Key List Widget */
975 gint keys_in_list = 0;
977 /* Selected entry in the key list (if any)*/
978 airpcap_key_ls_selected_info_t* selected_item;
982 airpcap_advanced_w = GTK_WIDGET(data);
984 /* Retrieve the selected item... if no row is selected, this is null... */
985 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
987 r = selected_item->row;
988 c = selected_item->column;
990 /* Retrieve the key list widget pointer, and add it to the add_key_w */
991 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
993 keys_in_list = GTK_CLIST(key_ls)->rows;
995 if (keys_in_list >= MAX_ENCRYPTION_KEYS) /* Check if we have already reached the maximum number of allowed keys... */
997 simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Maximum number (%d) of decryption keys reached! You cannot add another key!\n",MAX_ENCRYPTION_KEYS);
1001 /* Gray out the Advanced Wireless Setting window */
1002 gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
1004 /* Pop-up a new window */
1005 add_key_window = window_new (GTK_WINDOW_TOPLEVEL, "Add Decryption Key");
1006 gtk_widget_set_name (add_key_window, "add_key_window");
1007 gtk_container_set_border_width (GTK_CONTAINER (add_key_window), 5);
1008 gtk_window_set_resizable (GTK_WINDOW (add_key_window), FALSE);
1010 main_v_box = gtk_vbox_new (FALSE, 0);
1011 gtk_widget_set_name (main_v_box, "main_v_box");
1012 gtk_widget_show (main_v_box);
1013 gtk_container_add (GTK_CONTAINER (add_key_window), main_v_box);
1015 add_frame = gtk_frame_new (NULL);
1016 gtk_widget_set_name (add_frame, "add_frame");
1017 gtk_widget_show (add_frame);
1018 gtk_box_pack_start (GTK_BOX (main_v_box), add_frame, TRUE, TRUE, 0);
1020 add_frame_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1021 gtk_widget_set_name (add_frame_al, "add_frame_al");
1022 gtk_widget_show (add_frame_al);
1023 gtk_container_add (GTK_CONTAINER (add_frame), add_frame_al);
1024 gtk_alignment_set_padding (GTK_ALIGNMENT (add_frame_al), 0, 0, 12, 0);
1026 add_tb = gtk_table_new (2, 3, FALSE);
1027 gtk_widget_set_name (add_tb, "add_tb");
1028 gtk_container_set_border_width(GTK_CONTAINER(add_tb),5);
1029 gtk_widget_show (add_tb);
1030 gtk_container_add (GTK_CONTAINER (add_frame_al), add_tb);
1032 add_type_cb = gtk_combo_box_new_text();
1033 gtk_combo_box_append_text(GTK_COMBO_BOX(add_type_cb), AIRPCAP_WEP_KEY_STRING);
1035 #ifdef HAVE_AIRPDCAP
1036 gtk_combo_box_append_text(GTK_COMBO_BOX(add_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
1037 gtk_combo_box_append_text(GTK_COMBO_BOX(add_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
1039 gtk_combo_box_set_active(GTK_COMBO_BOX(add_type_cb), 0);
1040 gtk_widget_set_name (add_type_cb, "add_type_cb");
1041 gtk_widget_show (add_type_cb);
1042 gtk_table_attach (GTK_TABLE (add_tb), add_type_cb, 0, 1, 1, 2,
1043 (GtkAttachOptions) (GTK_FILL),
1044 (GtkAttachOptions) (0), 0, 0);
1045 gtk_widget_set_size_request (add_type_cb, 83, -1);
1047 add_key_te = gtk_entry_new ();
1048 gtk_widget_set_name (add_key_te, "add_key_te");
1050 gtk_widget_show (add_key_te);
1051 gtk_table_attach (GTK_TABLE (add_tb), add_key_te, 1, 2, 1, 2,
1052 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1053 gtk_widget_set_size_request (add_key_te, 178, -1);
1055 add_ssid_te = gtk_entry_new ();
1056 gtk_widget_set_name (add_ssid_te, "add_ssid_te");
1057 gtk_widget_set_sensitive(add_ssid_te,FALSE);
1058 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1059 gtk_widget_show (add_ssid_te);
1060 gtk_table_attach (GTK_TABLE (add_tb), add_ssid_te, 2, 3, 1, 2,
1061 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1063 add_type_lb = gtk_label_new ("Type");
1064 gtk_widget_set_name (add_type_lb, "add_type_lb");
1065 gtk_widget_show (add_type_lb);
1066 gtk_table_attach (GTK_TABLE (add_tb), add_type_lb, 0, 1, 0, 1,
1067 (GtkAttachOptions) (GTK_FILL),
1068 (GtkAttachOptions) (0), 0, 0);
1069 gtk_label_set_justify (GTK_LABEL (add_type_lb), GTK_JUSTIFY_CENTER);
1071 add_key_lb = gtk_label_new ("Key");
1072 gtk_widget_set_name (add_key_lb, "add_key_lb");
1073 gtk_widget_show (add_key_lb);
1074 gtk_table_attach (GTK_TABLE (add_tb), add_key_lb, 1, 2, 0, 1,
1075 (GtkAttachOptions) (GTK_FILL),
1076 (GtkAttachOptions) (0), 0, 0);
1077 gtk_label_set_justify (GTK_LABEL (add_key_lb), GTK_JUSTIFY_CENTER);
1079 add_ssid_lb = gtk_label_new ("");
1080 gtk_widget_set_name (add_ssid_lb, "add_ssid_lb");
1081 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1082 gtk_widget_show (add_ssid_lb);
1083 gtk_table_attach (GTK_TABLE (add_tb), add_ssid_lb, 2, 3, 0, 1,
1084 (GtkAttachOptions) (GTK_FILL),
1085 (GtkAttachOptions) (0), 0, 0);
1086 gtk_label_set_justify (GTK_LABEL (add_ssid_lb), GTK_JUSTIFY_CENTER);
1088 low_h_button_box = gtk_hbutton_box_new ();
1089 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
1090 gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
1091 gtk_widget_show (low_h_button_box);
1092 gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
1093 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
1096 ok_bt = gtk_button_new_with_mnemonic ("OK");
1097 gtk_widget_set_name (ok_bt, "ok_bt");
1098 gtk_widget_show (ok_bt);
1099 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
1100 GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
1102 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
1103 gtk_widget_set_name (cancel_bt, "cancel_bt");
1104 gtk_widget_show (cancel_bt);
1105 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
1106 GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
1108 add_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
1109 gtk_widget_set_name (add_frame_lb, "add_frame_lb");
1110 gtk_widget_show (add_frame_lb);
1111 gtk_frame_set_label_widget (GTK_FRAME (add_frame), add_frame_lb);
1112 gtk_label_set_use_markup (GTK_LABEL (add_frame_lb), TRUE);
1115 g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_add_key_ok_bt_clicked), add_key_window );
1116 g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), add_key_window );
1117 g_signal_connect(add_type_cb, "changed", G_CALLBACK(on_add_type_cb_changed), add_key_window);
1118 g_signal_connect(add_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1119 g_signal_connect(add_key_window, "destroy", G_CALLBACK(on_add_key_w_destroy), data);
1121 /* Add widget data */
1122 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_LIST_KEY,key_ls);
1123 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY,selected_item);
1124 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_TYPE_KEY,add_type_cb);
1125 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_KEY,add_key_te);
1126 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_KEY,add_ssid_te);
1127 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_KEY_LABEL_KEY,add_key_lb);
1128 g_object_set_data(G_OBJECT(add_key_window),AIRPCAP_ADVANCED_ADD_KEY_SSID_LABEL_KEY,add_ssid_lb);
1130 gtk_widget_show(add_key_window);
1134 * Edit key window destroy callback
1137 on_edit_key_w_destroy(GtkWidget *button _U_, gpointer data)
1139 GtkWidget *airpcap_advanced_w;
1141 airpcap_advanced_w = GTK_WIDGET(data);
1143 gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
1149 * Add key window destroy callback
1152 on_add_key_w_destroy(GtkWidget *button _U_, gpointer data)
1154 GtkWidget *airpcap_advanced_w;
1156 airpcap_advanced_w = GTK_WIDGET(data);
1158 gtk_widget_set_sensitive(GTK_WIDGET(airpcap_advanced_w),TRUE);
1164 * Callback for the 'Remove Key' button.
1167 on_remove_key_bt_clicked(GtkWidget *button _U_, gpointer data)
1170 GtkWidget *airpcap_advanced_w;
1174 airpcap_key_ls_selected_info_t *selected_item;
1176 gint c = NO_COLUMN_SELECTED;
1177 gint r = NO_ROW_SELECTED;
1179 airpcap_advanced_w = GTK_WIDGET(data);
1181 /* retrieve needed stuff */
1182 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1183 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1186 * Better to store the selected_item data in two new variables, because maybe some
1187 * select_row signal will be emitted somewhere...
1189 r = selected_item->row;
1190 c = selected_item->column;
1192 keys_in_list = GTK_CLIST(key_ls)->rows;
1194 if ( r == NO_ROW_SELECTED ) /* No key selected */
1197 /* Remove selected key */
1198 gtk_clist_remove(GTK_CLIST(key_ls),r);
1200 /* Reselect another row, if any... */
1201 if ( r < (keys_in_list-1) )
1202 gtk_clist_select_row(GTK_CLIST(key_ls),r,c);
1204 gtk_clist_select_row(GTK_CLIST(key_ls),r-1,c);
1206 /* Need to save config... */
1207 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
1211 * Callback for the 'Edit Key' button.
1214 on_edit_key_bt_clicked(GtkWidget *button _U_, gpointer data)
1216 GtkWidget *edit_key_window;
1217 GtkWidget *edit_frame;
1218 GtkWidget *main_v_box;
1220 GtkWidget *edit_frame_al;
1221 GtkWidget *edit_type_cb;
1222 GtkWidget *edit_key_te;
1223 GtkWidget *edit_ssid_te;
1224 GtkWidget *edit_type_lb;
1225 GtkWidget *edit_key_lb;
1226 GtkWidget *edit_ssid_lb;
1227 GtkWidget *low_h_button_box;
1229 GtkWidget *cancel_bt;
1230 GtkWidget *edit_frame_lb;
1232 GtkWidget *airpcap_advanced_w;
1234 /* Key List Widget */
1237 /* Selected entry in the key list (if any)*/
1238 airpcap_key_ls_selected_info_t* selected_item;
1246 airpcap_advanced_w = GTK_WIDGET(data);
1248 /* Retrieve the selected item... if no row is selected, this is null... */
1249 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1251 r = selected_item->row;
1252 c = selected_item->column;
1254 /* Retrieve the key list widget pointer, and add it to the edit_key_w */
1255 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1257 if ((r != NO_ROW_SELECTED) && (c != NO_COLUMN_SELECTED))
1259 gtk_clist_get_text(GTK_CLIST(key_ls),r,0,&row_type);
1260 gtk_clist_get_text(GTK_CLIST(key_ls),r,1,&row_key);
1261 gtk_clist_get_text(GTK_CLIST(key_ls),r,2,&row_ssid);
1263 /* Gray out the Advanced Wireless Setting window */
1264 gtk_widget_set_sensitive(airpcap_advanced_w,FALSE);
1266 /* Pop-up a new window */
1267 edit_key_window = window_new (GTK_WINDOW_TOPLEVEL, "Edit Decryption Key");
1268 gtk_widget_set_name (edit_key_window, "edit_key_window");
1269 gtk_container_set_border_width (GTK_CONTAINER (edit_key_window), 5);
1270 gtk_window_set_resizable (GTK_WINDOW (edit_key_window), FALSE);
1272 main_v_box = gtk_vbox_new (FALSE, 0);
1273 gtk_widget_set_name (main_v_box, "main_v_box");
1274 gtk_widget_show (main_v_box);
1275 gtk_container_add (GTK_CONTAINER (edit_key_window), main_v_box);
1277 edit_frame = gtk_frame_new (NULL);
1278 gtk_widget_set_name (edit_frame, "edit_frame");
1279 gtk_widget_show (edit_frame);
1280 gtk_box_pack_start (GTK_BOX (main_v_box), edit_frame, TRUE, TRUE, 0);
1282 edit_frame_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1283 gtk_widget_set_name (edit_frame_al, "edit_frame_al");
1284 gtk_widget_show (edit_frame_al);
1285 gtk_container_add (GTK_CONTAINER (edit_frame), edit_frame_al);
1286 gtk_alignment_set_padding (GTK_ALIGNMENT (edit_frame_al), 0, 0, 12, 0);
1288 edit_tb = gtk_table_new (2, 3, FALSE);
1289 gtk_widget_set_name (edit_tb, "edit_tb");
1290 gtk_container_set_border_width(GTK_CONTAINER(edit_tb),5);
1291 gtk_widget_show (edit_tb);
1292 gtk_container_add (GTK_CONTAINER (edit_frame_al), edit_tb);
1294 edit_type_cb = gtk_combo_box_new_text();
1295 gtk_combo_box_append_text(GTK_COMBO_BOX(edit_type_cb), AIRPCAP_WEP_KEY_STRING);
1297 #ifdef HAVE_AIRPDCAP
1298 gtk_combo_box_append_text(GTK_COMBO_BOX(edit_type_cb), AIRPCAP_WPA_PWD_KEY_STRING);
1299 gtk_combo_box_append_text(GTK_COMBO_BOX(edit_type_cb), AIRPCAP_WPA_BIN_KEY_STRING);
1301 /* Set current type */
1302 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 0);
1303 #ifdef HAVE_AIRPDCAP
1304 if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_PWD_KEY_STRING) == 0) {
1305 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 1);
1306 } else if (g_ascii_strcasecmp(row_type, AIRPCAP_WPA_BIN_KEY_STRING) == 0) {
1307 gtk_combo_box_set_active(GTK_COMBO_BOX(edit_type_cb), 2);
1310 gtk_widget_set_name (edit_type_cb, "edit_type_cb");
1311 gtk_widget_show (edit_type_cb);
1312 gtk_table_attach (GTK_TABLE (edit_tb), edit_type_cb, 0, 1, 1, 2,
1313 (GtkAttachOptions) (GTK_FILL),
1314 (GtkAttachOptions) (0), 0, 0);
1315 gtk_widget_set_size_request (edit_type_cb, 83, -1);
1317 edit_key_te = gtk_entry_new ();
1318 gtk_widget_set_name (edit_key_te, "edit_key_te");
1319 /* Set current key */
1320 gtk_entry_set_text(GTK_ENTRY(edit_key_te),row_key);
1321 gtk_widget_show (edit_key_te);
1322 gtk_table_attach (GTK_TABLE (edit_tb), edit_key_te, 1, 2, 1, 2,
1323 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1324 gtk_widget_set_size_request (edit_key_te, 178, -1);
1326 edit_ssid_te = gtk_entry_new ();
1327 gtk_widget_set_name (edit_ssid_te, "edit_ssid_te");
1329 /* Set current ssid (if key type is not WEP!)*/
1330 if (g_ascii_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
1332 gtk_widget_set_sensitive(edit_ssid_te,FALSE);
1336 gtk_widget_set_sensitive(edit_ssid_te,TRUE);
1337 gtk_entry_set_text(GTK_ENTRY(edit_ssid_te),row_ssid);
1340 /* XXX - Decomment only when WPA and WPA@ will be ready */
1341 #ifdef HAVE_AIRPDCAP
1342 gtk_widget_show (edit_ssid_te);
1344 gtk_table_attach (GTK_TABLE (edit_tb), edit_ssid_te, 2, 3, 1, 2,
1345 (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0);
1347 edit_type_lb = gtk_label_new ("Type");
1348 gtk_widget_set_name (edit_type_lb, "edit_type_lb");
1349 gtk_widget_show (edit_type_lb);
1350 gtk_table_attach (GTK_TABLE (edit_tb), edit_type_lb, 0, 1, 0, 1,
1351 (GtkAttachOptions) (GTK_FILL),
1352 (GtkAttachOptions) (0), 0, 0);
1353 gtk_label_set_justify (GTK_LABEL (edit_type_lb), GTK_JUSTIFY_CENTER);
1355 edit_key_lb = gtk_label_new ("Key");
1356 gtk_widget_set_name (edit_key_lb, "edit_key_lb");
1357 gtk_widget_show (edit_key_lb);
1358 gtk_table_attach (GTK_TABLE (edit_tb), edit_key_lb, 1, 2, 0, 1,
1359 (GtkAttachOptions) (GTK_FILL),
1360 (GtkAttachOptions) (0), 0, 0);
1361 gtk_label_set_justify (GTK_LABEL (edit_key_lb), GTK_JUSTIFY_CENTER);
1363 edit_ssid_lb = gtk_label_new ("");
1364 gtk_widget_set_name (edit_ssid_lb, "edit_ssid_lb");
1365 /* XXX - Decomment only when WPA and WPA_BIN will be ready */
1366 gtk_widget_show (edit_ssid_lb);
1367 gtk_table_attach (GTK_TABLE (edit_tb), edit_ssid_lb, 2, 3, 0, 1,
1368 (GtkAttachOptions) (GTK_FILL),
1369 (GtkAttachOptions) (0), 0, 0);
1370 gtk_label_set_justify (GTK_LABEL (edit_ssid_lb), GTK_JUSTIFY_CENTER);
1372 low_h_button_box = gtk_hbutton_box_new ();
1373 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
1374 gtk_container_set_border_width (GTK_CONTAINER (low_h_button_box), 5);
1375 gtk_widget_show (low_h_button_box);
1376 gtk_box_pack_end (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE, 0);
1377 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
1380 ok_bt = gtk_button_new_with_mnemonic ("OK");
1381 gtk_widget_set_name (ok_bt, "ok_bt");
1382 gtk_widget_show (ok_bt);
1383 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
1384 GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
1386 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
1387 gtk_widget_set_name (cancel_bt, "cancel_bt");
1388 gtk_widget_show (cancel_bt);
1389 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
1390 GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
1392 edit_frame_lb = gtk_label_new ("<b>Modify Selected Key</b>");
1393 gtk_widget_set_name (edit_frame_lb, "edit_frame_lb");
1394 gtk_widget_show (edit_frame_lb);
1395 gtk_frame_set_label_widget (GTK_FRAME (edit_frame), edit_frame_lb);
1396 gtk_label_set_use_markup (GTK_LABEL (edit_frame_lb), TRUE);
1399 g_signal_connect(ok_bt, "clicked", G_CALLBACK(on_edit_key_ok_bt_clicked), edit_key_window );
1400 g_signal_connect(cancel_bt, "clicked", G_CALLBACK(window_cancel_button_cb), edit_key_window );
1401 g_signal_connect(edit_type_cb, "changed", G_CALLBACK(on_edit_type_cb_changed), edit_key_window);
1402 g_signal_connect(edit_key_window, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1403 g_signal_connect(edit_key_window, "destroy", G_CALLBACK(on_edit_key_w_destroy), data);
1405 /* Add widget data */
1406 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_LIST_KEY,key_ls);
1407 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SELECTED_KEY,selected_item);
1408 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_TYPE_KEY,edit_type_cb);
1409 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_KEY,edit_key_te);
1410 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_KEY,edit_ssid_te);
1411 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_KEY_LABEL_KEY,edit_key_lb);
1412 g_object_set_data(G_OBJECT(edit_key_window),AIRPCAP_ADVANCED_EDIT_KEY_SSID_LABEL_KEY,edit_ssid_lb);
1414 gtk_widget_show(edit_key_window);
1419 * Callback for the 'Move Key Up' button.
1422 on_move_key_up_bt_clicked(GtkWidget *button _U_, gpointer data)
1424 GtkWidget *airpcap_advanced_w;
1429 airpcap_key_ls_selected_info_t *selected_item;
1431 gint c = NO_COLUMN_SELECTED;
1432 gint r = NO_ROW_SELECTED;
1434 airpcap_advanced_w = GTK_WIDGET(data);
1436 /* retrieve needed stuff */
1437 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1438 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1441 * Better to store the selected_item data in two new variables, because maybe some
1442 * select_row signal will be emitted somewhere...
1444 r = selected_item->row;
1445 c = selected_item->column;
1447 keys_in_list = GTK_CLIST(key_ls)->rows;
1449 if (keys_in_list < 2) /* With less than 2 keys, nothing can be moved ... */
1452 if ( r == 0 ) /* Cannot move up the first row */
1455 /* Move up selected key */
1456 gtk_clist_swap_rows (GTK_CLIST(key_ls),r-1,r);
1459 * Re-select the just moved key... so the user can keep pressing 'Move Key Up'
1460 * without re-select the row...
1462 gtk_clist_select_row (GTK_CLIST(key_ls),r-1,c);
1464 /* Need to save config... */
1465 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
1469 * Callback for the 'Move Key Down' button.
1472 on_move_key_down_bt_clicked(GtkWidget *button _U_, gpointer data)
1474 GtkWidget *airpcap_advanced_w;
1479 airpcap_key_ls_selected_info_t *selected_item;
1481 gint c = NO_COLUMN_SELECTED;
1482 gint r = NO_ROW_SELECTED;
1484 airpcap_advanced_w = GTK_WIDGET(data);
1486 /* retrieve needed stuff */
1487 key_ls = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
1488 selected_item = g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY);
1491 * Better to store the selected_item data in two new variables, because maybe some
1492 * select_row signal will be emitted somewhere...
1494 r = selected_item->row;
1495 c = selected_item->column;
1497 keys_in_list = GTK_CLIST(key_ls)->rows;
1499 if (keys_in_list < 2) /* With less than 2 keys, nothing can be moved ... */
1502 if ( (r+1) == keys_in_list ) /* Cannot move down the last row */
1505 /* Move down selected key */
1506 gtk_clist_swap_rows (GTK_CLIST(key_ls),r,r+1);
1509 * Re-select the just moved key... so the user can keep pressing 'Move Key Down'
1510 * without re-select the row...
1512 gtk_clist_select_row (GTK_CLIST(key_ls),r+1,c);
1514 /* Need to save config... */
1515 if (airpcap_if_selected != NULL) airpcap_if_selected->saved = FALSE;
1518 /* Turns the decryption on or off */
1520 on_decryption_mode_cb_changed(GtkWidget *cb, gpointer data _U_)
1528 cur_active = gtk_combo_box_get_active(GTK_COMBO_BOX(cb));
1530 if (cur_active < 0) {
1534 switch(cur_active) {
1535 /* XXX - Don't use magic numbers here */
1536 case 1: /* Wireshark */
1537 set_wireshark_decryption(TRUE);
1538 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
1540 case 2: /* Driver */
1541 set_wireshark_decryption(FALSE);
1542 if (!set_airpcap_decryption(TRUE)) g_warning(CANT_SAVE_ERR_STR);
1545 set_wireshark_decryption(FALSE);
1546 if (!set_airpcap_decryption(FALSE)) g_warning(CANT_SAVE_ERR_STR);
1550 /* Redissect all the packets, and re-evaluate the display filter. */
1551 redissect_packets();
1555 * Selects the current decryption mode string in the decryption mode combo box
1558 update_decryption_mode(GtkWidget *cb)
1564 /* Wireshark decryption is on */
1565 if (wireshark_decryption_on())
1567 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
1569 /* AirPcap decryption is on */
1570 else if (airpcap_decryption_on())
1572 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
1574 /* No decryption enabled */
1577 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
1584 * Creates the list of available decryption modes, depending on the adapters found
1587 update_decryption_mode_list(GtkWidget *cb)
1589 gchar *current_text;
1594 current_text = NULL;
1597 * XXX - Retrieve the current 'decryption mode'. It would be better just block the
1598 * signal handler, but it doesn't work... one of these days I'll try to figure out why...
1600 current_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(cb));
1602 while (gtk_tree_model_iter_n_children(gtk_combo_box_get_model(GTK_COMBO_BOX(cb)), NULL) > 0) {
1603 gtk_combo_box_remove_text(GTK_COMBO_BOX(cb), 0);
1606 gtk_combo_box_append_text(GTK_COMBO_BOX(cb), AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
1607 gtk_combo_box_append_text(GTK_COMBO_BOX(cb), AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK);
1609 if (airpcap_if_list != NULL && g_list_length(airpcap_if_list) > 0)
1611 gtk_combo_box_append_text(GTK_COMBO_BOX(cb), AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP);
1615 /* The last decryption mode was 'Driver', but no more AirPcap adapter are found */
1616 if (g_ascii_strcasecmp(current_text,AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0)
1618 g_free(current_text);
1619 current_text = g_strdup(AIRPCAP_DECRYPTION_TYPE_STRING_NONE);
1623 if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK) == 0) {
1624 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 1);
1625 } else if (g_ascii_strcasecmp(current_text, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP) == 0) {
1626 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 2);
1627 } else { /* None / Invalid */
1628 gtk_combo_box_set_active(GTK_COMBO_BOX(cb), 0);
1631 g_free(current_text);
1634 /* Called to create the airpcap settings' window */
1636 display_airpcap_advanced_cb(GtkWidget *w _U_, gpointer data)
1638 GtkWidget *airpcap_advanced_w;
1639 GtkWidget *main_box;
1640 GtkWidget *settings_sub_box;
1641 GtkWidget *interface_fr;
1642 GtkWidget *interface_al;
1643 GtkWidget *interface_sub_h_box;
1644 GtkWidget *interface_name_lb;
1645 GtkWidget *blink_bt;
1646 GtkWidget *interface_frame_lb;
1647 GtkWidget *basic_parameters_fr;
1648 GtkWidget *basic_parameters_al;
1649 GtkWidget *basic_parameters_tb;
1650 GtkWidget *channel_lb;
1651 GtkWidget *channel_offset_lb;
1652 GtkWidget *capture_type_lb;
1653 GtkWidget *channel_cb;
1654 GtkWidget *channel_offset_cb;
1655 GtkWidget *capture_type_cb;
1657 GtkWidget *basic_parameters_fcs_h_box;
1658 GtkWidget *basic_parameters_fcs_filter_lb;
1659 GtkWidget *fcs_filter_cb;
1660 GtkWidget *basic_parameters_frame_lb;
1661 GtkWidget *low_buttons_h_box;
1662 GtkWidget *left_h_button_box;
1663 GtkWidget *reset_configuration_bt;
1664 GtkWidget *right_h_button_box;
1666 GtkWidget *apply_bt;
1667 GtkWidget *cancel_bt;
1669 /* widgets in the toolbar */
1672 *toolbar_channel_cb,
1673 *toolbar_wrong_crc_cb;
1675 /* user data - RETRIEVE pointers of toolbar widgets */
1676 toolbar = GTK_WIDGET(data);
1677 toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
1678 toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
1679 toolbar_wrong_crc_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
1681 /* gray out the toolbar */
1682 gtk_widget_set_sensitive(toolbar,FALSE);
1687 /* the selected is the active, for now */
1688 airpcap_if_selected = airpcap_if_active;
1690 /* Create the new window */
1691 airpcap_advanced_w = dlg_window_new("Advanced Wireless Settings"); /* transient_for top_level */
1692 gtk_window_set_destroy_with_parent (GTK_WINDOW(airpcap_advanced_w), TRUE);
1694 gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 5);
1695 gtk_window_set_position (GTK_WINDOW (airpcap_advanced_w),
1696 GTK_WIN_POS_CENTER);
1698 gtk_window_set_resizable (GTK_WINDOW (airpcap_advanced_w), FALSE);
1699 gtk_window_set_type_hint (GTK_WINDOW (airpcap_advanced_w), GDK_WINDOW_TYPE_HINT_DIALOG);
1701 main_box = gtk_vbox_new (FALSE, 0);
1702 gtk_widget_set_name (main_box, "main_box");
1703 gtk_widget_show (main_box);
1704 gtk_container_add (GTK_CONTAINER (airpcap_advanced_w), main_box);
1706 settings_sub_box = gtk_vbox_new (FALSE, 0);
1707 gtk_widget_set_name (settings_sub_box, "settings_sub_box");
1708 gtk_widget_show (settings_sub_box);
1709 gtk_box_pack_start (GTK_BOX (main_box), settings_sub_box, FALSE, TRUE, 0);
1711 interface_fr = gtk_frame_new (NULL);
1712 gtk_widget_set_name (interface_fr, "interface_fr");
1713 gtk_widget_show (interface_fr);
1714 gtk_box_pack_start (GTK_BOX (settings_sub_box), interface_fr, FALSE, FALSE,
1716 gtk_container_set_border_width (GTK_CONTAINER (interface_fr), 10);
1718 interface_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1719 gtk_widget_set_name (interface_al, "interface_al");
1720 gtk_widget_show (interface_al);
1721 gtk_container_add (GTK_CONTAINER (interface_fr), interface_al);
1722 gtk_alignment_set_padding (GTK_ALIGNMENT (interface_al), 5, 5, 0, 0);
1724 interface_sub_h_box = gtk_hbox_new (FALSE, 0);
1725 gtk_widget_set_name (interface_sub_h_box, "interface_sub_h_box");
1726 gtk_widget_show (interface_sub_h_box);
1727 gtk_container_add (GTK_CONTAINER (interface_al), interface_sub_h_box);
1728 gtk_container_set_border_width (GTK_CONTAINER (interface_sub_h_box), 5);
1730 /* Fill the interface_box */
1731 if (airpcap_if_active != NULL)
1733 interface_name_lb = gtk_label_new(airpcap_if_active->description);
1737 interface_name_lb = gtk_label_new("No airpcap interface found!");
1738 gtk_widget_set_sensitive(main_box,FALSE);
1741 gtk_widget_set_name (interface_name_lb, "interface_name_lb");
1742 gtk_widget_show (interface_name_lb);
1743 gtk_box_pack_start (GTK_BOX (interface_sub_h_box), interface_name_lb, TRUE,
1746 /* If it is NOT the 'Any' Interface */
1747 if (!airpcap_if_is_any(airpcap_if_selected))
1749 blink_bt = gtk_button_new_with_mnemonic ("Blink Led");
1751 else /* It is the any interface, so it doesn't make sense to have 'Blink' button... */
1753 blink_bt = gtk_button_new_with_mnemonic ("What's This?");
1755 gtk_widget_set_name (blink_bt, "blink_bt");
1756 gtk_widget_show (blink_bt);
1757 gtk_box_pack_end (GTK_BOX (interface_sub_h_box), blink_bt, FALSE, FALSE, 0);
1759 interface_frame_lb = gtk_label_new ("<b>Interface</b>");
1760 gtk_widget_set_name (interface_frame_lb, "interface_frame_lb");
1761 gtk_widget_show (interface_frame_lb);
1762 gtk_frame_set_label_widget (GTK_FRAME (interface_fr), interface_frame_lb);
1763 gtk_label_set_use_markup (GTK_LABEL (interface_frame_lb), TRUE);
1765 basic_parameters_fr = gtk_frame_new (NULL);
1766 gtk_widget_set_name (basic_parameters_fr, "basic_parameters_fr");
1767 gtk_widget_show (basic_parameters_fr);
1768 gtk_box_pack_start (GTK_BOX (settings_sub_box), basic_parameters_fr, TRUE,FALSE, 0);
1769 gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_fr), 10);
1771 basic_parameters_al = gtk_alignment_new (0.5, 0.5, 1, 1);
1772 gtk_widget_set_name (basic_parameters_al, "basic_parameters_al");
1773 gtk_widget_show (basic_parameters_al);
1774 gtk_container_add (GTK_CONTAINER (basic_parameters_fr),basic_parameters_al);
1775 gtk_alignment_set_padding (GTK_ALIGNMENT (basic_parameters_al), 10, 10, 0, 0);
1777 basic_parameters_tb = gtk_table_new (2, 3, FALSE);
1778 gtk_widget_set_name (basic_parameters_tb, "basic_parameters_tb");
1779 gtk_widget_show (basic_parameters_tb);
1780 gtk_container_add (GTK_CONTAINER (basic_parameters_al),
1781 basic_parameters_tb);
1782 gtk_container_set_border_width (GTK_CONTAINER (basic_parameters_tb), 5);
1783 gtk_table_set_col_spacings (GTK_TABLE (basic_parameters_tb), 20);
1785 channel_lb = gtk_label_new ("Channel:");
1786 gtk_widget_set_name (channel_lb, "channel_lb");
1787 gtk_widget_show (channel_lb);
1788 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_lb, 0, 1, 0, 1,
1789 (GtkAttachOptions) (GTK_FILL),
1790 (GtkAttachOptions) (0), 0, 0);
1791 gtk_misc_set_alignment (GTK_MISC (channel_lb), 0, 0.5);
1793 capture_type_lb = gtk_label_new ("Capture Type:");
1794 gtk_widget_set_name (capture_type_lb, "capture_type_lb");
1795 gtk_widget_show (capture_type_lb);
1796 gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_lb, 0, 1, 2,
1797 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0),
1799 gtk_misc_set_alignment (GTK_MISC (capture_type_lb), 0, 0.5);
1801 /* Start: Channel offset label */
1802 channel_offset_lb = gtk_label_new ("Channel Offset:");
1803 gtk_widget_set_name (channel_offset_lb, "channel_offset_lb");
1804 gtk_widget_show (channel_offset_lb);
1805 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_lb, 0, 1, 1, 2,
1806 (GtkAttachOptions) (GTK_FILL),
1807 (GtkAttachOptions) (0), 0, 0);
1808 gtk_misc_set_alignment (GTK_MISC (channel_offset_lb), 0, 0.5);
1809 /* End: Channel offset label */
1811 /* Start: Channel offset combo box */
1812 channel_offset_cb = gtk_combo_box_new_text();
1813 gtk_widget_set_name (channel_offset_cb, "channel_offset_cb");
1815 airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, channel_offset_cb, FALSE);
1817 gtk_widget_show(channel_offset_cb);
1819 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_cb, 1, 2, 1, 2,
1820 (GtkAttachOptions) (GTK_FILL),
1821 (GtkAttachOptions) (0), 0, 0);
1822 /* End: Channel offset combo box */
1824 channel_cb = gtk_combo_box_new_text();
1825 gtk_widget_set_name (channel_cb, "channel_cb");
1826 gtk_widget_show (channel_cb);
1827 gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_cb, 1, 2, 0, 1,
1828 (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1829 (GtkAttachOptions) (0), 0, 0);
1831 /* Select the current channel */
1832 airpcap_update_channel_combo(GTK_WIDGET(channel_cb), airpcap_if_selected);
1834 capture_type_cb = gtk_combo_box_new_text();
1835 gtk_combo_box_append_text(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
1836 gtk_combo_box_append_text(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
1837 if (airpcap_get_dll_state() == AIRPCAP_DLL_OK) {
1838 gtk_combo_box_append_text(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI);
1841 gtk_widget_set_name (capture_type_cb, "capture_type_cb");
1842 gtk_widget_show (capture_type_cb);
1843 gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_cb, 1, 2, 2,
1844 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL),
1845 (GtkAttachOptions) (0), 0, 0);
1847 /* Current interface value */
1848 if (airpcap_if_selected != NULL)
1850 if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO){
1851 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_RADIO);
1852 }else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_PPI){
1853 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_PLUS_PPI);
1855 gtk_combo_box_set_active(GTK_COMBO_BOX(capture_type_cb), AIRPCAP_LINK_TYPE_NUM_802_11_ONLY);
1859 fcs_ck = gtk_check_button_new_with_label ("Include 802.11 FCS in Frames");
1861 gtk_widget_set_name (fcs_ck, "fcs_ck");
1863 /* Fcs Presence check box */
1864 if (airpcap_if_selected != NULL)
1866 if (airpcap_if_selected->IsFcsPresent)
1867 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),TRUE);
1869 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(fcs_ck),FALSE);
1872 gtk_widget_show (fcs_ck);
1873 gtk_table_attach (GTK_TABLE (basic_parameters_tb), fcs_ck, 2, 3, 0, 1,
1874 (GtkAttachOptions) (GTK_FILL),
1875 (GtkAttachOptions) (0), 0, 0);
1877 basic_parameters_fcs_h_box = gtk_hbox_new (FALSE, 1);
1878 gtk_widget_set_name (basic_parameters_fcs_h_box,
1879 "basic_parameters_fcs_h_box");
1880 gtk_widget_show (basic_parameters_fcs_h_box);
1881 gtk_table_attach (GTK_TABLE (basic_parameters_tb),
1882 basic_parameters_fcs_h_box, 2, 3, 2, 3,
1883 (GtkAttachOptions) (GTK_FILL),
1884 (GtkAttachOptions) (GTK_FILL), 3, 0);
1886 basic_parameters_fcs_filter_lb = gtk_label_new ("FCS Filter:");
1887 gtk_widget_set_name (basic_parameters_fcs_filter_lb,
1888 "basic_parameters_fcs_filter_lb");
1889 gtk_widget_show (basic_parameters_fcs_filter_lb);
1890 gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box),
1891 basic_parameters_fcs_filter_lb, FALSE, FALSE, 0);
1893 fcs_filter_cb = gtk_combo_box_new_text();
1894 gtk_combo_box_append_text(GTK_COMBO_BOX(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_EVERYTHING));
1895 gtk_combo_box_append_text(GTK_COMBO_BOX(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRECT_FRAMES));
1896 gtk_combo_box_append_text(GTK_COMBO_BOX(fcs_filter_cb), airpcap_get_validation_name(AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES));
1897 gtk_combo_box_set_active(GTK_COMBO_BOX(fcs_filter_cb), 0);
1898 gtk_widget_set_name (fcs_filter_cb, "fcs_filter_cb");
1899 gtk_widget_show (fcs_filter_cb);
1900 gtk_box_pack_start (GTK_BOX (basic_parameters_fcs_h_box), fcs_filter_cb,
1902 gtk_widget_set_size_request (fcs_filter_cb, 112, -1);
1904 if (airpcap_if_selected != NULL)
1906 airpcap_validation_type_combo_set_by_type(fcs_filter_cb, airpcap_if_selected->CrcValidationOn);
1909 basic_parameters_frame_lb = gtk_label_new ("<b>Basic Parameters</b>");
1910 gtk_widget_set_name (basic_parameters_frame_lb,
1911 "basic_parameters_frame_lb");
1912 gtk_widget_show (basic_parameters_frame_lb);
1914 gtk_frame_set_label_widget (GTK_FRAME (basic_parameters_fr),basic_parameters_frame_lb);
1915 gtk_label_set_use_markup (GTK_LABEL (basic_parameters_frame_lb), TRUE);
1917 low_buttons_h_box = gtk_hbox_new (FALSE, 0);
1918 gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
1919 gtk_widget_show (low_buttons_h_box);
1920 gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
1922 left_h_button_box = gtk_hbutton_box_new ();
1923 gtk_widget_set_name (left_h_button_box, "left_h_button_box");
1924 gtk_widget_show (left_h_button_box);
1925 gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
1928 reset_configuration_bt = gtk_button_new_with_mnemonic ("Reset Configuration");
1929 gtk_widget_set_name (reset_configuration_bt, "reset_configuration_bt");
1930 /* gtk_widget_show (reset_configuration_bt); */
1931 gtk_container_add (GTK_CONTAINER (low_buttons_h_box),
1932 reset_configuration_bt);
1933 GTK_WIDGET_SET_FLAGS (reset_configuration_bt, GTK_CAN_DEFAULT);
1935 right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
1936 gtk_widget_show (right_h_button_box);
1937 gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
1939 gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
1942 ok_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
1943 apply_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
1944 cancel_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
1946 /* Connect the callbacks */
1947 g_signal_connect (airpcap_advanced_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
1948 g_signal_connect (airpcap_advanced_w, "destroy", G_CALLBACK(on_airpcap_advanced_destroy), airpcap_advanced_w);
1950 if (!airpcap_if_is_any(airpcap_if_selected))
1952 g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_blink_bt_clicked), NULL);
1956 g_signal_connect (blink_bt, "clicked", G_CALLBACK(on_what_s_this_bt_clicked), NULL);
1959 g_signal_connect (channel_cb, "changed", G_CALLBACK(airpcap_channel_changed_noset_cb), channel_offset_cb);
1960 /* We don't attach the channel offset combo because we don't want it changing anything yet. */
1961 g_signal_connect (capture_type_cb, "changed", G_CALLBACK(on_capture_type_cb_changed), NULL);
1962 g_signal_connect (fcs_ck, "toggled", G_CALLBACK(on_fcs_ck_toggled), NULL);
1963 g_signal_connect (fcs_filter_cb, "changed", G_CALLBACK(on_fcs_filter_cb_changed), NULL);
1964 g_signal_connect (reset_configuration_bt, "clicked", G_CALLBACK(on_reset_configuration_bt_clicked), NULL);
1965 g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_advanced_apply_bt_clicked), airpcap_advanced_w);
1966 g_signal_connect (ok_bt,"clicked", G_CALLBACK(on_advanced_ok_bt_clicked), airpcap_advanced_w);
1967 g_signal_connect (cancel_bt,"clicked", G_CALLBACK(on_advanced_cancel_bt_clicked), airpcap_advanced_w);
1969 /* Different because the window will be closed ... */
1970 /*window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
1971 window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);*/
1974 /* Store pointers to all widgets, for use by lookup_widget(). */
1975 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_BLINK_KEY, blink_bt);
1976 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_KEY,channel_cb);
1977 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY, channel_offset_cb);
1978 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_type_cb);
1979 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_CHECK_KEY, fcs_ck);
1980 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_FCS_FILTER_KEY, fcs_filter_cb);
1981 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
1982 g_object_set_data (G_OBJECT(airpcap_advanced_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
1985 * I will need the toolbar and the main widget in some callback,
1986 * so I will add the toolbar pointer to the airpcap_advanced_w
1988 g_object_set_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY,toolbar);
1990 /* At the end, so that it appears completely all together ... */
1991 gtk_widget_show (airpcap_advanced_w);
1995 * Callback for the Wireless Advanced Settings 'Apply' button.
1998 on_advanced_apply_bt_clicked(GtkWidget *button _U_, gpointer data)
2000 /* advenced window */
2001 GtkWidget *airpcap_advanced_w;
2002 GtkWidget *channel_cb, *channel_offset_cb;
2004 /* widgets in the toolbar */
2007 *toolbar_channel_cb,
2008 *toolbar_channel_offset_cb,
2009 *toolbar_fcs_filter_cb;
2011 /* retrieve main window */
2012 airpcap_advanced_w = GTK_WIDGET(data);
2014 /* Set the channel and offset */
2015 channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
2016 channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_OFFSET_KEY));
2017 airpcap_channel_offset_changed_cb(channel_offset_cb, NULL);
2018 airpcap_channel_changed_set_cb(channel_cb, channel_offset_cb);
2021 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
2023 /* retrieve toolbar info */
2024 toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
2025 toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
2026 toolbar_channel_offset_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY));
2027 toolbar_fcs_filter_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
2029 /* Save the configuration (for all ) */
2030 airpcap_save_selected_if_configuration(airpcap_if_selected);
2032 /* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
2033 if ( g_ascii_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
2035 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)));
2036 airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cb),airpcap_if_selected);
2037 airpcap_update_channel_offset_combo(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, toolbar_channel_offset_cb, TRUE);
2038 airpcap_validation_type_combo_set_by_type(toolbar_fcs_filter_cb,airpcap_if_selected->CrcValidationOn);
2043 * Callback for the OK button 'clicked' in the Advanced Wireless Settings window.
2046 on_advanced_ok_bt_clicked(GtkWidget *button _U_, gpointer data)
2048 PAirpcapHandle ad = NULL;
2049 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
2051 /* Retrieve object data */
2052 GtkWidget *airpcap_advanced_w = GTK_WIDGET(data);
2054 if (airpcap_if_selected == NULL) { /* There's not much we can do. */
2055 gtk_widget_destroy(airpcap_advanced_w);
2059 on_advanced_apply_bt_clicked(button, data);
2061 /* Stop blinking our LED */
2062 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
2065 g_source_remove(airpcap_if_selected->tag);
2066 airpcap_if_turn_led_on(ad, 0);
2067 airpcap_if_selected->blinking = FALSE;
2068 airpcap_if_selected->led = TRUE;
2069 airpcap_if_close(ad);
2072 /* Remove GLIB timeout */
2073 g_source_remove(airpcap_if_selected->tag);
2075 gtk_widget_destroy(airpcap_advanced_w);
2079 * Callback for the CANCEL button 'clicked' in the Advanced Wireless Settings window.
2082 on_advanced_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
2084 PAirpcapHandle ad = NULL;
2085 gchar ebuf[AIRPCAP_ERRBUF_SIZE];
2087 /* Retrieve object data */
2088 GtkWidget *airpcap_advanced_w;
2089 GtkWidget *channel_combo;
2090 GtkWidget *capture_combo;
2091 GtkWidget *crc_check;
2092 GtkWidget *wrong_crc_combo;
2093 GtkWidget *blink_bt;
2094 GtkWidget *interface_combo;
2095 GtkWidget *cancel_bt;
2098 /* widgets in the toolbar */
2101 *toolbar_channel_cb,
2102 *toolbar_wrong_crc_cb,
2105 /* Retrieve the GUI object pointers */
2106 airpcap_advanced_w = GTK_WIDGET(data);
2107 interface_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_INTERFACE_KEY));
2108 channel_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CHANNEL_KEY));
2109 capture_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_LINK_TYPE_KEY));
2110 crc_check = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_FCS_CHECK_KEY));
2111 wrong_crc_combo = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_FCS_FILTER_KEY));
2112 blink_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_BLINK_KEY));
2113 cancel_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_CANCEL_KEY));
2114 ok_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_OK_KEY));
2115 advanced_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_ADVANCED_KEY));
2117 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(airpcap_advanced_w),AIRPCAP_TOOLBAR_KEY));
2119 /* retrieve toolbar info */
2120 toolbar_if_lb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_INTERFACE_KEY));
2121 toolbar_channel_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_CHANNEL_KEY));
2122 toolbar_wrong_crc_cb = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_FCS_FILTER_KEY));
2124 /* Stop blinking ALL leds (go through the airpcap_if_list) */
2125 if (airpcap_if_selected != NULL)
2127 ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
2130 g_source_remove(airpcap_if_selected->tag);
2131 airpcap_if_turn_led_on(ad, 0);
2132 airpcap_if_selected->blinking = FALSE;
2133 airpcap_if_selected->led = TRUE;
2134 airpcap_if_close(ad);
2138 /* reload the configuration!!! Configuration has not been saved but
2139 the corresponding structure has been modified probably...*/
2140 if (!airpcap_if_selected->saved)
2142 airpcap_load_selected_if_configuration(airpcap_if_selected);
2145 gtk_widget_destroy(airpcap_advanced_w);
2148 /* Called to create the key management window */
2150 display_airpcap_key_management_cb(GtkWidget *w _U_, gpointer data)
2152 GtkWidget *key_management_w;
2153 GtkWidget *main_box;
2156 GtkWidget *keys_h_sub_box;
2157 GtkWidget *decryption_mode_tb;
2158 GtkWidget *decryption_mode_lb;
2159 GtkWidget *decryption_mode_cb;
2160 GtkWidget *keys_v_sub_box;
2161 GtkWidget *keys_scrolled_w;
2163 GtkWidget *key_list_decryption_type_col_lb;
2164 GtkWidget *key_list_decryption_key_col_lb;
2165 #ifdef HAVE_AIRPDCAP
2166 GtkWidget *key_ls_decryption_ssid_col_lb;
2168 GtkWidget *key_v_button_box;
2169 GtkWidget *add_new_key_bt;
2170 GtkWidget *remove_key_bt;
2171 GtkWidget *edit_key_bt;
2172 GtkWidget *move_key_up_bt;
2173 GtkWidget *move_key_down_bt;
2174 GtkWidget *keys_frame_lb;
2175 GtkWidget *low_buttons_h_box;
2176 GtkWidget *left_h_button_box;
2177 GtkWidget *reset_configuration_bt;
2178 GtkWidget *right_h_button_box;
2180 GtkWidget *apply_bt;
2181 GtkWidget *cancel_bt;
2183 /* widgets in the toolbar */
2185 *toolbar_decryption_ck;
2188 /*GList *channel_list,*capture_list;*/
2189 /*GList *linktype_list = NULL;*/
2191 /* Selected row/column structure */
2192 airpcap_key_ls_selected_info_t *key_ls_selected_item;
2193 key_ls_selected_item = (airpcap_key_ls_selected_info_t*)g_malloc(sizeof(airpcap_key_ls_selected_info_t));
2194 key_ls_selected_item->row = NO_ROW_SELECTED;
2195 key_ls_selected_item->column = NO_COLUMN_SELECTED;
2197 /* user data - RETRIEVE pointers of toolbar widgets */
2198 toolbar = GTK_WIDGET(data);
2199 toolbar_decryption_ck = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
2201 /* gray out the toolbar */
2202 gtk_widget_set_sensitive(toolbar,FALSE);
2207 /* the selected is the active, for now */
2208 airpcap_if_selected = airpcap_if_active;
2210 /* Create the new window */
2211 key_management_w = dlg_window_new("Decryption Key Management"); /* transient_for top_level */
2212 gtk_window_set_destroy_with_parent (GTK_WINDOW(key_management_w), TRUE);
2214 gtk_container_set_border_width (GTK_CONTAINER (key_management_w), 5);
2215 gtk_window_set_position (GTK_WINDOW (key_management_w),
2216 GTK_WIN_POS_CENTER);
2218 gtk_window_set_resizable (GTK_WINDOW (key_management_w), FALSE);
2219 gtk_window_set_type_hint (GTK_WINDOW (key_management_w), GDK_WINDOW_TYPE_HINT_DIALOG);
2221 main_box = gtk_vbox_new (FALSE, 0);
2222 gtk_widget_set_name (main_box, "main_box");
2223 gtk_widget_show (main_box);
2224 gtk_container_add (GTK_CONTAINER (key_management_w), main_box);
2226 keys_fr = gtk_frame_new (NULL);
2227 gtk_widget_set_name (keys_fr, "keys_fr");
2228 gtk_widget_show (keys_fr);
2229 gtk_box_pack_start (GTK_BOX (main_box), keys_fr, FALSE, FALSE, 0);
2230 gtk_container_set_border_width (GTK_CONTAINER (keys_fr), 10);
2232 keys_al = gtk_alignment_new (0.5, 0.5, 1, 1);
2233 gtk_widget_set_name (keys_al, "keys_al");
2234 gtk_widget_show (keys_al);
2235 gtk_container_add (GTK_CONTAINER (keys_fr), keys_al);
2236 gtk_container_set_border_width (GTK_CONTAINER (keys_al), 5);
2238 gtk_alignment_set_padding (GTK_ALIGNMENT (keys_al), 0, 0, 12, 0);
2240 keys_h_sub_box = gtk_vbox_new (FALSE, 0);
2241 gtk_widget_set_name (keys_h_sub_box, "keys_h_sub_box");
2242 gtk_widget_show (keys_h_sub_box);
2243 gtk_container_add (GTK_CONTAINER (keys_al), keys_h_sub_box);
2245 decryption_mode_tb = gtk_table_new (1, 2, FALSE);
2246 gtk_widget_set_name (decryption_mode_tb, "decryption_mode_tb");
2247 gtk_widget_show (decryption_mode_tb);
2248 gtk_box_pack_start (GTK_BOX (keys_h_sub_box), decryption_mode_tb, FALSE,
2250 gtk_table_set_col_spacings (GTK_TABLE (decryption_mode_tb), 6);
2252 decryption_mode_lb = gtk_label_new ("Select Decryption Mode");
2253 gtk_widget_set_name (decryption_mode_lb, "decryption_mode_lb");
2254 gtk_widget_show (decryption_mode_lb);
2255 gtk_table_attach (GTK_TABLE (decryption_mode_tb), decryption_mode_lb, 1,
2256 2, 0, 1, (GtkAttachOptions) (GTK_FILL),
2257 (GtkAttachOptions) (0), 0, 0);
2258 gtk_misc_set_alignment (GTK_MISC (decryption_mode_lb), 0, 0.5);
2260 decryption_mode_cb = gtk_combo_box_new_text();
2261 update_decryption_mode_list(decryption_mode_cb);
2262 gtk_widget_set_name (decryption_mode_cb, "decryption_mode_cb");
2263 gtk_widget_show (decryption_mode_cb);
2264 gtk_table_attach (GTK_TABLE (decryption_mode_tb), decryption_mode_cb, 0,
2265 1, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0),
2267 gtk_widget_set_size_request (decryption_mode_cb, 83, -1);
2269 /* Set correct decryption mode!!!! */
2270 update_decryption_mode(decryption_mode_cb);
2272 keys_v_sub_box = gtk_hbox_new (FALSE, 0);
2273 gtk_widget_set_name (keys_v_sub_box, "keys_v_sub_box");
2274 gtk_widget_show (keys_v_sub_box);
2275 gtk_box_pack_start (GTK_BOX (keys_h_sub_box), keys_v_sub_box, TRUE, TRUE, 0);
2277 keys_scrolled_w = gtk_scrolled_window_new (NULL, NULL);
2278 gtk_widget_set_name (keys_scrolled_w, "keys_scrolled_w");
2279 gtk_widget_show (keys_scrolled_w);
2280 gtk_box_pack_start (GTK_BOX (keys_v_sub_box), keys_scrolled_w, TRUE, TRUE,
2282 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (keys_scrolled_w), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
2284 #ifdef HAVE_AIRPDCAP
2285 key_ls = gtk_clist_new (3);
2287 key_ls = gtk_clist_new (2);
2290 gtk_widget_set_name (key_ls, "key_ls");
2291 gtk_widget_show (key_ls);
2293 gtk_container_add (GTK_CONTAINER (keys_scrolled_w), key_ls);
2294 gtk_clist_set_column_width (GTK_CLIST (key_ls), 0, 54);
2295 gtk_clist_set_column_width (GTK_CLIST (key_ls), 1, 113);
2296 #ifdef HAVE_AIRPDCAP
2297 gtk_clist_set_column_width (GTK_CLIST (key_ls), 2, 80);
2299 gtk_clist_column_titles_show (GTK_CLIST (key_ls));
2300 gtk_clist_set_shadow_type (GTK_CLIST (key_ls), GTK_SHADOW_ETCHED_IN);
2301 gtk_clist_set_column_justification(GTK_CLIST (key_ls),0,GTK_JUSTIFY_CENTER);
2303 key_list_decryption_type_col_lb = gtk_label_new ("Type");
2304 gtk_widget_set_name (key_list_decryption_type_col_lb,
2305 "key_list_decryption_type_col_lb");
2306 gtk_widget_show (key_list_decryption_type_col_lb);
2307 gtk_clist_set_column_widget (GTK_CLIST (key_ls), 0, key_list_decryption_type_col_lb);
2309 key_list_decryption_key_col_lb = gtk_label_new ("Key");
2310 gtk_widget_set_name (key_list_decryption_key_col_lb,
2311 "key_list_decryption_key_col_lb");
2312 gtk_widget_show (key_list_decryption_key_col_lb);
2313 gtk_clist_set_column_widget (GTK_CLIST (key_ls), 1,
2314 key_list_decryption_key_col_lb);
2316 #ifdef HAVE_AIRPDCAP
2317 key_ls_decryption_ssid_col_lb = gtk_label_new ("SSID");
2318 gtk_widget_set_name (key_ls_decryption_ssid_col_lb,
2319 "key_ls_decryption_ssid_col_lb");
2320 gtk_widget_show (key_ls_decryption_ssid_col_lb);
2321 gtk_clist_set_column_widget (GTK_CLIST (key_ls), 2,
2322 key_ls_decryption_ssid_col_lb);
2326 key_v_button_box = gtk_vbutton_box_new ();
2327 gtk_widget_set_name (key_v_button_box, "key_v_button_box");
2328 gtk_widget_show (key_v_button_box);
2329 gtk_box_pack_start (GTK_BOX (keys_v_sub_box), key_v_button_box, FALSE, TRUE,
2332 add_new_key_bt = gtk_button_new_from_stock(GTK_STOCK_NEW);
2333 gtk_widget_set_name (add_new_key_bt, "add_new_key_bt");
2334 gtk_widget_show (add_new_key_bt);
2335 gtk_container_add (GTK_CONTAINER (key_v_button_box), add_new_key_bt);
2336 GTK_WIDGET_SET_FLAGS (add_new_key_bt, GTK_CAN_DEFAULT);
2338 edit_key_bt = gtk_button_new_from_stock(WIRESHARK_STOCK_EDIT);
2339 gtk_widget_set_name (edit_key_bt, "edit_key_bt");
2340 gtk_widget_show (edit_key_bt);
2341 gtk_container_add (GTK_CONTAINER (key_v_button_box), edit_key_bt);
2342 GTK_WIDGET_SET_FLAGS (edit_key_bt, GTK_CAN_DEFAULT);
2344 remove_key_bt = gtk_button_new_from_stock(GTK_STOCK_DELETE);
2345 gtk_widget_set_name (remove_key_bt, "remove_key_bt");
2346 gtk_widget_show (remove_key_bt);
2347 gtk_container_add (GTK_CONTAINER (key_v_button_box), remove_key_bt);
2348 GTK_WIDGET_SET_FLAGS (remove_key_bt, GTK_CAN_DEFAULT);
2350 move_key_up_bt = gtk_button_new_from_stock(GTK_STOCK_GO_UP);
2351 gtk_widget_set_name (move_key_up_bt, "move_key_up_bt");
2352 gtk_widget_show (move_key_up_bt);
2353 gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_up_bt);
2354 GTK_WIDGET_SET_FLAGS (move_key_up_bt, GTK_CAN_DEFAULT);
2356 move_key_down_bt = gtk_button_new_from_stock(GTK_STOCK_GO_DOWN);
2357 gtk_widget_set_name (move_key_down_bt, "move_key_down_bt");
2358 gtk_widget_show (move_key_down_bt);
2359 gtk_container_add (GTK_CONTAINER (key_v_button_box), move_key_down_bt);
2360 GTK_WIDGET_SET_FLAGS (move_key_down_bt, GTK_CAN_DEFAULT);
2362 keys_frame_lb = gtk_label_new ("<b>Decryption Keys</b>");
2363 gtk_widget_set_name (keys_frame_lb, "keys_frame_lb");
2364 gtk_widget_show (keys_frame_lb);
2366 gtk_frame_set_label_widget (GTK_FRAME (keys_fr), keys_frame_lb);
2367 gtk_label_set_use_markup (GTK_LABEL (keys_frame_lb), TRUE);
2369 low_buttons_h_box = gtk_hbox_new (FALSE, 0);
2370 gtk_widget_set_name (low_buttons_h_box, "low_buttons_h_box");
2371 gtk_widget_show (low_buttons_h_box);
2372 gtk_box_pack_end (GTK_BOX (main_box), low_buttons_h_box, FALSE, FALSE, 0);
2374 left_h_button_box = gtk_hbutton_box_new ();
2375 gtk_widget_set_name (left_h_button_box, "left_h_button_box");
2376 gtk_widget_show (left_h_button_box);
2377 gtk_box_pack_start (GTK_BOX (low_buttons_h_box), left_h_button_box, FALSE,
2380 reset_configuration_bt = gtk_button_new_with_mnemonic ("Reset Configuration");
2381 gtk_widget_set_name (reset_configuration_bt, "reset_configuration_bt");
2382 /* gtk_widget_show (reset_configuration_bt); */
2383 gtk_container_add (GTK_CONTAINER (left_h_button_box),
2384 reset_configuration_bt);
2385 GTK_WIDGET_SET_FLAGS (reset_configuration_bt, GTK_CAN_DEFAULT);
2387 right_h_button_box = dlg_button_row_new(GTK_STOCK_OK, GTK_STOCK_APPLY, GTK_STOCK_CANCEL, NULL);
2388 gtk_widget_set_name (right_h_button_box, "right_h_button_box");
2389 gtk_widget_show (right_h_button_box);
2390 gtk_box_pack_end (GTK_BOX (low_buttons_h_box), right_h_button_box, FALSE,
2392 gtk_button_box_set_layout (GTK_BUTTON_BOX (right_h_button_box),
2395 ok_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_OK);
2396 apply_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_APPLY);
2397 cancel_bt = g_object_get_data(G_OBJECT(right_h_button_box), GTK_STOCK_CANCEL);
2399 /* Connect the callbacks */
2400 g_signal_connect (key_management_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2401 g_signal_connect (key_management_w, "destroy", G_CALLBACK(on_key_management_destroy), key_management_w);
2402 g_signal_connect (add_new_key_bt, "clicked", G_CALLBACK(on_add_new_key_bt_clicked), key_management_w);
2403 g_signal_connect (remove_key_bt, "clicked", G_CALLBACK(on_remove_key_bt_clicked), key_management_w);
2404 g_signal_connect (edit_key_bt, "clicked", G_CALLBACK(on_edit_key_bt_clicked), key_management_w);
2405 g_signal_connect (move_key_up_bt, "clicked", G_CALLBACK(on_move_key_up_bt_clicked), key_management_w);
2406 g_signal_connect (move_key_down_bt, "clicked", G_CALLBACK(on_move_key_down_bt_clicked), key_management_w);
2407 g_signal_connect (reset_configuration_bt, "clicked", G_CALLBACK(on_reset_configuration_bt_clicked), NULL);
2408 g_signal_connect (apply_bt, "clicked", G_CALLBACK(on_key_management_apply_bt_clicked), key_management_w);
2409 g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_key_management_ok_bt_clicked), key_management_w);
2410 g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_key_management_cancel_bt_clicked), key_management_w);
2411 g_signal_connect (key_ls, "select_row", G_CALLBACK(on_key_ls_select_row), key_management_w);
2412 g_signal_connect (key_ls, "unselect_row", G_CALLBACK(on_key_ls_unselect_row), key_management_w);
2413 g_signal_connect (key_ls, "click_column", G_CALLBACK(on_key_ls_click_column), NULL);
2415 /* Different because the window will be closed ... */
2416 /*window_set_cancel_button(key_management_w, ok_bt, window_cancel_button_cb);
2417 window_set_cancel_button(key_management_w, cancel_bt, window_cancel_button_cb);*/
2419 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY,key_ls_selected_item);
2421 /* Store pointers to all widgets, for use by lookup_widget(). */
2422 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_DECRYPTION_MODE_KEY, decryption_mode_cb);
2423 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_KEYLIST_KEY, key_ls);
2424 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_OK_KEY, ok_bt);
2425 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
2428 * I will need the toolbar and the main widget in some callback,
2429 * so I will add the toolbar pointer to the key_management_w
2431 g_object_set_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY,toolbar);
2432 g_object_set_data (G_OBJECT(key_management_w), AIRPCAP_TOOLBAR_DECRYPTION_KEY, toolbar_decryption_ck);
2434 /* FIRST OF ALL, CHECK THE KEY COLLECTIONS */
2436 * This will read the decryption keys from the preferences file, and will store
2437 * them into the registry...
2439 if (!airpcap_check_decryption_keys(airpcap_if_list))
2441 /* Ask the user what to do ...*/
2442 airpcap_keys_check_w(key_management_w,NULL);
2444 else /* Keys from lists are equals, or Wireshark has got no keys */
2446 airpcap_load_decryption_keys(airpcap_if_list);
2447 airpcap_fill_key_list(key_ls);
2448 /* At the end, so that it appears completely all together ... */
2449 gtk_widget_show (key_management_w);
2454 * Callback for the OK button 'clicked' in the Decryption Key Management window.
2457 on_key_management_ok_bt_clicked(GtkWidget *button, gpointer data)
2459 /* advanced window */
2460 GtkWidget *key_management_w;
2462 /* retrieve main window */
2463 key_management_w = GTK_WIDGET(data);
2465 /* Apply the current decryption preferences */
2466 on_key_management_apply_bt_clicked(button, data);
2468 /* Save the preferences to preferences file!!! */
2469 write_prefs_to_file();
2471 gtk_widget_destroy(key_management_w);
2475 * Callback for the CANCEL button 'clicked' in the Decryption Key Management window.
2478 on_key_management_cancel_bt_clicked(GtkWidget *button _U_, gpointer data)
2480 /* Retrieve object data */
2481 GtkWidget *key_management_w;
2482 GtkWidget *cancel_bt;
2486 /* widgets in the toolbar */
2488 *toolbar_decryption_ck,
2491 /* Row selected structure */
2492 airpcap_key_ls_selected_info_t *selected_item;
2494 /* Retrieve the GUI object pointers */
2495 key_management_w = GTK_WIDGET(data);
2496 cancel_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_CANCEL_KEY));
2497 ok_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_OK_KEY));
2498 key_ls = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY));
2499 key_management_bt = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEY));
2501 toolbar = GTK_WIDGET(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_TOOLBAR_KEY));
2503 /* retrieve toolbar info */
2504 toolbar_decryption_ck = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbar),AIRPCAP_TOOLBAR_DECRYPTION_KEY));
2506 /* Retrieve the selected row item pointer... */
2507 selected_item = (airpcap_key_ls_selected_info_t*)(g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_SELECTED_KEY_LIST_ITEM_KEY));
2509 g_free(selected_item);
2511 gtk_widget_destroy(key_management_w);
2515 * Dialog box that appears whenever keys are not consistent between Wireshark and AirPcap
2518 airpcap_keys_check_w(GtkWidget *w, gpointer data _U_)
2520 GtkWidget *keys_check_w;
2521 GtkWidget *main_v_box;
2522 GtkWidget *warning_lb;
2523 GtkWidget *radio_tb;
2525 GSList *radio_bt_group = NULL;
2526 GtkWidget *merge_rb;
2527 GtkWidget *import_rb;
2528 GtkWidget *ignore_rb;
2530 GtkWidget *merge_lb;
2531 GtkWidget *import_lb;
2532 GtkWidget *ignore_lb;
2533 GtkWidget *low_h_button_box;
2535 GtkWidget *cancel_bt;
2537 keys_check_w = window_new (GTK_WINDOW_TOPLEVEL, "Decryption Key Warning");
2538 gtk_widget_set_name (keys_check_w, "keys_check_w");
2539 gtk_window_set_resizable (GTK_WINDOW (keys_check_w), FALSE);
2541 main_v_box = gtk_vbox_new (FALSE, 0);
2542 gtk_widget_set_name (main_v_box, "main_v_box");
2543 gtk_widget_show (main_v_box);
2544 gtk_container_add (GTK_CONTAINER (keys_check_w), main_v_box);
2546 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:");
2547 gtk_label_set_use_markup (GTK_LABEL (warning_lb), TRUE);
2548 gtk_widget_set_name (warning_lb, "warning_lb");
2549 gtk_widget_show (warning_lb);
2550 gtk_box_pack_start (GTK_BOX (main_v_box), warning_lb, FALSE, FALSE, 0);
2551 gtk_label_set_justify (GTK_LABEL (warning_lb), GTK_JUSTIFY_CENTER);
2552 gtk_label_set_line_wrap (GTK_LABEL (warning_lb), TRUE);
2554 radio_tb = gtk_table_new (4, 2, FALSE);
2555 gtk_widget_set_name (radio_tb, "radio_tb");
2556 gtk_widget_show (radio_tb);
2557 gtk_box_pack_start (GTK_BOX (main_v_box), radio_tb, TRUE, FALSE, 0);
2558 gtk_container_set_border_width (GTK_CONTAINER (radio_tb), 5);
2559 gtk_table_set_col_spacings (GTK_TABLE (radio_tb), 8);
2561 keep_rb = gtk_radio_button_new_with_mnemonic (NULL, "Keep");
2562 gtk_widget_set_name (keep_rb, "keep_rb");
2563 gtk_widget_show (keep_rb);
2564 gtk_table_attach (GTK_TABLE (radio_tb), keep_rb, 0, 1, 0, 1,
2565 (GtkAttachOptions) (GTK_FILL),
2566 (GtkAttachOptions) (0), 0, 0);
2567 gtk_radio_button_set_group (GTK_RADIO_BUTTON (keep_rb), radio_bt_group);
2568 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (keep_rb));
2570 merge_rb = gtk_radio_button_new_with_mnemonic (NULL, "Merge");
2571 gtk_widget_set_name (merge_rb, "merge_rb");
2572 gtk_widget_show (merge_rb);
2573 gtk_table_attach (GTK_TABLE (radio_tb), merge_rb, 0, 1, 1, 2,
2574 (GtkAttachOptions) (GTK_FILL),
2575 (GtkAttachOptions) (0), 0, 0);
2576 gtk_radio_button_set_group (GTK_RADIO_BUTTON (merge_rb), radio_bt_group);
2577 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (merge_rb));
2579 import_rb = gtk_radio_button_new_with_mnemonic (NULL, "Import");
2580 gtk_widget_set_name (import_rb, "import_rb");
2581 gtk_widget_show (import_rb);
2582 gtk_table_attach (GTK_TABLE (radio_tb), import_rb, 0, 1, 2, 3,
2583 (GtkAttachOptions) (GTK_FILL),
2584 (GtkAttachOptions) (0), 0, 0);
2585 gtk_radio_button_set_group (GTK_RADIO_BUTTON (import_rb), radio_bt_group);
2586 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (import_rb));
2588 ignore_rb = gtk_radio_button_new_with_mnemonic (NULL, "Ignore");
2589 gtk_widget_set_name (ignore_rb, "ignore_rb");
2590 gtk_widget_show (ignore_rb);
2591 gtk_table_attach (GTK_TABLE (radio_tb), ignore_rb, 0, 1, 3, 4,
2592 (GtkAttachOptions) (GTK_FILL),
2593 (GtkAttachOptions) (0), 0, 0);
2594 gtk_radio_button_set_group (GTK_RADIO_BUTTON (ignore_rb), radio_bt_group);
2595 radio_bt_group = gtk_radio_button_get_group (GTK_RADIO_BUTTON (ignore_rb));
2599 ("Use Wireshark keys, thus overwriting AirPcap adapter(s) ones.");
2600 gtk_widget_set_name (keep_lb, "keep_lb");
2601 gtk_widget_show (keep_lb);
2602 gtk_table_attach (GTK_TABLE (radio_tb), keep_lb, 1, 2, 0, 1,
2603 (GtkAttachOptions) (GTK_FILL),
2604 (GtkAttachOptions) (0), 0, 0);
2605 gtk_misc_set_alignment (GTK_MISC (keep_lb), 0, 0.5);
2607 merge_lb = gtk_label_new ("Merge Wireshark and AirPcap adapter(s) keys.");
2608 gtk_widget_set_name (merge_lb, "merge_lb");
2609 gtk_widget_show (merge_lb);
2610 gtk_table_attach (GTK_TABLE (radio_tb), merge_lb, 1, 2, 1, 2,
2611 (GtkAttachOptions) (GTK_FILL),
2612 (GtkAttachOptions) (0), 0, 0);
2613 gtk_misc_set_alignment (GTK_MISC (merge_lb), 0, 0.5);
2617 ("Use AirPcap adapter(s) keys, thus overwriting Wireshark ones.");
2618 gtk_widget_set_name (import_lb, "import_lb");
2619 gtk_widget_show (import_lb);
2620 gtk_table_attach (GTK_TABLE (radio_tb), import_lb, 1, 2, 2, 3,
2621 (GtkAttachOptions) (GTK_FILL),
2622 (GtkAttachOptions) (0), 0, 0);
2623 gtk_misc_set_alignment (GTK_MISC (import_lb), 0, 0.5);
2627 ("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.");
2628 gtk_widget_set_name (ignore_lb, "ignore_lb");
2629 gtk_widget_show (ignore_lb);
2630 gtk_table_attach (GTK_TABLE (radio_tb), ignore_lb, 1, 2, 3, 4,
2631 (GtkAttachOptions) (GTK_FILL),
2632 (GtkAttachOptions) (0), 0, 0);
2633 gtk_label_set_line_wrap (GTK_LABEL (ignore_lb), TRUE);
2634 gtk_misc_set_alignment (GTK_MISC (ignore_lb), 0, 0.5);
2636 low_h_button_box = gtk_hbutton_box_new ();
2637 gtk_widget_set_name (low_h_button_box, "low_h_button_box");
2638 gtk_widget_show (low_h_button_box);
2639 gtk_box_pack_start (GTK_BOX (main_v_box), low_h_button_box, FALSE, FALSE,
2641 gtk_button_box_set_layout (GTK_BUTTON_BOX (low_h_button_box),
2642 GTK_BUTTONBOX_SPREAD);
2644 ok_bt = gtk_button_new_with_mnemonic ("OK");
2645 gtk_widget_set_name (ok_bt, "ok_bt");
2646 gtk_widget_show (ok_bt);
2647 gtk_container_add (GTK_CONTAINER (low_h_button_box), ok_bt);
2648 GTK_WIDGET_SET_FLAGS (ok_bt, GTK_CAN_DEFAULT);
2650 cancel_bt = gtk_button_new_with_mnemonic ("Cancel");
2651 gtk_widget_set_name (cancel_bt, "cancel_bt");
2652 gtk_widget_show (cancel_bt);
2653 gtk_container_add (GTK_CONTAINER (low_h_button_box), cancel_bt);
2654 GTK_WIDGET_SET_FLAGS (cancel_bt, GTK_CAN_DEFAULT);
2656 /* Store pointers to all widgets, for use by lookup_widget(). */
2657 g_signal_connect (ok_bt, "clicked", G_CALLBACK(on_keys_check_ok_bt_clicked), keys_check_w);
2658 g_signal_connect (cancel_bt, "clicked", G_CALLBACK(on_keys_check_cancel_bt_clicked), keys_check_w);
2659 g_signal_connect (keys_check_w, "destroy", G_CALLBACK(on_keys_check_w_destroy), keys_check_w);
2661 /* Store pointers to all widgets, for use by lookup_widget(). */
2662 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY,w);
2663 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY,merge_rb);
2664 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY,keep_rb);
2665 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY,import_rb);
2666 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY,ignore_rb);
2667 g_object_set_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_GROUP_KEY,radio_bt_group);
2669 gtk_widget_set_sensitive(top_level,FALSE);
2670 gtk_widget_show(keys_check_w);
2674 on_keys_check_cancel_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2676 GtkWidget *key_management_w;
2677 GtkWidget *keys_check_w;
2680 keys_check_w = GTK_WIDGET(user_data);
2682 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2684 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2685 and is not NULL if it was called when the Key Management widget has been clicked */
2686 if (key_management_w != NULL)
2689 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2690 airpcap_fill_key_list(key_ls);
2691 gtk_widget_show (key_management_w);
2694 gtk_widget_destroy(keys_check_w);
2698 on_keys_check_ok_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2700 GtkWidget *key_management_w;
2701 GtkWidget *keys_check_w;
2703 GtkWidget *merge_rb,
2708 keys_check_w = GTK_WIDGET(user_data);
2710 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2711 merge_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_MERGE_KEY);
2712 keep_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_KEEP_KEY);
2713 import_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IMPORT_KEY);
2714 ignore_rb = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_RADIO_IGNORE_KEY);
2716 /* Find out which radio button is selected and call the correct function */
2717 if (GTK_TOGGLE_BUTTON(merge_rb)->active) on_merge_bt_clicked (merge_rb,keys_check_w);
2718 else if (GTK_TOGGLE_BUTTON(keep_rb)->active) on_keep_bt_clicked (keep_rb,keys_check_w);
2719 else if (GTK_TOGGLE_BUTTON(import_rb)->active) on_import_bt_clicked (import_rb,keys_check_w);
2720 else if (GTK_TOGGLE_BUTTON(ignore_rb)->active) on_ignore_bt_clicked (ignore_rb,keys_check_w);
2721 else on_keys_check_cancel_bt_clicked(NULL,keys_check_w);
2725 on_keys_check_w_destroy (GtkWidget *w _U_, gpointer user_data)
2727 gtk_widget_set_sensitive(top_level,TRUE);
2728 gtk_widget_set_sensitive(GTK_WIDGET(user_data),TRUE);
2732 on_keep_bt_clicked (GtkWidget *button _U_, gpointer user_data)
2734 GtkWidget *key_management_w;
2735 GtkWidget *keys_check_w;
2736 GtkWidget *key_ls=NULL;
2738 GList* wireshark_keys=NULL;
2739 guint n_wireshark_keys = 0;
2741 GList* merged_keys=NULL;
2742 guint n_merged_keys = 0;
2745 guint n_total_keys=0;
2747 keys_check_w = GTK_WIDGET(user_data);
2749 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2751 n_adapters = g_list_length(airpcap_if_list);
2753 /* Retrieve Wireshark keys */
2754 wireshark_keys = get_wireshark_keys();
2755 n_wireshark_keys = g_list_length(wireshark_keys);
2756 n_total_keys += n_wireshark_keys;
2758 merged_keys = merge_key_list(wireshark_keys,NULL);
2759 n_merged_keys = g_list_length(merged_keys);
2761 /* Set up this new list as default for Wireshark and Adapters... */
2762 airpcap_save_decryption_keys(merged_keys,airpcap_if_list);
2764 /* Write the preferences to the preferences file (here is not needed, by the way)*/
2765 write_prefs_to_file();
2767 /* Free the memory */
2768 free_key_list(wireshark_keys);
2770 /* Close the window */
2771 gtk_widget_destroy(keys_check_w);
2773 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2774 and is not NULL if it was called when the Key Management widget has been clicked */
2775 if (key_management_w != NULL)
2778 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2779 airpcap_fill_key_list(key_ls);
2780 gtk_widget_show (key_management_w);
2785 on_merge_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2787 GtkWidget *key_management_w;
2788 GtkWidget *keys_check_w;
2791 guint n_adapters = 0;
2792 guint n_wireshark_keys = 0;
2793 guint n_driver_keys = 0;
2794 guint n_curr_adapter_keys = 0;
2795 guint n_total_keys = 0;
2796 guint n_merged_keys = 0;
2799 GList* wireshark_keys=NULL;
2800 GList* driver_keys=NULL;
2801 GList* current_adapter_keys=NULL;
2802 GList* merged_list = NULL;
2803 GList* merged_list_tmp = NULL;
2805 airpcap_if_info_t* curr_adapter;
2807 keys_check_w = GTK_WIDGET(user_data);
2809 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2811 n_adapters = g_list_length(airpcap_if_list);
2813 /* Retrieve Wireshark keys */
2814 wireshark_keys = get_wireshark_keys();
2815 n_wireshark_keys = g_list_length(wireshark_keys);
2816 n_total_keys += n_wireshark_keys;
2818 merged_list = merge_key_list(wireshark_keys,NULL);
2820 /* Retrieve AirPcap driver's keys */
2821 driver_keys = get_airpcap_driver_keys();
2822 n_driver_keys = g_list_length(driver_keys);
2823 n_total_keys += n_driver_keys;
2825 merged_list = merge_key_list(merged_list,driver_keys);
2827 /* NOW wireshark_keys and driver_keys ARE no more needed... at the end, we will have to free them! */
2828 for (i = 0; i<n_adapters; i++)
2830 curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2831 current_adapter_keys = get_airpcap_device_keys(curr_adapter);
2832 n_curr_adapter_keys = g_list_length(current_adapter_keys);
2834 merged_list_tmp = merged_list;
2835 merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
2836 free_key_list(merged_list_tmp);
2838 n_total_keys += n_curr_adapter_keys;
2841 n_merged_keys = g_list_length(merged_list);
2843 /* Set up this new list as default for Wireshark and Adapters... */
2844 airpcap_save_decryption_keys(merged_list,airpcap_if_list);
2846 /* Write the preferences to the preferences file */
2847 write_prefs_to_file();
2849 free_key_list(wireshark_keys);
2850 free_key_list(driver_keys);
2852 gtk_widget_destroy(keys_check_w);
2854 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2855 and is not NULL if it was called when the Key Management widget has been clicked */
2856 if (key_management_w != NULL)
2859 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2860 airpcap_fill_key_list(key_ls);
2861 gtk_widget_show (key_management_w);
2867 on_import_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2869 GtkWidget *key_management_w;
2870 GtkWidget *keys_check_w;
2873 guint n_adapters = 0;
2874 guint n_wireshark_keys = 0;
2875 guint n_driver_keys = 0;
2876 guint n_curr_adapter_keys = 0;
2877 guint n_total_keys = 0;
2878 guint n_merged_keys = 0;
2881 GList* wireshark_keys=NULL;
2882 GList* driver_keys=NULL;
2883 GList* current_adapter_keys=NULL;
2884 GList* merged_list = NULL;
2885 GList* merged_list_tmp = NULL;
2887 airpcap_if_info_t* curr_adapter;
2889 keys_check_w = GTK_WIDGET(user_data);
2891 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2893 n_adapters = g_list_length(airpcap_if_list);
2895 wireshark_keys = get_wireshark_keys();
2896 n_wireshark_keys = g_list_length(wireshark_keys);
2897 n_total_keys += n_wireshark_keys;
2899 /* Retrieve AirPcap driver's keys */
2900 driver_keys = get_airpcap_driver_keys();
2901 n_driver_keys = g_list_length(driver_keys);
2902 n_total_keys += n_driver_keys;
2904 merged_list = merge_key_list(merged_list,driver_keys);
2906 /* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
2907 for (i = 0; i<n_adapters; i++)
2909 curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2910 current_adapter_keys = get_airpcap_device_keys(curr_adapter);
2911 n_curr_adapter_keys = g_list_length(current_adapter_keys);
2913 merged_list_tmp = merged_list;
2914 merged_list = merge_key_list(merged_list_tmp,current_adapter_keys);
2915 free_key_list(merged_list_tmp);
2917 n_total_keys += n_curr_adapter_keys;
2920 n_merged_keys = g_list_length(merged_list);
2922 /* Set up this new list as default for Wireshark and Adapters... */
2923 airpcap_save_decryption_keys(merged_list,airpcap_if_list);
2925 /* Write the preferences to the preferences file */
2926 write_prefs_to_file();
2928 free_key_list(wireshark_keys);
2929 free_key_list(driver_keys);
2931 gtk_widget_destroy(keys_check_w);
2933 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2934 and is not NULL if it was called when the Key Management widget has been clicked */
2935 if (key_management_w != NULL)
2938 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2939 airpcap_fill_key_list(key_ls);
2940 gtk_widget_show (key_management_w);
2946 on_ignore_bt_clicked (GtkWidget* button _U_, gpointer user_data)
2948 GtkWidget *key_management_w;
2949 GtkWidget *keys_check_w;
2952 keys_check_w = GTK_WIDGET(user_data);
2954 key_management_w = g_object_get_data(G_OBJECT(keys_check_w),AIRPCAP_CHECK_WINDOW_KEY);
2956 /* w may be NULL if airpcap_keys_check_w() has been called while Wireshark was loading,
2957 and is not NULL if it was called when the Key Management widget has been clicked */
2958 if (key_management_w != NULL)
2961 key_ls = g_object_get_data(G_OBJECT(key_management_w),AIRPCAP_ADVANCED_KEYLIST_KEY);
2962 airpcap_fill_key_list(key_ls);
2963 gtk_widget_show (key_management_w);
2966 gtk_widget_destroy(keys_check_w);
2970 #endif /* HAVE_AIRPCAP */
2978 * indent-tabs-mode: t
2981 * ex: set shiftwidth=4 tabstop=4 noexpandtab
2982 * :indentSize=4:tabSize=4:noTabs=false: