aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2006-10-30 06:34:31 +0000
committerGerald Combs <gerald@wireshark.org>2006-10-30 06:34:31 +0000
commitff8422a3e4234141625de38b0999ff434715a3bd (patch)
treefb037fae95d048a96d7616f57b88463edbbdbead /gtk
parentb8b14bf66a3fef1f360ad8236fa6fc8f0a688a43 (diff)
From Giorgio Tino: Add support for version 2.0 of the AirPcap driver,
which has an updated API for WEP key handling. svn path=/trunk/; revision=19736
Diffstat (limited to 'gtk')
-rw-r--r--gtk/about_dlg.c2
-rw-r--r--gtk/airpcap_dlg.c148
-rwxr-xr-xgtk/airpcap_gui_utils.c213
-rwxr-xr-xgtk/airpcap_gui_utils.h8
-rw-r--r--gtk/main.c23
5 files changed, 327 insertions, 67 deletions
diff --git a/gtk/about_dlg.c b/gtk/about_dlg.c
index eee578ca5c..3744530c8b 100644
--- a/gtk/about_dlg.c
+++ b/gtk/about_dlg.c
@@ -80,7 +80,7 @@ about_wireshark(GtkWidget *parent, GtkWidget *main_vb, const char *title)
}
-GtkWidget *
+GtkWidget*
splash_new(char *message)
{
GtkWidget *win;
diff --git a/gtk/airpcap_dlg.c b/gtk/airpcap_dlg.c
index dba152df71..ecde5677af 100644
--- a/gtk/airpcap_dlg.c
+++ b/gtk/airpcap_dlg.c
@@ -558,7 +558,7 @@ airpcap_change_if(GtkWidget *entry _U_, gpointer data)
/* 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);
+ airpcap_fill_key_list(key_ls);
/* Enable the signals again */
block_advanced_signals = FALSE;
@@ -1831,7 +1831,6 @@ cf_redissect_packets(&cfile);
void
update_decryption_mode_cm(GtkWidget *w)
{
-
/* Wireshark decryption is on */
if(wireshark_decryption_on())
{
@@ -2508,6 +2507,7 @@ airpcap_if_selected = airpcap_if_active;
/* Create the new window */
key_management_w = window_new(GTK_WINDOW_TOPLEVEL, "Decryption Keys Management");
+
gtk_container_set_border_width (GTK_CONTAINER (key_management_w), 5);
gtk_window_set_title (GTK_WINDOW (key_management_w),
"Decryption Keys Management");
@@ -2606,8 +2606,6 @@ key_ls = gtk_clist_new (3);
gtk_widget_set_name (key_ls, "key_ls");
gtk_widget_show (key_ls);
-airpcap_fill_key_list(key_ls,airpcap_if_selected);
-
gtk_container_add (GTK_CONTAINER (keys_scrolled_w), key_ls);
gtk_clist_set_column_width (GTK_CLIST (key_ls), 0, 54);
gtk_clist_set_column_width (GTK_CLIST (key_ls), 1, 113);
@@ -2756,6 +2754,7 @@ OBJECT_SET_DATA (key_management_w, AIRPCAP_ADVANCED_CANCEL_KEY, cancel_bt);
OBJECT_SET_DATA(key_management_w,AIRPCAP_TOOLBAR_KEY,toolbar);
OBJECT_SET_DATA (key_management_w, AIRPCAP_TOOLBAR_DECRYPTION_KEY, toolbar_decryption_ck);
+/* FIRST OF ALL, CHECK THE KEY COLLECTIONS */
/*
* This will read the decryption keys from the preferences file, and will store
* them into the registry...
@@ -2768,9 +2767,10 @@ if(!airpcap_check_decryption_keys(airpcap_if_list))
else /* Keys from lists are equals, or wireshark has got no keys */
{
airpcap_load_decryption_keys(airpcap_if_list);
+ airpcap_fill_key_list(key_ls);
/* At the end, so that it appears completely all together ... */
- gtk_widget_show (key_management_w);
- }
+ gtk_widget_show (key_management_w);
+ }
}
/*
@@ -3102,6 +3102,7 @@ on_keys_check_cancel_bt_clicked (GtkWidget *button, gpointer user_data)
{
GtkWidget *key_management_w;
GtkWidget *keys_check_w;
+GtkWidget *key_ls;
keys_check_w = GTK_WIDGET(user_data);
@@ -3109,11 +3110,13 @@ key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
and is not NULL if it was called when the Key Management widget has been clicked */
- if(key_management_w != NULL)
- {
- /* ... */
- gtk_widget_show (key_management_w);
- }
+if(key_management_w != NULL)
+ {
+ /* ... */
+ key_ls = OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
+ airpcap_fill_key_list(key_ls);
+ gtk_widget_show (key_management_w);
+ }
gtk_widget_destroy(keys_check_w);
}
@@ -3157,22 +3160,53 @@ on_keep_bt_clicked (GtkWidget *button, gpointer user_data)
{
GtkWidget *key_management_w;
GtkWidget *keys_check_w;
+GtkWidget *key_ls=NULL;
+
+GList* wireshark_keys=NULL;
+guint n_wireshark_keys = 0;
+
+GList* merged_keys=NULL;
+guint n_merged_keys = 0;
+
+guint n_adapters=0;
+guint n_total_keys=0;
keys_check_w = GTK_WIDGET(user_data);
key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
- if(key_management_w != NULL)
- {
- /* ... */
- gtk_widget_show (key_management_w);
- }
+n_adapters = g_list_length(airpcap_if_list);
+/* Retrieve Wireshark keys */
+wireshark_keys = get_wireshark_keys();
+n_wireshark_keys = g_list_length(wireshark_keys);
+n_total_keys += n_wireshark_keys;
+
+merged_keys = merge_key_list(wireshark_keys,NULL);
+n_merged_keys = g_list_length(merged_keys);
+
+/* Set up this new list as default for Wireshark and Adapters... */
+airpcap_save_decryption_keys(merged_keys,airpcap_if_list);
+
+/* Write the preferences to the preferences file (here is not needed, by the way)*/
+write_prefs_to_file();
+
+/* Free the memory */
+free_key_list(wireshark_keys);
+free_key_list(merged_keys);
+
+/* Close the window */
gtk_widget_destroy(keys_check_w);
-airpcap_load_decryption_keys(airpcap_if_list);
+/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
+ and is not NULL if it was called when the Key Management widget has been clicked */
+if(key_management_w != NULL)
+ {
+ /* ... */
+ key_ls = OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
+ airpcap_fill_key_list(key_ls);
+ gtk_widget_show (key_management_w);
+ }
}
void
@@ -3180,15 +3214,18 @@ on_merge_bt_clicked (GtkWidget * button, gpointer user_data)
{
GtkWidget *key_management_w;
GtkWidget *keys_check_w;
+GtkWidget *key_ls;
guint n_adapters = 0;
guint n_wireshark_keys = 0;
+guint n_driver_keys = 0;
guint n_curr_adapter_keys = 0;
guint n_total_keys = 0;
guint n_merged_keys = 0;
guint i = 0;
GList* wireshark_keys=NULL;
+GList* driver_keys=NULL;
GList* current_adapter_keys=NULL;
GList* merged_list = NULL;
GList* merged_list_tmp = NULL;
@@ -3199,24 +3236,23 @@ keys_check_w = GTK_WIDGET(user_data);
key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
-
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
-if(key_management_w != NULL)
- {
- /* ... */
- gtk_widget_show (key_management_w);
- }
-
n_adapters = g_list_length(airpcap_if_list);
+/* Retrieve Wireshark keys */
wireshark_keys = get_wireshark_keys();
n_wireshark_keys = g_list_length(wireshark_keys);
n_total_keys += n_wireshark_keys;
merged_list = merge_key_list(wireshark_keys,NULL);
-/* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
+/* Retrieve AirPcap driver's keys */
+driver_keys = get_airpcap_driver_keys();
+n_driver_keys = g_list_length(driver_keys);
+n_total_keys += n_driver_keys;
+
+merged_list = merge_key_list(merged_list,driver_keys);
+
+/* NOW wireshark_keys and driver_keys ARE no more needed... at the end, we will have to free them! */
for(i = 0; i<n_adapters; i++)
{
curr_adapter = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
@@ -3239,8 +3275,19 @@ airpcap_save_decryption_keys(merged_list,airpcap_if_list);
write_prefs_to_file();
free_key_list(wireshark_keys);
+free_key_list(driver_keys);
gtk_widget_destroy(keys_check_w);
+
+/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
+ and is not NULL if it was called when the Key Management widget has been clicked */
+if(key_management_w != NULL)
+ {
+ /* ... */
+ key_ls = OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
+ airpcap_fill_key_list(key_ls);
+ gtk_widget_show (key_management_w);
+ }
}
@@ -3249,15 +3296,18 @@ on_import_bt_clicked (GtkWidget * button, gpointer user_data)
{
GtkWidget *key_management_w;
GtkWidget *keys_check_w;
+GtkWidget *key_ls;
guint n_adapters = 0;
guint n_wireshark_keys = 0;
+guint n_driver_keys = 0;
guint n_curr_adapter_keys = 0;
guint n_total_keys = 0;
guint n_merged_keys = 0;
guint i = 0;
GList* wireshark_keys=NULL;
+GList* driver_keys=NULL;
GList* current_adapter_keys=NULL;
GList* merged_list = NULL;
GList* merged_list_tmp = NULL;
@@ -3268,21 +3318,19 @@ keys_check_w = GTK_WIDGET(user_data);
key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
-
-/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
- and is not NULL if it was called when the Key Management widget has been clicked */
-if(key_management_w != NULL)
- {
- /* ... */
- gtk_widget_show (key_management_w);
- }
-
n_adapters = g_list_length(airpcap_if_list);
wireshark_keys = get_wireshark_keys();
n_wireshark_keys = g_list_length(wireshark_keys);
n_total_keys += n_wireshark_keys;
+/* Retrieve AirPcap driver's keys */
+driver_keys = get_airpcap_driver_keys();
+n_driver_keys = g_list_length(driver_keys);
+n_total_keys += n_driver_keys;
+
+merged_list = merge_key_list(merged_list,driver_keys);
+
/* NOW wireshark_keys IS no more needed... at the end, we will have to free it! */
for(i = 0; i<n_adapters; i++)
{
@@ -3306,8 +3354,19 @@ airpcap_save_decryption_keys(merged_list,airpcap_if_list);
write_prefs_to_file();
free_key_list(wireshark_keys);
+free_key_list(driver_keys);
gtk_widget_destroy(keys_check_w);
+
+/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
+ and is not NULL if it was called when the Key Management widget has been clicked */
+if(key_management_w != NULL)
+ {
+ /* ... */
+ key_ls = OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
+ airpcap_fill_key_list(key_ls);
+ gtk_widget_show (key_management_w);
+ }
}
@@ -3316,6 +3375,7 @@ on_ignore_bt_clicked (GtkWidget * button, gpointer user_data)
{
GtkWidget *key_management_w;
GtkWidget *keys_check_w;
+GtkWidget *key_ls;
keys_check_w = GTK_WIDGET(user_data);
@@ -3323,11 +3383,13 @@ key_management_w = OBJECT_GET_DATA(keys_check_w,AIRPCAP_CHECK_WINDOW_KEY);
/* w may be NULL if airpcap_keys_check_w() has been called while wireshark was loading,
and is not NULL if it was called when the Key Management widget has been clicked */
- if(key_management_w != NULL)
- {
- /* ... */
- gtk_widget_show (key_management_w);
- }
+if(key_management_w != NULL)
+ {
+ /* ... */
+ key_ls = OBJECT_GET_DATA(key_management_w,AIRPCAP_ADVANCED_KEYLIST_KEY);
+ airpcap_fill_key_list(key_ls);
+ gtk_widget_show (key_management_w);
+ }
gtk_widget_destroy(keys_check_w);
}
diff --git a/gtk/airpcap_gui_utils.c b/gtk/airpcap_gui_utils.c
index 19f1a87cc6..20c6e47ce0 100755
--- a/gtk/airpcap_gui_utils.c
+++ b/gtk/airpcap_gui_utils.c
@@ -274,35 +274,41 @@ g_free(new_row[2]);
* Fill the list with the keys
*/
void
-airpcap_fill_key_list(GtkWidget *keylist,airpcap_if_info_t* if_info)
+airpcap_fill_key_list(GtkWidget *keylist)
{
gchar* s;
unsigned int i,n;
gchar* new_row[3];
+airpcap_if_info_t* fake_if_info;
+GList* wireshark_key_list=NULL;
+decryption_key_t* curr_key = NULL;
n = 0;
- if( (if_info != NULL) && (if_info->keysCollection != NULL))
+fake_if_info = airpcap_driver_fake_if_info_new();
+
+ /* We can retrieve the driver's key list (i.e. we have the right .dll)*/
+ if( (fake_if_info != NULL) && (fake_if_info->keysCollection != NULL))
{
- n = if_info->keysCollection->nKeys;
- for(i = 0; i < if_info->keysCollection->nKeys; i++)
+ n = fake_if_info->keysCollection->nKeys;
+ for(i = 0; i < n; i++)
{
- s = airpcap_get_key_string(if_info->keysCollection->Keys[i]);
+ s = airpcap_get_key_string(fake_if_info->keysCollection->Keys[i]);
- if(if_info->keysCollection->Keys[i].KeyType == AIRPCAP_KEYTYPE_WEP)
+ if(fake_if_info->keysCollection->Keys[i].KeyType == AIRPCAP_KEYTYPE_WEP)
{
new_row[0] = g_strdup(AIRPCAP_WEP_KEY_STRING);
new_row[1] = g_strdup(s);
new_row[2] = g_strdup("");
}
- else if(if_info->keysCollection->Keys[i].KeyType == AIRPCAP_KEYTYPE_TKIP)
+ else if(fake_if_info->keysCollection->Keys[i].KeyType == AIRPCAP_KEYTYPE_TKIP)
{
new_row[0] = g_strdup(AIRPCAP_WPA_KEY_STRING);
new_row[1] = g_strdup(s);
/* XXX - Put here the SSID */
new_row[2] = g_strdup("");
}
- else if(if_info->keysCollection->Keys[i].KeyType == AIRPCAP_KEYTYPE_CCMP)
+ else if(fake_if_info->keysCollection->Keys[i].KeyType == AIRPCAP_KEYTYPE_CCMP)
{
new_row[0] = g_strdup(AIRPCAP_WPA2_KEY_STRING);
new_row[1] = g_strdup(s);
@@ -326,6 +332,32 @@ n = 0;
g_free(s);
}
}
+ else
+ {
+ wireshark_key_list = get_wireshark_keys();
+ n = g_list_length(wireshark_key_list);
+
+ for(i = 0; i < n; i++)
+ {
+ curr_key = (decryption_key_t*)g_list_nth_data(wireshark_key_list,i);
+ s = g_strdup(curr_key->key->str);
+
+ new_row[0] = g_strdup(AIRPCAP_WEP_KEY_STRING);
+ new_row[1] = g_strdup(s);
+ new_row[2] = g_strdup("");
+
+ gtk_clist_append(GTK_CLIST(keylist),new_row);
+
+ g_free(new_row[0]);
+ g_free(new_row[1]);
+ g_free(new_row[2]);
+
+ g_free(s);
+ }
+ }
+
+airpcap_if_info_free(fake_if_info);
+return;
}
/*
@@ -575,7 +607,7 @@ KeysCollectionSize = sizeof(AirpcapKeysCollection) + keys_in_list * sizeof(Airpc
/*
* Allocate the collection
*/
-KeysCollection = (PAirpcapKeysCollection)malloc(KeysCollectionSize);
+KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
if(!KeysCollection)
{
/* Simple dialog ERROR */
@@ -634,6 +666,104 @@ return;
}
/*
+ * Takes the keys from the GtkList widget, and add them to the interface list
+ */
+void
+airpcap_add_keys_to_driver_from_list(GtkWidget *key_ls,airpcap_if_info_t *fake_if_info)
+{
+GString *new_key;
+
+gchar *text_entered = NULL;
+
+/* airpcap stuff */
+UINT i, j;
+gchar s[3];
+PAirpcapKeysCollection KeysCollection;
+ULONG KeysCollectionSize;
+UCHAR KeyByte;
+
+UINT keys_in_list = 0;
+
+gchar *row_type,
+ *row_key,
+ *row_ssid;
+
+if(fake_if_info == NULL)
+ return;
+
+keys_in_list = GTK_CLIST(key_ls)->rows;
+
+/*
+ * 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)g_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
+ */
+KeysCollection->nKeys = keys_in_list;
+
+for(i = 0; i < keys_in_list; i++)
+{
+ /* Retrieve the row infos */
+ gtk_clist_get_text(GTK_CLIST(key_ls),i,0,&row_type);
+ gtk_clist_get_text(GTK_CLIST(key_ls),i,1,&row_key);
+ gtk_clist_get_text(GTK_CLIST(key_ls),i,2,&row_ssid);
+
+ if(g_strcasecmp(row_type,AIRPCAP_WEP_KEY_STRING) == 0)
+ KeysCollection->Keys[i].KeyType = AIRPCAP_KEYTYPE_WEP;
+ else if(g_strcasecmp(row_type,AIRPCAP_WPA_KEY_STRING) == 0)
+ KeysCollection->Keys[i].KeyType = AIRPCAP_KEYTYPE_TKIP;
+ else if(g_strcasecmp(row_type,AIRPCAP_WPA2_KEY_STRING) == 0)
+ KeysCollection->Keys[i].KeyType = AIRPCAP_KEYTYPE_CCMP;
+
+ /* Retrieve the Item corresponding to the i-th key */
+ new_key = g_string_new(row_key);
+
+ 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(fake_if_info->keysCollection != NULL)
+ g_free(fake_if_info->keysCollection);
+
+/*
+ * Set this collection ad the new one
+ */
+fake_if_info->keysCollection = KeysCollection;
+fake_if_info->keysCollectionSize = KeysCollectionSize;
+return;
+}
+
+/*
* This function will take the current keys (widget list), specified for the
* current adapter, and save them as default for ALL the others.
*/
@@ -642,33 +772,57 @@ airpcap_read_and_save_decryption_keys_from_clist(GtkWidget* key_ls, airpcap_if_i
{
gint if_n = 0;
gint i = 0;
+gint r = 0;
+gint n = 0;
airpcap_if_info_t* curr_if = NULL;
+airpcap_if_info_t* fake_info_if = NULL;
+GList* key_list=NULL;
+char* tmp_key = NULL;
+
+/*
+ * Save the key list for driver.
+ */
+fake_info_if = airpcap_driver_fake_if_info_new();
+
+airpcap_add_keys_to_driver_from_list(key_ls,fake_info_if);
+airpcap_save_driver_if_configuration(fake_info_if);
+airpcap_if_info_free(fake_info_if);
if( (if_list == NULL) || (info_if == NULL) ) return;
if_n = g_list_length(if_list);
-/* For all the adapters in the list, save those keys as default */
+/* For all the adapters in the list, empty the key list */
for(i = 0; i < if_n; i++)
{
curr_if = (airpcap_if_info_t*)g_list_nth_data(if_list,i);
if(curr_if != NULL)
{
- /* If the interface is not the active one, we need to free it's
- key list and copy in the selected key list... */
- airpcap_add_keys_from_list(key_ls,curr_if);
+ /* XXX - Set an empty collection */
+ airpcap_if_clear_decryption_settings(curr_if);
/* Save to registry */
airpcap_save_selected_if_configuration(curr_if);
}
}
-
+
/* Save the settings of the given interface as default for Wireshark...
* By the way, now all the adapters have the same keys, so it is not
* really necessary to use THIS specific one...
*/
-save_wlan_wep_keys(info_if);
+if( (r = save_wlan_driver_wep_keys()) == 0)
+ {
+ /* Create a list of keys from the list widget... */
+ n = GTK_CLIST(key_ls)->rows;
+ for(i = 0; i < n; i++)
+ {
+ gtk_clist_get_text(GTK_CLIST(key_ls),i,1,&tmp_key);
+ key_list = g_list_append(key_list,(gpointer)g_strdup(tmp_key));
+ }
+
+ r = save_wlan_wireshark_wep_keys(key_list);
+ }
}
/*
@@ -689,12 +843,16 @@ airpcap_check_decryption_keys(GList* if_list)
gint if_n = 0;
gint i = 0;
gint n_adapters_keys = 0;
+gint n_driver_keys = 0;
+gint n_wireshark_keys = 0;
airpcap_if_info_t* curr_if = NULL;
GList* wireshark_key_list;
+GList* driver_key_list;
GList* curr_adapter_key_list;
gboolean equals = TRUE;
+gboolean adapters_keys_equals=TRUE;
/*
* If no AirPcap interface is found, return TRUE, so Wireshark
@@ -707,16 +865,26 @@ if_n = g_list_length(if_list);
/* Get Wireshark preferences keys */
wireshark_key_list = get_wireshark_keys();
+n_wireshark_keys = g_list_length(wireshark_key_list);
+
+/* Retrieve AirPcap driver's keys */
+driver_key_list = get_airpcap_driver_keys();
+n_driver_keys = g_list_length(driver_key_list);
+
+equals &= key_lists_are_equal(wireshark_key_list,driver_key_list);
for(i = 0; i < if_n; i++)
{
curr_if = (airpcap_if_info_t*)g_list_nth_data(if_list,i);
curr_adapter_key_list = get_airpcap_device_keys(curr_if);
n_adapters_keys += g_list_length(curr_adapter_key_list);
- equals &= key_lists_are_equal(wireshark_key_list,curr_adapter_key_list);
+ adapters_keys_equals &= key_lists_are_equal(wireshark_key_list,curr_adapter_key_list);
}
-if(n_adapters_keys == 0) /* No keys set in any of the AirPcap adapters... */
+if(n_adapters_keys != 0) /* If for some reason at least one specific key has been found */
+ equals &= adapters_keys_equals; /* */
+
+if(n_driver_keys == 0) /* No keys set in any of the AirPcap adapters... */
return TRUE; /* Use Wireshark keys and set them ad default for airpcap devices */
return equals;
@@ -748,7 +916,7 @@ if_n = g_list_length(if_list);
for(i = 0; i < if_n; i++)
{
curr_if = (airpcap_if_info_t*)g_list_nth_data(if_list,i);
- load_wlan_wep_keys(curr_if);
+ load_wlan_driver_wep_keys();
}
}
@@ -763,23 +931,28 @@ gint if_n = 0;
gint key_n = 0;
gint i = 0;
airpcap_if_info_t* curr_if = NULL;
+GList* empty_key_list = NULL;
if( (key_list == NULL) || (adapters_list == NULL)) return;
if_n = g_list_length(adapters_list);
key_n = g_list_length(key_list);
+/* Set the driver's global list of keys. */
+write_wlan_driver_wep_keys_to_regitry(key_list);
+
+/* Empty the key list for each interface */
for(i = 0; i < if_n; i++)
{
curr_if = (airpcap_if_info_t*)g_list_nth_data(adapters_list,i);
- write_wlan_wep_keys_to_regitry(curr_if,key_list);
+ write_wlan_wep_keys_to_regitry(curr_if,empty_key_list);
}
/*
* This will set the keys of the current adapter as Wireshark default...
* Now all the adapters have the same keys, so curr_if is ok as any other...
*/
-save_wlan_wep_keys(curr_if);
+save_wlan_driver_wep_keys();
}
#endif /* HAVE_AIRPCAP */
diff --git a/gtk/airpcap_gui_utils.h b/gtk/airpcap_gui_utils.h
index c953c31209..ab01366ef4 100755
--- a/gtk/airpcap_gui_utils.h
+++ b/gtk/airpcap_gui_utils.h
@@ -81,6 +81,12 @@ void
airpcap_add_key_to_list(GtkWidget *keylist, gchar* type, gchar* key, gchar* ssid);
/*
+ * Takes the keys from the GtkList widget, and add them to the interface list
+ */
+void
+airpcap_add_keys_to_driver_from_list(GtkWidget *key_ls,airpcap_if_info_t *fake_if_info);
+
+/*
* Modify a key given a list and a row
*/
void
@@ -90,7 +96,7 @@ airpcap_modify_key_in_list(GtkWidget *keylist, gint row, gchar* type, gchar* key
* Fill the list with the keys
*/
void
-airpcap_fill_key_list(GtkWidget *keylist,airpcap_if_info_t* if_info);
+airpcap_fill_key_list(GtkWidget *keylist);
/*
* Function used to retrieve the AirpcapValidationType given the string name.
diff --git a/gtk/main.c b/gtk/main.c
index 98e4896238..496fe75c94 100644
--- a/gtk/main.c
+++ b/gtk/main.c
@@ -2084,6 +2084,7 @@ main(int argc, char *argv[])
int status;
#ifdef HAVE_AIRPCAP
+ int airpcap_dll_ret_val;
char err_str[AIRPCAP_ERRBUF_SIZE];
gchar *cant_get_if_list_errstr;
#endif
@@ -2129,7 +2130,8 @@ main(int argc, char *argv[])
#ifdef HAVE_AIRPCAP
/* Load the airpcap.dll. This must also be done before collecting
* run-time version information. */
- if(load_airpcap())
+ airpcap_dll_ret_val = load_airpcap();
+ if(airpcap_dll_ret_val == AIRPCAP_DLL_OK)
{
/* load the airpcap interfaces */
airpcap_if_list = get_airpcap_interface_list(&err, err_str);
@@ -2140,10 +2142,27 @@ main(int argc, char *argv[])
cant_get_if_list_errstr);
g_free(cant_get_if_list_errstr);
}
-
/* select the first ad default (THIS SHOULD BE CHANGED) */
airpcap_if_active = airpcap_get_default_if(airpcap_if_list);
}
+ else if(airpcap_dll_ret_val == AIRPCAP_DLL_OLD)
+ {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s",
+ "WARNING: The version of AirPcap on this system\n"
+ "does not support driver-level decryption. Please\n"
+ "download a more recent version from\n" "http://www.cacetech.com/support/downloads.htm \n");
+ }
+ /*
+ * XXX - Maybe we need to warn the user if one of the following happens???
+ */
+/* else if(airpcap_dll_ret_val == AIRPCAP_DLL_ERROR)
+ {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s","AIRPCAP_DLL_ERROR\n");
+ }
+ else if(airpcap_dll_ret_val == AIRPCAP_DLL_NOT_FOUND)
+ {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s","AIRPCAP_DDL_NOT_FOUND\n");
+ }*/
#endif
/* Start windows sockets */