1
/* NetworkManager Wireless Applet -- Display wireless access points and allow user control
3
* Dan Williams <dcbw@redhat.com>
5
* This program is free software; you can redistribute it and/or modify
6
* it under the terms of the GNU General Public License as published by
7
* the Free Software Foundation; either version 2 of the License, or
8
* (at your option) any later version.
10
* This program is distributed in the hope that it will be useful,
11
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
* GNU General Public License for more details.
15
* You should have received a copy of the GNU General Public License
16
* along with this program; if not, write to the Free Software
17
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
* (C) Copyright 2005 Red Hat, Inc.
20
* (C) Copyright 2006 Novell, Inc.
24
#include <glib/gi18n.h>
26
#include <glade/glade.h>
27
#include <dbus/dbus.h>
30
#include "wireless-security-option.h"
31
#include "wso-wpa-eap.h"
32
#include "wso-private.h"
34
#include "dbus-helpers.h"
35
#include "NetworkManager.h"
37
#define WPA_EAP_NAME_COL 0
38
#define WPA_EAP_VALUE_COL 1
45
const char * identity;
47
const char * anon_identity;
48
const char * private_key_passwd;
49
const char * private_key_file;
50
const char * client_cert_file;
51
const char * ca_cert_file;
57
data_free_func (WirelessSecurityOption *opt)
59
g_return_if_fail (opt != NULL);
60
g_return_if_fail (opt->data != NULL);
62
memset (opt->data, 0, sizeof (opt->data));
67
static void show_passwords_cb (GtkToggleButton *button, WirelessSecurityOption *opt)
72
visible = gtk_toggle_button_get_active (button);
74
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_passwd_entry");
75
gtk_entry_set_visibility (GTK_ENTRY (entry), visible);
77
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
78
gtk_entry_set_visibility (GTK_ENTRY (entry), visible);
83
widget_create_func (WirelessSecurityOption *opt,
84
GtkSignalFunc validate_cb,
89
GtkWidget * checkbutton;
91
g_return_val_if_fail (opt != NULL, NULL);
92
g_return_val_if_fail (opt->data != NULL, NULL);
93
g_return_val_if_fail (validate_cb != NULL, NULL);
95
widget = wso_widget_helper (opt);
97
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_identity_entry");
98
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
100
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_passwd_entry");
101
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
103
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_anon_identity_entry");
104
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
106
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_client_cert_file_chooser_button");
107
g_signal_connect (G_OBJECT (entry), "selection-changed", validate_cb, user_data);
109
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_file_chooser_button");
110
g_signal_connect (G_OBJECT (entry), "selection-changed", validate_cb, user_data);
112
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_ca_cert_file_chooser_button");
113
g_signal_connect (G_OBJECT (entry), "selection-changed", validate_cb, user_data);
115
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
116
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
118
checkbutton = glade_xml_get_widget (opt->uixml, "show_checkbutton");
119
g_signal_connect (G_OBJECT (checkbutton), "toggled", GTK_SIGNAL_FUNC (show_passwords_cb), opt);
126
validate_input_func (WirelessSecurityOption *opt,
128
IEEE_802_11_Cipher **out_cipher)
130
#if 0 /* FIXME: Figure out valid combinations of options and enforce */
132
GtkWidget * filechooser;
135
g_return_val_if_fail (opt != NULL, FALSE);
137
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
138
input = gtk_entry_get_text (GTK_ENTRY (entry));
139
if (!input || strlen (input) < 1)
142
filechooser = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_file_chooser_button");
143
input = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
147
filechooser = glade_xml_get_widget (opt->uixml, "wpa_eap_ca_cert_file_chooser_button");
148
input = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
158
append_dbus_params_func (WirelessSecurityOption *opt,
160
DBusMessage *message)
163
GtkTreeModel * model;
164
GtkTreeIter tree_iter;
165
DBusMessageIter dbus_iter;
167
g_return_val_if_fail (opt != NULL, FALSE);
168
g_return_val_if_fail (opt->data != NULL, FALSE);
170
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_eap_method_combo");
171
model = gtk_combo_box_get_model (GTK_COMBO_BOX (entry));
172
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (entry), &tree_iter);
173
gtk_tree_model_get (model, &tree_iter, WPA_EAP_VALUE_COL, &opt->data->eap_method, -1);
175
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_key_type_combo");
176
model = gtk_combo_box_get_model (GTK_COMBO_BOX (entry));
177
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (entry), &tree_iter);
178
gtk_tree_model_get (model, &tree_iter, WPA_KEY_TYPE_CIPHER_COL, &opt->data->key_type, -1);
180
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_phase2_type_combo");
181
model = gtk_combo_box_get_model (GTK_COMBO_BOX (entry));
182
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (entry), &tree_iter);
183
gtk_tree_model_get (model, &tree_iter, WPA_KEY_TYPE_CIPHER_COL, &opt->data->phase2_type, -1);
185
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_identity_entry");
186
opt->data->identity = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
188
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_passwd_entry");
189
opt->data->passwd = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
191
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_anon_identity_entry");
192
opt->data->anon_identity = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
194
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_client_cert_file_chooser_button");
195
opt->data->client_cert_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (entry)) ? : "";
197
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_ca_cert_file_chooser_button");
198
opt->data->ca_cert_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (entry)) ? : "";
200
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_file_chooser_button");
201
opt->data->private_key_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (entry)) ? : "";
203
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
204
opt->data->private_key_passwd = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
206
dbus_message_iter_init_append (message, &dbus_iter);
208
nmu_security_serialize_wpa_eap_with_cipher (&dbus_iter,
209
opt->data->eap_method | opt->data->phase2_type,
213
opt->data->anon_identity,
214
opt->data->private_key_passwd,
215
opt->data->private_key_file,
216
opt->data->client_cert_file,
217
opt->data->ca_cert_file,
218
opt->data->wpa2 ? IW_AUTH_WPA_VERSION_WPA2 : IW_AUTH_WPA_VERSION_WPA);
224
WirelessSecurityOption *
225
wso_wpa_eap_new (const char *glade_file,
229
WirelessSecurityOption * opt = NULL;
230
OptData * data = NULL;
231
GtkWidget * eap_method_combo;
232
GtkWidget * key_type_combo;
233
GtkWidget * phase2_type_combo;
234
GtkListStore * model;
235
GtkTreeModel * tree_model;
237
GtkCellRenderer * renderer;
243
} *list, eap_method_list[] = {
244
{ _("PEAP"), NM_EAP_METHOD_PEAP },
245
{ _("TLS"), NM_EAP_METHOD_TLS },
246
{ _("TTLS"), NM_EAP_METHOD_TTLS },
250
g_return_val_if_fail (glade_file != NULL, NULL);
252
opt = g_malloc0 (sizeof (WirelessSecurityOption));
254
opt->name = g_strdup (_("WPA2 Enterprise"));
256
opt->name = g_strdup (_("WPA Enterprise"));
257
opt->widget_name = "wpa_eap_notebook";
258
opt->data_free_func = data_free_func;
259
opt->validate_input_func = validate_input_func;
260
opt->widget_create_func = widget_create_func;
261
opt->append_dbus_params_func = append_dbus_params_func;
263
if (!(opt->uixml = glade_xml_new (glade_file, opt->widget_name, NULL)))
269
eap_method_combo = glade_xml_get_widget (opt->uixml, "wpa_eap_eap_method_combo");
270
model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
271
list = eap_method_list;
274
gtk_list_store_append (model, &iter);
275
gtk_list_store_set (model, &iter, WPA_EAP_NAME_COL, list->name, WPA_EAP_VALUE_COL, list->value, -1);
278
gtk_combo_box_set_model (GTK_COMBO_BOX (eap_method_combo), GTK_TREE_MODEL (model));
279
gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
280
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (eap_method_combo), &iter);
282
/* FIXME: Why do we need this here but not in the same place in wso-wpa-psk.c ? */
283
renderer = gtk_cell_renderer_text_new ();
284
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (eap_method_combo), renderer, TRUE);
285
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (eap_method_combo), renderer, "text", 0, NULL);
287
key_type_combo = glade_xml_get_widget (opt->uixml, "wpa_eap_key_type_combo");
288
tree_model = wso_wpa_create_key_type_model (capabilities, TRUE, &num_added);
289
gtk_combo_box_set_model (GTK_COMBO_BOX (key_type_combo), tree_model);
290
gtk_tree_model_get_iter_first (tree_model, &iter);
291
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (key_type_combo), &iter);
293
gtk_widget_set_sensitive (key_type_combo, FALSE);
295
phase2_type_combo = glade_xml_get_widget (opt->uixml, "wpa_eap_phase2_type_combo");
296
tree_model = wso_wpa_create_phase2_type_model (capabilities, TRUE, &num_added);
297
gtk_combo_box_set_model (GTK_COMBO_BOX (phase2_type_combo), tree_model);
298
gtk_tree_model_get_iter_first (tree_model, &iter);
299
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (phase2_type_combo), &iter);
301
/* FIXME: Why do we need this here but not in the same place in wso-wpa-psk.c ? */
302
renderer = gtk_cell_renderer_text_new ();
303
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (key_type_combo), renderer, TRUE);
304
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (key_type_combo), renderer, "text", 0, NULL);
305
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (phase2_type_combo), renderer, TRUE);
306
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (phase2_type_combo), renderer, "text", 0, NULL);
308
/* Option-specific data */
309
opt->data = data = g_malloc0 (sizeof (OptData));
311
data->eap_method = NM_EAP_METHOD_TLS;