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
44
const char * identity;
46
const char * anon_identity;
47
const char * private_key_passwd;
48
const char * private_key_file;
49
const char * client_cert_file;
50
const char * ca_cert_file;
56
data_free_func (WirelessSecurityOption *opt)
58
g_return_if_fail (opt != NULL);
59
g_return_if_fail (opt->data != NULL);
61
memset (opt->data, 0, sizeof (opt->data));
66
static void show_passwords_cb (GtkToggleButton *button, WirelessSecurityOption *opt)
71
visible = gtk_toggle_button_get_active (button);
73
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_passwd_entry");
74
gtk_entry_set_visibility (GTK_ENTRY (entry), visible);
76
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
77
gtk_entry_set_visibility (GTK_ENTRY (entry), visible);
82
widget_create_func (WirelessSecurityOption *opt,
83
GtkSignalFunc validate_cb,
88
GtkWidget * checkbutton;
90
g_return_val_if_fail (opt != NULL, NULL);
91
g_return_val_if_fail (opt->data != NULL, NULL);
92
g_return_val_if_fail (validate_cb != NULL, NULL);
94
widget = wso_widget_helper (opt);
96
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_identity_entry");
97
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
99
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_passwd_entry");
100
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
102
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_anon_identity_entry");
103
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
105
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_client_cert_file_chooser_button");
106
g_signal_connect (G_OBJECT (entry), "selection-changed", validate_cb, user_data);
108
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_file_chooser_button");
109
g_signal_connect (G_OBJECT (entry), "selection-changed", validate_cb, user_data);
111
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_ca_cert_file_chooser_button");
112
g_signal_connect (G_OBJECT (entry), "selection-changed", validate_cb, user_data);
114
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
115
g_signal_connect (G_OBJECT (entry), "changed", validate_cb, user_data);
117
checkbutton = glade_xml_get_widget (opt->uixml, "show_checkbutton");
118
g_signal_connect (G_OBJECT (checkbutton), "toggled", GTK_SIGNAL_FUNC (show_passwords_cb), opt);
125
validate_input_func (WirelessSecurityOption *opt,
127
IEEE_802_11_Cipher **out_cipher)
129
#if 0 /* FIXME: Figure out valid combinations of options and enforce */
131
GtkWidget * filechooser;
134
g_return_val_if_fail (opt != NULL, FALSE);
136
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
137
input = gtk_entry_get_text (GTK_ENTRY (entry));
138
if (!input || strlen (input) < 1)
141
filechooser = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_file_chooser_button");
142
input = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
146
filechooser = glade_xml_get_widget (opt->uixml, "wpa_eap_ca_cert_file_chooser_button");
147
input = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (filechooser));
157
append_dbus_params_func (WirelessSecurityOption *opt,
159
DBusMessage *message)
162
GtkTreeModel * model;
163
GtkTreeIter tree_iter;
164
DBusMessageIter dbus_iter;
166
g_return_val_if_fail (opt != NULL, FALSE);
167
g_return_val_if_fail (opt->data != NULL, FALSE);
169
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_eap_method_combo");
170
model = gtk_combo_box_get_model (GTK_COMBO_BOX (entry));
171
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (entry), &tree_iter);
172
gtk_tree_model_get (model, &tree_iter, WPA_EAP_VALUE_COL, &opt->data->eap_method, -1);
174
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_key_type_combo");
175
model = gtk_combo_box_get_model (GTK_COMBO_BOX (entry));
176
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (entry), &tree_iter);
177
gtk_tree_model_get (model, &tree_iter, WPA_KEY_TYPE_CIPHER_COL, &opt->data->key_type, -1);
179
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_identity_entry");
180
opt->data->identity = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
182
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_passwd_entry");
183
opt->data->passwd = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
185
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_anon_identity_entry");
186
opt->data->anon_identity = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
188
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_client_cert_file_chooser_button");
189
opt->data->client_cert_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (entry)) ? : "";
191
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_ca_cert_file_chooser_button");
192
opt->data->ca_cert_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (entry)) ? : "";
194
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_file_chooser_button");
195
opt->data->private_key_file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (entry)) ? : "";
197
entry = glade_xml_get_widget (opt->uixml, "wpa_eap_private_key_passwd_entry");
198
opt->data->private_key_passwd = gtk_entry_get_text (GTK_ENTRY (entry)) ? : "";
200
dbus_message_iter_init_append (message, &dbus_iter);
202
nmu_security_serialize_wpa_eap_with_cipher (&dbus_iter,
203
opt->data->eap_method,
207
opt->data->anon_identity,
208
opt->data->private_key_passwd,
209
opt->data->private_key_file,
210
opt->data->client_cert_file,
211
opt->data->ca_cert_file,
212
opt->data->wpa2 ? IW_AUTH_WPA_VERSION_WPA2 : IW_AUTH_WPA_VERSION_WPA);
218
WirelessSecurityOption *
219
wso_wpa_eap_new (const char *glade_file,
223
WirelessSecurityOption * opt = NULL;
224
OptData * data = NULL;
225
GtkWidget * eap_method_combo;
226
GtkWidget * key_type_combo;
227
GtkListStore * model;
228
GtkTreeModel * tree_model;
230
GtkCellRenderer * renderer;
236
} *list, eap_method_list[] = {
237
{ _("PEAP"), NM_EAP_METHOD_PEAP },
238
{ _("TLS"), NM_EAP_METHOD_TLS },
239
{ _("TTLS"), NM_EAP_METHOD_TTLS },
243
g_return_val_if_fail (glade_file != NULL, NULL);
245
opt = g_malloc0 (sizeof (WirelessSecurityOption));
247
opt->name = g_strdup (_("WPA2 Enterprise"));
249
opt->name = g_strdup (_("WPA Enterprise"));
250
opt->widget_name = "wpa_eap_notebook";
251
opt->data_free_func = data_free_func;
252
opt->validate_input_func = validate_input_func;
253
opt->widget_create_func = widget_create_func;
254
opt->append_dbus_params_func = append_dbus_params_func;
256
if (!(opt->uixml = glade_xml_new (glade_file, opt->widget_name, NULL)))
262
eap_method_combo = glade_xml_get_widget (opt->uixml, "wpa_eap_eap_method_combo");
263
model = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT);
264
list = eap_method_list;
267
gtk_list_store_append (model, &iter);
268
gtk_list_store_set (model, &iter, WPA_EAP_NAME_COL, list->name, WPA_EAP_VALUE_COL, list->value, -1);
271
gtk_combo_box_set_model (GTK_COMBO_BOX (eap_method_combo), GTK_TREE_MODEL (model));
272
gtk_tree_model_get_iter_first (GTK_TREE_MODEL (model), &iter);
273
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (eap_method_combo), &iter);
275
/* FIXME: Why do we need this here but not in the same place in wso-wpa-psk.c ? */
276
renderer = gtk_cell_renderer_text_new ();
277
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (eap_method_combo), renderer, TRUE);
278
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (eap_method_combo), renderer, "text", 0, NULL);
280
key_type_combo = glade_xml_get_widget (opt->uixml, "wpa_eap_key_type_combo");
281
tree_model = wso_wpa_create_key_type_model (capabilities, TRUE, &num_added);
282
gtk_combo_box_set_model (GTK_COMBO_BOX (key_type_combo), tree_model);
283
gtk_tree_model_get_iter_first (tree_model, &iter);
284
gtk_combo_box_set_active_iter (GTK_COMBO_BOX (key_type_combo), &iter);
286
gtk_widget_set_sensitive (key_type_combo, FALSE);
288
/* FIXME: Why do we need this here but not in the same place in wso-wpa-psk.c ? */
289
renderer = gtk_cell_renderer_text_new ();
290
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (key_type_combo), renderer, TRUE);
291
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (key_type_combo), renderer, "text", 0, NULL);
293
/* Option-specific data */
294
opt->data = data = g_malloc0 (sizeof (OptData));
296
data->eap_method = NM_EAP_METHOD_TLS;