[gnome-control-center] network: Update wireless-security from network-manager-applet
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-control-center] network: Update wireless-security from network-manager-applet
- Date: Tue, 7 Jun 2016 12:26:29 +0000 (UTC)
commit 92b044ba7fe438cb707ebba4bbc893d271a2e7c0
Author: Bastien Nocera <hadess hadess net>
Date: Tue Jun 7 12:03:22 2016 +0200
network: Update wireless-security from network-manager-applet
panels/network/wireless-security/eap-method-fast.c | 42 +-
.../network/wireless-security/eap-method-fast.ui | 73 ++--
panels/network/wireless-security/eap-method-leap.c | 176 +++++--
.../network/wireless-security/eap-method-leap.ui | 12 +-
panels/network/wireless-security/eap-method-peap.c | 82 +++-
.../network/wireless-security/eap-method-peap.ui | 56 ++-
.../network/wireless-security/eap-method-simple.c | 352 ++++++++------
.../network/wireless-security/eap-method-simple.h | 23 +-
.../network/wireless-security/eap-method-simple.ui | 63 +--
panels/network/wireless-security/eap-method-tls.c | 122 ++++--
panels/network/wireless-security/eap-method-tls.ui | 62 ++-
panels/network/wireless-security/eap-method-ttls.c | 117 ++++-
.../network/wireless-security/eap-method-ttls.ui | 44 ++-
panels/network/wireless-security/eap-method.c | 518 +++++++++++---------
panels/network/wireless-security/eap-method.h | 52 ++-
panels/network/wireless-security/helpers.c | 5 +-
panels/network/wireless-security/helpers.h | 13 +-
.../network/wireless-security/wireless-security.c | 174 +++++---
.../network/wireless-security/wireless-security.h | 39 +-
panels/network/wireless-security/ws-dynamic-wep.c | 23 +-
panels/network/wireless-security/ws-dynamic-wep.h | 8 +-
panels/network/wireless-security/ws-dynamic-wep.ui | 6 +-
panels/network/wireless-security/ws-leap.c | 45 ++-
panels/network/wireless-security/ws-leap.h | 8 +-
panels/network/wireless-security/ws-leap.ui | 12 +-
panels/network/wireless-security/ws-wep-key.c | 97 ++--
panels/network/wireless-security/ws-wep-key.h | 8 +-
panels/network/wireless-security/ws-wep-key.ui | 16 +-
panels/network/wireless-security/ws-wpa-eap.c | 18 +-
panels/network/wireless-security/ws-wpa-eap.h | 8 +-
panels/network/wireless-security/ws-wpa-eap.ui | 6 +-
panels/network/wireless-security/ws-wpa-psk.c | 43 ++-
panels/network/wireless-security/ws-wpa-psk.h | 10 +-
panels/network/wireless-security/ws-wpa-psk.ui | 11 +-
34 files changed, 1457 insertions(+), 887 deletions(-)
---
diff --git a/panels/network/wireless-security/eap-method-fast.c
b/panels/network/wireless-security/eap-method-fast.c
index f148fda..be5578d 100644
--- a/panels/network/wireless-security/eap-method-fast.c
+++ b/panels/network/wireless-security/eap-method-fast.c
@@ -17,19 +17,17 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2012 Red Hat, Inc.
+ * Copyright 2012 - 2014 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
-#include <glib/gi18n.h>
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
-
#include "eap-method.h"
#include "wireless-security.h"
+#include "utils.h"
#include "helpers.h"
#define I_NAME_COLUMN 0
@@ -53,7 +51,7 @@ destroy (EAPMethod *parent)
}
static gboolean
-validate (EAPMethod *parent)
+validate (EAPMethod *parent, GError **error)
{
GtkWidget *widget;
GtkTreeModel *model;
@@ -61,6 +59,7 @@ validate (EAPMethod *parent)
EAPMethod *eap = NULL;
const char *file;
gboolean provisioning;
+ gboolean valid = FALSE;
gboolean ret = TRUE;
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_fast_pac_provision_checkbutton"));
@@ -71,6 +70,7 @@ validate (EAPMethod *parent)
file = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
if (!provisioning && !file) {
widget_set_error (widget);
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-FAST PAC file"));
ret = FALSE;
} else {
widget_unset_error (widget);
@@ -82,14 +82,9 @@ validate (EAPMethod *parent)
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
gtk_tree_model_get (model, &iter, I_METHOD_COLUMN, &eap, -1);
g_assert (eap);
- if (!eap_method_validate (eap)) {
- widget_set_error (widget);
- ret = FALSE;
- } else {
- widget_unset_error (widget);
- }
+ valid = eap_method_validate (eap, *error ? NULL : error);
eap_method_unref (eap);
- return ret;
+ return ret ? valid : ret;
}
static void
@@ -133,7 +128,7 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
}
static void
-fill_connection (EAPMethod *parent, NMConnection *connection)
+fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFlags flags)
{
NMSetting8021x *s_8021x;
GtkWidget *widget;
@@ -192,7 +187,7 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
gtk_tree_model_get (model, &iter, I_METHOD_COLUMN, &eap, -1);
g_assert (eap);
- eap_method_fill_connection (eap, connection);
+ eap_method_fill_connection (eap, connection, flags);
eap_method_unref (eap);
}
@@ -249,8 +244,9 @@ inner_auth_combo_init (EAPMethodFAST *method,
EAPMethodSimple *em_mschap_v2;
guint32 active = 0;
const char *phase2_auth = NULL;
+ EAPMethodSimpleFlags simple_flags;
- auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_g_type ());
+ auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_type ());
if (s_8021x) {
if (nm_setting_802_1x_get_phase2_auth (s_8021x))
@@ -259,12 +255,16 @@ inner_auth_combo_init (EAPMethodFAST *method,
phase2_auth = nm_setting_802_1x_get_phase2_autheap (s_8021x);
}
+ simple_flags = EAP_METHOD_SIMPLE_FLAG_PHASE2;
+ if (method->is_editor)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_IS_EDITOR;
+ if (secrets_only)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY;
+
em_gtc = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_GTC,
- TRUE,
- method->is_editor,
- secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("GTC"),
@@ -279,8 +279,7 @@ inner_auth_combo_init (EAPMethodFAST *method,
em_mschap_v2 = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_MSCHAP_V2,
- TRUE,
- method->is_editor, secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("MSCHAPv2"),
@@ -359,6 +358,7 @@ eap_method_fast_new (WirelessSecurity *ws_parent,
if (!parent)
return NULL;
+ parent->password_flags_name = NM_SETTING_802_1X_PASSWORD;
method = (EAPMethodFAST *) parent;
method->sec_parent = ws_parent;
method->is_editor = is_editor;
diff --git a/panels/network/wireless-security/eap-method-fast.ui
b/panels/network/wireless-security/eap-method-fast.ui
index 344f9b9..4b19a66 100644
--- a/panels/network/wireless-security/eap-method-fast.ui
+++ b/panels/network/wireless-security/eap-method-fast.ui
@@ -1,6 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<!-- interface-requires gtk+ 3.0 -->
+ <object class="GtkListStore" id="model8">
+ <columns>
+ <!-- column-name gchararray -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes"> </col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkListStore" id="model9">
+ <columns>
+ <!-- column-name gchararray -->
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">Anonymous</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Authenticated</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">Both</col>
+ </row>
+ </data>
+ </object>
<object class="GtkNotebook" id="eap_fast_notebook">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -12,14 +40,14 @@
<property name="can_focus">False</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="eap_fast_anon_identity_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Anony_mous identity</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Anony_mous identity:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_fast_anon_identity_entry</property>
</object>
@@ -44,8 +72,8 @@
<object class="GtkLabel" id="eap_fast_pac_file_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">PAC _file</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">PAC _file:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_fast_pac_file_button</property>
</object>
@@ -89,8 +117,8 @@
<object class="GtkLabel" id="eap_fast_inner_auth_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Inner authentication</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Inner authentication:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_fast_inner_auth_combo</property>
</object>
@@ -124,11 +152,12 @@
</child>
<child>
<object class="GtkCheckButton" id="eap_fast_pac_provision_checkbutton">
- <property name="label" translatable="yes">PAC pro_visioning</property>
+ <property name="label" translatable="yes">Allow automatic PAC pro_visioning</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
</object>
<packing>
<property name="top_attach">1</property>
@@ -170,32 +199,4 @@
</packing>
</child>
</object>
- <object class="GtkListStore" id="model8">
- <columns>
- <!-- column-name gchararray -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes"> </col>
- </row>
- </data>
- </object>
- <object class="GtkListStore" id="model9">
- <columns>
- <!-- column-name gchararray -->
- <column type="gchararray"/>
- </columns>
- <data>
- <row>
- <col id="0" translatable="yes">Anonymous</col>
- </row>
- <row>
- <col id="0" translatable="yes">Authenticated</col>
- </row>
- <row>
- <col id="0" translatable="yes">Both</col>
- </row>
- </data>
- </object>
</interface>
diff --git a/panels/network/wireless-security/eap-method-leap.c
b/panels/network/wireless-security/eap-method-leap.c
index f6baefb..6163468 100644
--- a/panels/network/wireless-security/eap-method-leap.c
+++ b/panels/network/wireless-security/eap-method-leap.c
@@ -17,61 +17,65 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
+#include "nm-default.h"
+
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
#include "eap-method.h"
#include "wireless-security.h"
#include "helpers.h"
+#include "nma-ui-utils.h"
+#include "utils.h"
struct _EAPMethodLEAP {
EAPMethod parent;
- gboolean new_connection;
+ WirelessSecurity *ws_parent;
+
+ gboolean editing_connection;
+
+ GtkEntry *username_entry;
+ GtkEntry *password_entry;
+ GtkToggleButton *show_password;
};
static void
-show_toggled_cb (GtkCheckButton *button, EAPMethod *method)
+show_toggled_cb (GtkToggleButton *button, EAPMethodLEAP *method)
{
- GtkWidget *widget;
gboolean visible;
- widget = GTK_WIDGET (gtk_builder_get_object (method->builder, "eap_leap_password_entry"));
- g_assert (widget);
-
- visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
- gtk_entry_set_visibility (GTK_ENTRY (widget), visible);
+ visible = gtk_toggle_button_get_active (button);
+ gtk_entry_set_visibility (method->password_entry, visible);
}
static gboolean
-validate (EAPMethod *parent)
+validate (EAPMethod *parent, GError **error)
{
- GtkWidget *widget;
+ EAPMethodLEAP *method = (EAPMethodLEAP *)parent;
const char *text;
gboolean ret = TRUE;
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_username_entry"));
- g_assert (widget);
- text = gtk_entry_get_text (GTK_ENTRY (widget));
+ text = gtk_entry_get_text (method->username_entry);
if (!text || !strlen (text)) {
- widget_set_error (widget);
+ widget_set_error (GTK_WIDGET (method->username_entry));
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-LEAP username"));
ret = FALSE;
} else {
- widget_unset_error (widget);
+ widget_unset_error (GTK_WIDGET (method->username_entry));
}
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_password_entry"));
- g_assert (widget);
- text = gtk_entry_get_text (GTK_ENTRY (widget));
- if (!text || *text == '\0') {
- widget_set_error (widget);
+ text = gtk_entry_get_text (method->password_entry);
+ if (!text || !strlen (text)) {
+ widget_set_error (GTK_WIDGET (method->password_entry));
+ if (!*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-LEAP
password"));
ret = FALSE;
} else {
- widget_unset_error (widget);
+ widget_unset_error (GTK_WIDGET (method->password_entry));
}
return ret;
@@ -92,32 +96,33 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
}
static void
-fill_connection (EAPMethod *parent, NMConnection *connection)
+fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFlags flags)
{
EAPMethodLEAP *method = (EAPMethodLEAP *) parent;
NMSetting8021x *s_8021x;
- GtkWidget *widget;
+ NMSettingSecretFlags secret_flags;
+ GtkWidget *passwd_entry;
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x);
nm_setting_802_1x_add_eap_method (s_8021x, "leap");
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_username_entry"));
- g_assert (widget);
- g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (GTK_ENTRY (widget)), NULL);
+ g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (method->username_entry), NULL);
+ g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_entry_get_text (method->password_entry), NULL);
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_password_entry"));
- g_assert (widget);
- g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_entry_get_text (GTK_ENTRY (widget)), NULL);
-
- /* Default to agent-owned secrets for new connections */
- if (method->new_connection) {
- g_object_set (s_8021x,
- NM_SETTING_802_1X_PASSWORD_FLAGS, NM_SETTING_SECRET_FLAG_AGENT_OWNED,
- NM_SETTING_802_1X_SYSTEM_CA_CERTS, TRUE,
- NULL);
- }
+ passwd_entry = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_password_entry"));
+ g_assert (passwd_entry);
+
+ /* Save 802.1X password flags to the connection */
+ secret_flags = nma_utils_menu_to_secret_flags (passwd_entry);
+ nm_setting_set_secret_flags (NM_SETTING (s_8021x), parent->password_flags_name,
+ secret_flags, NULL);
+
+ /* Update secret flags and popup when editing the connection */
+ if (method->editing_connection)
+ nma_utils_update_password_storage (passwd_entry, secret_flags,
+ NM_SETTING (s_8021x), parent->password_flags_name);
}
static void
@@ -130,6 +135,59 @@ update_secrets (EAPMethod *parent, NMConnection *connection)
(HelperSecretFunc) nm_setting_802_1x_get_password);
}
+/* Set the UI fields for user, password and show_password to the
+ * values as provided by method->ws_parent. */
+static void
+set_userpass_ui (EAPMethodLEAP *method)
+{
+ if (method->ws_parent->username)
+ gtk_entry_set_text (method->username_entry, method->ws_parent->username);
+ else
+ gtk_entry_set_text (method->username_entry, "");
+
+ if (method->ws_parent->password && !method->ws_parent->always_ask)
+ gtk_entry_set_text (method->password_entry, method->ws_parent->password);
+ else
+ gtk_entry_set_text (method->password_entry, "");
+
+ gtk_toggle_button_set_active (method->show_password, method->ws_parent->show_password);
+}
+
+static void
+widgets_realized (GtkWidget *widget, EAPMethodLEAP *method)
+{
+ set_userpass_ui (method);
+}
+
+static void
+widgets_unrealized (GtkWidget *widget, EAPMethodLEAP *method)
+{
+ wireless_security_set_userpass (method->ws_parent,
+ gtk_entry_get_text (method->username_entry),
+ gtk_entry_get_text (method->password_entry),
+ (gboolean) -1,
+ gtk_toggle_button_get_active (method->show_password));
+}
+
+static void
+destroy (EAPMethod *parent)
+{
+ EAPMethodLEAP *method = (EAPMethodLEAP *) parent;
+ GtkWidget *widget;
+
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_notebook"));
+ g_assert (widget);
+
+ g_signal_handlers_disconnect_by_func (G_OBJECT (widget),
+ (GCallback) widgets_realized,
+ method);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (widget),
+ (GCallback) widgets_unrealized,
+ method);
+
+ wireless_security_unref (method->ws_parent);
+}
+
EAPMethodLEAP *
eap_method_leap_new (WirelessSecurity *ws_parent,
NMConnection *connection,
@@ -138,13 +196,14 @@ eap_method_leap_new (WirelessSecurity *ws_parent,
EAPMethodLEAP *method;
EAPMethod *parent;
GtkWidget *widget;
+ NMSetting8021x *s_8021x = NULL;
parent = eap_method_init (sizeof (EAPMethodLEAP),
validate,
add_to_size_group,
fill_connection,
update_secrets,
- NULL,
+ destroy,
"/org/gnome/control-center/network/eap-method-leap.ui",
"eap_leap_notebook",
"eap_leap_username_entry",
@@ -152,41 +211,58 @@ eap_method_leap_new (WirelessSecurity *ws_parent,
if (!parent)
return NULL;
+ parent->password_flags_name = NM_SETTING_802_1X_PASSWORD;
method = (EAPMethodLEAP *) parent;
- method->new_connection = secrets_only ? FALSE : TRUE;
+ method->editing_connection = secrets_only ? FALSE : TRUE;
+ method->ws_parent = wireless_security_ref (ws_parent);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_notebook"));
+ g_assert (widget);
+ g_signal_connect (G_OBJECT (widget), "realize",
+ (GCallback) widgets_realized,
+ method);
+ g_signal_connect (G_OBJECT (widget), "unrealize",
+ (GCallback) widgets_unrealized,
+ method);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_username_entry"));
g_assert (widget);
+ method->username_entry = GTK_ENTRY (widget);
g_signal_connect (G_OBJECT (widget), "changed",
(GCallback) wireless_security_changed_cb,
ws_parent);
- if (connection) {
- NMSetting8021x *s_8021x;
-
- s_8021x = nm_connection_get_setting_802_1x (connection);
- if (s_8021x && nm_setting_802_1x_get_identity (s_8021x))
- gtk_entry_set_text (GTK_ENTRY (widget), nm_setting_802_1x_get_identity (s_8021x));
- }
if (secrets_only)
gtk_widget_set_sensitive (widget, FALSE);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_leap_password_entry"));
g_assert (widget);
+ method->password_entry = GTK_ENTRY (widget);
g_signal_connect (G_OBJECT (widget), "changed",
(GCallback) wireless_security_changed_cb,
ws_parent);
- /* Fill secrets, if any */
+ /* Create password-storage popup menu for password entry under entry's secondary icon */
if (connection)
- update_secrets (parent, connection);
+ s_8021x = nm_connection_get_setting_802_1x (connection);
+ nma_utils_setup_password_storage (widget, 0, (NMSetting *) s_8021x, parent->password_flags_name,
+ FALSE, secrets_only);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_eapleap"));
g_assert (widget);
+ method->show_password = GTK_TOGGLE_BUTTON (widget);
g_signal_connect (G_OBJECT (widget), "toggled",
(GCallback) show_toggled_cb,
parent);
+ /* Initialize the UI fields with the security settings from method->ws_parent.
+ * This will be done again when the widget gets realized. It must be done here as well,
+ * because the outer dialog will ask to 'validate' the connection before the security tab
+ * is shown/realized (to enable the 'Apply' button).
+ * As 'validate' accesses the contents of the UI fields, they must be initialized now, even
+ * if the widgets are not yet visible. */
+ set_userpass_ui (method);
+
return method;
}
diff --git a/panels/network/wireless-security/eap-method-leap.ui
b/panels/network/wireless-security/eap-method-leap.ui
index 8b475fb..1d1f23d 100644
--- a/panels/network/wireless-security/eap-method-leap.ui
+++ b/panels/network/wireless-security/eap-method-leap.ui
@@ -10,9 +10,10 @@
<object class="GtkTable" id="table9">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="valign">start</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<placeholder/>
@@ -21,8 +22,8 @@
<object class="GtkLabel" id="eap_leap_username_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Username</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Username:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_leap_username_entry</property>
</object>
@@ -35,8 +36,8 @@
<object class="GtkLabel" id="eap_leap_password_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Password</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Password:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_leap_password_entry</property>
</object>
@@ -69,7 +70,6 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
- <property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
diff --git a/panels/network/wireless-security/eap-method-peap.c
b/panels/network/wireless-security/eap-method-peap.c
index 3d9d750..7f87541 100644
--- a/panels/network/wireless-security/eap-method-peap.c
+++ b/panels/network/wireless-security/eap-method-peap.c
@@ -17,18 +17,17 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
-#include <glib/gi18n.h>
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
#include "eap-method.h"
#include "wireless-security.h"
+#include "utils.h"
#define I_NAME_COLUMN 0
#define I_METHOD_COLUMN 1
@@ -51,16 +50,24 @@ destroy (EAPMethod *parent)
}
static gboolean
-validate (EAPMethod *parent)
+validate (EAPMethod *parent, GError **error)
{
GtkWidget *widget;
GtkTreeModel *model;
GtkTreeIter iter;
EAPMethod *eap = NULL;
gboolean valid = FALSE;
+ GError *local = NULL;
- if (!eap_method_validate_filepicker (parent->builder, "eap_peap_ca_cert_button", TYPE_CA_CERT, NULL,
NULL))
+ if (!eap_method_validate_filepicker (parent->builder, "eap_peap_ca_cert_button", TYPE_CA_CERT, NULL,
NULL, &local)) {
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-PEAP CA certificate: %s"),
local->message);
+ g_clear_error (&local);
return FALSE;
+ }
+ if (eap_method_ca_cert_required (parent->builder, "eap_peap_ca_cert_not_required_checkbox",
"eap_peap_ca_cert_button")) {
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-PEAP CA certificate:
no certificate specified"));
+ return FALSE;
+ }
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_peap_inner_auth_combo"));
g_assert (widget);
@@ -69,12 +76,20 @@ validate (EAPMethod *parent)
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
gtk_tree_model_get (model, &iter, I_METHOD_COLUMN, &eap, -1);
g_assert (eap);
- valid = eap_method_validate (eap);
+ valid = eap_method_validate (eap, error);
eap_method_unref (eap);
return valid;
}
static void
+ca_cert_not_required_toggled (GtkWidget *ignored, gpointer user_data)
+{
+ EAPMethod *parent = user_data;
+
+ eap_method_ca_cert_not_required_toggled (parent->builder, "eap_peap_ca_cert_not_required_checkbox",
"eap_peap_ca_cert_button");
+}
+
+static void
add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
{
EAPMethodPEAP *method = (EAPMethodPEAP *) parent;
@@ -87,6 +102,10 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
g_object_unref (method->size_group);
method->size_group = g_object_ref (group);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_peap_ca_cert_not_required_checkbox"));
+ g_assert (widget);
+ gtk_size_group_add_widget (group, widget);
+
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_peap_anon_identity_label"));
g_assert (widget);
gtk_size_group_add_widget (group, widget);
@@ -115,7 +134,7 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
}
static void
-fill_connection (EAPMethod *parent, NMConnection *connection)
+fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFlags flags)
{
NMSetting8021x *s_8021x;
NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
@@ -127,6 +146,7 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
GtkTreeIter iter;
int peapver_active = 0;
GError *error = NULL;
+ gboolean ca_cert_error = FALSE;
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x);
@@ -145,7 +165,10 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
if (!nm_setting_802_1x_set_ca_cert (s_8021x, filename, NM_SETTING_802_1X_CK_SCHEME_PATH, &format,
&error)) {
g_warning ("Couldn't read CA certificate '%s': %s", filename, error ? error->message :
"(unknown)");
g_clear_error (&error);
+ ca_cert_error = TRUE;
}
+ eap_method_ca_cert_ignore_set (parent, connection, filename, ca_cert_error);
+ g_free (filename);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_peap_version_combo"));
peapver_active = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
@@ -167,7 +190,7 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
gtk_tree_model_get (model, &iter, I_METHOD_COLUMN, &eap, -1);
g_assert (eap);
- eap_method_fill_connection (eap, connection);
+ eap_method_fill_connection (eap, connection, flags);
eap_method_unref (eap);
}
static void
@@ -223,8 +246,9 @@ inner_auth_combo_init (EAPMethodPEAP *method,
EAPMethodSimple *em_gtc;
guint32 active = 0;
const char *phase2_auth = NULL;
+ EAPMethodSimpleFlags simple_flags;
- auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_g_type ());
+ auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_type ());
if (s_8021x) {
if (nm_setting_802_1x_get_phase2_auth (s_8021x))
@@ -233,12 +257,16 @@ inner_auth_combo_init (EAPMethodPEAP *method,
phase2_auth = nm_setting_802_1x_get_phase2_autheap (s_8021x);
}
+ simple_flags = EAP_METHOD_SIMPLE_FLAG_PHASE2;
+ if (method->is_editor)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_IS_EDITOR;
+ if (secrets_only)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY;
+
em_mschap_v2 = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_MSCHAP_V2,
- TRUE,
- method->is_editor,
- secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("MSCHAPv2"),
@@ -253,9 +281,7 @@ inner_auth_combo_init (EAPMethodPEAP *method,
em_md5 = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_MD5,
- TRUE,
- method->is_editor,
- secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("MD5"),
@@ -270,9 +296,7 @@ inner_auth_combo_init (EAPMethodPEAP *method,
em_gtc = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_GTC,
- TRUE,
- method->is_editor,
- secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("GTC"),
@@ -314,7 +338,7 @@ eap_method_peap_new (WirelessSecurity *ws_parent,
{
EAPMethod *parent;
EAPMethodPEAP *method;
- GtkWidget *widget;
+ GtkWidget *widget, *widget_ca_not_required_checkbox;
GtkFileFilter *filter;
NMSetting8021x *s_8021x = NULL;
const char *filename;
@@ -332,8 +356,7 @@ eap_method_peap_new (WirelessSecurity *ws_parent,
if (!parent)
return NULL;
- eap_method_nag_init (parent, "eap_peap_ca_cert_button", connection);
-
+ parent->password_flags_name = NM_SETTING_802_1X_PASSWORD;
method = (EAPMethodPEAP *) parent;
method->sec_parent = ws_parent;
method->is_editor = is_editor;
@@ -341,6 +364,16 @@ eap_method_peap_new (WirelessSecurity *ws_parent,
if (connection)
s_8021x = nm_connection_get_setting_802_1x (connection);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_peap_ca_cert_not_required_checkbox"));
+ g_assert (widget);
+ g_signal_connect (G_OBJECT (widget), "toggled",
+ (GCallback) ca_cert_not_required_toggled,
+ parent);
+ g_signal_connect (G_OBJECT (widget), "toggled",
+ (GCallback) wireless_security_changed_cb,
+ ws_parent);
+ widget_ca_not_required_checkbox = widget;
+
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_peap_ca_cert_button"));
g_assert (widget);
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (widget), TRUE);
@@ -352,11 +385,14 @@ eap_method_peap_new (WirelessSecurity *ws_parent,
filter = eap_method_default_file_chooser_filter_new (FALSE);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (widget), filter);
if (connection && s_8021x) {
+ filename = NULL;
if (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH) {
filename = nm_setting_802_1x_get_ca_cert_path (s_8021x);
if (filename)
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), filename);
}
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget_ca_not_required_checkbox),
+ !filename && eap_method_ca_cert_ignore_get (parent,
connection));
}
widget = inner_auth_combo_init (method, connection, s_8021x, secrets_only);
@@ -397,6 +433,8 @@ eap_method_peap_new (WirelessSecurity *ws_parent,
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_peap_ca_cert_button"));
gtk_widget_hide (widget);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_peap_ca_cert_not_required_checkbox"));
+ gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_peap_inner_auth_label"));
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_peap_inner_auth_combo"));
diff --git a/panels/network/wireless-security/eap-method-peap.ui
b/panels/network/wireless-security/eap-method-peap.ui
index 4202237..a97123a 100644
--- a/panels/network/wireless-security/eap-method-peap.ui
+++ b/panels/network/wireless-security/eap-method-peap.ui
@@ -40,14 +40,14 @@
<property name="can_focus">False</property>
<property name="n_rows">5</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="eap_peap_anon_identity_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Anony_mous identity</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Anony_mous identity:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_peap_anon_identity_entry</property>
</object>
@@ -72,8 +72,8 @@
<object class="GtkLabel" id="eap_peap_ca_cert_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">C_A certificate</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">C_A certificate:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_peap_ca_cert_button</property>
</object>
@@ -99,6 +99,24 @@
</packing>
</child>
<child>
+ <object class="GtkCheckButton" id="eap_peap_ca_cert_not_required_checkbox">
+ <property name="label" translatable="yes">No CA certificate is _required</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
<object class="GtkVBox" id="eap_peap_inner_auth_vbox">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -108,8 +126,8 @@
</object>
<packing>
<property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
@@ -117,14 +135,14 @@
<object class="GtkLabel" id="eap_peap_inner_auth_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Inner authentication</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Inner authentication:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_peap_inner_auth_combo</property>
</object>
<packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"/>
</packing>
@@ -144,8 +162,8 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
@@ -154,14 +172,14 @@
<object class="GtkLabel" id="eap_peap_version_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">PEAP _version</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">PEAP _version:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_peap_version_combo</property>
</object>
<packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"/>
</packing>
@@ -181,8 +199,8 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
diff --git a/panels/network/wireless-security/eap-method-simple.c
b/panels/network/wireless-security/eap-method-simple.c
index 24a6cdd..f9fd473 100644
--- a/panels/network/wireless-security/eap-method-simple.c
+++ b/panels/network/wireless-security/eap-method-simple.c
@@ -17,71 +17,79 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2011 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
+#include "nm-default.h"
+
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
#include "eap-method.h"
#include "wireless-security.h"
#include "helpers.h"
+#include "nma-ui-utils.h"
+#include "utils.h"
struct _EAPMethodSimple {
EAPMethod parent;
+ WirelessSecurity *ws_parent;
+
EAPMethodSimpleType type;
- gboolean is_editor;
- gboolean new_connection;
+ EAPMethodSimpleFlags flags;
+
+ GtkEntry *username_entry;
+ GtkEntry *password_entry;
+ GtkToggleButton *show_password;
+ guint idle_func_id;
};
static void
-show_toggled_cb (GtkCheckButton *button, EAPMethod *method)
+show_toggled_cb (GtkToggleButton *button, EAPMethodSimple *method)
{
- GtkWidget *widget;
gboolean visible;
- widget = GTK_WIDGET (gtk_builder_get_object (method->builder, "eap_simple_password_entry"));
- g_assert (widget);
+ visible = gtk_toggle_button_get_active (button);
+ gtk_entry_set_visibility (method->password_entry, visible);
+}
- visible = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
- gtk_entry_set_visibility (GTK_ENTRY (widget), visible);
+static gboolean
+always_ask_selected (GtkEntry *passwd_entry)
+{
+ return !!( nma_utils_menu_to_secret_flags (GTK_WIDGET (passwd_entry))
+ & NM_SETTING_SECRET_FLAG_NOT_SAVED);
}
static gboolean
-validate (EAPMethod *parent)
+validate (EAPMethod *parent, GError **error)
{
- GtkWidget *widget;
+ EAPMethodSimple *method = (EAPMethodSimple *)parent;
const char *text;
gboolean ret = TRUE;
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_username_entry"));
- g_assert (widget);
- text = gtk_entry_get_text (GTK_ENTRY (widget));
+ text = gtk_entry_get_text (method->username_entry);
if (!text || !strlen (text)) {
- widget_set_error (widget);
+ widget_set_error (GTK_WIDGET (method->username_entry));
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP username"));
ret = FALSE;
} else {
- widget_unset_error (widget);
+ widget_unset_error (GTK_WIDGET (method->username_entry));
}
/* Check if the password should always be requested */
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_password_always_ask"));
- g_assert (widget);
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
- widget_unset_error (GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_simple_password_entry")));
- return ret;
- }
-
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_entry"));
- g_assert (widget);
- text = gtk_entry_get_text (GTK_ENTRY (widget));
- if (!text || !strlen (text)) {
- widget_set_error (widget);
- ret = FALSE;
+ if (always_ask_selected (method->password_entry)) {
+ widget_unset_error (GTK_WIDGET (method->password_entry));
} else {
- widget_unset_error (widget);
+ text = gtk_entry_get_text (method->password_entry);
+ if (!text || !strlen (text)) {
+ widget_set_error (GTK_WIDGET (method->password_entry));
+ if (!*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP
password"));
+ ret = FALSE;
+ } else {
+ widget_unset_error (GTK_WIDGET (method->password_entry));
+ }
}
return ret;
@@ -101,15 +109,30 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
gtk_size_group_add_widget (group, widget);
}
+typedef struct {
+ const char *name;
+ gboolean autheap_allowed;
+} EapType;
+
+/* Indexed by EAP_METHOD_SIMPLE_TYPE_* */
+static const EapType eap_table[EAP_METHOD_SIMPLE_TYPE_LAST] = {
+ [EAP_METHOD_SIMPLE_TYPE_PAP] = { "pap", FALSE },
+ [EAP_METHOD_SIMPLE_TYPE_MSCHAP] = { "mschap", FALSE },
+ [EAP_METHOD_SIMPLE_TYPE_MSCHAP_V2] = { "mschapv2", TRUE },
+ [EAP_METHOD_SIMPLE_TYPE_MD5] = { "md5", TRUE },
+ [EAP_METHOD_SIMPLE_TYPE_PWD] = { "pwd", TRUE },
+ [EAP_METHOD_SIMPLE_TYPE_CHAP] = { "chap", FALSE },
+ [EAP_METHOD_SIMPLE_TYPE_GTC] = { "gtc", TRUE },
+};
+
static void
-fill_connection (EAPMethod *parent, NMConnection *connection)
+fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFlags prev_flags)
{
EAPMethodSimple *method = (EAPMethodSimple *) parent;
NMSetting8021x *s_8021x;
- GtkWidget *widget;
gboolean not_saved = FALSE;
- const char *eap = NULL;
- NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
+ NMSettingSecretFlags flags;
+ const EapType *eap_type;
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x);
@@ -120,48 +143,28 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
if (parent->phase2 == FALSE)
nm_setting_802_1x_clear_eap_methods (s_8021x);
- switch (method->type) {
- case EAP_METHOD_SIMPLE_TYPE_PAP:
- eap = "pap";
- break;
- case EAP_METHOD_SIMPLE_TYPE_MSCHAP:
- eap = "mschap";
- break;
- case EAP_METHOD_SIMPLE_TYPE_MSCHAP_V2:
- eap = "mschapv2";
- break;
- case EAP_METHOD_SIMPLE_TYPE_MD5:
- eap = "md5";
- break;
- case EAP_METHOD_SIMPLE_TYPE_CHAP:
- eap = "chap";
- break;
- case EAP_METHOD_SIMPLE_TYPE_GTC:
- eap = "gtc";
- break;
- default:
- g_assert_not_reached ();
- break;
- }
-
- if (parent->phase2)
- g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, eap, NULL);
- else
- nm_setting_802_1x_add_eap_method (s_8021x, eap);
-
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_username_entry"));
- g_assert (widget);
- g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (GTK_ENTRY (widget)), NULL);
+ eap_type = &eap_table[method->type];
+ if (parent->phase2) {
+ /* If the outer EAP method (TLS, TTLS, PEAP, etc) allows inner/phase2
+ * EAP methods (which only TTLS allows) *and* the inner/phase2 method
+ * supports being an inner EAP method, then set PHASE2_AUTHEAP.
+ * Otherwise the inner/phase2 method goes into PHASE2_AUTH.
+ */
+ if ((method->flags & EAP_METHOD_SIMPLE_FLAG_AUTHEAP_ALLOWED) && eap_type->autheap_allowed) {
+ g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTHEAP, eap_type->name, NULL);
+ g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, NULL, NULL);
+ } else {
+ g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, eap_type->name, NULL);
+ g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTHEAP, NULL, NULL);
+ }
+ } else
+ nm_setting_802_1x_add_eap_method (s_8021x, eap_type->name);
+
+ g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (method->username_entry), NULL);
/* Save the password always ask setting */
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_password_always_ask"));
- g_assert (widget);
- not_saved = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
-
- nm_setting_get_secret_flags (NM_SETTING (s_8021x), NM_SETTING_802_1X_PASSWORD, &flags, NULL);
- flags &= ~(NM_SETTING_SECRET_FLAG_NOT_SAVED);
- if (not_saved)
- flags |= NM_SETTING_SECRET_FLAG_NOT_SAVED;
+ not_saved = always_ask_selected (method->password_entry);
+ flags = nma_utils_menu_to_secret_flags (GTK_WIDGET (method->password_entry));
nm_setting_set_secret_flags (NM_SETTING (s_8021x), NM_SETTING_802_1X_PASSWORD, flags, NULL);
/* Fill the connection's password if we're in the applet so that it'll get
@@ -169,18 +172,16 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
* back to NM in response to a GetSecrets() call, we don't save it if the
* user checked "Always Ask".
*/
- if (method->is_editor == FALSE || not_saved == FALSE) {
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_entry"));
- g_assert (widget);
- g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_entry_get_text (GTK_ENTRY (widget)),
NULL);
- }
+ if (!(method->flags & EAP_METHOD_SIMPLE_FLAG_IS_EDITOR) || not_saved == FALSE)
+ g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD, gtk_entry_get_text
(method->password_entry), NULL);
- /* Default to agent-owned secrets for new connections */
- if (method->new_connection && (not_saved == FALSE)) {
- g_object_set (s_8021x,
- NM_SETTING_802_1X_PASSWORD_FLAGS, NM_SETTING_SECRET_FLAG_AGENT_OWNED,
- NM_SETTING_802_1X_SYSTEM_CA_CERTS, TRUE,
- NULL);
+ /* Update secret flags and popup when editing the connection */
+ if (!(method->flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY)) {
+ GtkWidget *passwd_entry = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_simple_password_entry"));
+ g_assert (passwd_entry);
+
+ nma_utils_update_password_storage (passwd_entry, flags,
+ NM_SETTING (s_8021x), parent->password_flags_name);
}
}
@@ -194,43 +195,110 @@ update_secrets (EAPMethod *parent, NMConnection *connection)
(HelperSecretFunc) nm_setting_802_1x_get_password);
}
+static gboolean
+stuff_changed (EAPMethodSimple *method)
+{
+ wireless_security_changed_cb (NULL, method->ws_parent);
+ method->idle_func_id = 0;
+ return FALSE;
+}
+
static void
-password_always_ask_changed (GtkButton *button, EAPMethodSimple *method)
+password_storage_changed (GObject *entry,
+ GParamSpec *pspec,
+ EAPMethodSimple *method)
{
- EAPMethod *parent = (EAPMethod *) method;
- GtkWidget *password_entry;
- GtkWidget *show_checkbox;
gboolean always_ask;
+ gboolean secrets_only = method->flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY;
+
+ always_ask = always_ask_selected (method->password_entry);
+
+ if (always_ask && !secrets_only) {
+ /* we always clear this button and do not restore it
+ * (because we want to hide the password). */
+ gtk_toggle_button_set_active (method->show_password, FALSE);
+ }
+
+ gtk_widget_set_sensitive (GTK_WIDGET (method->show_password),
+ !always_ask || secrets_only);
+
+ if (!method->idle_func_id)
+ method->idle_func_id = g_idle_add ((GSourceFunc) stuff_changed, method);
+}
+
+/* Set the UI fields for user, password, always_ask and show_password to the
+ * values as provided by method->ws_parent. */
+static void
+set_userpass_ui (EAPMethodSimple *method)
+{
+ if (method->ws_parent->username)
+ gtk_entry_set_text (method->username_entry, method->ws_parent->username);
+ else
+ gtk_entry_set_text (method->username_entry, "");
+
+ if (method->ws_parent->password && !method->ws_parent->always_ask)
+ gtk_entry_set_text (method->password_entry, method->ws_parent->password);
+ else
+ gtk_entry_set_text (method->password_entry, "");
+
+ gtk_toggle_button_set_active (method->show_password, method->ws_parent->show_password);
+ password_storage_changed (NULL, NULL, method);
+}
+
+static void
+widgets_realized (GtkWidget *widget, EAPMethodSimple *method)
+{
+ set_userpass_ui (method);
+}
- always_ask = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
+static void
+widgets_unrealized (GtkWidget *widget, EAPMethodSimple *method)
+{
+ wireless_security_set_userpass (method->ws_parent,
+ gtk_entry_get_text (method->username_entry),
+ gtk_entry_get_text (method->password_entry),
+ always_ask_selected (method->password_entry),
+ gtk_toggle_button_get_active (method->show_password));
+}
- password_entry = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_entry"));
- g_assert (password_entry);
+static void
+destroy (EAPMethod *parent)
+{
+ EAPMethodSimple *method = (EAPMethodSimple *) parent;
+ GtkWidget *widget;
+
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_notebook"));
+ g_assert (widget);
- show_checkbox = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_eapsimple"));
- g_assert (show_checkbox);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (widget),
+ (GCallback) widgets_realized,
+ method);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (widget),
+ (GCallback) widgets_unrealized,
+ method);
- if (always_ask) {
- gtk_entry_set_text (GTK_ENTRY (password_entry), "");
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (show_checkbox), FALSE);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_entry"));
+ g_assert (widget);
+ g_signal_handlers_disconnect_by_func (G_OBJECT (widget),
+ (GCallback) password_storage_changed,
+ method);
+ if (method->idle_func_id > 0) {
+ g_source_remove (method->idle_func_id);
+ method->idle_func_id = 0;
}
- gtk_widget_set_sensitive (password_entry, !always_ask);
- gtk_widget_set_sensitive (show_checkbox, !always_ask);
+ wireless_security_unref (method->ws_parent);
}
EAPMethodSimple *
eap_method_simple_new (WirelessSecurity *ws_parent,
NMConnection *connection,
EAPMethodSimpleType type,
- gboolean phase2,
- gboolean is_editor,
- gboolean secrets_only)
+ EAPMethodSimpleFlags flags)
{
EAPMethod *parent;
EAPMethodSimple *method;
GtkWidget *widget;
- gboolean not_saved = FALSE;
NMSetting8021x *s_8021x = NULL;
parent = eap_method_init (sizeof (EAPMethodSimple),
@@ -238,78 +306,72 @@ eap_method_simple_new (WirelessSecurity *ws_parent,
add_to_size_group,
fill_connection,
update_secrets,
- NULL,
+ destroy,
"/org/gnome/control-center/network/eap-method-simple.ui",
"eap_simple_notebook",
"eap_simple_username_entry",
- phase2);
+ flags & EAP_METHOD_SIMPLE_FLAG_PHASE2);
if (!parent)
return NULL;
+ parent->password_flags_name = NM_SETTING_802_1X_PASSWORD;
method = (EAPMethodSimple *) parent;
+ method->ws_parent = wireless_security_ref (ws_parent);
+ method->flags = flags;
method->type = type;
- method->is_editor = is_editor;
- method->new_connection = secrets_only ? FALSE : TRUE;
+ g_assert (type < EAP_METHOD_SIMPLE_TYPE_LAST);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_notebook"));
+ g_assert (widget);
+ g_signal_connect (G_OBJECT (widget), "realize",
+ (GCallback) widgets_realized,
+ method);
+ g_signal_connect (G_OBJECT (widget), "unrealize",
+ (GCallback) widgets_unrealized,
+ method);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_username_entry"));
g_assert (widget);
+ method->username_entry = GTK_ENTRY (widget);
g_signal_connect (G_OBJECT (widget), "changed",
(GCallback) wireless_security_changed_cb,
ws_parent);
- if (connection) {
- s_8021x = nm_connection_get_setting_802_1x (connection);
- if (s_8021x && nm_setting_802_1x_get_identity (s_8021x))
- gtk_entry_set_text (GTK_ENTRY (widget), nm_setting_802_1x_get_identity (s_8021x));
- }
- if (secrets_only)
+ if (method->flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY)
gtk_widget_set_sensitive (widget, FALSE);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_entry"));
g_assert (widget);
+ method->password_entry = GTK_ENTRY (widget);
g_signal_connect (G_OBJECT (widget), "changed",
(GCallback) wireless_security_changed_cb,
ws_parent);
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_password_always_ask"));
- g_assert (widget);
- g_signal_connect (G_OBJECT (widget), "toggled",
- (GCallback) wireless_security_changed_cb,
- ws_parent);
- if (is_editor) {
- /* We only desensitize the password entry from the editor, because
- * from nm-applet if the entry was desensitized, there'd be no way to
- * get the password back to NetworkManager when NM asked for it. Since
- * the editor only sets up the initial connection though, it's safe to
- * do there.
- */
- g_signal_connect (G_OBJECT (widget), "toggled",
- G_CALLBACK (password_always_ask_changed),
- method);
- }
-
- if (secrets_only)
- gtk_widget_hide (widget);
-
- if (s_8021x) {
- NMSettingSecretFlags flags = NM_SETTING_SECRET_FLAG_NONE;
-
- nm_setting_get_secret_flags (NM_SETTING (s_8021x), NM_SETTING_802_1X_PASSWORD, &flags, NULL);
- not_saved = (flags & NM_SETTING_SECRET_FLAG_NOT_SAVED);
- }
-
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), not_saved);
+ /* Create password-storage popup menu for password entry under entry's secondary icon */
+ if (connection)
+ s_8021x = nm_connection_get_setting_802_1x (connection);
+ nma_utils_setup_password_storage (widget, 0, (NMSetting *) s_8021x, parent->password_flags_name,
+ FALSE, flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY);
- /* Fill secrets if there's a static (ie, not OTP) password */
- if (connection && (not_saved == FALSE))
- update_secrets (EAP_METHOD (method), connection);
+ g_signal_connect (method->password_entry, "notify::secondary-icon-name",
+ G_CALLBACK (password_storage_changed),
+ method);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_eapsimple"));
g_assert (widget);
+ method->show_password = GTK_TOGGLE_BUTTON (widget);
g_signal_connect (G_OBJECT (widget), "toggled",
(GCallback) show_toggled_cb,
method);
+ /* Initialize the UI fields with the security settings from method->ws_parent.
+ * This will be done again when the widget gets realized. It must be done here as well,
+ * because the outer dialog will ask to 'validate' the connection before the security tab
+ * is shown/realized (to enable the 'Apply' button).
+ * As 'validate' accesses the contents of the UI fields, they must be initialized now, even
+ * if the widgets are not yet visible. */
+ set_userpass_ui (method);
+
return method;
}
diff --git a/panels/network/wireless-security/eap-method-simple.h
b/panels/network/wireless-security/eap-method-simple.h
index 8a955dc..293d17b 100644
--- a/panels/network/wireless-security/eap-method-simple.h
+++ b/panels/network/wireless-security/eap-method-simple.h
@@ -26,22 +26,37 @@
#include "wireless-security.h"
typedef enum {
+ /* NOTE: when updating this table, also update eap_methods[] */
EAP_METHOD_SIMPLE_TYPE_PAP = 0,
EAP_METHOD_SIMPLE_TYPE_MSCHAP,
EAP_METHOD_SIMPLE_TYPE_MSCHAP_V2,
EAP_METHOD_SIMPLE_TYPE_MD5,
+ EAP_METHOD_SIMPLE_TYPE_PWD,
EAP_METHOD_SIMPLE_TYPE_CHAP,
- EAP_METHOD_SIMPLE_TYPE_GTC
+ EAP_METHOD_SIMPLE_TYPE_GTC,
+
+ /* Boundary value, do not use */
+ EAP_METHOD_SIMPLE_TYPE_LAST
} EAPMethodSimpleType;
+typedef enum {
+ EAP_METHOD_SIMPLE_FLAG_NONE = 0x00,
+ /* Indicates the EAP method is an inner/phase2 method */
+ EAP_METHOD_SIMPLE_FLAG_PHASE2 = 0x01,
+ /* Set by TTLS to indicate that inner/phase2 EAP is allowed */
+ EAP_METHOD_SIMPLE_FLAG_AUTHEAP_ALLOWED = 0x02,
+ /* Set from nm-connection-editor or the GNOME network panel */
+ EAP_METHOD_SIMPLE_FLAG_IS_EDITOR = 0x04,
+ /* Set to indicate that this request is only for secrets */
+ EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY = 0x08
+} EAPMethodSimpleFlags;
+
typedef struct _EAPMethodSimple EAPMethodSimple;
EAPMethodSimple *eap_method_simple_new (WirelessSecurity *ws_parent,
NMConnection *connection,
EAPMethodSimpleType type,
- gboolean phase2,
- gboolean is_editor,
- gboolean secrets_only);
+ EAPMethodSimpleFlags flags);
#endif /* EAP_METHOD_SIMPLE_H */
diff --git a/panels/network/wireless-security/eap-method-simple.ui
b/panels/network/wireless-security/eap-method-simple.ui
index a3ffdf8..b3318e4 100644
--- a/panels/network/wireless-security/eap-method-simple.ui
+++ b/panels/network/wireless-security/eap-method-simple.ui
@@ -10,9 +10,10 @@
<object class="GtkTable" id="table11">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="valign">start</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<placeholder/>
@@ -21,8 +22,8 @@
<object class="GtkLabel" id="eap_simple_username_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Username</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Username:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_simple_username_entry</property>
</object>
@@ -35,8 +36,8 @@
<object class="GtkLabel" id="eap_simple_password_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Password</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Password:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_simple_password_entry</property>
</object>
@@ -75,47 +76,26 @@
</packing>
</child>
<child>
- <object class="GtkAlignment" id="alignment1">
+ <object class="GtkVBox" id="vbox5">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
- <object class="GtkVBox" id="vbox5">
+ <object class="GtkCheckButton" id="show_checkbutton_eapsimple">
+ <property name="label" translatable="yes">Sho_w password</property>
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <child>
- <object class="GtkCheckButton" id="eap_password_always_ask">
- <property name="label" translatable="yes">As_k for this password every time</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">0</property>
- </packing>
- </child>
- <child>
- <object class="GtkCheckButton" id="show_checkbutton_eapsimple">
- <property name="label" translatable="yes">Sho_w password</property>
- <property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="use_underline">True</property>
- <property name="xalign">0</property>
- <property name="draw_indicator">True</property>
- </object>
- <packing>
- <property name="expand">True</property>
- <property name="fill">True</property>
- <property name="position">1</property>
- </packing>
- </child>
- <child>
- <placeholder/>
- </child>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
</object>
+ <packing>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
</child>
</object>
<packing>
@@ -123,7 +103,6 @@
<property name="right_attach">2</property>
<property name="top_attach">2</property>
<property name="bottom_attach">3</property>
- <property name="y_options"/>
</packing>
</child>
</object>
diff --git a/panels/network/wireless-security/eap-method-tls.c
b/panels/network/wireless-security/eap-method-tls.c
index 0fbb58c..587c399 100644
--- a/panels/network/wireless-security/eap-method-tls.c
+++ b/panels/network/wireless-security/eap-method-tls.c
@@ -17,25 +17,24 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
-#include <glib/gi18n.h>
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
-
#include "eap-method.h"
#include "wireless-security.h"
#include "helpers.h"
+#include "nma-ui-utils.h"
+#include "utils.h"
struct _EAPMethodTLS {
EAPMethod parent;
- gboolean new_connection;
+ gboolean editing_connection;
};
@@ -53,11 +52,12 @@ show_toggled_cb (GtkCheckButton *button, EAPMethod *method)
}
static gboolean
-validate (EAPMethod *parent)
+validate (EAPMethod *parent, GError **error)
{
NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
GtkWidget *widget;
const char *password, *identity;
+ GError *local = NULL;
gboolean ret = TRUE;
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_identity_entry"));
@@ -65,17 +65,23 @@ validate (EAPMethod *parent)
identity = gtk_entry_get_text (GTK_ENTRY (widget));
if (!identity || !strlen (identity)) {
widget_set_error (widget);
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-TLS identity"));
ret = FALSE;
} else {
widget_unset_error (widget);
}
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_ca_cert_button"));
- if (!eap_method_validate_filepicker (parent->builder, "eap_tls_ca_cert_button", TYPE_CA_CERT, NULL,
NULL)) {
- widget_set_error (widget);
+ if (!eap_method_validate_filepicker (parent->builder, "eap_tls_ca_cert_button", TYPE_CA_CERT, NULL,
NULL, &local)) {
+ widget_set_error (GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_ca_cert_button")));
+ if (!*error)
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS CA certificate:
%s"), local->message);
+ g_clear_error (&local);
+ ret = FALSE;
+ } else if (eap_method_ca_cert_required (parent->builder, "eap_tls_ca_cert_not_required_checkbox",
"eap_tls_ca_cert_button")) {
+ widget_set_error (GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_ca_cert_button")));
+ if (!*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS CA
certificate: no certificate specified"));
ret = FALSE;
- } else {
- widget_unset_error (widget);
}
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_private_key_password_entry"));
@@ -83,28 +89,33 @@ validate (EAPMethod *parent)
password = gtk_entry_get_text (GTK_ENTRY (widget));
if (!password || !strlen (password)) {
widget_set_error (widget);
+ if (!*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS
password: missing"));
ret = FALSE;
} else {
widget_unset_error (widget);
}
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_private_key_button"));
if (!eap_method_validate_filepicker (parent->builder,
"eap_tls_private_key_button",
TYPE_PRIVATE_KEY,
password,
- &format)) {
- widget_set_error (widget);
+ &format,
+ &local)) {
+ if (!*error)
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS private-key:
%s"), local->message);
+ g_clear_error (&local);
+ widget_set_error (GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_private_key_button")));
ret = FALSE;
}
if (format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
- widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_user_cert_button"));
- if (!eap_method_validate_filepicker (parent->builder, "eap_tls_user_cert_button",
TYPE_CLIENT_CERT, NULL, NULL)) {
- widget_set_error (widget);
+ if (!eap_method_validate_filepicker (parent->builder, "eap_tls_user_cert_button",
TYPE_CLIENT_CERT, NULL, NULL, &local)) {
+ if (!*error)
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TLS
user-certificate: %s"), local->message);
+ g_clear_error (&local);
+ widget_set_error (GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_user_cert_button")));
ret = FALSE;
- } else {
- widget_unset_error (widget);
}
}
@@ -112,10 +123,22 @@ validate (EAPMethod *parent)
}
static void
+ca_cert_not_required_toggled (GtkWidget *ignored, gpointer user_data)
+{
+ EAPMethod *parent = user_data;
+
+ eap_method_ca_cert_not_required_toggled (parent->builder, "eap_tls_ca_cert_not_required_checkbox",
"eap_tls_ca_cert_button");
+}
+
+static void
add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
{
GtkWidget *widget;
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_ca_cert_not_required_checkbox"));
+ g_assert (widget);
+ gtk_size_group_add_widget (group, widget);
+
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_identity_label"));
g_assert (widget);
gtk_size_group_add_widget (group, widget);
@@ -138,16 +161,17 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
}
static void
-fill_connection (EAPMethod *parent, NMConnection *connection)
+fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFlags flags)
{
EAPMethodTLS *method = (EAPMethodTLS *) parent;
NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
NMSetting8021x *s_8021x;
- GtkWidget *widget;
+ NMSettingSecretFlags secret_flags;
+ GtkWidget *widget, *passwd_entry;
char *ca_filename, *pk_filename, *cc_filename;
const char *password = NULL;
GError *error = NULL;
- const char *secret_flag_prop = NULL;
+ gboolean ca_cert_error = FALSE;
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x);
@@ -166,6 +190,7 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
g_assert (widget);
password = gtk_entry_get_text (GTK_ENTRY (widget));
g_assert (password);
+ passwd_entry = widget;
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_private_key_button"));
g_assert (widget);
@@ -177,22 +202,23 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
g_warning ("Couldn't read phase2 private key '%s': %s", pk_filename, error ?
error->message : "(unknown)");
g_clear_error (&error);
}
- secret_flag_prop = NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD_FLAGS;
} else {
if (!nm_setting_802_1x_set_private_key (s_8021x, pk_filename, password,
NM_SETTING_802_1X_CK_SCHEME_PATH, &format, &error)) {
g_warning ("Couldn't read private key '%s': %s", pk_filename, error ? error->message
: "(unknown)");
g_clear_error (&error);
}
- secret_flag_prop = NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD_FLAGS;
}
g_free (pk_filename);
- /* Default to agent-owned secrets for new connections */
- if (method->new_connection) {
- g_object_set (s_8021x,
- secret_flag_prop, NM_SETTING_SECRET_FLAG_AGENT_OWNED,
- NM_SETTING_802_1X_SYSTEM_CA_CERTS, TRUE,
- NULL);
+ /* Save 802.1X password flags to the connection */
+ secret_flags = nma_utils_menu_to_secret_flags (passwd_entry);
+ nm_setting_set_secret_flags (NM_SETTING (s_8021x), parent->password_flags_name,
+ secret_flags, NULL);
+
+ /* Update secret flags and popup when editing the connection */
+ if (method->editing_connection) {
+ nma_utils_update_password_storage (passwd_entry, secret_flags,
+ NM_SETTING (s_8021x), parent->password_flags_name);
}
/* TLS client certificate */
@@ -230,13 +256,17 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
if (!nm_setting_802_1x_set_phase2_ca_cert (s_8021x, ca_filename,
NM_SETTING_802_1X_CK_SCHEME_PATH, &format, &error)) {
g_warning ("Couldn't read phase2 CA certificate '%s': %s", ca_filename, error ?
error->message : "(unknown)");
g_clear_error (&error);
+ ca_cert_error = TRUE;
}
} else {
if (!nm_setting_802_1x_set_ca_cert (s_8021x, ca_filename, NM_SETTING_802_1X_CK_SCHEME_PATH,
&format, &error)) {
g_warning ("Couldn't read CA certificate '%s': %s", ca_filename, error ?
error->message : "(unknown)");
g_clear_error (&error);
+ ca_cert_error = TRUE;
}
}
+ eap_method_ca_cert_ignore_set (parent, connection, ca_filename, ca_cert_error);
+ g_free (ca_filename);
}
static void
@@ -415,6 +445,7 @@ eap_method_tls_new (WirelessSecurity *ws_parent,
EAPMethod *parent;
GtkWidget *widget;
NMSetting8021x *s_8021x = NULL;
+ gboolean ca_not_required = FALSE;
parent = eap_method_init (sizeof (EAPMethodTLS),
validate,
@@ -429,14 +460,24 @@ eap_method_tls_new (WirelessSecurity *ws_parent,
if (!parent)
return NULL;
+ parent->password_flags_name = phase2 ?
+ NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD :
+ NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD;
method = (EAPMethodTLS *) parent;
- method->new_connection = secrets_only ? FALSE : TRUE;
-
- eap_method_nag_init (parent, "eap_tls_ca_cert_button", connection);
+ method->editing_connection = secrets_only ? FALSE : TRUE;
if (connection)
s_8021x = nm_connection_get_setting_802_1x (connection);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_ca_cert_not_required_checkbox"));
+ g_assert (widget);
+ g_signal_connect (G_OBJECT (widget), "toggled",
+ (GCallback) ca_cert_not_required_toggled,
+ parent);
+ g_signal_connect (G_OBJECT (widget), "toggled",
+ (GCallback) wireless_security_changed_cb,
+ ws_parent);
+
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_identity_entry"));
g_assert (widget);
g_signal_connect (G_OBJECT (widget), "changed",
@@ -464,6 +505,13 @@ eap_method_tls_new (WirelessSecurity *ws_parent,
phase2 ? nm_setting_802_1x_get_phase2_private_key_path :
nm_setting_802_1x_get_private_key_path,
TRUE, FALSE);
+ if (connection && eap_method_ca_cert_ignore_get (parent, connection)) {
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_ca_cert_button"));
+ ca_not_required = !gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
+ }
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_ca_cert_not_required_checkbox"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), ca_not_required);
+
/* Fill secrets, if any */
if (connection)
update_secrets (parent, connection);
@@ -474,6 +522,10 @@ eap_method_tls_new (WirelessSecurity *ws_parent,
(GCallback) wireless_security_changed_cb,
ws_parent);
+ /* Create password-storage popup menu for password entry under entry's secondary icon */
+ nma_utils_setup_password_storage (widget, 0, (NMSetting *) s_8021x, parent->password_flags_name,
+ FALSE, secrets_only);
+
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_eaptls"));
g_assert (widget);
g_signal_connect (G_OBJECT (widget), "toggled",
@@ -495,6 +547,8 @@ eap_method_tls_new (WirelessSecurity *ws_parent,
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_ca_cert_button"));
gtk_widget_hide (widget);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_tls_ca_cert_not_required_checkbox"));
+ gtk_widget_hide (widget);
}
return method;
diff --git a/panels/network/wireless-security/eap-method-tls.ui
b/panels/network/wireless-security/eap-method-tls.ui
index 028e73e..5557593 100644
--- a/panels/network/wireless-security/eap-method-tls.ui
+++ b/panels/network/wireless-security/eap-method-tls.ui
@@ -10,9 +10,10 @@
<object class="GtkTable" id="table8">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="valign">start</property>
<property name="n_rows">6</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<placeholder/>
@@ -21,8 +22,8 @@
<object class="GtkLabel" id="eap_tls_identity_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">I_dentity</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">I_dentity:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_tls_identity_entry</property>
</object>
@@ -47,8 +48,8 @@
<object class="GtkLabel" id="eap_tls_user_cert_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_User certificate</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_User certificate:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_tls_user_cert_button</property>
</object>
@@ -63,8 +64,8 @@
<object class="GtkLabel" id="eap_tls_ca_cert_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">C_A certificate</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">C_A certificate:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_tls_ca_cert_button</property>
</object>
@@ -90,17 +91,35 @@
</packing>
</child>
<child>
+ <object class="GtkCheckButton" id="eap_tls_ca_cert_not_required_checkbox">
+ <property name="label" translatable="yes">No CA certificate is _required</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
<object class="GtkLabel" id="eap_tls_private_key_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Private _key</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Private _key:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_tls_private_key_button</property>
</object>
<packing>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"/>
</packing>
@@ -113,8 +132,8 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
@@ -123,14 +142,14 @@
<object class="GtkLabel" id="eap_tls_private_key_password_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Private key password</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Private key password:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_tls_private_key_password_entry</property>
</object>
<packing>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"/>
</packing>
@@ -145,8 +164,8 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">4</property>
- <property name="bottom_attach">5</property>
+ <property name="top_attach">5</property>
+ <property name="bottom_attach">6</property>
<property name="y_options"/>
</packing>
</child>
@@ -157,14 +176,13 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
- <property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">5</property>
- <property name="bottom_attach">6</property>
+ <property name="top_attach">6</property>
+ <property name="bottom_attach">7</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"/>
</packing>
diff --git a/panels/network/wireless-security/eap-method-ttls.c
b/panels/network/wireless-security/eap-method-ttls.c
index ef94058..ef02529 100644
--- a/panels/network/wireless-security/eap-method-ttls.c
+++ b/panels/network/wireless-security/eap-method-ttls.c
@@ -17,18 +17,17 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
-#include <glib/gi18n.h>
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
#include "eap-method.h"
#include "wireless-security.h"
+#include "utils.h"
#define I_NAME_COLUMN 0
#define I_METHOD_COLUMN 1
@@ -51,16 +50,24 @@ destroy (EAPMethod *parent)
}
static gboolean
-validate (EAPMethod *parent)
+validate (EAPMethod *parent, GError **error)
{
GtkWidget *widget;
GtkTreeModel *model;
GtkTreeIter iter;
EAPMethod *eap = NULL;
gboolean valid = FALSE;
+ GError *local = NULL;
- if (!eap_method_validate_filepicker (parent->builder, "eap_ttls_ca_cert_button", TYPE_CA_CERT, NULL,
NULL))
+ if (!eap_method_validate_filepicker (parent->builder, "eap_ttls_ca_cert_button", TYPE_CA_CERT, NULL,
NULL, &local)) {
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TTLS CA certificate: %s"),
local->message);
+ g_clear_error (&local);
return FALSE;
+ }
+ if (eap_method_ca_cert_required (parent->builder, "eap_ttls_ca_cert_not_required_checkbox",
"eap_ttls_ca_cert_button")) {
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid EAP-TTLS CA certificate:
no certificate specified"));
+ return FALSE;
+ }
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_inner_auth_combo"));
g_assert (widget);
@@ -69,12 +76,20 @@ validate (EAPMethod *parent)
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
gtk_tree_model_get (model, &iter, I_METHOD_COLUMN, &eap, -1);
g_assert (eap);
- valid = eap_method_validate (eap);
+ valid = eap_method_validate (eap, error);
eap_method_unref (eap);
return valid;
}
static void
+ca_cert_not_required_toggled (GtkWidget *ignored, gpointer user_data)
+{
+ EAPMethod *parent = user_data;
+
+ eap_method_ca_cert_not_required_toggled (parent->builder, "eap_ttls_ca_cert_not_required_checkbox",
"eap_ttls_ca_cert_button");
+}
+
+static void
add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
{
EAPMethodTTLS *method = (EAPMethodTTLS *) parent;
@@ -87,6 +102,10 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
g_object_unref (method->size_group);
method->size_group = g_object_ref (group);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_ttls_ca_cert_not_required_checkbox"));
+ g_assert (widget);
+ gtk_size_group_add_widget (group, widget);
+
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_anon_identity_label"));
g_assert (widget);
gtk_size_group_add_widget (group, widget);
@@ -111,7 +130,7 @@ add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
}
static void
-fill_connection (EAPMethod *parent, NMConnection *connection)
+fill_connection (EAPMethod *parent, NMConnection *connection, NMSettingSecretFlags flags)
{
NMSetting8021x *s_8021x;
NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
@@ -122,6 +141,7 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
GtkTreeModel *model;
GtkTreeIter iter;
GError *error = NULL;
+ gboolean ca_cert_error = FALSE;
s_8021x = nm_connection_get_setting_802_1x (connection);
g_assert (s_8021x);
@@ -140,7 +160,10 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
if (!nm_setting_802_1x_set_ca_cert (s_8021x, filename, NM_SETTING_802_1X_CK_SCHEME_PATH, &format,
&error)) {
g_warning ("Couldn't read CA certificate '%s': %s", filename, error ? error->message :
"(unknown)");
g_clear_error (&error);
+ ca_cert_error = TRUE;
}
+ eap_method_ca_cert_ignore_set (parent, connection, filename, ca_cert_error);
+ g_free (filename);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_inner_auth_combo"));
model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
@@ -148,7 +171,7 @@ fill_connection (EAPMethod *parent, NMConnection *connection)
gtk_tree_model_get (model, &iter, I_METHOD_COLUMN, &eap, -1);
g_assert (eap);
- eap_method_fill_connection (eap, connection);
+ eap_method_fill_connection (eap, connection, flags);
eap_method_unref (eap);
}
@@ -205,10 +228,13 @@ inner_auth_combo_init (EAPMethodTTLS *method,
EAPMethodSimple *em_mschap;
EAPMethodSimple *em_mschap_v2;
EAPMethodSimple *em_chap;
+ EAPMethodSimple *em_md5;
+ EAPMethodSimple *em_gtc;
guint32 active = 0;
const char *phase2_auth = NULL;
+ EAPMethodSimpleFlags simple_flags;
- auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_g_type ());
+ auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_type ());
if (s_8021x) {
if (nm_setting_802_1x_get_phase2_auth (s_8021x))
@@ -217,12 +243,16 @@ inner_auth_combo_init (EAPMethodTTLS *method,
phase2_auth = nm_setting_802_1x_get_phase2_autheap (s_8021x);
}
+ simple_flags = EAP_METHOD_SIMPLE_FLAG_PHASE2 | EAP_METHOD_SIMPLE_FLAG_AUTHEAP_ALLOWED;
+ if (method->is_editor)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_IS_EDITOR;
+ if (secrets_only)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY;
+
em_pap = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_PAP,
- TRUE,
- method->is_editor,
- secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("PAP"),
@@ -237,9 +267,7 @@ inner_auth_combo_init (EAPMethodTTLS *method,
em_mschap = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_MSCHAP,
- TRUE,
- method->is_editor,
- secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("MSCHAP"),
@@ -254,8 +282,7 @@ inner_auth_combo_init (EAPMethodTTLS *method,
em_mschap_v2 = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_MSCHAP_V2,
- TRUE,
- method->is_editor, secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("MSCHAPv2"),
@@ -270,9 +297,7 @@ inner_auth_combo_init (EAPMethodTTLS *method,
em_chap = eap_method_simple_new (method->sec_parent,
connection,
EAP_METHOD_SIMPLE_TYPE_CHAP,
- TRUE,
- method->is_editor,
- secrets_only);
+ simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
I_NAME_COLUMN, _("CHAP"),
@@ -284,6 +309,36 @@ inner_auth_combo_init (EAPMethodTTLS *method,
if (phase2_auth && !strcasecmp (phase2_auth, "chap"))
active = 3;
+ em_md5 = eap_method_simple_new (method->sec_parent,
+ connection,
+ EAP_METHOD_SIMPLE_TYPE_MD5,
+ simple_flags);
+ gtk_list_store_append (auth_model, &iter);
+ gtk_list_store_set (auth_model, &iter,
+ I_NAME_COLUMN, _("MD5"),
+ I_METHOD_COLUMN, em_md5,
+ -1);
+ eap_method_unref (EAP_METHOD (em_md5));
+
+ /* Check for defaulting to MD5 */
+ if (phase2_auth && !strcasecmp (phase2_auth, "md5"))
+ active = 4;
+
+ em_gtc = eap_method_simple_new (method->sec_parent,
+ connection,
+ EAP_METHOD_SIMPLE_TYPE_GTC,
+ simple_flags);
+ gtk_list_store_append (auth_model, &iter);
+ gtk_list_store_set (auth_model, &iter,
+ I_NAME_COLUMN, _("GTC"),
+ I_METHOD_COLUMN, em_gtc,
+ -1);
+ eap_method_unref (EAP_METHOD (em_gtc));
+
+ /* Check for defaulting to GTC */
+ if (phase2_auth && !strcasecmp (phase2_auth, "gtc"))
+ active = 5;
+
combo = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_inner_auth_combo"));
g_assert (combo);
@@ -314,7 +369,7 @@ eap_method_ttls_new (WirelessSecurity *ws_parent,
{
EAPMethod *parent;
EAPMethodTTLS *method;
- GtkWidget *widget;
+ GtkWidget *widget, *widget_ca_not_required_checkbox;
GtkFileFilter *filter;
NMSetting8021x *s_8021x = NULL;
const char *filename;
@@ -332,8 +387,7 @@ eap_method_ttls_new (WirelessSecurity *ws_parent,
if (!parent)
return NULL;
- eap_method_nag_init (parent, "eap_ttls_ca_cert_button", connection);
-
+ parent->password_flags_name = NM_SETTING_802_1X_PASSWORD;
method = (EAPMethodTTLS *) parent;
method->sec_parent = ws_parent;
method->is_editor = is_editor;
@@ -341,6 +395,16 @@ eap_method_ttls_new (WirelessSecurity *ws_parent,
if (connection)
s_8021x = nm_connection_get_setting_802_1x (connection);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_ttls_ca_cert_not_required_checkbox"));
+ g_assert (widget);
+ g_signal_connect (G_OBJECT (widget), "toggled",
+ (GCallback) ca_cert_not_required_toggled,
+ parent);
+ g_signal_connect (G_OBJECT (widget), "toggled",
+ (GCallback) wireless_security_changed_cb,
+ ws_parent);
+ widget_ca_not_required_checkbox = widget;
+
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_ca_cert_button"));
g_assert (widget);
gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (widget), TRUE);
@@ -352,11 +416,14 @@ eap_method_ttls_new (WirelessSecurity *ws_parent,
filter = eap_method_default_file_chooser_filter_new (FALSE);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (widget), filter);
if (connection && s_8021x) {
+ filename = NULL;
if (nm_setting_802_1x_get_ca_cert_scheme (s_8021x) == NM_SETTING_802_1X_CK_SCHEME_PATH) {
filename = nm_setting_802_1x_get_ca_cert_path (s_8021x);
if (filename)
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), filename);
}
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget_ca_not_required_checkbox),
+ !filename && eap_method_ca_cert_ignore_get (parent,
connection));
}
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_anon_identity_entry"));
@@ -378,6 +445,8 @@ eap_method_ttls_new (WirelessSecurity *ws_parent,
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_ca_cert_button"));
gtk_widget_hide (widget);
+ widget = GTK_WIDGET (gtk_builder_get_object (parent->builder,
"eap_ttls_ca_cert_not_required_checkbox"));
+ gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_inner_auth_label"));
gtk_widget_hide (widget);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_ttls_inner_auth_combo"));
diff --git a/panels/network/wireless-security/eap-method-ttls.ui
b/panels/network/wireless-security/eap-method-ttls.ui
index 39465cf..ce00c26 100644
--- a/panels/network/wireless-security/eap-method-ttls.ui
+++ b/panels/network/wireless-security/eap-method-ttls.ui
@@ -23,14 +23,14 @@
<property name="can_focus">False</property>
<property name="n_rows">4</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="eap_ttls_anon_identity_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Anony_mous identity</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Anony_mous identity:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_ttls_anon_identity_entry</property>
</object>
@@ -55,8 +55,8 @@
<object class="GtkLabel" id="eap_ttls_ca_cert_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">C_A certificate</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">C_A certificate:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_ttls_ca_cert_button</property>
</object>
@@ -82,17 +82,35 @@
</packing>
</child>
<child>
+ <object class="GtkCheckButton" id="eap_ttls_ca_cert_not_required_checkbox">
+ <property name="label" translatable="yes">No CA certificate is _required</property>
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="receives_default">False</property>
+ <property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
+ </object>
+ <packing>
+ <property name="left_attach">1</property>
+ <property name="right_attach">2</property>
+ <property name="top_attach">2</property>
+ <property name="bottom_attach">3</property>
+ <property name="x_options">GTK_FILL</property>
+ <property name="y_options"/>
+ </packing>
+ </child>
+ <child>
<object class="GtkLabel" id="eap_ttls_inner_auth_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Inner authentication</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Inner authentication:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">eap_ttls_inner_auth_combo</property>
</object>
<packing>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options"/>
</packing>
@@ -112,8 +130,8 @@
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
- <property name="top_attach">2</property>
- <property name="bottom_attach">3</property>
+ <property name="top_attach">3</property>
+ <property name="bottom_attach">4</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
@@ -129,8 +147,8 @@
</object>
<packing>
<property name="right_attach">2</property>
- <property name="top_attach">3</property>
- <property name="bottom_attach">4</property>
+ <property name="top_attach">4</property>
+ <property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
</packing>
</child>
diff --git a/panels/network/wireless-security/eap-method.c b/panels/network/wireless-security/eap-method.c
index 62ac4e8..6ec4849 100644
--- a/panels/network/wireless-security/eap-method.c
+++ b/panels/network/wireless-security/eap-method.c
@@ -18,32 +18,31 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2012 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
-#include <glib.h>
-#include <glib/gi18n.h>
-#include <gtk/gtk.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
-#include <NetworkManager.h>
#include "eap-method.h"
+#include "nm-utils.h"
+#include "utils.h"
+#include "helpers.h"
GType
-eap_method_get_g_type (void)
+eap_method_get_type (void)
{
static GType type_id = 0;
if (!type_id) {
type_id = g_boxed_type_register_static ("CcEAPMethod",
- (GBoxedCopyFunc) eap_method_ref,
- (GBoxedFreeFunc) eap_method_unref);
+ (GBoxedCopyFunc) eap_method_ref,
+ (GBoxedFreeFunc) eap_method_unref);
}
return type_id;
@@ -58,12 +57,17 @@ eap_method_get_widget (EAPMethod *method)
}
gboolean
-eap_method_validate (EAPMethod *method)
+eap_method_validate (EAPMethod *method, GError **error)
{
+ gboolean result;
+
g_return_val_if_fail (method != NULL, FALSE);
g_assert (method->validate);
- return (*(method->validate)) (method);
+ result = (*(method->validate)) (method, error);
+ if (!result && error && !*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("undefined error in 802.1x
security (wpa-eap)"));
+ return result;
}
void
@@ -77,13 +81,15 @@ eap_method_add_to_size_group (EAPMethod *method, GtkSizeGroup *group)
}
void
-eap_method_fill_connection (EAPMethod *method, NMConnection *connection)
+eap_method_fill_connection (EAPMethod *method,
+ NMConnection *connection,
+ NMSettingSecretFlags flags)
{
g_return_if_fail (method != NULL);
g_return_if_fail (connection != NULL);
g_assert (method->fill_connection);
- return (*(method->fill_connection)) (method, connection);
+ return (*(method->fill_connection)) (method, connection, flags);
}
void
@@ -96,197 +102,6 @@ eap_method_update_secrets (EAPMethod *method, NMConnection *connection)
method->update_secrets (method, connection);
}
-typedef struct {
- EAPMethod *method;
- NMConnection *connection;
-} NagDialogResponseInfo;
-
-static void
-nag_dialog_destroyed (gpointer data, GObject *dialog_ptr)
-{
- NagDialogResponseInfo *info = (NagDialogResponseInfo *) data;
-
- memset (info, '\0', sizeof (NagDialogResponseInfo));
- g_free (info);
-}
-
-static GSettings *
-_get_ca_ignore_settings (const char *uuid)
-{
- GSettings *settings;
- char *path = NULL;
-
- path = g_strdup_printf ("/org/gnome/nm-applet/eap/%s/", uuid);
- settings = g_settings_new_with_path ("org.gnome.nm-applet.eap", path);
- g_free (path);
-
- return settings;
-}
-
-static void
-_set_ignore_ca_cert (const char *uuid, gboolean phase2, gboolean ignore)
-{
- GSettings *settings;
- const char *key;
-
- g_return_if_fail (uuid != NULL);
-
- settings = _get_ca_ignore_settings (uuid);
- key = phase2 ? "ignore-phase2-ca-cert" : "ignore-ca-cert";
- g_settings_set_boolean (settings, key, ignore);
- g_object_unref (settings);
-}
-
-static void
-nag_dialog_response_cb (GtkDialog *nag_dialog,
- gint response,
- gpointer user_data)
-{
- NagDialogResponseInfo *info = (NagDialogResponseInfo *) user_data;
- EAPMethod *method = (EAPMethod *) info->method;
- NMConnection *connection = (NMConnection *) info->connection;
- GtkWidget *widget;
-
- if (response == GTK_RESPONSE_NO) {
- /* Grab the value of the "don't bother me" checkbox */
- widget = GTK_WIDGET (gtk_builder_get_object (method->nag_builder, "ignore_checkbox"));
- g_assert (widget);
-
- method->ignore_ca_cert = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
-
- /* And save it */
- _set_ignore_ca_cert (nm_connection_get_uuid (connection),
- method->phase2,
- method->ignore_ca_cert);
- }
-
- gtk_widget_hide (GTK_WIDGET (nag_dialog));
-}
-
-static gboolean
-nag_dialog_delete_event_cb (GtkDialog *nag_dialog, GdkEvent *e, gpointer user_data)
-{
- // FIXME?: By emitting response signal, dismissing nag dialog with upper right "x" icon,
- // Alt-F4, or Esc would have the same behaviour as clicking "Ignore" button.
- //g_signal_emit_by_name (nag_dialog, "response", GTK_RESPONSE_NO, user_data);
- return TRUE; /* do not destroy */
-}
-
-GtkWidget *
-eap_method_nag_user (EAPMethod *method)
-{
- GtkWidget *widget;
- char *filename = NULL;
-
- g_return_val_if_fail (method != NULL, NULL);
-
- if (!method->nag_dialog || method->ignore_ca_cert)
- return NULL;
-
- /* Checkbox should be unchecked each time dialog comes up */
- widget = GTK_WIDGET (gtk_builder_get_object (method->nag_builder, "ignore_checkbox"));
- g_assert (widget);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), FALSE);
-
- /* Nag the user if the CA Cert is blank, since it's a security risk. */
- widget = GTK_WIDGET (gtk_builder_get_object (method->builder, method->ca_cert_chooser));
- g_assert (widget);
- filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
- if (filename != NULL) {
- g_free (filename);
- return NULL;
- }
-
- gtk_window_present (GTK_WINDOW (method->nag_dialog));
- return method->nag_dialog;
-}
-
-#define NAG_DIALOG_UI "/org/gnome/control-center/network/nag-user-dialog.ui"
-
-static gboolean
-_get_ignore_ca_cert (const char *uuid, gboolean phase2)
-{
- GSettings *settings;
- const char *key;
- gboolean ignore = FALSE;
-
- g_return_val_if_fail (uuid != NULL, FALSE);
-
- settings = _get_ca_ignore_settings (uuid);
-
- key = phase2 ? "ignore-phase2-ca-cert" : "ignore-ca-cert";
- ignore = g_settings_get_boolean (settings, key);
-
- g_object_unref (settings);
- return ignore;
-}
-
-gboolean
-eap_method_nag_init (EAPMethod *method,
- const char *ca_cert_chooser,
- NMConnection *connection)
-{
- GtkWidget *dialog, *widget;
- NagDialogResponseInfo *info;
- GError *error = NULL;
- char *text;
-
- g_return_val_if_fail (method != NULL, FALSE);
- g_return_val_if_fail (ca_cert_chooser != NULL, FALSE);
-
- method->nag_builder = gtk_builder_new ();
- if (!gtk_builder_add_from_resource (method->nag_builder, NAG_DIALOG_UI, &error)) {
- g_warning ("Couldn't load UI builder file " NAG_DIALOG_UI ": %s",
- error->message);
- g_error_free (error);
- return FALSE;
- }
-
- method->ca_cert_chooser = g_strdup (ca_cert_chooser);
- if (connection) {
- NMSettingConnection *s_con;
- const char *uuid;
-
- s_con = nm_connection_get_setting_connection (connection);
- g_assert (s_con);
- uuid = nm_setting_connection_get_uuid (s_con);
- g_assert (uuid);
-
- /* Figure out if the user wants to ignore missing CA cert */
- method->ignore_ca_cert = _get_ignore_ca_cert (uuid, method->phase2);
- }
-
- info = g_malloc0 (sizeof (NagDialogResponseInfo));
- info->method = method;
- info->connection = connection;
-
- dialog = GTK_WIDGET (gtk_builder_get_object (method->nag_builder, "nag_user_dialog"));
- g_assert (dialog);
- g_signal_connect (dialog, "response", G_CALLBACK (nag_dialog_response_cb), info);
- g_signal_connect (dialog, "delete-event", G_CALLBACK (nag_dialog_delete_event_cb), info);
- g_object_weak_ref (G_OBJECT (dialog), nag_dialog_destroyed, info);
-
- widget = GTK_WIDGET (gtk_builder_get_object (method->nag_builder, "content_label"));
- g_assert (widget);
-
- text = g_strdup_printf ("<span weight=\"bold\" size=\"larger\">%s</span>\n\n%s",
- _("No Certificate Authority certificate chosen"),
- _("Not using a Certificate Authority (CA) certificate can result in
connections to insecure, rogue Wi-Fi networks. Would you like to choose a Certificate Authority
certificate?"));
- gtk_label_set_markup (GTK_LABEL (widget), text);
- g_free (text);
-
- widget = GTK_WIDGET (gtk_builder_get_object (method->nag_builder, "ignore_button"));
- gtk_button_set_label (GTK_BUTTON (widget), _("Ignore"));
- g_assert (widget);
-
- widget = GTK_WIDGET (gtk_builder_get_object (method->nag_builder, "change_button"));
- gtk_button_set_label (GTK_BUTTON (widget), _("Choose CA Certificate"));
- g_assert (widget);
-
- method->nag_dialog = dialog;
- return TRUE;
-}
-
void
eap_method_phase2_update_secrets_helper (EAPMethod *method,
NMConnection *connection,
@@ -347,7 +162,6 @@ eap_method_init (gsize obj_size,
method->add_to_size_group = add_to_size_group;
method->fill_connection = fill_connection;
method->update_secrets = update_secrets;
- method->destroy = destroy;
method->default_field = default_field;
method->phase2 = phase2;
@@ -368,6 +182,8 @@ eap_method_init (gsize obj_size,
}
g_object_ref_sink (method->ui_widget);
+ method->destroy = destroy;
+
return method;
}
@@ -393,11 +209,6 @@ eap_method_unref (EAPMethod *method)
if (method->destroy)
method->destroy (method);
- if (method->nag_dialog)
- gtk_widget_destroy (method->nag_dialog);
- if (method->nag_builder)
- g_object_unref (method->nag_builder);
- g_free (method->ca_cert_chooser);
if (method->builder)
g_object_unref (method->builder);
if (method->ui_widget)
@@ -412,61 +223,67 @@ eap_method_validate_filepicker (GtkBuilder *builder,
const char *name,
guint32 item_type,
const char *password,
- NMSetting8021xCKFormat *out_format)
+ NMSetting8021xCKFormat *out_format,
+ GError **error)
{
GtkWidget *widget;
char *filename;
NMSetting8021x *setting;
- gboolean success = FALSE;
- GError *error = NULL;
+ gboolean success = TRUE;
if (item_type == TYPE_PRIVATE_KEY) {
- g_return_val_if_fail (password != NULL, FALSE);
- g_return_val_if_fail (strlen (password), FALSE);
+ if (!password || *password == '\0')
+ success = FALSE;
}
widget = GTK_WIDGET (gtk_builder_get_object (builder, name));
g_assert (widget);
filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
- if (!filename)
- return (item_type == TYPE_CA_CERT) ? TRUE : FALSE;
+ if (!filename) {
+ if (item_type != TYPE_CA_CERT) {
+ widget_set_error (widget);
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("no file selected"));
+ }
+ goto out;
+ }
- if (!g_file_test (filename, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR))
+ if (!g_file_test (filename, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
+ success = FALSE;
+ widget_set_error (widget);
goto out;
+ }
setting = (NMSetting8021x *) nm_setting_802_1x_new ();
+ success = FALSE;
if (item_type == TYPE_PRIVATE_KEY) {
- if (!nm_setting_802_1x_set_private_key (setting, filename, password,
NM_SETTING_802_1X_CK_SCHEME_PATH, out_format, &error)) {
- g_warning ("Error: couldn't verify private key: %d %s",
- error ? error->code : -1, error ? error->message : "(none)");
- g_clear_error (&error);
- } else
+ if (nm_setting_802_1x_set_private_key (setting, filename, password,
NM_SETTING_802_1X_CK_SCHEME_PATH, out_format, error))
success = TRUE;
} else if (item_type == TYPE_CLIENT_CERT) {
- if (!nm_setting_802_1x_set_client_cert (setting, filename, NM_SETTING_802_1X_CK_SCHEME_PATH,
out_format, &error)) {
- g_warning ("Error: couldn't verify client certificate: %d %s",
- error ? error->code : -1, error ? error->message : "(none)");
- g_clear_error (&error);
- } else
+ if (nm_setting_802_1x_set_client_cert (setting, filename, NM_SETTING_802_1X_CK_SCHEME_PATH,
out_format, error))
success = TRUE;
} else if (item_type == TYPE_CA_CERT) {
- if (!nm_setting_802_1x_set_ca_cert (setting, filename, NM_SETTING_802_1X_CK_SCHEME_PATH,
out_format, &error)) {
- g_warning ("Error: couldn't verify CA certificate: %d %s",
- error ? error->code : -1, error ? error->message : "(none)");
- g_clear_error (&error);
- } else
+ if (nm_setting_802_1x_set_ca_cert (setting, filename, NM_SETTING_802_1X_CK_SCHEME_PATH,
out_format, error))
success = TRUE;
} else
g_warning ("%s: invalid item type %d.", __func__, item_type);
+ if (!success)
+ widget_set_error (widget);
+
g_object_unref (setting);
out:
g_free (filename);
+
+ if (!success && error && !*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("unspecified error validating
eap-method file"));
+ else
+ widget_unset_error (widget);
return success;
}
+#ifdef LIBNM_GLIB_BUILD
static const char *
find_tag (const char *tag, const char *buf, gsize len)
{
@@ -594,23 +411,35 @@ out:
close (fd);
return success;
}
+#endif
static gboolean
default_filter_privkey (const GtkFileFilterInfo *filter_info, gpointer user_data)
{
- const char *extensions[] = { ".der", ".pem", ".p12", NULL };
+#ifdef LIBNM_GLIB_BUILD
+ const char *extensions[] = { ".der", ".pem", ".p12", ".key", NULL };
+#endif
gboolean require_encrypted = !!user_data;
- gboolean is_encrypted = TRUE;
+ gboolean is_encrypted;
if (!filter_info->filename)
return FALSE;
+#if defined (LIBNM_GLIB_BUILD)
if (!file_has_extension (filter_info->filename, extensions))
return FALSE;
+ is_encrypted = TRUE;
if ( !file_is_der_or_pem (filter_info->filename, TRUE, &is_encrypted)
&& !nm_utils_file_is_pkcs12 (filter_info->filename))
return FALSE;
+#elif defined (LIBNM_BUILD)
+ is_encrypted = FALSE;
+ if (!nm_utils_file_is_private_key (filter_info->filename, &is_encrypted))
+ return FALSE;
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
return require_encrypted ? is_encrypted : TRUE;
}
@@ -618,16 +447,25 @@ default_filter_privkey (const GtkFileFilterInfo *filter_info, gpointer user_data
static gboolean
default_filter_cert (const GtkFileFilterInfo *filter_info, gpointer user_data)
{
+#ifdef LIBNM_GLIB_BUILD
const char *extensions[] = { ".der", ".pem", ".crt", ".cer", NULL };
+#endif
if (!filter_info->filename)
return FALSE;
+#if defined (LIBNM_GLIB_BUILD)
if (!file_has_extension (filter_info->filename, extensions))
return FALSE;
if (!file_is_der_or_pem (filter_info->filename, FALSE, NULL))
return FALSE;
+#elif defined (LIBNM_BUILD)
+ if (!nm_utils_file_is_certificate (filter_info->filename))
+ return FALSE;
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
return TRUE;
}
@@ -640,7 +478,7 @@ eap_method_default_file_chooser_filter_new (gboolean privkey)
filter = gtk_file_filter_new ();
if (privkey) {
gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME, default_filter_privkey, NULL,
NULL);
- gtk_file_filter_set_name (filter, _("DER, PEM, or PKCS#12 private keys (*.der, *.pem,
*.p12)"));
+ gtk_file_filter_set_name (filter, _("DER, PEM, or PKCS#12 private keys (*.der, *.pem, *.p12,
*.key)"));
} else {
gtk_file_filter_add_custom (filter, GTK_FILE_FILTER_FILENAME, default_filter_cert, NULL,
NULL);
gtk_file_filter_set_name (filter, _("DER or PEM certificates (*.der, *.pem, *.crt, *.cer)"));
@@ -656,3 +494,211 @@ eap_method_is_encrypted_private_key (const char *path)
return default_filter_privkey (&info, (gpointer) TRUE);
}
+/* Some methods (PEAP, TLS, TTLS) require a CA certificate. The user can choose
+ * not to provide such a certificate. This method whether the checkbox
+ * id_ca_cert_not_required_checkbutton is checked or id_ca_cert_chooser has a certificate
+ * selected.
+ */
+gboolean
+eap_method_ca_cert_required (GtkBuilder *builder, const char *id_ca_cert_not_required_checkbutton, const
char *id_ca_cert_chooser)
+{
+ char *filename;
+ GtkWidget *widget;
+
+ g_assert (builder && id_ca_cert_not_required_checkbutton && id_ca_cert_chooser);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, id_ca_cert_not_required_checkbutton));
+ g_assert (widget && GTK_IS_TOGGLE_BUTTON (widget));
+
+ if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) {
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, id_ca_cert_chooser));
+ g_assert (widget && GTK_IS_FILE_CHOOSER (widget));
+
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
+ if (!filename)
+ return TRUE;
+ g_free (filename);
+ }
+ return FALSE;
+}
+
+
+void
+eap_method_ca_cert_not_required_toggled (GtkBuilder *builder, const char
*id_ca_cert_not_required_checkbutton, const char *id_ca_cert_chooser)
+{
+ char *filename, *filename_old;
+ gboolean is_not_required;
+ GtkWidget *widget;
+
+ g_assert (builder && id_ca_cert_not_required_checkbutton && id_ca_cert_chooser);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, id_ca_cert_not_required_checkbutton));
+ g_assert (widget && GTK_IS_TOGGLE_BUTTON (widget));
+ is_not_required = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget));
+
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, id_ca_cert_chooser));
+ g_assert (widget && GTK_IS_FILE_CHOOSER (widget));
+
+ filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
+ filename_old = g_object_steal_data (G_OBJECT (widget), "filename-old");
+ if (is_not_required) {
+ g_free (filename_old);
+ filename_old = filename;
+ filename = NULL;
+ } else {
+ g_free (filename);
+ filename = filename_old;
+ filename_old = NULL;
+ }
+ gtk_widget_set_sensitive (widget, !is_not_required);
+ if (filename)
+ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), filename);
+ else
+ gtk_file_chooser_unselect_all (GTK_FILE_CHOOSER (widget));
+ g_free (filename);
+ g_object_set_data_full (G_OBJECT (widget), "filename-old", filename_old, g_free);
+}
+
+/* Used as both GSettings keys and GObject data tags */
+#define IGNORE_CA_CERT_TAG "ignore-ca-cert"
+#define IGNORE_PHASE2_CA_CERT_TAG "ignore-phase2-ca-cert"
+
+/**
+ * eap_method_ca_cert_ignore_set:
+ * @method: the #EAPMethod object
+ * @connection: the #NMConnection
+ * @filename: the certificate file, if any
+ * @ca_cert_error: %TRUE if an error was encountered loading the given CA
+ * certificate, %FALSE if not or if a CA certificate is not present
+ *
+ * Updates the connection's CA cert ignore value to %TRUE if the "CA certificate
+ * not required" checkbox is checked. If @ca_cert_error is %TRUE, then the
+ * connection's CA cert ignore value will always be set to %FALSE, because it
+ * means that the user selected an invalid certificate (thus he does not want to
+ * ignore the CA cert)..
+ */
+void
+eap_method_ca_cert_ignore_set (EAPMethod *method,
+ NMConnection *connection,
+ const char *filename,
+ gboolean ca_cert_error)
+{
+ NMSetting8021x *s_8021x;
+ gboolean ignore;
+
+ s_8021x = nm_connection_get_setting_802_1x (connection);
+ if (s_8021x) {
+ ignore = !ca_cert_error && filename == NULL;
+ g_object_set_data (G_OBJECT (s_8021x),
+ method->phase2 ? IGNORE_PHASE2_CA_CERT_TAG : IGNORE_CA_CERT_TAG,
+ GUINT_TO_POINTER (ignore));
+ }
+}
+
+/**
+ * eap_method_ca_cert_ignore_get:
+ * @method: the #EAPMethod object
+ * @connection: the #NMConnection
+ *
+ * Returns: %TRUE if a missing CA certificate can be ignored, %FALSE if a CA
+ * certificate should be required for the connection to be valid.
+ */
+gboolean
+eap_method_ca_cert_ignore_get (EAPMethod *method, NMConnection *connection)
+{
+ NMSetting8021x *s_8021x;
+
+ s_8021x = nm_connection_get_setting_802_1x (connection);
+ if (s_8021x) {
+ return !!g_object_get_data (G_OBJECT (s_8021x),
+ method->phase2 ? IGNORE_PHASE2_CA_CERT_TAG : IGNORE_CA_CERT_TAG);
+ }
+ return FALSE;
+}
+
+static GSettings *
+_get_ca_ignore_settings (NMConnection *connection)
+{
+ GSettings *settings;
+ char *path = NULL;
+ const char *uuid;
+
+ g_return_val_if_fail (connection, NULL);
+
+ uuid = nm_connection_get_uuid (connection);
+ g_return_val_if_fail (uuid && *uuid, NULL);
+
+ path = g_strdup_printf ("/org/gnome/nm-applet/eap/%s/", uuid);
+ settings = g_settings_new_with_path ("org.gnome.nm-applet.eap", path);
+ g_free (path);
+
+ return settings;
+}
+
+/**
+ * eap_method_ca_cert_ignore_save:
+ * @connection: the connection for which to save CA cert ignore values to GSettings
+ *
+ * Reads the CA cert ignore tags from the 802.1x setting GObject data and saves
+ * then to GSettings if present, using the connection UUID as the index.
+ */
+void
+eap_method_ca_cert_ignore_save (NMConnection *connection)
+{
+ NMSetting8021x *s_8021x;
+ GSettings *settings;
+ gboolean ignore = FALSE, phase2_ignore = FALSE;
+
+ g_return_if_fail (connection);
+
+ s_8021x = nm_connection_get_setting_802_1x (connection);
+ if (s_8021x) {
+ ignore = !!g_object_get_data (G_OBJECT (s_8021x), IGNORE_CA_CERT_TAG);
+ phase2_ignore = !!g_object_get_data (G_OBJECT (s_8021x), IGNORE_PHASE2_CA_CERT_TAG);
+ }
+
+ settings = _get_ca_ignore_settings (connection);
+ if (!settings)
+ return;
+
+ g_settings_set_boolean (settings, IGNORE_CA_CERT_TAG, ignore);
+ g_settings_set_boolean (settings, IGNORE_PHASE2_CA_CERT_TAG, phase2_ignore);
+ g_object_unref (settings);
+}
+
+/**
+ * eap_method_ca_cert_ignore_load:
+ * @connection: the connection for which to load CA cert ignore values to GSettings
+ *
+ * Reads the CA cert ignore tags from the 802.1x setting GObject data and saves
+ * then to GSettings if present, using the connection UUID as the index.
+ */
+void
+eap_method_ca_cert_ignore_load (NMConnection *connection)
+{
+ GSettings *settings;
+ NMSetting8021x *s_8021x;
+ gboolean ignore, phase2_ignore;
+
+ g_return_if_fail (connection);
+
+ s_8021x = nm_connection_get_setting_802_1x (connection);
+ if (!s_8021x)
+ return;
+
+ settings = _get_ca_ignore_settings (connection);
+ if (!settings)
+ return;
+
+ ignore = g_settings_get_boolean (settings, IGNORE_CA_CERT_TAG);
+ phase2_ignore = g_settings_get_boolean (settings, IGNORE_PHASE2_CA_CERT_TAG);
+
+ g_object_set_data (G_OBJECT (s_8021x),
+ IGNORE_CA_CERT_TAG,
+ GUINT_TO_POINTER (ignore));
+ g_object_set_data (G_OBJECT (s_8021x),
+ IGNORE_PHASE2_CA_CERT_TAG,
+ GUINT_TO_POINTER (phase2_ignore));
+ g_object_unref (settings);
+}
+
diff --git a/panels/network/wireless-security/eap-method.h b/panels/network/wireless-security/eap-method.h
index 61cc1f7..de287e3 100644
--- a/panels/network/wireless-security/eap-method.h
+++ b/panels/network/wireless-security/eap-method.h
@@ -17,7 +17,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2012 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
#ifndef EAP_METHOD_H
@@ -25,15 +25,23 @@
#include <glib.h>
#include <gtk/gtk.h>
+
+#if defined (LIBNM_BUILD)
#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-connection.h>
+#include <nm-setting-8021x.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
typedef struct _EAPMethod EAPMethod;
typedef void (*EMAddToSizeGroupFunc) (EAPMethod *method, GtkSizeGroup *group);
-typedef void (*EMFillConnectionFunc) (EAPMethod *method, NMConnection *connection);
+typedef void (*EMFillConnectionFunc) (EAPMethod *method, NMConnection *connection,
NMSettingSecretFlags flags);
typedef void (*EMUpdateSecretsFunc) (EAPMethod *method, NMConnection *connection);
typedef void (*EMDestroyFunc) (EAPMethod *method);
-typedef gboolean (*EMValidateFunc) (EAPMethod *method);
+typedef gboolean (*EMValidateFunc) (EAPMethod *method, GError **error);
struct _EAPMethod {
guint32 refcount;
@@ -42,14 +50,11 @@ struct _EAPMethod {
GtkBuilder *builder;
GtkWidget *ui_widget;
- GtkBuilder *nag_builder;
- char *ca_cert_chooser;
const char *default_field;
- GtkWidget *nag_dialog;
+ const char *password_flags_name;
gboolean phase2;
gboolean secrets_only;
- gboolean ignore_ca_cert;
EMAddToSizeGroupFunc add_to_size_group;
EMFillConnectionFunc fill_connection;
@@ -63,21 +68,21 @@ struct _EAPMethod {
GtkWidget *eap_method_get_widget (EAPMethod *method);
-gboolean eap_method_validate (EAPMethod *method);
+gboolean eap_method_validate (EAPMethod *method, GError **error);
void eap_method_add_to_size_group (EAPMethod *method, GtkSizeGroup *group);
-void eap_method_fill_connection (EAPMethod *method, NMConnection *connection);
+void eap_method_fill_connection (EAPMethod *method,
+ NMConnection *connection,
+ NMSettingSecretFlags flags);
void eap_method_update_secrets (EAPMethod *method, NMConnection *connection);
-GtkWidget * eap_method_nag_user (EAPMethod *method);
-
EAPMethod *eap_method_ref (EAPMethod *method);
void eap_method_unref (EAPMethod *method);
-GType eap_method_get_g_type (void);
+GType eap_method_get_type (void);
/* Below for internal use only */
@@ -111,16 +116,29 @@ gboolean eap_method_validate_filepicker (GtkBuilder *builder,
const char *name,
guint32 item_type,
const char *password,
- NMSetting8021xCKFormat *out_format);
-
-gboolean eap_method_nag_init (EAPMethod *method,
- const char *ca_cert_chooser,
- NMConnection *connection);
+ NMSetting8021xCKFormat *out_format,
+ GError **error);
void eap_method_phase2_update_secrets_helper (EAPMethod *method,
NMConnection *connection,
const char *combo_name,
guint32 column);
+gboolean eap_method_ca_cert_required (GtkBuilder *builder,
+ const char *id_ca_cert_is_not_required_checkbox,
+ const char *id_ca_cert_chooser);
+void eap_method_ca_cert_not_required_toggled (GtkBuilder *builder,
+ const char *id_ca_cert_is_not_required_checkbox,
+ const char *id_ca_cert_chooser);
+
+void eap_method_ca_cert_ignore_set (EAPMethod *method,
+ NMConnection *connection,
+ const char *filename,
+ gboolean ca_cert_error);
+gboolean eap_method_ca_cert_ignore_get (EAPMethod *method, NMConnection *connection);
+
+void eap_method_ca_cert_ignore_save (NMConnection *connection);
+void eap_method_ca_cert_ignore_load (NMConnection *connection);
+
#endif /* EAP_METHOD_H */
diff --git a/panels/network/wireless-security/helpers.c b/panels/network/wireless-security/helpers.c
index 1d2b9af..aff9db2 100644
--- a/panels/network/wireless-security/helpers.c
+++ b/panels/network/wireless-security/helpers.c
@@ -17,9 +17,11 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2009 Red Hat, Inc.
+ * Copyright 2009 - 2014 Red Hat, Inc.
*/
+#include "nm-default.h"
+
#include "helpers.h"
void
@@ -48,3 +50,4 @@ helper_fill_secret_entry (NMConnection *connection,
}
}
}
+
diff --git a/panels/network/wireless-security/helpers.h b/panels/network/wireless-security/helpers.h
index dbcc332..bdd58b0 100644
--- a/panels/network/wireless-security/helpers.h
+++ b/panels/network/wireless-security/helpers.h
@@ -17,7 +17,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2009 Red Hat, Inc.
+ * Copyright 2009 - 2014 Red Hat, Inc.
*/
#ifndef _HELPERS_H_
@@ -25,7 +25,15 @@
#include <glib.h>
#include <gtk/gtk.h>
+
+#if defined (LIBNM_BUILD)
#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-connection.h>
+#include <nm-setting.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
typedef const char * (*HelperSecretFunc)(NMSetting *);
@@ -35,8 +43,5 @@ void helper_fill_secret_entry (NMConnection *connection,
GType setting_type,
HelperSecretFunc func);
-extern void widget_set_error (GtkWidget *widget);
-extern void widget_unset_error (GtkWidget *widget);
-
#endif /* _HELPERS_H_ */
diff --git a/panels/network/wireless-security/wireless-security.c
b/panels/network/wireless-security/wireless-security.c
index 2b3a2be..bd233b0 100644
--- a/panels/network/wireless-security/wireless-security.c
+++ b/panels/network/wireless-security/wireless-security.c
@@ -17,25 +17,20 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2012 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include "config.h"
+#include "nm-default.h"
#include <string.h>
-#include <glib.h>
-#include <gtk/gtk.h>
-#include <glib/gi18n.h>
-
-#include <NetworkManager.h>
-
#include "wireless-security.h"
#include "wireless-security-resources.h"
#include "eap-method.h"
+#include "utils.h"
GType
-wireless_security_get_g_type (void)
+wireless_security_get_type (void)
{
static GType type_id = 0;
@@ -43,8 +38,8 @@ wireless_security_get_g_type (void)
g_resources_register (wireless_security_get_resource ());
type_id = g_boxed_type_register_static ("CcWirelessSecurity",
- (GBoxedCopyFunc) wireless_security_ref,
- (GBoxedFreeFunc) wireless_security_unref);
+ (GBoxedCopyFunc) wireless_security_ref,
+ (GBoxedFreeFunc) wireless_security_unref);
}
return type_id;
@@ -79,12 +74,18 @@ wireless_security_changed_cb (GtkWidget *ignored, gpointer user_data)
}
gboolean
-wireless_security_validate (WirelessSecurity *sec, GBytes *ssid)
+wireless_security_validate (WirelessSecurity *sec, GError **error)
{
+ gboolean result;
+
g_return_val_if_fail (sec != NULL, FALSE);
+ g_return_val_if_fail (!error || !*error, FALSE);
g_assert (sec->validate);
- return (*(sec->validate)) (sec, ssid);
+ result = (*(sec->validate)) (sec, error);
+ if (!result && error && !*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Unknown error validating 802.1x
security"));
+ return result;
}
void
@@ -139,6 +140,12 @@ wireless_security_unref (WirelessSecurity *sec)
if (sec->destroy)
sec->destroy (sec);
+ g_free (sec->username);
+ if (sec->password) {
+ memset (sec->password, 0, strlen (sec->password));
+ g_free (sec->password);
+ }
+
if (sec->builder)
g_object_unref (sec->builder);
if (sec->ui_widget)
@@ -175,7 +182,6 @@ wireless_security_init (gsize obj_size,
sec->add_to_size_group = add_to_size_group;
sec->fill_connection = fill_connection;
sec->update_secrets = update_secrets;
- sec->destroy = destroy;
sec->default_field = default_field;
sec->builder = gtk_builder_new ();
@@ -196,27 +202,74 @@ wireless_security_init (gsize obj_size,
}
g_object_ref_sink (sec->ui_widget);
+ sec->destroy = destroy;
sec->adhoc_compatible = TRUE;
+ sec->hotspot_compatible = TRUE;
return sec;
}
-GtkWidget *
-wireless_security_nag_user (WirelessSecurity *sec)
+gboolean
+wireless_security_adhoc_compatible (WirelessSecurity *sec)
{
- g_return_val_if_fail (sec != NULL, NULL);
+ g_return_val_if_fail (sec != NULL, FALSE);
- if (sec->nag_user)
- return (*(sec->nag_user)) (sec);
- return NULL;
+ return sec->adhoc_compatible;
}
gboolean
-wireless_security_adhoc_compatible (WirelessSecurity *sec)
+wireless_security_hotspot_compatible (WirelessSecurity *sec)
{
g_return_val_if_fail (sec != NULL, FALSE);
- return sec->adhoc_compatible;
+ return sec->hotspot_compatible;
+}
+
+void
+wireless_security_set_userpass (WirelessSecurity *sec,
+ const char *user,
+ const char *password,
+ gboolean always_ask,
+ gboolean show_password)
+{
+ g_free (sec->username);
+ sec->username = g_strdup (user);
+
+ if (sec->password) {
+ memset (sec->password, 0, strlen (sec->password));
+ g_free (sec->password);
+ }
+ sec->password = g_strdup (password);
+
+ if (always_ask != (gboolean) -1)
+ sec->always_ask = always_ask;
+ sec->show_password = show_password;
+}
+
+void
+wireless_security_set_userpass_802_1x (WirelessSecurity *sec,
+ NMConnection *connection)
+{
+ const char *user = NULL, *password = NULL;
+ gboolean always_ask = FALSE, show_password = FALSE;
+ NMSetting8021x *setting;
+ NMSettingSecretFlags flags;
+
+ if (!connection)
+ goto set;
+
+ setting = nm_connection_get_setting_802_1x (connection);
+ if (!setting)
+ goto set;
+
+ user = nm_setting_802_1x_get_identity (setting);
+ password = nm_setting_802_1x_get_password (setting);
+
+ if (nm_setting_get_secret_flags (NM_SETTING (setting), NM_SETTING_802_1X_PASSWORD, &flags, NULL))
+ always_ask = !!(flags & NM_SETTING_SECRET_FLAG_NOT_SAVED);
+
+set:
+ wireless_security_set_userpass (sec, user, password, always_ask, show_password);
}
void
@@ -261,7 +314,7 @@ ws_802_1x_add_to_size_group (WirelessSecurity *sec,
}
gboolean
-ws_802_1x_validate (WirelessSecurity *sec, const char *combo_name)
+ws_802_1x_validate (WirelessSecurity *sec, const char *combo_name, GError **error)
{
GtkWidget *widget;
GtkTreeModel *model;
@@ -276,7 +329,7 @@ ws_802_1x_validate (WirelessSecurity *sec, const char *combo_name)
gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
gtk_tree_model_get (model, &iter, AUTH_METHOD_COLUMN, &eap, -1);
g_assert (eap);
- valid = eap_method_validate (eap);
+ valid = eap_method_validate (eap, error);
eap_method_unref (eap);
return valid;
}
@@ -343,12 +396,14 @@ ws_802_1x_auth_combo_init (WirelessSecurity *sec,
EAPMethodSimple *em_md5;
EAPMethodTLS *em_tls;
EAPMethodLEAP *em_leap;
+ EAPMethodSimple *em_pwd;
EAPMethodFAST *em_fast;
EAPMethodTTLS *em_ttls;
EAPMethodPEAP *em_peap;
const char *default_method = NULL, *ctype = NULL;
int active = -1, item = 0;
gboolean wired = FALSE;
+ EAPMethodSimpleFlags simple_flags = EAP_METHOD_SIMPLE_FLAG_NONE;
/* Grab the default EAP method out of the security object */
if (connection) {
@@ -367,15 +422,18 @@ ws_802_1x_auth_combo_init (WirelessSecurity *sec,
default_method = nm_setting_802_1x_get_eap_method (s_8021x, 0);
}
- auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_g_type ());
+ /* initialize WirelessSecurity userpass from connection (clear if no connection) */
+ wireless_security_set_userpass_802_1x (sec, connection);
+
+ auth_model = gtk_list_store_new (2, G_TYPE_STRING, eap_method_get_type ());
+
+ if (is_editor)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_IS_EDITOR;
+ if (secrets_only)
+ simple_flags |= EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY;
if (wired) {
- em_md5 = eap_method_simple_new (sec,
- connection,
- EAP_METHOD_SIMPLE_TYPE_MD5,
- FALSE,
- is_editor,
- secrets_only);
+ em_md5 = eap_method_simple_new (sec, connection, EAP_METHOD_SIMPLE_TYPE_MD5, simple_flags);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
AUTH_NAME_COLUMN, _("MD5"),
@@ -411,6 +469,17 @@ ws_802_1x_auth_combo_init (WirelessSecurity *sec,
item++;
}
+ em_pwd = eap_method_simple_new (sec, connection, EAP_METHOD_SIMPLE_TYPE_PWD, simple_flags);
+ gtk_list_store_append (auth_model, &iter);
+ gtk_list_store_set (auth_model, &iter,
+ AUTH_NAME_COLUMN, _("PWD"),
+ AUTH_METHOD_COLUMN, em_pwd,
+ -1);
+ eap_method_unref (EAP_METHOD (em_pwd));
+ if (default_method && (active < 0) && !strcmp (default_method, "pwd"))
+ active = item;
+ item++;
+
em_fast = eap_method_fast_new (sec, connection, is_editor, secrets_only);
gtk_list_store_append (auth_model, &iter);
gtk_list_store_set (auth_model, &iter,
@@ -470,10 +539,25 @@ ws_802_1x_fill_connection (WirelessSecurity *sec,
GtkWidget *widget;
NMSettingWirelessSecurity *s_wireless_sec;
NMSetting8021x *s_8021x;
+ NMSettingSecretFlags secret_flags = NM_SETTING_SECRET_FLAG_NONE;
EAPMethod *eap = NULL;
GtkTreeModel *model;
GtkTreeIter iter;
+ /* Get the EAPMethod object */
+ widget = GTK_WIDGET (gtk_builder_get_object (sec->builder, combo_name));
+ model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
+ gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
+ gtk_tree_model_get (model, &iter, AUTH_METHOD_COLUMN, &eap, -1);
+ g_assert (eap);
+
+ /* Get previous pasword flags, if any. Otherwise default to agent-owned secrets */
+ s_8021x = nm_connection_get_setting_802_1x (connection);
+ if (s_8021x)
+ nm_setting_get_secret_flags (NM_SETTING (s_8021x), eap->password_flags_name, &secret_flags,
NULL);
+ else
+ secret_flags = NM_SETTING_SECRET_FLAG_AGENT_OWNED;
+
/* Blow away the old wireless security setting by adding a clear one */
s_wireless_sec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
nm_connection_add_setting (connection, (NMSetting *) s_wireless_sec);
@@ -482,13 +566,7 @@ ws_802_1x_fill_connection (WirelessSecurity *sec,
s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
nm_connection_add_setting (connection, (NMSetting *) s_8021x);
- widget = GTK_WIDGET (gtk_builder_get_object (sec->builder, combo_name));
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
- gtk_tree_model_get (model, &iter, AUTH_METHOD_COLUMN, &eap, -1);
- g_assert (eap);
-
- eap_method_fill_connection (eap, connection);
+ eap_method_fill_connection (eap, connection, secret_flags);
eap_method_unref (eap);
}
@@ -522,23 +600,3 @@ ws_802_1x_update_secrets (WirelessSecurity *sec,
}
}
-GtkWidget *
-ws_802_1x_nag_user (WirelessSecurity *sec,
- const char *combo_name)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- EAPMethod *eap = NULL;
- GtkWidget *widget;
-
- widget = GTK_WIDGET (gtk_builder_get_object (sec->builder, combo_name));
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (widget));
- gtk_combo_box_get_active_iter (GTK_COMBO_BOX (widget), &iter);
- gtk_tree_model_get (model, &iter, AUTH_METHOD_COLUMN, &eap, -1);
- g_return_val_if_fail (eap != NULL, NULL);
-
- widget = eap_method_nag_user (eap);
- eap_method_unref (eap);
- return widget;
-}
-
diff --git a/panels/network/wireless-security/wireless-security.h
b/panels/network/wireless-security/wireless-security.h
index 0a58553..3d56fa3 100644
--- a/panels/network/wireless-security/wireless-security.h
+++ b/panels/network/wireless-security/wireless-security.h
@@ -17,15 +17,24 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
#ifndef WIRELESS_SECURITY_H
#define WIRELESS_SECURITY_H
+#define LIBNM_GLIB_BUILD
+
#include <glib.h>
#include <gtk/gtk.h>
+
+#if defined (LIBNM_BUILD)
#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-connection.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
typedef struct _WirelessSecurity WirelessSecurity;
@@ -35,7 +44,7 @@ typedef void (*WSAddToSizeGroupFunc) (WirelessSecurity *sec, GtkSizeGroup *group
typedef void (*WSFillConnectionFunc) (WirelessSecurity *sec, NMConnection *connection);
typedef void (*WSUpdateSecretsFunc) (WirelessSecurity *sec, NMConnection *connection);
typedef void (*WSDestroyFunc) (WirelessSecurity *sec);
-typedef gboolean (*WSValidateFunc) (WirelessSecurity *sec, GBytes *ssid);
+typedef gboolean (*WSValidateFunc) (WirelessSecurity *sec, GError **error);
typedef GtkWidget * (*WSNagUserFunc) (WirelessSecurity *sec);
struct _WirelessSecurity {
@@ -47,12 +56,15 @@ struct _WirelessSecurity {
gpointer changed_notify_data;
const char *default_field;
gboolean adhoc_compatible;
+ gboolean hotspot_compatible;
+
+ char *username, *password;
+ gboolean always_ask, show_password;
WSAddToSizeGroupFunc add_to_size_group;
WSFillConnectionFunc fill_connection;
WSUpdateSecretsFunc update_secrets;
WSValidateFunc validate;
- WSNagUserFunc nag_user;
WSDestroyFunc destroy;
};
@@ -65,7 +77,7 @@ void wireless_security_set_changed_notify (WirelessSecurity *sec,
WSChangedFunc func,
gpointer user_data);
-gboolean wireless_security_validate (WirelessSecurity *sec, GBytes *ssid);
+gboolean wireless_security_validate (WirelessSecurity *sec, GError **error);
void wireless_security_add_to_size_group (WirelessSecurity *sec,
GtkSizeGroup *group);
@@ -76,15 +88,23 @@ void wireless_security_fill_connection (WirelessSecurity *sec,
void wireless_security_update_secrets (WirelessSecurity *sec,
NMConnection *connection);
-GtkWidget * wireless_security_nag_user (WirelessSecurity *sec);
-
gboolean wireless_security_adhoc_compatible (WirelessSecurity *sec);
+gboolean wireless_security_hotspot_compatible (WirelessSecurity *sec);
+
+void wireless_security_set_userpass (WirelessSecurity *sec,
+ const char *user,
+ const char *password,
+ gboolean always_ask,
+ gboolean show_password);
+void wireless_security_set_userpass_802_1x (WirelessSecurity *sec,
+ NMConnection *connection);
+
WirelessSecurity *wireless_security_ref (WirelessSecurity *sec);
void wireless_security_unref (WirelessSecurity *sec);
-GType wireless_security_get_g_type (void);
+GType wireless_security_get_type (void);
/* Below for internal use only */
@@ -124,7 +144,7 @@ void ws_802_1x_auth_combo_changed (GtkWidget *combo,
const char *vbox_name,
GtkSizeGroup *size_group);
-gboolean ws_802_1x_validate (WirelessSecurity *sec, const char *combo_name);
+gboolean ws_802_1x_validate (WirelessSecurity *sec, const char *combo_name, GError **error);
void ws_802_1x_add_to_size_group (WirelessSecurity *sec,
GtkSizeGroup *size_group,
@@ -139,8 +159,5 @@ void ws_802_1x_update_secrets (WirelessSecurity *sec,
const char *combo_name,
NMConnection *connection);
-GtkWidget * ws_802_1x_nag_user (WirelessSecurity *sec,
- const char *combo_name);
-
#endif /* WIRELESS_SECURITY_H */
diff --git a/panels/network/wireless-security/ws-dynamic-wep.c
b/panels/network/wireless-security/ws-dynamic-wep.c
index 0ccc28a..0192d24 100644
--- a/panels/network/wireless-security/ws-dynamic-wep.c
+++ b/panels/network/wireless-security/ws-dynamic-wep.c
@@ -17,13 +17,13 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include <glib/gi18n.h>
+#include "nm-default.h"
+
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
#include "wireless-security.h"
#include "eap-method.h"
@@ -44,9 +44,9 @@ destroy (WirelessSecurity *parent)
}
static gboolean
-validate (WirelessSecurity *parent, GBytes *ssid)
+validate (WirelessSecurity *parent, GError **error)
{
- return ws_802_1x_validate (parent, "dynamic_wep_auth_combo");
+ return ws_802_1x_validate (parent, "dynamic_wep_auth_combo", error);
}
static void
@@ -75,11 +75,6 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
g_assert (s_wireless_sec);
g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "ieee8021x", NULL);
-
- nm_setting_wireless_security_add_pairwise (s_wireless_sec, "wep40");
- nm_setting_wireless_security_add_pairwise (s_wireless_sec, "wep104");
- nm_setting_wireless_security_add_group (s_wireless_sec, "wep40");
- nm_setting_wireless_security_add_group (s_wireless_sec, "wep104");
}
static void
@@ -94,12 +89,6 @@ auth_combo_changed_cb (GtkWidget *combo, gpointer user_data)
sec->size_group);
}
-static GtkWidget *
-nag_user (WirelessSecurity *parent)
-{
- return ws_802_1x_nag_user (parent, "dynamic_wep_auth_combo");
-}
-
static void
update_secrets (WirelessSecurity *parent, NMConnection *connection)
{
@@ -126,8 +115,8 @@ ws_dynamic_wep_new (NMConnection *connection,
if (!parent)
return NULL;
- parent->nag_user = nag_user;
parent->adhoc_compatible = FALSE;
+ parent->hotspot_compatible = FALSE;
widget = ws_802_1x_auth_combo_init (parent,
"dynamic_wep_auth_combo",
diff --git a/panels/network/wireless-security/ws-dynamic-wep.h
b/panels/network/wireless-security/ws-dynamic-wep.h
index 03b2d68..e25a983 100644
--- a/panels/network/wireless-security/ws-dynamic-wep.h
+++ b/panels/network/wireless-security/ws-dynamic-wep.h
@@ -17,13 +17,19 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
#ifndef WS_DYNAMIC_WEP_H
#define WS_DYNAMIC_WEP_H
+#if defined (LIBNM_BUILD)
#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-connection.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
typedef struct _WirelessSecurityDynamicWEP WirelessSecurityDynamicWEP;
diff --git a/panels/network/wireless-security/ws-dynamic-wep.ui
b/panels/network/wireless-security/ws-dynamic-wep.ui
index d6bc12b..4bd8520 100644
--- a/panels/network/wireless-security/ws-dynamic-wep.ui
+++ b/panels/network/wireless-security/ws-dynamic-wep.ui
@@ -23,7 +23,7 @@
<property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<placeholder/>
@@ -35,8 +35,8 @@
<object class="GtkLabel" id="dynamic_wep_auth_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Au_thentication</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Au_thentication:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">dynamic_wep_auth_combo</property>
</object>
diff --git a/panels/network/wireless-security/ws-leap.c b/panels/network/wireless-security/ws-leap.c
index 23357da..3a0f60c 100644
--- a/panels/network/wireless-security/ws-leap.c
+++ b/panels/network/wireless-security/ws-leap.c
@@ -17,18 +17,22 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
+#include "nm-default.h"
+
#include <string.h>
-#include <NetworkManager.h>
#include "wireless-security.h"
#include "helpers.h"
+#include "nma-ui-utils.h"
+#include "utils.h"
struct _WirelessSecurityLEAP {
WirelessSecurity parent;
- gboolean new_connection;
+ gboolean editing_connection;
+ const char *password_flags_name;
};
static void
@@ -45,7 +49,7 @@ show_toggled_cb (GtkCheckButton *button, WirelessSecurity *sec)
}
static gboolean
-validate (WirelessSecurity *parent, GBytes *ssid)
+validate (WirelessSecurity *parent, GError **error)
{
GtkWidget *entry;
const char *text;
@@ -56,6 +60,7 @@ validate (WirelessSecurity *parent, GBytes *ssid)
text = gtk_entry_get_text (GTK_ENTRY (entry));
if (!text || !strlen (text)) {
widget_set_error (entry);
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing leap-username"));
ret = FALSE;
} else {
widget_unset_error (entry);
@@ -64,8 +69,10 @@ validate (WirelessSecurity *parent, GBytes *ssid)
entry = GTK_WIDGET (gtk_builder_get_object (parent->builder, "leap_password_entry"));
g_assert (entry);
text = gtk_entry_get_text (GTK_ENTRY (entry));
- if (!text || *text == '\0') {
+ if (!text || !strlen (text)) {
widget_set_error (entry);
+ if (!*error)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing leap-password"));
ret = FALSE;
} else {
widget_unset_error (entry);
@@ -91,7 +98,8 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
{
WirelessSecurityLEAP *sec = (WirelessSecurityLEAP *) parent;
NMSettingWirelessSecurity *s_wireless_sec;
- GtkWidget *widget;
+ NMSettingSecretFlags secret_flags;
+ GtkWidget *widget, *passwd_entry;
const char *leap_password = NULL, *leap_username = NULL;
/* Blow away the old security setting by adding a clear one */
@@ -102,6 +110,7 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
leap_username = gtk_entry_get_text (GTK_ENTRY (widget));
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "leap_password_entry"));
+ passwd_entry = widget;
leap_password = gtk_entry_get_text (GTK_ENTRY (widget));
g_object_set (s_wireless_sec,
@@ -111,12 +120,15 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD, leap_password,
NULL);
- /* Default to agent-owned secrets for new connections */
- if (sec->new_connection) {
- g_object_set (s_wireless_sec,
- NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD_FLAGS,
NM_SETTING_SECRET_FLAG_AGENT_OWNED,
- NULL);
- }
+ /* Save LEAP_PASSWORD_FLAGS to the connection */
+ secret_flags = nma_utils_menu_to_secret_flags (passwd_entry);
+ nm_setting_set_secret_flags (NM_SETTING (s_wireless_sec), sec->password_flags_name,
+ secret_flags, NULL);
+
+ /* Update secret flags and popup when editing the connection */
+ if (sec->editing_connection)
+ nma_utils_update_password_storage (passwd_entry, secret_flags,
+ NM_SETTING (s_wireless_sec), sec->password_flags_name);
}
static void
@@ -162,14 +174,21 @@ ws_leap_new (NMConnection *connection, gboolean secrets_only)
}
parent->adhoc_compatible = FALSE;
+ parent->hotspot_compatible = FALSE;
sec = (WirelessSecurityLEAP *) parent;
- sec->new_connection = secrets_only ? FALSE : TRUE;
+ sec->editing_connection = secrets_only ? FALSE : TRUE;
+ sec->password_flags_name = NM_SETTING_WIRELESS_SECURITY_LEAP_PASSWORD;
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "leap_password_entry"));
g_assert (widget);
g_signal_connect (G_OBJECT (widget), "changed",
(GCallback) wireless_security_changed_cb,
sec);
+
+ /* Create password-storage popup menu for password entry under entry's secondary icon */
+ nma_utils_setup_password_storage (widget, 0, (NMSetting *) wsec, sec->password_flags_name,
+ FALSE, secrets_only);
+
if (wsec)
update_secrets (WIRELESS_SECURITY (sec), connection);
diff --git a/panels/network/wireless-security/ws-leap.h b/panels/network/wireless-security/ws-leap.h
index d6319fe..6b1fe56 100644
--- a/panels/network/wireless-security/ws-leap.h
+++ b/panels/network/wireless-security/ws-leap.h
@@ -17,13 +17,19 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
#ifndef WS_LEAP_H
#define WS_LEAP_H
+#if defined (LIBNM_BUILD)
#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-connection.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
typedef struct _WirelessSecurityLEAP WirelessSecurityLEAP;
diff --git a/panels/network/wireless-security/ws-leap.ui b/panels/network/wireless-security/ws-leap.ui
index 76bca3a..dc936ad 100644
--- a/panels/network/wireless-security/ws-leap.ui
+++ b/panels/network/wireless-security/ws-leap.ui
@@ -10,9 +10,10 @@
<object class="GtkTable" id="table5">
<property name="visible">True</property>
<property name="can_focus">False</property>
+ <property name="valign">start</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<placeholder/>
@@ -21,8 +22,8 @@
<object class="GtkLabel" id="leap_username_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Username</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Username:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">leap_username_entry</property>
</object>
@@ -35,8 +36,8 @@
<object class="GtkLabel" id="leap_password_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Password</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Password:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">leap_password_entry</property>
</object>
@@ -69,7 +70,6 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
- <property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
diff --git a/panels/network/wireless-security/ws-wep-key.c b/panels/network/wireless-security/ws-wep-key.c
index a49ae74..cd7dbac 100644
--- a/panels/network/wireless-security/ws-wep-key.c
+++ b/panels/network/wireless-security/ws-wep-key.c
@@ -17,20 +17,24 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include <ctype.h>
-#include <string.h>
+#include "nm-default.h"
-#include <NetworkManager.h>
+#include <string.h>
#include "wireless-security.h"
+#include "utils.h"
#include "helpers.h"
+#include "nma-ui-utils.h"
struct _WirelessSecurityWEPKey {
WirelessSecurity parent;
+ gboolean editing_connection;
+ const char *password_flags_name;
+
NMWepKeyType type;
char keys[4][65];
guint8 cur_index;
@@ -61,7 +65,7 @@ key_index_combo_changed_cb (GtkWidget *combo, WirelessSecurity *parent)
entry = GTK_WIDGET (gtk_builder_get_object (parent->builder, "wep_key_entry"));
key = gtk_entry_get_text (GTK_ENTRY (entry));
if (key)
- strcpy (sec->keys[sec->cur_index], key);
+ g_strlcpy (sec->keys[sec->cur_index], key, sizeof (sec->keys[sec->cur_index]));
else
memset (sec->keys[sec->cur_index], 0, sizeof (sec->keys[sec->cur_index]));
@@ -87,7 +91,7 @@ destroy (WirelessSecurity *parent)
}
static gboolean
-validate (WirelessSecurity *parent, GBytes *ssid)
+validate (WirelessSecurity *parent, GError **error)
{
WirelessSecurityWEPKey *sec = (WirelessSecurityWEPKey *) parent;
GtkWidget *entry;
@@ -100,31 +104,39 @@ validate (WirelessSecurity *parent, GBytes *ssid)
key = gtk_entry_get_text (GTK_ENTRY (entry));
if (!key) {
widget_set_error (entry);
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing wep-key"));
return FALSE;
}
if (sec->type == NM_WEP_KEY_TYPE_KEY) {
if ((strlen (key) == 10) || (strlen (key) == 26)) {
for (i = 0; i < strlen (key); i++) {
- if (!isxdigit (key[i])) {
+ if (!g_ascii_isxdigit (key[i])) {
widget_set_error (entry);
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid wep-key:
key with a length of %zu must contain only hex-digits"), strlen (key));
return FALSE;
}
}
} else if ((strlen (key) == 5) || (strlen (key) == 13)) {
for (i = 0; i < strlen (key); i++) {
- if (!isascii (key[i])) {
+ if (!utils_char_is_ascii_print (key[i])) {
widget_set_error (entry);
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid wep-key:
key with a length of %zu must contain only ascii characters"), strlen (key));
return FALSE;
}
}
} else {
widget_set_error (entry);
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid wep-key: wrong key
length %zu. A key must be either of length 5/13 (ascii) or 10/26 (hex)"), strlen (key));
return FALSE;
}
} else if (sec->type == NM_WEP_KEY_TYPE_PASSPHRASE) {
- if (!strlen (key) || (strlen (key) > 64)) {
+ if (!*key || (strlen (key) > 64)) {
widget_set_error (entry);
+ if (!*key)
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid wep-key:
passphrase must be non-empty"));
+ else
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid wep-key:
passphrase must be shorter than 64 characters"));
return FALSE;
}
}
@@ -153,7 +165,8 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
{
WirelessSecurityWEPKey *sec = (WirelessSecurityWEPKey *) parent;
NMSettingWirelessSecurity *s_wsec;
- GtkWidget *widget;
+ NMSettingSecretFlags secret_flags;
+ GtkWidget *widget, *passwd_entry;
gint auth_alg;
const char *key;
int i;
@@ -162,8 +175,9 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
auth_alg = gtk_combo_box_get_active (GTK_COMBO_BOX (widget));
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "wep_key_entry"));
+ passwd_entry = widget;
key = gtk_entry_get_text (GTK_ENTRY (widget));
- strcpy (sec->keys[sec->cur_index], key);
+ g_strlcpy (sec->keys[sec->cur_index], key, sizeof (sec->keys[sec->cur_index]));
/* Blow away the old security setting by adding a clear one */
s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
@@ -180,44 +194,32 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
if (strlen (sec->keys[i]))
nm_setting_wireless_security_set_wep_key (s_wsec, i, sec->keys[i]);
}
+
+ /* Save WEP_KEY_FLAGS to the connection */
+ secret_flags = nma_utils_menu_to_secret_flags (passwd_entry);
+ g_object_set (s_wsec, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_FLAGS, secret_flags, NULL);
+
+ /* Update secret flags and popup when editing the connection */
+ if (sec->editing_connection)
+ nma_utils_update_password_storage (passwd_entry, secret_flags,
+ NM_SETTING (s_wsec), sec->password_flags_name);
}
static void
-wep_entry_filter_cb (GtkEntry * entry,
- const gchar *text,
- gint length,
- gint * position,
- gpointer data)
+wep_entry_filter_cb (GtkEditable *editable,
+ gchar *text,
+ gint length,
+ gint *position,
+ gpointer data)
{
WirelessSecurityWEPKey *sec = (WirelessSecurityWEPKey *) data;
- GtkEditable *editable = GTK_EDITABLE (entry);
- int i, count = 0;
- gchar *result;
-
- result = g_malloc0 (length + 1);
if (sec->type == NM_WEP_KEY_TYPE_KEY) {
- for (i = 0; i < length; i++) {
- if (isxdigit(text[i]) || isascii(text[i]))
- result[count++] = text[i];
- }
- } else if (sec->type == NM_WEP_KEY_TYPE_PASSPHRASE) {
- for (i = 0; i < length; i++)
- result[count++] = text[i];
- }
-
- if (count > 0) {
- g_signal_handlers_block_by_func (G_OBJECT (editable),
- G_CALLBACK (wep_entry_filter_cb),
- data);
- gtk_editable_insert_text (editable, result, count, position);
- g_signal_handlers_unblock_by_func (G_OBJECT (editable),
- G_CALLBACK (wep_entry_filter_cb),
- data);
+ utils_filter_editable_on_insert_text (editable,
+ text, length, position, data,
+ utils_char_is_ascii_print,
+ wep_entry_filter_cb);
}
-
- g_signal_stop_emission_by_name (G_OBJECT (editable), "insert-text");
- g_free (result);
}
static void
@@ -233,7 +235,7 @@ update_secrets (WirelessSecurity *parent, NMConnection *connection)
for (i = 0; s_wsec && i < 4; i++) {
tmp = nm_setting_wireless_security_get_wep_key (s_wsec, i);
if (tmp)
- strcpy (sec->keys[i], tmp);
+ g_strlcpy (sec->keys[i], tmp, sizeof (sec->keys[i]));
}
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "wep_key_entry"));
@@ -251,6 +253,7 @@ ws_wep_key_new (NMConnection *connection,
WirelessSecurityWEPKey *sec;
GtkWidget *widget;
NMSettingWirelessSecurity *s_wsec = NULL;
+ NMSetting *setting = NULL;
guint8 default_key_idx = 0;
gboolean is_adhoc = adhoc_create;
gboolean is_shared_key = FALSE;
@@ -266,14 +269,22 @@ ws_wep_key_new (NMConnection *connection,
"wep_key_entry");
if (!parent)
return NULL;
-
+
sec = (WirelessSecurityWEPKey *) parent;
+ sec->editing_connection = secrets_only ? FALSE : TRUE;
+ sec->password_flags_name = NM_SETTING_WIRELESS_SECURITY_WEP_KEY0;
sec->type = type;
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "wep_key_entry"));
g_assert (widget);
gtk_entry_set_width_chars (GTK_ENTRY (widget), 28);
+ /* Create password-storage popup menu for password entry under entry's secondary icon */
+ if (connection)
+ setting = (NMSetting *) nm_connection_get_setting_wireless_security (connection);
+ nma_utils_setup_password_storage (widget, 0, setting, sec->password_flags_name,
+ FALSE, secrets_only);
+
if (connection) {
NMSettingWireless *s_wireless;
const char *mode, *auth_alg;
diff --git a/panels/network/wireless-security/ws-wep-key.h b/panels/network/wireless-security/ws-wep-key.h
index 097f7a1..7ba5407 100644
--- a/panels/network/wireless-security/ws-wep-key.h
+++ b/panels/network/wireless-security/ws-wep-key.h
@@ -17,13 +17,19 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
#ifndef WS_WEP_KEY_H
#define WS_WEP_KEY_H
+#if defined (LIBNM_BUILD)
#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-setting-wireless-security.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
typedef struct _WirelessSecurityWEPKey WirelessSecurityWEPKey;
diff --git a/panels/network/wireless-security/ws-wep-key.ui b/panels/network/wireless-security/ws-wep-key.ui
index b50aa62..62b11a5 100644
--- a/panels/network/wireless-security/ws-wep-key.ui
+++ b/panels/network/wireless-security/ws-wep-key.ui
@@ -46,14 +46,14 @@
<property name="can_focus">False</property>
<property name="n_rows">4</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="wep_key_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Key</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Key:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">wep_key_entry</property>
</object>
@@ -66,6 +66,7 @@
<object class="GtkEntry" id="wep_key_entry">
<property name="visible">True</property>
<property name="can_focus">True</property>
+ <property name="max_length">64</property>
<property name="visibility">False</property>
<property name="activates_default">True</property>
</object>
@@ -95,7 +96,6 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
- <property name="xalign">0</property>
<property name="draw_indicator">True</property>
</object>
<packing>
@@ -111,8 +111,8 @@
<object class="GtkLabel" id="auth_method_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Au_thentication</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Au_thentication:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">auth_method_combo</property>
</object>
@@ -148,8 +148,8 @@
<object class="GtkLabel" id="key_index_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">WEP inde_x</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">WEP inde_x:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">key_index_combo</property>
</object>
diff --git a/panels/network/wireless-security/ws-wpa-eap.c b/panels/network/wireless-security/ws-wpa-eap.c
index 0450c4b..7db42df 100644
--- a/panels/network/wireless-security/ws-wpa-eap.c
+++ b/panels/network/wireless-security/ws-wpa-eap.c
@@ -17,13 +17,13 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
-#include <glib/gi18n.h>
+#include "nm-default.h"
+
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
#include "wireless-security.h"
#include "eap-method.h"
@@ -45,9 +45,9 @@ destroy (WirelessSecurity *parent)
}
static gboolean
-validate (WirelessSecurity *parent, GBytes *ssid)
+validate (WirelessSecurity *parent, GError **error)
{
- return ws_802_1x_validate (parent, "wpa_eap_auth_combo");
+ return ws_802_1x_validate (parent, "wpa_eap_auth_combo", error);
}
static void
@@ -90,12 +90,6 @@ auth_combo_changed_cb (GtkWidget *combo, gpointer user_data)
sec->size_group);
}
-static GtkWidget *
-nag_user (WirelessSecurity *parent)
-{
- return ws_802_1x_nag_user (parent, "wpa_eap_auth_combo");
-}
-
static void
update_secrets (WirelessSecurity *parent, NMConnection *connection)
{
@@ -122,8 +116,8 @@ ws_wpa_eap_new (NMConnection *connection,
if (!parent)
return NULL;
- parent->nag_user = nag_user;
parent->adhoc_compatible = FALSE;
+ parent->hotspot_compatible = FALSE;
widget = ws_802_1x_auth_combo_init (parent,
"wpa_eap_auth_combo",
diff --git a/panels/network/wireless-security/ws-wpa-eap.h b/panels/network/wireless-security/ws-wpa-eap.h
index 095772c..b8f9ba8 100644
--- a/panels/network/wireless-security/ws-wpa-eap.h
+++ b/panels/network/wireless-security/ws-wpa-eap.h
@@ -17,13 +17,19 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
#ifndef WS_WPA_EAP_H
#define WS_WPA_EAP_H
+#if defined (LIBNM_BUILD)
#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-connection.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
typedef struct _WirelessSecurityWPAEAP WirelessSecurityWPAEAP;
diff --git a/panels/network/wireless-security/ws-wpa-eap.ui b/panels/network/wireless-security/ws-wpa-eap.ui
index 5d71936..2da2148 100644
--- a/panels/network/wireless-security/ws-wpa-eap.ui
+++ b/panels/network/wireless-security/ws-wpa-eap.ui
@@ -23,14 +23,14 @@
<property name="can_focus">False</property>
<property name="n_rows">2</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="wpa_eap_auth_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">Au_thentication</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">Au_thentication:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">wpa_eap_auth_combo</property>
</object>
diff --git a/panels/network/wireless-security/ws-wpa-psk.c b/panels/network/wireless-security/ws-wpa-psk.c
index cbf5461..4be28f2 100644
--- a/panels/network/wireless-security/ws-wpa-psk.c
+++ b/panels/network/wireless-security/ws-wpa-psk.c
@@ -17,20 +17,26 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
+#include "nm-default.h"
+
#include <ctype.h>
#include <string.h>
-#include <NetworkManager.h>
#include "wireless-security.h"
#include "helpers.h"
+#include "nma-ui-utils.h"
+#include "utils.h"
#define WPA_PMK_LEN 32
struct _WirelessSecurityWPAPSK {
WirelessSecurity parent;
+
+ gboolean editing_connection;
+ const char *password_flags_name;
};
static void
@@ -47,29 +53,30 @@ show_toggled_cb (GtkCheckButton *button, WirelessSecurity *sec)
}
static gboolean
-validate (WirelessSecurity *parent, GBytes *ssid)
+validate (WirelessSecurity *parent, GError **error)
{
GtkWidget *entry;
const char *key;
- guint32 len;
+ gsize len;
int i;
entry = GTK_WIDGET (gtk_builder_get_object (parent->builder, "wpa_psk_entry"));
g_assert (entry);
key = gtk_entry_get_text (GTK_ENTRY (entry));
- len = strlen (key);
+ len = key ? strlen (key) : 0;
if ((len < 8) || (len > 64)) {
widget_set_error (entry);
+ g_set_error (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid wpa-psk: invalid key-length %zu.
Must be [8,63] bytes or 64 hex digits"), len);
return FALSE;
}
- widget_unset_error (entry);
if (len == 64) {
/* Hex PSK */
for (i = 0; i < len; i++) {
if (!isxdigit (key[i])) {
widget_set_error (entry);
+ g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("invalid wpa-psk:
cannot interpret key with 64 bytes as hex"));
return FALSE;
}
}
@@ -96,10 +103,12 @@ add_to_size_group (WirelessSecurity *parent, GtkSizeGroup *group)
static void
fill_connection (WirelessSecurity *parent, NMConnection *connection)
{
- GtkWidget *widget;
+ WirelessSecurityWPAPSK *wpa_psk = (WirelessSecurityWPAPSK *) parent;
+ GtkWidget *widget, *passwd_entry;
const char *key;
NMSettingWireless *s_wireless;
NMSettingWirelessSecurity *s_wireless_sec;
+ NMSettingSecretFlags secret_flags;
const char *mode;
gboolean is_adhoc = FALSE;
@@ -115,9 +124,20 @@ fill_connection (WirelessSecurity *parent, NMConnection *connection)
nm_connection_add_setting (connection, (NMSetting *) s_wireless_sec);
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "wpa_psk_entry"));
+ passwd_entry = widget;
key = gtk_entry_get_text (GTK_ENTRY (widget));
g_object_set (s_wireless_sec, NM_SETTING_WIRELESS_SECURITY_PSK, key, NULL);
+ /* Save PSK_FLAGS to the connection */
+ secret_flags = nma_utils_menu_to_secret_flags (passwd_entry);
+ nm_setting_set_secret_flags (NM_SETTING (s_wireless_sec), NM_SETTING_WIRELESS_SECURITY_PSK,
+ secret_flags, NULL);
+
+ /* Update secret flags and popup when editing the connection */
+ if (wpa_psk->editing_connection)
+ nma_utils_update_password_storage (passwd_entry, secret_flags,
+ NM_SETTING (s_wireless_sec), wpa_psk->password_flags_name);
+
wireless_security_clear_ciphers (connection);
if (is_adhoc) {
/* Ad-Hoc settings as specified by the supplicant */
@@ -153,6 +173,7 @@ ws_wpa_psk_new (NMConnection *connection, gboolean secrets_only)
{
WirelessSecurity *parent;
WirelessSecurityWPAPSK *sec;
+ NMSetting *setting = NULL;
GtkWidget *widget;
parent = wireless_security_init (sizeof (WirelessSecurityWPAPSK),
@@ -169,6 +190,8 @@ ws_wpa_psk_new (NMConnection *connection, gboolean secrets_only)
parent->adhoc_compatible = FALSE;
sec = (WirelessSecurityWPAPSK *) parent;
+ sec->editing_connection = secrets_only ? FALSE : TRUE;
+ sec->password_flags_name = NM_SETTING_WIRELESS_SECURITY_PSK;
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "wpa_psk_entry"));
g_assert (widget);
@@ -177,6 +200,12 @@ ws_wpa_psk_new (NMConnection *connection, gboolean secrets_only)
sec);
gtk_entry_set_width_chars (GTK_ENTRY (widget), 28);
+ /* Create password-storage popup menu for password entry under entry's secondary icon */
+ if (connection)
+ setting = (NMSetting *) nm_connection_get_setting_wireless_security (connection);
+ nma_utils_setup_password_storage (widget, 0, setting, sec->password_flags_name,
+ FALSE, secrets_only);
+
/* Fill secrets, if any */
if (connection)
update_secrets (WIRELESS_SECURITY (sec), connection);
diff --git a/panels/network/wireless-security/ws-wpa-psk.h b/panels/network/wireless-security/ws-wpa-psk.h
index a89552f..6bd1768 100644
--- a/panels/network/wireless-security/ws-wpa-psk.h
+++ b/panels/network/wireless-security/ws-wpa-psk.h
@@ -17,12 +17,20 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
- * (C) Copyright 2007 - 2010 Red Hat, Inc.
+ * Copyright 2007 - 2014 Red Hat, Inc.
*/
#ifndef WS_WPA_PSK_H
#define WS_WPA_PSK_H
+#if defined (LIBNM_BUILD)
+#include <NetworkManager.h>
+#elif defined (LIBNM_GLIB_BUILD)
+#include <nm-connection.h>
+#else
+#error neither LIBNM_BUILD nor LIBNM_GLIB_BUILD defined
+#endif
+
typedef struct _WirelessSecurityWPAPSK WirelessSecurityWPAPSK;
WirelessSecurityWPAPSK * ws_wpa_psk_new (NMConnection *connection, gboolean secrets_only);
diff --git a/panels/network/wireless-security/ws-wpa-psk.ui b/panels/network/wireless-security/ws-wpa-psk.ui
index d10e43d..4ec6909 100644
--- a/panels/network/wireless-security/ws-wpa-psk.ui
+++ b/panels/network/wireless-security/ws-wpa-psk.ui
@@ -12,14 +12,14 @@
<property name="can_focus">False</property>
<property name="n_rows">3</property>
<property name="n_columns">2</property>
- <property name="column_spacing">6</property>
+ <property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkLabel" id="wpa_psk_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Password</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Password:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">wpa_psk_entry</property>
</object>
@@ -46,8 +46,8 @@
<object class="GtkLabel" id="wpa_psk_type_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
- <property name="xalign">1</property>
- <property name="label" translatable="yes">_Type</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">_Type:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">wpa_psk_type_combo</property>
</object>
@@ -78,6 +78,7 @@
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="use_underline">True</property>
+ <property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">1</property>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]