wireshark/gtk/airpcap_dlg.c

1891 lines
57 KiB
C

/* airpcap_dlg.c
*
* $Id$
*
* Giorgio Tino <giorgio.tino@cacetech.com>
* Copyright (c) CACE Technologies, LLC 2006
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 2000 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#ifdef HAVE_AIRPCAP
#include <gtk/gtk.h>
#include <glib.h>
#include <glib/gprintf.h>
#include <string.h>
#include <epan/filesystem.h>
#include <pcap.h>
#include "gtk/main.h"
#include "dlg_utils.h"
#include "gui_utils.h"
#include "simple_dialog.h"
#include "dfilter_expr_dlg.h"
#include "compat_macros.h"
#include "gtkglobals.h"
#include "help_dlg.h"
#include <airpcap.h>
#include "airpcap_loader.h"
#include "airpcap_gui_utils.h"
#include "airpcap_dlg.h"
#include "keys.h"
/* temporary block signals to widgets */
BOOL block_advanced_signals;
/*
* This struct will contain useful data for the selected (actual) airpcap device
*/
void
airpcap_fill_if_combo(GtkWidget *combo, GList* if_list)
{
int ifn = 0;
GList* popdown_if_list = NULL;
GList* curr = NULL;
airpcap_if_info_t* if_info = NULL;
curr = g_list_nth(if_list, ifn);
if_info = NULL;
if(curr != NULL) if_info = curr->data;
popdown_if_list = NULL;
ifn = g_list_length(if_list) - 1;
while(ifn >= 0) /* reverse order */
{
curr = g_list_nth(if_list, ifn);
if_info = NULL;
if(curr != NULL)
if_info = curr->data;
if(if_info != NULL)
popdown_if_list = g_list_append( popdown_if_list , if_info->description) ;
ifn--;
}
gtk_combo_set_popdown_strings( GTK_COMBO(combo), popdown_if_list) ;
if(airpcap_if_selected != NULL)
{
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), airpcap_if_selected->description);
}
else
{
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(combo)->entry), "No Wireless Interfaces Found");
}
}
/*
* Callback for the crc chackbox
*/
static void
crc_check_cb(GtkWidget *w, gpointer user_data)
{
if( !block_advanced_signals && (airpcap_if_selected != NULL))
{
if(airpcap_if_selected->IsFcsPresent)
{
airpcap_if_selected->IsFcsPresent = FALSE;
airpcap_if_selected->saved = FALSE;
}
else
{
airpcap_if_selected->IsFcsPresent = TRUE;
airpcap_if_selected->saved = FALSE;
}
}
}
/*
* Callback for the wrong crc combo
*/
static void
wrong_crc_combo_cb(GtkWidget *w, gpointer data)
{
const gchar *s;
s = gtk_entry_get_text(GTK_ENTRY(data));
if( !block_advanced_signals && (data != NULL) && (w != NULL) )
{
if((g_strcasecmp("",s)))
{
airpcap_if_selected->CrcValidationOn = airpcap_get_validation_type(s);
airpcap_if_selected->saved = FALSE;
}
}
}
/*
* Changed callback for the channel combobox
*/
static void
channel_changed_cb(GtkWidget *w _U_, gpointer data)
{
const gchar *s;
s = gtk_entry_get_text(GTK_ENTRY(data));
if( !block_advanced_signals && (data != NULL) && (w != NULL) )
{
s = gtk_entry_get_text(GTK_ENTRY(data));
if((g_strcasecmp("",s)))
{
if(airpcap_if_selected != NULL)
{
airpcap_if_selected->channel = airpcap_get_channel_number(s);
airpcap_if_selected->saved = FALSE;
}
}
}
}
/*
* Changed callback for the link layer combobox
*/
static void
link_type_changed_cb(GtkWidget *w _U_, gpointer data)
{
const gchar *s;
s = gtk_entry_get_text(GTK_ENTRY(data));
if( !block_advanced_signals && (data != NULL) && (w != NULL) )
{
if((g_strcasecmp("",s)))
{
airpcap_if_selected->linkType = airpcap_get_link_type(s);
airpcap_if_selected->saved = FALSE;
}
}
}
/*
* Activate callback for the adapter combobox
*/
static void
combo_if_activate_cb(GtkWidget *entry _U_, gpointer data)
{
}
/*
* Changed callback for the adapter combobox
*/
static void
airpcap_advanced_combo_if_changed_cb(GtkWidget *w _U_, gpointer data)
{
const gchar* s = NULL;
s = gtk_entry_get_text(GTK_ENTRY(w));
if((g_strcasecmp("",s)))
{
/* We are trying to change the interface to set up...*/
/* Check if the current interface settings need to be SAVED! */
if( (airpcap_if_selected != NULL) && !block_advanced_signals)
{
if( (airpcap_if_selected->saved) ) /* Just change interface */
{
/* No changes for this interface, no need to save anything */
airpcap_change_if(w,data);
}
else
{
/* Popup a dialog to ask if user wants to save settings for selected
* interface before changing it...
*/
airpcap_ask_for_save(w,data);
}
}
}
}
/*
* Takes the keys from the GtkList widget, and add them to the interface list
*/
void
airpcap_add_keys_from_list(GtkWidget *keylist, airpcap_if_info_t *if_info)
{
GtkWidget *key_ls;
GString *new_key;
gchar *text_entered = NULL;
GtkWidget *nl_item,*nl_lb;
GList *list,
*children;
/* airpcap stuff */
UINT i, j;
gchar s[3];
PAirpcapKeysCollection KeysCollection;
ULONG KeysCollectionSize;
UCHAR KeyByte;
UINT keys_in_list = 0;
key_ls = keylist;
keys_in_list = (UINT)g_list_length(GTK_LIST(key_ls)->children);
if(keys_in_list > 0)
{
/*
* Save the encryption keys, if we have any of them
*/
KeysCollectionSize = 0;
/*
* Calculate the size of the keys collection
*/
KeysCollectionSize = sizeof(AirpcapKeysCollection) + keys_in_list * sizeof(AirpcapKey);
/*
* Allocate the collection
*/
KeysCollection = (PAirpcapKeysCollection)malloc(KeysCollectionSize);
if(!KeysCollection)
{
/* Simple dialog ERROR */
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","Failed mamory allocation for KeysCollection!");
return;
}
/*
* Populate the key collection
*/
list = GTK_LIST(key_ls)->children;
KeysCollection->nKeys = keys_in_list;
for(i = 0; i < keys_in_list; i++)
{
KeysCollection->Keys[i].KeyType = AIRPCAP_KEYTYPE_WEP;
/* Retrieve the Item corresponding to the i-th key */
nl_item = g_list_nth_data(list, i);
children = gtk_container_children(GTK_CONTAINER(nl_item));
nl_lb = g_list_nth_data(children,0);
new_key = g_string_new(GTK_LABEL(nl_lb)->label);
KeysCollection->Keys[i].KeyLen = new_key->len / 2;
memset(&KeysCollection->Keys[i].KeyData, 0, sizeof(KeysCollection->Keys[i].KeyData));
for(j = 0 ; j < new_key->len; j += 2)
{
s[0] = new_key->str[j];
s[1] = new_key->str[j+1];
s[2] = '\0';
KeyByte = (UCHAR)strtol(s, NULL, 16);
KeysCollection->Keys[i].KeyData[j / 2] = KeyByte;
}
}
/*
* Free the old adapter key collection!
*/
if(airpcap_if_selected->keysCollection != NULL)
g_free(airpcap_if_selected->keysCollection);
/*
* Set this collection ad the new one
*/
airpcap_if_selected->keysCollection = KeysCollection;
airpcap_if_selected->keysCollectionSize = KeysCollectionSize;
}
return;
}
/*
* Pop-up window, used to ask the user if he wants to save the selected interface settings
* when closing the window.
*/
void
airpcap_ask_for_save_before_closing(GtkWidget *w _U_, gpointer data)
{
GtkWidget* dialog;
dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL,
PRIMARY_TEXT_START "Save settings before closing?" PRIMARY_TEXT_END "\n\n"
"If you close the window without saving, changes you made will\nbe discarded.");
simple_dialog_set_cb(dialog, airpcap_dialog_save_before_closing_cb, data);
}
/* user confirmed the "Save settings..." dialog */
void
airpcap_dialog_save_before_closing_cb(gpointer dialog _U_, gint btn, gpointer data)
{
GtkWidget* interface_combo;
GtkWidget* key_ls;
/* I need the combo box entry */
interface_combo = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY));
key_ls = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY));
switch(btn) {
case(ESD_BTN_SAVE):
/* save interface and exit */
airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
airpcap_save_selected_if_configuration(airpcap_if_selected);
/* Remove gtk timeout */
gtk_timeout_remove(airpcap_if_selected->tag);
break;
case(ESD_BTN_DONT_SAVE):
/* exit without saving */
break;
default:
break;
}
}
/*
* Pop-up window, used to ask the user if he wants to save the selected interface settings
* when changing the interface in the advanced dialog box
*/
void
airpcap_ask_for_save(GtkWidget *entry _U_, gpointer data)
{
GtkWidget* dialog;
dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL,
PRIMARY_TEXT_START "Save settings before changing interface?" PRIMARY_TEXT_END "\n\n"
"If you change interface without saving, changes you made will\nbe discarded.");
simple_dialog_set_cb(dialog, airpcap_dialog_save_cb, data);
}
/* user confirmed the "Save settings..." dialog */
void
airpcap_dialog_save_cb(GtkWidget* dialog _U_, gint btn, gpointer data)
{
GtkWidget* interface_combo;
GtkWidget* key_ls;
/* I need the combo box entry */
interface_combo = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY));
key_ls = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY));
switch(btn) {
case(ESD_BTN_SAVE):
/* save interface and change */
airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
airpcap_save_selected_if_configuration(airpcap_if_selected);
/* Remove gtk timeout */
gtk_timeout_remove(airpcap_if_selected->tag);
airpcap_change_if(GTK_COMBO(interface_combo)->entry,data);
break;
case(ESD_BTN_DONT_SAVE):
/* change interface without saving */
airpcap_change_if(GTK_COMBO(interface_combo)->entry,data);
break;
case(ESD_BTN_CANCEL):
/* don't change interface and don't save */
break;
default:
break;
}
}
/*
* Function used to change the selected interface and advanced dialog box
*/
void
airpcap_change_if(GtkWidget *entry _U_, gpointer data)
{
const gchar *s;
gchar *channel_s;
gchar *capture_s;
GtkWidget *main_w;
GtkWidget *interface_combo;
GtkWidget *channel_combo;
GtkWidget *capture_combo;
GtkWidget *crc_check;
GtkWidget *wrong_crc_combo;
GtkWidget *blink_bt;
GtkWidget *key_ls;
airpcap_if_info_t *new_if;
/* Retrieve the GUI object pointers */
main_w = GTK_WIDGET(data);
interface_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_INTERFACE_KEY));
channel_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CHANNEL_KEY));
capture_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY));
crc_check = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CRC_KEY));
wrong_crc_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_WRONG_CRC_KEY));
blink_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_BLINK_KEY));
key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
s = gtk_entry_get_text(GTK_ENTRY(entry));
/* Select actual interface*/
new_if = get_airpcap_if_from_description(airpcap_if_list, s);
/* And change the GUI according to it... */
/* This should always happen, but it seems that the callback is
* called twice, the first time with an 'empty' text... so it
* will return NULL!
*/
if(new_if != NULL)
{
airpcap_if_selected = new_if;
new_if = NULL;
/* I need to 'block' signals to widgets or they will receive a signal now
and will change twice */
block_advanced_signals = TRUE;
/* Blink button */
if(airpcap_if_selected->blinking)
{
#if GTK_MAJOR_VERSION >= 2
gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
#else
gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"Stop Blinking");
#endif
}
else
{
#if GTK_MAJOR_VERSION >= 2
gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led ");
#else
gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child)," Blink Led ");
#endif
}
/* Channel combo */
channel_s = g_strdup_printf("%d",airpcap_if_selected->channel);
if(channel_combo != NULL) /* this event seems to happen when combo is still NULL */
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_combo)->entry), channel_s);
/* Link Layer combo */
capture_s = NULL;
if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11)
{
capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
if(capture_combo != NULL) /* this event seems to happen when combo is still NULL */
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
}
else if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO)
{
capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
if(capture_combo != NULL) /* this event seems to happen when combo is still NULL */
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
}
/* Fcs Presence check box */
if(airpcap_if_selected->IsFcsPresent)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),FALSE);
/* Wrong Crc combo box */
if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_EVERYTHING)
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_ALL);
else if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRECT_FRAMES)
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRECT);
else if(airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES)
gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT);
/* Remove old keys */
gtk_list_remove_items(GTK_LIST(key_ls),GTK_LIST(key_ls)->children);
/* Add new keys */
airpcap_fill_key_list(key_ls,airpcap_if_selected);
/* Enable the signals again */
block_advanced_signals = FALSE;
}
}
/*
* Thread function used to blink the led
*/
void update_blink(gpointer data _U_)
{
airpcap_if_info_t* sel;
PAirpcapHandle ad;
gchar ebuf[AIRPCAP_ERRBUF_SIZE];
sel = (airpcap_if_info_t*)data;
ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list, sel->description), ebuf);
if(ad)
{
if(sel->led)
{
airpcap_if_turn_led_off(ad, 0);
sel->led = FALSE;
}
else
{
airpcap_if_turn_led_on(ad, 0);
sel->led = TRUE;
}
airpcap_if_close(ad);
}
}
/*
* Blink button callback
*/
void
blink_cb( GtkWidget *blink_bt _U_, gpointer if_data )
{
PAirpcapHandle ad = NULL;
gchar ebuf[AIRPCAP_ERRBUF_SIZE];
if(airpcap_if_selected != NULL)
if(!(airpcap_if_selected->blinking))
{
#if GTK_MAJOR_VERSION >= 2
gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking");
#else
gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"Stop Blinking");
#endif
airpcap_if_selected->tag = gtk_timeout_add(500, (GtkFunction)update_blink,airpcap_if_selected);
airpcap_if_selected->blinking = TRUE;
}
else
{
#if GTK_MAJOR_VERSION >= 2
gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led ");
#else
gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child)," Blink Led ");
#endif
gtk_timeout_remove(airpcap_if_selected->tag);
airpcap_if_selected->blinking = FALSE;
/* Switch on the led! */
ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
if(ad)
{
gtk_timeout_remove(airpcap_if_selected->tag);
airpcap_if_turn_led_on(ad, 0);
airpcap_if_selected->blinking = FALSE;
airpcap_if_selected->led = TRUE;
airpcap_if_close(ad);
}
}
}
/* the window was closed, cleanup things */
static void
airpcap_if_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_)
{
PAirpcapHandle ad = NULL;
gchar ebuf[AIRPCAP_ERRBUF_SIZE];
/* Retrieve object data */
GtkWidget *main_w;
GtkWidget *channel_combo;
GtkWidget *capture_combo;
GtkWidget *crc_check;
GtkWidget *wrong_crc_combo;
GtkWidget *blink_bt;
GtkWidget *interface_combo;
GtkWidget *cancel_bt;
GtkWidget *ok_bt;
GtkWidget *key_ls;
/* widgets in the toolbar */
GtkWidget *toolbar,
*toolbar_if_lb,
*toolbar_channel_cm,
*toolbar_wrong_crc_cm,
*toolbar_decryption_ck,
*advanced_bt;
gint *from_widget = NULL;
/* Retrieve the GUI object pointers */
main_w = GTK_WIDGET(user_data);
interface_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_INTERFACE_KEY));
channel_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CHANNEL_KEY));
capture_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY));
crc_check = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CRC_KEY));
wrong_crc_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_WRONG_CRC_KEY));
blink_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_BLINK_KEY));
cancel_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CANCEL_KEY));
ok_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_OK_KEY));
key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
advanced_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEY));
toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
/* retrieve toolbar info */
toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
toolbar_decryption_ck = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
from_widget = (gint*)OBJECT_GET_DATA(toolbar,AIRPCAP_ADVANCED_FROM_KEY);
/* ... */
/* gray out the toolbar (if we came here from the toolbar advanced button)*/
if( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
gtk_widget_set_sensitive(toolbar,TRUE);
/* Stop blinking ALL leds (go through the airpcap_if_list) */
if(airpcap_if_selected != NULL)
{
ad = airpcap_if_open(airpcap_if_selected->name, ebuf);
if(ad)
{
gtk_timeout_remove(airpcap_if_selected->tag);
airpcap_if_turn_led_on(ad, 0);
airpcap_if_selected->blinking = FALSE;
airpcap_if_selected->led = TRUE;
airpcap_if_close(ad);
}
}
/* See if the 'Cancel' button was pressed or not
* if button is pressed, don't save configuration!
*/
if(GTK_BUTTON(cancel_bt)->in_button)
{
/* reload the configuration!!! Configuration has not been saved but
the corresponding structure has been modified probably...*/
if(!airpcap_if_selected->saved)
{
airpcap_load_selected_if_configuration(airpcap_if_selected);
}
/* NULL to everything */
main_w = NULL;
blink_bt = NULL;
channel_combo = NULL;
interface_combo = NULL;
capture_combo = NULL;
crc_check = NULL;
wrong_crc_combo = NULL;
/* ... */
/* gray out the toolbar (if we came here from the toolbar advanced button)*/
if( *from_widget == AIRPCAP_ADVANCED_FROM_TOOLBAR)
gtk_widget_set_sensitive(toolbar,TRUE);
g_free(from_widget);
return;
}
else if(GTK_BUTTON(ok_bt)->in_button)
{
/* ??? - Ask if want to save configuration */
/* Save the configuration */
airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
airpcap_save_selected_if_configuration(airpcap_if_selected);
/* Remove gtk timeout */
gtk_timeout_remove(airpcap_if_selected->tag);
/* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
{
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)));
airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),FALSE);
gtk_signal_handler_unblock_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
}
/* If interface active is airpcap, set sensitive TRUE for airpcap toolbar */
if( get_airpcap_if_by_name(airpcap_if_list,airpcap_if_active->description) != NULL)
{
airpcap_set_toolbar_start_capture(airpcap_if_active);
}
else
{
airpcap_set_toolbar_stop_capture(airpcap_if_active);
}
/* NULL to everything */
main_w = NULL;
blink_bt = NULL;
channel_combo = NULL;
interface_combo = NULL;
capture_combo = NULL;
crc_check = NULL;
wrong_crc_combo = NULL;
/* ... */
/* gray out the toolbar (if we came here from the toolbar advanced button)*/
if( *from_widget == AIRPCAP_ADVANCED_FROM_OPTIONS)
gtk_widget_set_sensitive(toolbar,FALSE);
g_free(from_widget);
return;
}
/* reload the configuration!!! Configuration has not been saved but
the corresponding structure has been modified probably...*/
if(!airpcap_if_selected->saved)
{
airpcap_load_selected_if_configuration(airpcap_if_selected);
}
}
/*
* Callback for the 'Apply' button.
*/
static void
airpcap_advanced_apply_cb(GtkWidget *button, gpointer data _U_)
{
/* advenced window */
GtkWidget *main_w;
/* widgets in the toolbar */
GtkWidget *toolbar,
*toolbar_if_lb,
*toolbar_channel_cm,
*toolbar_wrong_crc_cm,
*toolbar_decryption_ck;
GtkWidget *key_ls;
/* retrieve main window */
main_w = GTK_WIDGET(data);
key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
/* retrieve toolbar info */
toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
toolbar_decryption_ck = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
/* Save the configuration */
airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
airpcap_save_selected_if_configuration(airpcap_if_selected);
/* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
{
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)));
airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),FALSE);
gtk_signal_handler_unblock_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
}
}
/*
* Callback for the 'Ok' button.
*/
static void
airpcap_advanced_ok_cb(GtkWidget *w, gpointer data _U_)
{
/* advenced window */
GtkWidget *main_w;
/* widgets in the toolbar */
GtkWidget *toolbar,
*toolbar_if_lb,
*toolbar_channel_cm,
*toolbar_wrong_crc_cm,
*toolbar_decryption_ck;
GtkWidget *key_ls;
/* retrieve main window */
main_w = GTK_WIDGET(data);
toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY));
key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY));
/* retrieve toolbar info */
toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
toolbar_decryption_ck = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_DECRYPTION_KEY));
/* Save the configuration */
airpcap_add_keys_from_list(key_ls,airpcap_if_selected);
airpcap_save_selected_if_configuration(airpcap_if_selected);
/* Remove gtk timeout */
gtk_timeout_remove(airpcap_if_selected->tag);
/* Update toolbar (only if airpcap_if_selected is airpcap_if_active)*/
if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0)
{
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)));
airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected);
airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn);
gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toolbar_decryption_ck),FALSE);
gtk_signal_handler_unblock_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar);
}
}
/*
* Callback for the 'Reset Configuration' button.
*/
static void
airpcap_advanced_reset_configuration_cb(GtkWidget *button, gpointer data _U_)
{
}
/*
* Callback for the 'About' button.
*/
static void
airpcap_advanced_about_cb(GtkWidget *button, gpointer data _U_)
{
/* retrieve toolbar info */
}
/*
* Callback used to add a WEP key in the add new key box;
*/
static void
add_key(GtkWidget *widget, gpointer data _U_)
{
GtkWidget *text,
*key_ls,
*ok_bt;
GString *new_key;
gchar *text_entered = NULL;
int keys_in_list = 0;
unsigned int i;
text = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_TEXT_KEY);
ok_bt = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_ADD_KEY_OK_KEY);
key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
keys_in_list = g_list_length(GTK_LIST(key_ls)->children);
text_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(text)));
/* Too many keys? */
if(keys_in_list == MAX_ENCRYPTION_KEYS)
{
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","Reached the Wep Keys Limit for this Interface.");
return;
}
/* Check if key is correct */
new_key = g_string_new(text_entered);
g_strchug(new_key->str);
g_strchomp(new_key->str);
if((new_key->len) > WEP_KEY_MAX_CHAR_SIZE)
{
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8);
return;
}
if((new_key->len % 2) != 0)
{
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nThe number of characters must be even.");
return;
}
for(i = 0; i < new_key->len; i++)
{
if(!g_ascii_isxdigit(new_key->str[i]))
{
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
return;
}
}
/* If so... Add key */
airpcap_add_key_to_list(key_ls,new_key->str);
airpcap_if_selected->saved = FALSE;
g_string_free(new_key,TRUE);
g_free(text_entered);
window_destroy(GTK_WIDGET(data));
return;
}
/*
* Callback used to add a WEP key in the edit key box;
*/
static void
edit_key(GtkWidget *widget, gpointer data _U_)
{
GtkWidget *text,
*key_ls,
*ok_bt;
GString *new_key;
gchar *text_entered = NULL;
GtkWidget *label;
int keys_in_list = 0;
unsigned int i;
text = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_TEXT_KEY);
ok_bt = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_OK_KEY);
key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
label = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_EDIT_KEY_LABEL_KEY);
keys_in_list = g_list_length(GTK_LIST(key_ls)->children);
text_entered = g_strdup(gtk_entry_get_text(GTK_ENTRY(text)));
/* Check if key is correct */
new_key = g_string_new(text_entered);
g_strchug(new_key->str);
g_strchomp(new_key->str);
if((new_key->len) > WEP_KEY_MAX_CHAR_SIZE)
{
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8);
return;
}
if((new_key->len % 2) != 0)
{
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nThe number of characters must be even.");
return;
}
for(i = 0; i < new_key->len; i++)
{
if(!g_ascii_isxdigit(new_key->str[i]))
{
simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.");
return;
}
}
/* If so... modify key */
gtk_label_set_text(GTK_LABEL(label),new_key->str);
airpcap_if_selected->saved = FALSE;
g_string_free(new_key,TRUE);
g_free(text_entered);
window_destroy(GTK_WIDGET(data));
return;
}
/*
* Callback for the 'Add Key' button.
*/
static void
airpcap_advanced_add_key_cb(GtkWidget *button, gpointer data _U_)
{
/* Window */
GtkWidget *add_key_w;
/* Frame */
GtkWidget *add_key_frame;
/* Boxes */
GtkWidget *main_box, /* vertical */
*key_box, /* orizontal */
*text_box, /* orizontal */
*button_box;/* orizontal (packed to end)*/
/* Text Entry */
GtkWidget *key_text_entry;
/* Buttons */
GtkWidget *key_ok_bt,
*key_cancel_bt;
/* Key List Widget */
GtkWidget *key_ls;
/* Pop-up a new window */
add_key_w = window_new (GTK_WINDOW_TOPLEVEL,"Add a WEP Key");
/* Connect events */
SIGNAL_CONNECT(add_key_w, "delete_event",window_delete_event_cb, add_key_w);
SIGNAL_CONNECT(add_key_w, "destroy",add_key_w_destroy_cb, add_key_w);
/* Sets the border width of the window. */
gtk_container_set_border_width (GTK_CONTAINER (add_key_w), 5);
/* Retrieve the key list widget pointer, and add it to the add_key_w */
key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
OBJECT_SET_DATA(GTK_WIDGET(add_key_w),AIRPCAP_ADVANCED_KEYLIST_KEY,key_ls);
OBJECT_SET_DATA(GTK_WIDGET(add_key_w),AIRPCAP_ADVANCED_KEY,data);
/* Create boxes */
main_box = gtk_vbox_new(FALSE,1);
key_box = gtk_hbox_new(FALSE,1);
button_box = gtk_hbox_new(FALSE,1);
text_box = gtk_hbox_new(TRUE,1);
/* Add the two sub boxes to the main box */
gtk_box_pack_start(GTK_BOX(main_box), key_box, FALSE, FALSE, 1);
gtk_box_pack_start(GTK_BOX(main_box), button_box, FALSE, FALSE, 1);
/* Add the main box to the main window */
gtk_container_add(GTK_CONTAINER(add_key_w),main_box);
/* Crete key frame */
add_key_frame = gtk_frame_new("");
gtk_frame_set_label(GTK_FRAME(add_key_frame),"Key");
#if GTK_MAJOR_VERSION < 2
gtk_widget_set_usize( GTK_WIDGET(add_key_frame),
200,
-1 );
#else
gtk_widget_set_size_request( GTK_WIDGET(add_key_frame),
200,
-1 );
#endif
gtk_box_pack_start(GTK_BOX(key_box), add_key_frame, FALSE, FALSE, 1);
/* Create and Add text entry*/
key_text_entry = gtk_entry_new();
OBJECT_SET_DATA(add_key_w, AIRPCAP_ADVANCED_ADD_KEY_TEXT_KEY, key_text_entry);
SIGNAL_CONNECT(key_text_entry, "activate", add_key, add_key_w );
gtk_box_pack_start(GTK_BOX(text_box), key_text_entry, FALSE, FALSE, 1);
gtk_container_add(GTK_CONTAINER(add_key_frame),text_box);
gtk_container_set_border_width (GTK_CONTAINER (text_box), 5);
/* Create and add buttons */
key_ok_bt = gtk_button_new_with_label("OK");
SIGNAL_CONNECT(key_ok_bt, "clicked", add_key, add_key_w );
OBJECT_SET_DATA(add_key_w, AIRPCAP_ADVANCED_ADD_KEY_OK_KEY, key_ok_bt);
#if GTK_MAJOR_VERSION < 2
gtk_widget_set_usize( GTK_WIDGET(key_ok_bt),
50,
-1 );
#else
gtk_widget_set_size_request( GTK_WIDGET(key_ok_bt),
50,
-1 );
#endif
key_cancel_bt = gtk_button_new_with_label("Cancel");
SIGNAL_CONNECT(key_cancel_bt, "clicked", window_cancel_button_cb, add_key_w );
#if GTK_MAJOR_VERSION < 2
gtk_widget_set_usize( GTK_WIDGET(key_cancel_bt),
50,
-1 );
#else
gtk_widget_set_size_request( GTK_WIDGET(key_cancel_bt),
50,
-1 );
#endif
gtk_box_pack_end(GTK_BOX(button_box), key_cancel_bt, FALSE, FALSE, 1);
gtk_box_pack_end(GTK_BOX(button_box), key_ok_bt, FALSE, FALSE, 1);
/* Show all */
gtk_widget_show(key_ok_bt);
gtk_widget_show(key_cancel_bt);
gtk_widget_show(key_text_entry);
gtk_widget_show(add_key_frame);
gtk_widget_show(text_box);
gtk_widget_show(button_box);
gtk_widget_show(key_box);
gtk_widget_show(main_box);
gtk_widget_show(add_key_w);
}
/*
* Add key window destroy callback
*/
static void
add_key_w_destroy_cb(GtkWidget *button, gpointer data _U_)
{
return;
}
/*
* Edit key window destroy callback
*/
static void
edit_key_w_destroy_cb(GtkWidget *button, gpointer data _U_)
{
return;
}
/*
* Callback for the 'Remove Key' button.
*/
static void
airpcap_advanced_remove_key_cb(GtkWidget *button, gpointer data _U_)
{
GtkList *key_ls;
GtkWidget *label;
GList *item = NULL;
gint n;
/* retrieve key list */
key_ls = GTK_LIST(data);
/* Remove selected keys*/
if(key_ls->selection != NULL)
{
item = g_list_nth(key_ls->selection,0);
if(item != NULL)
{
n = gtk_list_child_position(key_ls,item->data);
label = GTK_BIN(item->data)->child;
gtk_list_clear_items(key_ls,n,n+1);
}
}
/* Need to save config... */
airpcap_if_selected->saved = FALSE;
}
/*
* Callback for the 'Edit Key' button.
*/
static void
airpcap_advanced_edit_key_cb(GtkWidget *button, gpointer data _U_)
{
/* Window */
GtkWidget *edit_key_w;
/* Frame */
GtkWidget *edit_key_frame;
/* Boxes */
GtkWidget *main_box, /* vertical */
*key_box, /* orizontal */
*text_box, /* orizontal */
*button_box;/* orizontal (packed to end)*/
/* Text Entry */
GtkWidget *key_text_entry;
/* Buttons */
GtkWidget *key_ok_bt,
*key_cancel_bt;
/* Key List Widget */
GtkWidget *key_ls;
GtkWidget *label;
GList *item = NULL;
gint n;
/* Retrieve the key list widget pointer, and add it to the edit_key_w */
key_ls = OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_KEYLIST_KEY);
/*
* Check if a key has been selected. If not, just do nothing.
*/
if(GTK_LIST(key_ls)->selection != NULL)
{
item = g_list_nth(GTK_LIST(key_ls)->selection,0);
if(item != NULL)
{
/* Pop-up a new window */
edit_key_w = window_new (GTK_WINDOW_TOPLEVEL,"Edit a WEP Key");
/* Connect events */
SIGNAL_CONNECT(edit_key_w, "delete_event",window_delete_event_cb, edit_key_w);
SIGNAL_CONNECT(edit_key_w, "destroy",edit_key_w_destroy_cb, edit_key_w);
/* Sets the border width of the window. */
gtk_container_set_border_width (GTK_CONTAINER (edit_key_w), 5);
OBJECT_SET_DATA(GTK_WIDGET(edit_key_w),AIRPCAP_ADVANCED_KEYLIST_KEY,key_ls);
OBJECT_SET_DATA(GTK_WIDGET(edit_key_w),AIRPCAP_ADVANCED_KEY,data);
/* Create boxes */
main_box = gtk_vbox_new(FALSE,1);
key_box = gtk_hbox_new(FALSE,1);
button_box = gtk_hbox_new(FALSE,1);
text_box = gtk_hbox_new(TRUE,1);
/* Add the two sub boxes to the main box */
gtk_box_pack_start(GTK_BOX(main_box), key_box, FALSE, FALSE, 1);
gtk_box_pack_start(GTK_BOX(main_box), button_box, FALSE, FALSE, 1);
/* Add the main box to the main window */
gtk_container_add(GTK_CONTAINER(edit_key_w),main_box);
/* Crete key frame */
edit_key_frame = gtk_frame_new("");
gtk_frame_set_label(GTK_FRAME(edit_key_frame),"Key");
#if GTK_MAJOR_VERSION < 2
gtk_widget_set_usize( GTK_WIDGET(edit_key_frame),
200,
-1 );
#else
gtk_widget_set_size_request( GTK_WIDGET(edit_key_frame),
200,
-1 );
#endif
gtk_box_pack_start(GTK_BOX(key_box), edit_key_frame, FALSE, FALSE, 1);
/* Create and Add text entry*/
key_text_entry = gtk_entry_new();
/* Retrieve the currently selected entry */
if(GTK_LIST(key_ls)->selection != NULL)
{
item = g_list_nth(GTK_LIST(key_ls)->selection,0);
if(item != NULL)
{
n = gtk_list_child_position(GTK_LIST(key_ls),item->data);
label = GTK_BIN(item->data)->child;
/* Pass the pointer as data */
OBJECT_SET_DATA(edit_key_w,AIRPCAP_ADVANCED_EDIT_KEY_LABEL_KEY,label);
}
}
gtk_entry_set_text(GTK_ENTRY(key_text_entry),GTK_LABEL(label)->label);
OBJECT_SET_DATA(edit_key_w, AIRPCAP_ADVANCED_EDIT_KEY_TEXT_KEY, key_text_entry);
SIGNAL_CONNECT(key_text_entry, "activate", edit_key, edit_key_w );
gtk_box_pack_start(GTK_BOX(text_box), key_text_entry, FALSE, FALSE, 1);
gtk_container_add(GTK_CONTAINER(edit_key_frame),text_box);
gtk_container_set_border_width (GTK_CONTAINER (text_box), 5);
/* Create and add buttons */
key_ok_bt = gtk_button_new_with_label("OK");
SIGNAL_CONNECT(key_ok_bt, "clicked", edit_key, edit_key_w );
OBJECT_SET_DATA(edit_key_w, AIRPCAP_ADVANCED_EDIT_KEY_OK_KEY, key_ok_bt);
#if GTK_MAJOR_VERSION < 2
gtk_widget_set_usize( GTK_WIDGET(key_ok_bt),
50,
-1 );
#else
gtk_widget_set_size_request( GTK_WIDGET(key_ok_bt),
50,
-1 );
#endif
key_cancel_bt = gtk_button_new_with_label("Cancel");
SIGNAL_CONNECT(key_cancel_bt, "clicked", window_cancel_button_cb, edit_key_w );
#if GTK_MAJOR_VERSION < 2
gtk_widget_set_usize( GTK_WIDGET(key_cancel_bt),
50,
-1 );
#else
gtk_widget_set_size_request( GTK_WIDGET(key_cancel_bt),
50,
-1 );
#endif
gtk_box_pack_end(GTK_BOX(button_box), key_cancel_bt, FALSE, FALSE, 1);
gtk_box_pack_end(GTK_BOX(button_box), key_ok_bt, FALSE, FALSE, 1);
/* Show all */
gtk_widget_show(key_ok_bt);
gtk_widget_show(key_cancel_bt);
gtk_widget_show(key_text_entry);
gtk_widget_show(edit_key_frame);
gtk_widget_show(text_box);
gtk_widget_show(button_box);
gtk_widget_show(key_box);
gtk_widget_show(main_box);
gtk_widget_show(edit_key_w);
}
}
}
/*
* Callback for the 'Move Key Up' button.
*/
static void
airpcap_advanced_move_key_up_cb(GtkWidget *button, gpointer data _U_)
{
GtkList *key_ls;
GtkWidget *label,*nl_lb,*nl_item;
GList *new_list = NULL;
GList *item = NULL;
gint n;
/* retrieve key list */
key_ls = GTK_LIST(data);
/* Remove selected keys*/
if(key_ls->selection != NULL)
{
item = g_list_nth(key_ls->selection,0);
if(item != NULL)
{
n = gtk_list_child_position(key_ls,item->data);
if(n>0)
{
label = GTK_BIN(item->data)->child;
nl_lb = gtk_label_new(GTK_LABEL(label)->label);
gtk_list_clear_items(key_ls,n,n+1);
nl_item = gtk_list_item_new();
gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5);
gtk_container_add(GTK_CONTAINER(nl_item), nl_lb);
gtk_widget_show(nl_lb);
gtk_widget_show(nl_item);
new_list = g_list_append(new_list,nl_item);
gtk_list_insert_items(key_ls,new_list,n-1);
gtk_list_select_item(key_ls,n-1);
}
}
}
/* Need to save config... */
airpcap_if_selected->saved = FALSE;
}
/*
* Callback for the 'Move Key Down' button.
*/
static void
airpcap_advanced_move_key_down_cb(GtkWidget *button, gpointer data _U_)
{
GtkList *key_ls;
GtkWidget *label,*nl_lb,*nl_item;
GList *new_list = NULL;
GList *item = NULL;
unsigned int n;
/* retrieve key list */
key_ls = GTK_LIST(data);
/* Remove selected keys*/
if(key_ls->selection != NULL)
{
item = g_list_nth(key_ls->selection,0);
if(item != NULL)
{
n = gtk_list_child_position(key_ls,item->data);
if(n< (g_list_length(key_ls->children)-1))
{
label = GTK_BIN(item->data)->child;
nl_lb = gtk_label_new(GTK_LABEL(label)->label);
gtk_list_clear_items(key_ls,n,n+1);
nl_item = gtk_list_item_new();
gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5);
gtk_container_add(GTK_CONTAINER(nl_item), nl_lb);
gtk_widget_show(nl_lb);
gtk_widget_show(nl_item);
new_list = g_list_append(new_list,nl_item);
gtk_list_insert_items(key_ls,new_list,n+1);
gtk_list_select_item(key_ls,n+1);
}
}
}
/* Need to save config... */
airpcap_if_selected->saved = FALSE;
}
/* Turns the decryption on or off */
static void
wep_encryption_check_cb(GtkWidget *w, gpointer data)
{
if( !block_advanced_signals && (airpcap_if_selected != NULL))
{
if(airpcap_if_selected->DecryptionOn == AIRPCAP_DECRYPTION_ON)
{
airpcap_if_selected->DecryptionOn = AIRPCAP_DECRYPTION_OFF;
airpcap_if_selected->saved = FALSE;
}
else
{
airpcap_if_selected->DecryptionOn = AIRPCAP_DECRYPTION_ON;
airpcap_if_selected->saved = FALSE;
}
}
}
/* Called to create the airpcap settings' window */
void
display_airpcap_advanced_cb(GtkWidget *w, gpointer data)
{
/* Main window */
GtkWidget *airpcap_advanced_w;
/* Blink button */
GtkWidget *blink_bt,
*channel_combo;
/* Combos */
GtkWidget *interface_combo,
*capture_combo;
/* check */
GtkWidget *wrong_crc_combo;
/* key list*/
GtkWidget *key_ls;
/* frames */
GtkWidget *interface_frame,
*basic_frame,
*wep_frame;
/* boxes */
GtkWidget *main_box,
*buttons_box_1,
*buttons_box_2,
*interface_box,
*basic_box,
*basic_combo_box,
*basic_check_box,
*basic_label_box,
*basic_wrong_box,
*wep_box,
*wep_sub_box,
*encryption_box,
*wep_buttons_box;
/* buttons */
/* blink button is global */
GtkWidget *add_new_key_bt,
*remove_key_bt,
*edit_key_bt,
*move_key_up_bt,
*move_key_down_bt,
*reset_configuration_bt,
*about_bt,
*apply_bt,
*ok_bt,
*cancel_bt;
/* combo */
/* shortcut to combo entry */
GtkWidget *link_type_te,
*wrong_crc_te,
*channel_te;
/* check */
/* global check buttons */
GtkWidget *crc_check,
*encryption_check;
/* label */
GtkWidget *channel_lb,
*wrong_lb,
*capture_lb;
/* text field */
GtkWidget *key_text;
/* widgets in the toolbar */
GtkWidget *toolbar,
*toolbar_if_lb,
*toolbar_channel_cm,
*toolbar_wrong_crc_cm;
/* other stuff */
GList *channel_list,*capture_list;
GList *linktype_list = NULL;
gchar *capture_s;
/* user data - RETRIEVE pointers of toolbar widgets */
toolbar = GTK_WIDGET(data);
toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY));
toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY));
toolbar_wrong_crc_cm= GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_WRONG_CRC_KEY));
/* gray out the toolbar */
gtk_widget_set_sensitive(toolbar,FALSE);
/* main window */
/* global */
/* NULL to global widgets */
blink_bt = NULL;
channel_combo = NULL;
block_advanced_signals = FALSE;
/* the selected is the active, for now */
airpcap_if_selected = airpcap_if_active;
/* Create the new window */
airpcap_advanced_w = window_new(GTK_WINDOW_TOPLEVEL, "Advanced Wireless Settings");
/*
* I will need the toolbar and the main widget in some callback,
* so I will add the toolbar pointer to the airpcap_advanced_w
*/
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY,toolbar);
/* Connect the callbacks */
SIGNAL_CONNECT(airpcap_advanced_w, "delete_event", window_delete_event_cb, airpcap_advanced_w);
SIGNAL_CONNECT(airpcap_advanced_w, "destroy", airpcap_if_destroy_cb, airpcap_advanced_w);
/* Set the size */
/* Sets the border width of the window. */
gtk_container_set_border_width (GTK_CONTAINER (airpcap_advanced_w), 10);
/* Create the main box */
main_box = gtk_vbox_new(FALSE,0);
/* Create the button boxes */
buttons_box_1 = gtk_hbox_new(FALSE,0);
buttons_box_2 = gtk_hbox_new(FALSE,0);
/* Create the buttons for box 1 */
reset_configuration_bt = gtk_button_new_with_label("Reset Configuration");
SIGNAL_CONNECT(reset_configuration_bt, "clicked", airpcap_advanced_reset_configuration_cb, toolbar);
gtk_widget_show(reset_configuration_bt);
about_bt = gtk_button_new_with_label("About");
SIGNAL_CONNECT(about_bt, "clicked", airpcap_advanced_about_cb, toolbar);
gtk_widget_show(about_bt);
/* Add them to box 1 */
gtk_box_pack_start (GTK_BOX (buttons_box_1), reset_configuration_bt, FALSE, FALSE, 1);
gtk_box_pack_start (GTK_BOX (buttons_box_1), about_bt, FALSE, FALSE, 1);
/* Create the buttons for box 2 */
apply_bt = gtk_button_new_with_label("Apply");
SIGNAL_CONNECT(apply_bt, "clicked", airpcap_advanced_apply_cb, airpcap_advanced_w);
gtk_widget_show(apply_bt);
ok_bt = gtk_button_new_with_label("Ok");
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_OK_KEY,ok_bt);
window_set_cancel_button(airpcap_advanced_w, ok_bt, window_cancel_button_cb);
gtk_widget_show(ok_bt);
cancel_bt = gtk_button_new_with_label("Cancel");
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CANCEL_KEY,cancel_bt);
window_set_cancel_button(airpcap_advanced_w, cancel_bt, window_cancel_button_cb);
gtk_widget_show(cancel_bt);
/* Add them to box 2 */
gtk_box_pack_end (GTK_BOX (buttons_box_2), cancel_bt, FALSE, FALSE, 1);
gtk_box_pack_end (GTK_BOX (buttons_box_2), apply_bt, FALSE, FALSE, 1);
gtk_box_pack_end (GTK_BOX (buttons_box_2), ok_bt, FALSE, FALSE, 1);
/* Create the three main frames */
interface_frame = gtk_frame_new("");
gtk_frame_set_label(GTK_FRAME(interface_frame),"Interface");
basic_frame = gtk_frame_new("");
gtk_frame_set_label(GTK_FRAME(basic_frame),"Basic Parameters");
wep_frame = gtk_frame_new("");
gtk_frame_set_label(GTK_FRAME(wep_frame),"WEP Keys");
/* Create the three sub boxes */
interface_box = gtk_hbox_new(FALSE,0);
basic_box = gtk_hbox_new(FALSE,0);
wep_box = gtk_vbox_new(FALSE,0);
/* Fill the interface_box */
if(airpcap_if_active != NULL)
{
interface_combo = gtk_label_new(airpcap_if_active->description);
}
else
{
interface_combo = gtk_label_new("No airpcap interface found!");
gtk_widget_set_sensitive(main_box,FALSE);
}
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_INTERFACE_KEY,interface_combo);
gtk_box_pack_start (GTK_BOX (interface_box), interface_combo, TRUE, TRUE, 0);
gtk_widget_show(interface_combo);
/* blink led button (BEFORE interface_combo, 'cause its callback will need blink_bt)*/
blink_bt = gtk_button_new_with_label(" Blink Led ");
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_BLINK_KEY,blink_bt);
gtk_box_pack_end (GTK_BOX (interface_box), blink_bt, FALSE, FALSE, 0);
SIGNAL_CONNECT(blink_bt, "clicked", blink_cb, NULL);
gtk_widget_show(blink_bt);
gtk_container_set_border_width (GTK_CONTAINER (interface_box), 10);
/* Fill the basic_box */
/* Create the two vertical boxes for combo and check */
basic_combo_box = gtk_vbox_new(TRUE,0);
basic_check_box = gtk_vbox_new(TRUE,0);
basic_label_box = gtk_vbox_new(TRUE,0);
/* Create the Wrong CRC horiziontal box */
basic_wrong_box = gtk_hbox_new(FALSE,0);
/* Fill the label vbox */
channel_lb = gtk_label_new("Channel: ");
gtk_label_set_justify(GTK_LABEL(channel_lb),GTK_JUSTIFY_LEFT);
gtk_box_pack_start (GTK_BOX (basic_label_box), channel_lb, TRUE, TRUE, 0);
gtk_widget_show(channel_lb);
capture_lb = gtk_label_new("Capture Type:");
gtk_label_set_justify(GTK_LABEL(capture_lb),GTK_JUSTIFY_LEFT);
gtk_box_pack_start (GTK_BOX (basic_label_box), capture_lb, TRUE, TRUE, 0);
gtk_widget_show(capture_lb);
/* Create the two combo boxes */
channel_combo = gtk_combo_new();
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CHANNEL_KEY,channel_combo);
channel_list = NULL;
channel_list = g_list_append(channel_list, "1");
channel_list = g_list_append(channel_list, "2");
channel_list = g_list_append(channel_list, "3");
channel_list = g_list_append(channel_list, "4");
channel_list = g_list_append(channel_list, "5");
channel_list = g_list_append(channel_list, "6");
channel_list = g_list_append(channel_list, "7");
channel_list = g_list_append(channel_list, "8");
channel_list = g_list_append(channel_list, "9");
channel_list = g_list_append(channel_list, "10");
channel_list = g_list_append(channel_list, "11");
channel_list = g_list_append(channel_list, "12");
channel_list = g_list_append(channel_list, "13");
channel_list = g_list_append(channel_list, "14");
gtk_combo_set_popdown_strings( GTK_COMBO(channel_combo), channel_list) ;
/* Select the first entry */
if(airpcap_if_selected != NULL)
{
airpcap_update_channel_combo(GTK_WIDGET(channel_combo), airpcap_if_selected);
}
channel_te = GTK_COMBO(channel_combo)->entry;
gtk_editable_set_editable(GTK_EDITABLE(channel_te),FALSE);
SIGNAL_CONNECT(channel_te, "changed", channel_changed_cb, channel_te);
gtk_box_pack_start (GTK_BOX (basic_combo_box), channel_combo, FALSE, FALSE, 0);
gtk_widget_show(channel_combo);
capture_combo = gtk_combo_new();
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY,capture_combo);
capture_list = NULL;
capture_list = g_list_append(capture_list, AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
capture_list = g_list_append(capture_list, AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
gtk_combo_set_popdown_strings( GTK_COMBO(capture_combo), capture_list) ;
capture_s = NULL;
if(airpcap_if_selected != NULL)
{
if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11)
capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_ONLY);
else if(airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO)
capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO);
if(capture_s != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s);
}
g_free(capture_s);
link_type_te = GTK_COMBO(capture_combo)->entry;
gtk_editable_set_editable(GTK_EDITABLE(link_type_te),FALSE);
SIGNAL_CONNECT(link_type_te, "changed", link_type_changed_cb, link_type_te);
gtk_box_pack_start (GTK_BOX (basic_combo_box), capture_combo, FALSE, FALSE, 1);
gtk_widget_show(capture_combo);
/* Create the two check boxes */
crc_check = gtk_check_button_new_with_label("Include 802.11 FCS in Frames");
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CRC_KEY,crc_check);
/* Fcs Presence check box */
if(airpcap_if_selected != NULL)
{
if(airpcap_if_selected->IsFcsPresent)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),FALSE);
}
SIGNAL_CONNECT(crc_check,"toggled",crc_check_cb,NULL);
gtk_box_pack_start (GTK_BOX (basic_check_box), crc_check, FALSE, FALSE, 0);
gtk_widget_show(crc_check);
/* CRC Filter label */
wrong_lb = gtk_label_new("FCS Filter:");
gtk_box_pack_start (GTK_BOX (basic_wrong_box), wrong_lb, FALSE, FALSE, 0);
gtk_widget_show(wrong_lb);
/* CRC Filter combo */
wrong_crc_combo = gtk_combo_new();
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_WRONG_CRC_KEY,wrong_crc_combo);
linktype_list = g_list_append(linktype_list, AIRPCAP_VALIDATION_TYPE_NAME_ALL);
linktype_list = g_list_append(linktype_list, AIRPCAP_VALIDATION_TYPE_NAME_CORRECT);
linktype_list = g_list_append(linktype_list, AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT);
gtk_combo_set_popdown_strings( GTK_COMBO(wrong_crc_combo), linktype_list) ;
wrong_crc_te = GTK_COMBO(wrong_crc_combo)->entry;
if(airpcap_if_selected != NULL)
{
airpcap_validation_type_combo_set_by_type(wrong_crc_combo,airpcap_if_selected->CrcValidationOn);
}
gtk_editable_set_editable(GTK_EDITABLE(wrong_crc_te),FALSE);
SIGNAL_CONNECT(wrong_crc_te,"changed",wrong_crc_combo_cb,wrong_crc_te);
gtk_box_pack_start (GTK_BOX (basic_wrong_box), wrong_crc_combo, FALSE, FALSE, 0);
gtk_widget_show(wrong_crc_combo);
gtk_box_pack_start(GTK_BOX(basic_check_box), basic_wrong_box, FALSE, FALSE, 0);
gtk_widget_show(basic_wrong_box);
/* Add the vertical inner boxes to the basic_box */
gtk_box_pack_start (GTK_BOX (basic_box), basic_label_box, FALSE, FALSE, 10);
gtk_box_pack_start (GTK_BOX (basic_box), basic_combo_box, FALSE, FALSE, 10);
gtk_box_pack_start (GTK_BOX (basic_box), basic_check_box, FALSE, FALSE, 10);
gtk_container_set_border_width (GTK_CONTAINER (basic_box), 10);
/* Fill the wep_box */
wep_sub_box = gtk_hbox_new(FALSE,1);
gtk_widget_show(wep_sub_box);
encryption_box = gtk_hbox_new(FALSE,1);
gtk_widget_show(encryption_box);
/* encryption enabled box */
encryption_check = gtk_check_button_new_with_label("Enable WEP Decryption");
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_WEP_DECRYPTION_KEY,encryption_check);
/* Fcs Presence check box */
if(airpcap_if_selected != NULL)
{
if(airpcap_if_selected->DecryptionOn == AIRPCAP_DECRYPTION_ON)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(encryption_check),TRUE);
else
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(encryption_check),FALSE);
}
SIGNAL_CONNECT(encryption_check,"toggled",wep_encryption_check_cb,NULL);
gtk_box_pack_start (GTK_BOX (encryption_box), encryption_check, FALSE, FALSE, 0);
gtk_widget_show(encryption_check);
/* WEP text box */
key_text = scrolled_window_new(NULL, NULL);
/* never use a scrollbar in x direction, show the complete relation string */
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(key_text),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
#if GTK_MAJOR_VERSION >= 2
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(key_text),
GTK_SHADOW_IN);
#endif
/* add WEP keys if present... */
key_ls = gtk_list_new();
gtk_list_set_selection_mode(GTK_LIST(key_ls), GTK_SELECTION_SINGLE);
OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEYLIST_KEY,key_ls);
airpcap_fill_key_list(key_ls,airpcap_if_selected);
gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(key_text),key_ls);
gtk_widget_show(key_ls);
gtk_box_pack_start (GTK_BOX (wep_sub_box), key_text, TRUE, TRUE, 0);
gtk_widget_show(key_text);
/* WEP buttons */
wep_buttons_box = gtk_vbox_new(FALSE,0);
/* Create and add buttons */
add_new_key_bt = gtk_button_new_with_label("Add New Key");
SIGNAL_CONNECT(add_new_key_bt, "clicked", airpcap_advanced_add_key_cb, airpcap_advanced_w);
gtk_box_pack_start (GTK_BOX (wep_buttons_box), add_new_key_bt, FALSE, FALSE, 0);
gtk_widget_show(add_new_key_bt);
remove_key_bt = gtk_button_new_with_label("Remove Key");
SIGNAL_CONNECT(remove_key_bt, "clicked", airpcap_advanced_remove_key_cb, key_ls);
gtk_box_pack_start (GTK_BOX (wep_buttons_box), remove_key_bt, FALSE, FALSE, 0);
gtk_widget_show(remove_key_bt);
edit_key_bt = gtk_button_new_with_label("Edit Key");
SIGNAL_CONNECT(edit_key_bt, "clicked", airpcap_advanced_edit_key_cb, airpcap_advanced_w);
gtk_box_pack_start (GTK_BOX (wep_buttons_box), edit_key_bt, FALSE, FALSE, 0);
gtk_widget_show(edit_key_bt);
move_key_up_bt = gtk_button_new_with_label("Move Key Up");
SIGNAL_CONNECT(move_key_up_bt, "clicked", airpcap_advanced_move_key_up_cb, key_ls);
gtk_box_pack_start (GTK_BOX (wep_buttons_box), move_key_up_bt, FALSE, FALSE, 0);
gtk_widget_show(move_key_up_bt);
move_key_down_bt = gtk_button_new_with_label("Move Key Down");
SIGNAL_CONNECT(move_key_down_bt, "clicked", airpcap_advanced_move_key_down_cb, key_ls);
gtk_box_pack_start (GTK_BOX (wep_buttons_box), move_key_down_bt, FALSE, FALSE, 0);
gtk_widget_show(move_key_down_bt);
gtk_box_pack_end (GTK_BOX (wep_sub_box), wep_buttons_box, FALSE, FALSE, 0);
gtk_container_set_border_width (GTK_CONTAINER (wep_sub_box), 10);
gtk_box_pack_start (GTK_BOX (wep_box), encryption_box, FALSE, FALSE,0);
gtk_box_pack_start (GTK_BOX (wep_box), wep_sub_box, FALSE, FALSE,0);
gtk_widget_show(wep_sub_box);
/* Add them to the frames */
gtk_container_add(GTK_CONTAINER(interface_frame),interface_box);
gtk_container_add(GTK_CONTAINER(basic_frame),basic_box);
gtk_container_add(GTK_CONTAINER(wep_frame),wep_box);
/* Add frames to the main box */
gtk_box_pack_start (GTK_BOX (main_box), interface_frame, FALSE, FALSE, 1);
gtk_box_pack_start (GTK_BOX (main_box), basic_frame, FALSE, FALSE, 1);
gtk_box_pack_start (GTK_BOX (main_box), wep_frame, FALSE, FALSE, 1);
/* Add buttons' boxes to the main box */
gtk_box_pack_start (GTK_BOX (main_box), buttons_box_2, FALSE, FALSE, 1);
/* Add the main box to the main window */
gtk_container_add(GTK_CONTAINER(airpcap_advanced_w),main_box);
/* SHOW EVERYTHING */
/* Show the WEP key buttons */
gtk_widget_show (wep_buttons_box);
/* Show the combo and check boxes */
gtk_widget_show (basic_label_box);
gtk_widget_show (basic_combo_box);
gtk_widget_show (basic_check_box);
/* Show the button boxes */
gtk_widget_show (buttons_box_1);
gtk_widget_show (buttons_box_2);
/* Show the frames */
gtk_widget_show (interface_frame);
gtk_widget_show (basic_frame);
gtk_widget_show (wep_frame);
/* Show the sub main boxes */
gtk_widget_show (interface_box);
gtk_widget_show (basic_box);
gtk_widget_show (wep_box);
/* Show the main box */
gtk_widget_show (main_box);
/* Show the window */
gtk_widget_show (airpcap_advanced_w);
}
#endif /* HAVE_AIRPCAP */