|
Packit Service |
639700 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit |
fabffb |
/* NetworkManager Applet -- allow user control over networking
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Dan Williams <dcbw@redhat.com>
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Copyright 2007 - 2014 Red Hat, Inc.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "nm-default.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include <ctype.h>
|
|
Packit |
fabffb |
#include <string.h>
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "eap-method.h"
|
|
Packit |
fabffb |
#include "wireless-security.h"
|
|
Packit |
fabffb |
#include "helpers.h"
|
|
Packit |
fabffb |
#include "nma-ui-utils.h"
|
|
Packit |
fabffb |
#include "utils.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
struct _EAPMethodSimple {
|
|
Packit |
fabffb |
EAPMethod parent;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
WirelessSecurity *ws_parent;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
const char *password_flags_name;
|
|
Packit |
fabffb |
EAPMethodSimpleType type;
|
|
Packit |
fabffb |
EAPMethodSimpleFlags flags;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gboolean username_requested;
|
|
Packit |
fabffb |
gboolean password_requested;
|
|
Packit |
fabffb |
gboolean pkey_passphrase_requested;
|
|
Packit |
fabffb |
GtkEntry *username_entry;
|
|
Packit |
fabffb |
GtkEntry *password_entry;
|
|
Packit |
fabffb |
GtkToggleButton *show_password;
|
|
Packit |
fabffb |
GtkEntry *pkey_passphrase_entry;
|
|
Packit |
fabffb |
GtkToggleButton *show_pkey_passphrase;
|
|
Packit |
fabffb |
guint idle_func_id;
|
|
Packit |
fabffb |
};
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
show_password_toggled_cb (GtkToggleButton *button, EAPMethodSimple *method)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
gboolean visible;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
visible = gtk_toggle_button_get_active (button);
|
|
Packit |
fabffb |
gtk_entry_set_visibility (method->password_entry, visible);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
show_pkey_passphrase_toggled_cb (GtkToggleButton *button, EAPMethodSimple *method)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
gboolean visible;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
visible = gtk_toggle_button_get_active (button);
|
|
Packit |
fabffb |
gtk_entry_set_visibility (method->pkey_passphrase_entry, visible);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static gboolean
|
|
Packit |
fabffb |
always_ask_selected (GtkEntry *passwd_entry)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
return !!( nma_utils_menu_to_secret_flags (GTK_WIDGET (passwd_entry))
|
|
Packit |
fabffb |
& NM_SETTING_SECRET_FLAG_NOT_SAVED);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static gboolean
|
|
Packit |
fabffb |
validate (EAPMethod *parent, GError **error)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
EAPMethodSimple *method = (EAPMethodSimple *)parent;
|
|
Packit |
fabffb |
const char *text;
|
|
Packit |
fabffb |
gboolean ret = TRUE;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->username_requested) {
|
|
Packit |
fabffb |
text = gtk_entry_get_text (method->username_entry);
|
|
Packit |
fabffb |
if (!text || !strlen (text)) {
|
|
Packit |
fabffb |
widget_set_error (GTK_WIDGET (method->username_entry));
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP username"));
|
|
Packit |
fabffb |
ret = FALSE;
|
|
Packit |
fabffb |
} else
|
|
Packit |
fabffb |
widget_unset_error (GTK_WIDGET (method->username_entry));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Check if the password should always be requested */
|
|
Packit |
fabffb |
if (method->password_requested) {
|
|
Packit |
fabffb |
if (always_ask_selected (method->password_entry))
|
|
Packit |
fabffb |
widget_unset_error (GTK_WIDGET (method->password_entry));
|
|
Packit |
fabffb |
else {
|
|
Packit |
fabffb |
text = gtk_entry_get_text (method->password_entry);
|
|
Packit |
fabffb |
if (!text || !strlen (text)) {
|
|
Packit |
fabffb |
widget_set_error (GTK_WIDGET (method->password_entry));
|
|
Packit |
fabffb |
if (ret) {
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit |
fabffb |
_("missing EAP password"));
|
|
Packit |
fabffb |
ret = FALSE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
} else
|
|
Packit |
fabffb |
widget_unset_error (GTK_WIDGET (method->password_entry));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->pkey_passphrase_requested) {
|
|
Packit |
fabffb |
text = gtk_entry_get_text (method->pkey_passphrase_entry);
|
|
Packit |
fabffb |
if (!text || !strlen (text)) {
|
|
Packit |
fabffb |
widget_set_error (GTK_WIDGET (method->pkey_passphrase_entry));
|
|
Packit |
fabffb |
if (ret) {
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC,
|
|
Packit |
fabffb |
_("missing EAP client Private Key passphrase"));
|
|
Packit |
fabffb |
ret = FALSE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
} else
|
|
Packit |
fabffb |
widget_unset_error (GTK_WIDGET (method->pkey_passphrase_entry));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
return ret;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
EAPMethodSimple *method = (EAPMethodSimple *) parent;
|
|
Packit |
fabffb |
GtkWidget *widget;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->username_requested) {
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_username_label"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
gtk_size_group_add_widget (group, widget);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->password_requested) {
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_label"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
gtk_size_group_add_widget (group, widget);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->pkey_passphrase_requested) {
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_pkey_passphrase_label"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
gtk_size_group_add_widget (group, widget);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
typedef struct {
|
|
Packit |
fabffb |
const char *name;
|
|
Packit |
fabffb |
gboolean autheap_allowed;
|
|
Packit |
fabffb |
} EapType;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Indexed by EAP_METHOD_SIMPLE_TYPE_* */
|
|
Packit |
fabffb |
static const EapType eap_table[EAP_METHOD_SIMPLE_TYPE_LAST] = {
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_PAP] = { "pap", FALSE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_MSCHAP] = { "mschap", FALSE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_MSCHAP_V2] = { "mschapv2", TRUE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_PLAIN_MSCHAP_V2] = { "mschapv2", FALSE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_MD5] = { "md5", TRUE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_PWD] = { "pwd", TRUE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_CHAP] = { "chap", FALSE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_GTC] = { "gtc", TRUE },
|
|
Packit |
fabffb |
[EAP_METHOD_SIMPLE_TYPE_UNKNOWN] = { "unknown", TRUE },
|
|
Packit |
fabffb |
};
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
fill_connection (EAPMethod *parent, NMConnection *connection)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
EAPMethodSimple *method = (EAPMethodSimple *) parent;
|
|
Packit |
fabffb |
NMSetting8021x *s_8021x;
|
|
Packit |
fabffb |
gboolean not_saved = FALSE;
|
|
Packit |
fabffb |
NMSettingSecretFlags flags;
|
|
Packit |
fabffb |
const EapType *eap_type;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
s_8021x = nm_connection_get_setting_802_1x (connection);
|
|
Packit |
fabffb |
g_assert (s_8021x);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (!(method->flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY)) {
|
|
Packit |
fabffb |
/* If this is the main EAP method, clear any existing methods because the
|
|
Packit |
fabffb |
* user-selected one will replace it.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
if (parent->phase2 == FALSE)
|
|
Packit |
fabffb |
nm_setting_802_1x_clear_eap_methods (s_8021x);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
eap_type = &eap_table[method->type];
|
|
Packit |
fabffb |
if (parent->phase2) {
|
|
Packit |
fabffb |
/* If the outer EAP method (TLS, TTLS, PEAP, etc) allows inner/phase2
|
|
Packit |
fabffb |
* EAP methods (which only TTLS allows) *and* the inner/phase2 method
|
|
Packit |
fabffb |
* supports being an inner EAP method, then set PHASE2_AUTHEAP.
|
|
Packit |
fabffb |
* Otherwise the inner/phase2 method goes into PHASE2_AUTH.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
if ((method->flags & EAP_METHOD_SIMPLE_FLAG_AUTHEAP_ALLOWED) && eap_type->autheap_allowed) {
|
|
Packit |
fabffb |
g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTHEAP, eap_type->name, NULL);
|
|
Packit |
fabffb |
g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, NULL, NULL);
|
|
Packit |
fabffb |
} else {
|
|
Packit |
fabffb |
g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, eap_type->name, NULL);
|
|
Packit |
fabffb |
g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTHEAP, NULL, NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
} else
|
|
Packit |
fabffb |
nm_setting_802_1x_add_eap_method (s_8021x, eap_type->name);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->username_requested)
|
|
Packit |
fabffb |
g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (method->username_entry), NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->password_requested) {
|
|
Packit |
fabffb |
/* Save the password always ask setting */
|
|
Packit |
fabffb |
not_saved = always_ask_selected (method->password_entry);
|
|
Packit |
fabffb |
flags = nma_utils_menu_to_secret_flags (GTK_WIDGET (method->password_entry));
|
|
Packit |
fabffb |
nm_setting_set_secret_flags (NM_SETTING (s_8021x), method->password_flags_name, flags, NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Fill the connection's password if we're in the applet so that it'll get
|
|
Packit |
fabffb |
* back to NM. From the editor though, since the connection isn't going
|
|
Packit |
fabffb |
* back to NM in response to a GetSecrets() call, we don't save it if the
|
|
Packit |
fabffb |
* user checked "Always Ask".
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
if (!(method->flags & EAP_METHOD_SIMPLE_FLAG_IS_EDITOR) || not_saved == FALSE) {
|
|
Packit |
fabffb |
g_object_set (s_8021x, NM_SETTING_802_1X_PASSWORD,
|
|
Packit |
fabffb |
gtk_entry_get_text (method->password_entry), NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Update secret flags and popup when editing the connection */
|
|
Packit |
fabffb |
if (!(method->flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY)) {
|
|
Packit |
fabffb |
GtkWidget *passwd_entry = GTK_WIDGET (gtk_builder_get_object (parent->builder,
|
|
Packit |
fabffb |
"eap_simple_password_entry"));
|
|
Packit |
fabffb |
g_assert (passwd_entry);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
nma_utils_update_password_storage (passwd_entry, flags,
|
|
Packit |
fabffb |
NM_SETTING (s_8021x), method->password_flags_name);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->pkey_passphrase_requested) {
|
|
Packit |
fabffb |
g_object_set (s_8021x, NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD,
|
|
Packit |
fabffb |
gtk_entry_get_text (method->pkey_passphrase_entry), NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
update_secrets (EAPMethod *parent, NMConnection *connection)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
helper_fill_secret_entry (connection,
|
|
Packit |
fabffb |
parent->builder,
|
|
Packit |
fabffb |
"eap_simple_password_entry",
|
|
Packit |
fabffb |
NM_TYPE_SETTING_802_1X,
|
|
Packit |
fabffb |
(HelperSecretFunc) nm_setting_802_1x_get_password);
|
|
Packit |
fabffb |
helper_fill_secret_entry (connection,
|
|
Packit |
fabffb |
parent->builder,
|
|
Packit |
fabffb |
"eap_simple_pkey_passphrase_entry",
|
|
Packit |
fabffb |
NM_TYPE_SETTING_802_1X,
|
|
Packit |
fabffb |
(HelperSecretFunc) nm_setting_802_1x_get_private_key_password);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static gboolean
|
|
Packit |
fabffb |
stuff_changed (EAPMethodSimple *method)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
wireless_security_changed_cb (NULL, method->ws_parent);
|
|
Packit |
fabffb |
method->idle_func_id = 0;
|
|
Packit |
fabffb |
return FALSE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
password_storage_changed (GObject *entry,
|
|
Packit |
fabffb |
GParamSpec *pspec,
|
|
Packit |
fabffb |
EAPMethodSimple *method)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
gboolean always_ask;
|
|
Packit |
fabffb |
gboolean secrets_only = method->flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
always_ask = always_ask_selected (method->password_entry);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (always_ask && !secrets_only) {
|
|
Packit |
fabffb |
/* we always clear this button and do not restore it
|
|
Packit |
fabffb |
* (because we want to hide the password). */
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (method->show_password, FALSE);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (method->show_password),
|
|
Packit |
fabffb |
!always_ask || secrets_only);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (!method->idle_func_id)
|
|
Packit |
fabffb |
method->idle_func_id = g_idle_add ((GSourceFunc) stuff_changed, method);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Set the UI fields for user, password, always_ask and show_password to the
|
|
Packit |
fabffb |
* values as provided by method->ws_parent. */
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
set_userpass_ui (EAPMethodSimple *method)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
if (method->ws_parent->username)
|
|
Packit |
fabffb |
gtk_entry_set_text (method->username_entry, method->ws_parent->username);
|
|
Packit |
fabffb |
else
|
|
Packit |
fabffb |
gtk_entry_set_text (method->username_entry, "");
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (method->ws_parent->password && !method->ws_parent->always_ask)
|
|
Packit |
fabffb |
gtk_entry_set_text (method->password_entry, method->ws_parent->password);
|
|
Packit |
fabffb |
else
|
|
Packit |
fabffb |
gtk_entry_set_text (method->password_entry, "");
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (method->show_password, method->ws_parent->show_password);
|
|
Packit |
fabffb |
password_storage_changed (NULL, NULL, method);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
widgets_realized (GtkWidget *widget, EAPMethodSimple *method)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
set_userpass_ui (method);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
widgets_unrealized (GtkWidget *widget, EAPMethodSimple *method)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
wireless_security_set_userpass (method->ws_parent,
|
|
Packit |
fabffb |
gtk_entry_get_text (method->username_entry),
|
|
Packit |
fabffb |
gtk_entry_get_text (method->password_entry),
|
|
Packit |
fabffb |
always_ask_selected (method->password_entry),
|
|
Packit |
fabffb |
gtk_toggle_button_get_active (method->show_password));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
destroy (EAPMethod *parent)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
EAPMethodSimple *method = (EAPMethodSimple *) parent;
|
|
Packit |
fabffb |
GtkWidget *widget;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_notebook"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
g_signal_handlers_disconnect_by_data (widget, method);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_handlers_disconnect_by_data (method->username_entry, method->ws_parent);
|
|
Packit |
fabffb |
g_signal_handlers_disconnect_by_data (method->password_entry, method->ws_parent);
|
|
Packit |
fabffb |
g_signal_handlers_disconnect_by_data (method->password_entry, method);
|
|
Packit |
fabffb |
g_signal_handlers_disconnect_by_data (method->show_password, method);
|
|
Packit |
fabffb |
g_signal_handlers_disconnect_by_data (method->pkey_passphrase_entry, method->ws_parent);
|
|
Packit |
fabffb |
g_signal_handlers_disconnect_by_data (method->show_pkey_passphrase, method);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
nm_clear_g_source (&method->idle_func_id);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
hide_row (GtkWidget **widgets, size_t num)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
while (num--)
|
|
Packit |
fabffb |
gtk_widget_hide (*widgets++);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
EAPMethodSimple *
|
|
Packit |
fabffb |
eap_method_simple_new (WirelessSecurity *ws_parent,
|
|
Packit |
fabffb |
NMConnection *connection,
|
|
Packit |
fabffb |
EAPMethodSimpleType type,
|
|
Packit |
fabffb |
EAPMethodSimpleFlags flags,
|
|
Packit |
fabffb |
const char *const*hints)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
EAPMethod *parent;
|
|
Packit |
fabffb |
EAPMethodSimple *method;
|
|
Packit |
fabffb |
GtkWidget *widget;
|
|
Packit |
fabffb |
NMSetting8021x *s_8021x = NULL;
|
|
Packit |
fabffb |
GtkWidget *widget_row[10];
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
parent = eap_method_init (sizeof (EAPMethodSimple),
|
|
Packit |
fabffb |
validate,
|
|
Packit |
fabffb |
add_to_size_group,
|
|
Packit |
fabffb |
fill_connection,
|
|
Packit |
fabffb |
update_secrets,
|
|
Packit |
fabffb |
destroy,
|
|
Packit |
fabffb |
"/org/freedesktop/network-manager-applet/eap-method-simple.ui",
|
|
Packit |
fabffb |
"eap_simple_notebook",
|
|
Packit |
fabffb |
"eap_simple_username_entry",
|
|
Packit |
fabffb |
flags & EAP_METHOD_SIMPLE_FLAG_PHASE2);
|
|
Packit |
fabffb |
if (!parent)
|
|
Packit |
fabffb |
return NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
method = (EAPMethodSimple *) parent;
|
|
Packit |
fabffb |
method->password_flags_name = NM_SETTING_802_1X_PASSWORD;
|
|
Packit |
fabffb |
method->ws_parent = ws_parent;
|
|
Packit |
fabffb |
method->flags = flags;
|
|
Packit |
fabffb |
method->type = type;
|
|
Packit |
fabffb |
g_assert (type < EAP_METHOD_SIMPLE_TYPE_LAST);
|
|
Packit |
fabffb |
g_assert ( type != EAP_METHOD_SIMPLE_TYPE_UNKNOWN
|
|
Packit |
fabffb |
|| hints);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (hints) {
|
|
Packit |
fabffb |
for (; *hints; hints++) {
|
|
Packit |
fabffb |
if (!strcmp (*hints, NM_SETTING_802_1X_IDENTITY))
|
|
Packit |
fabffb |
method->username_requested = TRUE;
|
|
Packit |
fabffb |
else if (!strcmp (*hints, NM_SETTING_802_1X_PASSWORD)) {
|
|
Packit |
fabffb |
method->password_requested = TRUE;
|
|
Packit |
fabffb |
method->password_flags_name = NM_SETTING_802_1X_PASSWORD;
|
|
Packit |
fabffb |
} else if (!strcmp (*hints, NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD))
|
|
Packit |
fabffb |
method->pkey_passphrase_requested = TRUE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
} else {
|
|
Packit |
fabffb |
method->username_requested = TRUE;
|
|
Packit |
fabffb |
method->password_requested = TRUE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_notebook"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
g_signal_connect (G_OBJECT (widget), "realize",
|
|
Packit |
fabffb |
(GCallback) widgets_realized,
|
|
Packit |
fabffb |
method);
|
|
Packit |
fabffb |
g_signal_connect (G_OBJECT (widget), "unrealize",
|
|
Packit |
fabffb |
(GCallback) widgets_unrealized,
|
|
Packit |
fabffb |
method);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_username_entry"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
method->username_entry = GTK_ENTRY (widget);
|
|
Packit |
fabffb |
g_signal_connect (G_OBJECT (widget), "changed",
|
|
Packit |
fabffb |
(GCallback) wireless_security_changed_cb,
|
|
Packit |
fabffb |
ws_parent);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if ( (method->flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY)
|
|
Packit |
fabffb |
&& !method->username_requested)
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (widget, FALSE);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_entry"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
method->password_entry = GTK_ENTRY (widget);
|
|
Packit |
fabffb |
g_signal_connect (G_OBJECT (widget), "changed",
|
|
Packit |
fabffb |
(GCallback) wireless_security_changed_cb,
|
|
Packit |
fabffb |
ws_parent);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Create password-storage popup menu for password entry under entry's secondary icon */
|
|
Packit |
fabffb |
if (connection)
|
|
Packit |
fabffb |
s_8021x = nm_connection_get_setting_802_1x (connection);
|
|
Packit |
fabffb |
nma_utils_setup_password_storage (widget, 0, (NMSetting *) s_8021x, method->password_flags_name,
|
|
Packit |
fabffb |
FALSE, flags & EAP_METHOD_SIMPLE_FLAG_SECRETS_ONLY);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (method->password_entry, "notify::secondary-icon-name",
|
|
Packit |
fabffb |
G_CALLBACK (password_storage_changed),
|
|
Packit |
fabffb |
method);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_eapsimple"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
method->show_password = GTK_TOGGLE_BUTTON (widget);
|
|
Packit |
fabffb |
g_signal_connect (G_OBJECT (widget), "toggled",
|
|
Packit |
fabffb |
(GCallback) show_password_toggled_cb,
|
|
Packit |
fabffb |
method);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_pkey_passphrase_entry"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
method->pkey_passphrase_entry = GTK_ENTRY (widget);
|
|
Packit |
fabffb |
g_signal_connect (G_OBJECT (widget), "changed",
|
|
Packit |
fabffb |
(GCallback) wireless_security_changed_cb,
|
|
Packit |
fabffb |
ws_parent);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_show_pkey_passphrase_checkbutton"));
|
|
Packit |
fabffb |
g_assert (widget);
|
|
Packit |
fabffb |
method->show_pkey_passphrase = GTK_TOGGLE_BUTTON (widget);
|
|
Packit |
fabffb |
g_signal_connect (G_OBJECT (widget), "toggled",
|
|
Packit |
fabffb |
(GCallback) show_pkey_passphrase_toggled_cb,
|
|
Packit |
fabffb |
method);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget_row[0] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_username_label"));
|
|
Packit |
fabffb |
widget_row[1] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_username_entry"));
|
|
Packit |
fabffb |
if (!method->username_requested)
|
|
Packit |
fabffb |
hide_row (widget_row, 2);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget_row[0] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_label"));
|
|
Packit |
fabffb |
widget_row[1] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_password_entry"));
|
|
Packit |
fabffb |
widget_row[2] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "show_checkbutton_eapsimple"));
|
|
Packit |
fabffb |
if (!method->password_requested)
|
|
Packit |
fabffb |
hide_row (widget_row, 3);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
widget_row[0] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_pkey_passphrase_label"));
|
|
Packit |
fabffb |
widget_row[1] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_pkey_passphrase_entry"));
|
|
Packit |
fabffb |
widget_row[2] = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_simple_show_pkey_passphrase_checkbutton"));
|
|
Packit |
fabffb |
if (!method->pkey_passphrase_requested)
|
|
Packit |
fabffb |
hide_row (widget_row, 3);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Initialize the UI fields with the security settings from method->ws_parent.
|
|
Packit |
fabffb |
* This will be done again when the widget gets realized. It must be done here as well,
|
|
Packit |
fabffb |
* because the outer dialog will ask to 'validate' the connection before the security tab
|
|
Packit |
fabffb |
* is shown/realized (to enable the 'Apply' button).
|
|
Packit |
fabffb |
* As 'validate' accesses the contents of the UI fields, they must be initialized now, even
|
|
Packit |
fabffb |
* if the widgets are not yet visible. */
|
|
Packit |
fabffb |
set_userpass_ui (method);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
return method;
|
|
Packit |
fabffb |
}
|