|
Packit Service |
639700 |
// SPDX-License-Identifier: GPL-2.0+
|
|
Packit |
fabffb |
/* NetworkManager Connection editor -- Connection editor for NetworkManager
|
|
Packit |
fabffb |
*
|
|
Packit |
fabffb |
* Copyright 2017 Red Hat, Inc.
|
|
Packit |
fabffb |
*/
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "nm-default.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include <string.h>
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#include "page-macsec.h"
|
|
Packit |
fabffb |
#include "nm-connection-editor.h"
|
|
Packit |
fabffb |
#include "nma-ui-utils.h"
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
G_DEFINE_TYPE (CEPageMacsec, ce_page_macsec, CE_TYPE_PAGE)
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
#define CE_PAGE_MACSEC_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), CE_TYPE_PAGE_MACSEC, CEPageMacsecPrivate))
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
typedef struct {
|
|
Packit |
fabffb |
NMSettingMacsec *setting;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
GtkEntry *name;
|
|
Packit |
fabffb |
GtkComboBoxText *parent;
|
|
Packit |
fabffb |
GtkComboBox *mode;
|
|
Packit |
fabffb |
GtkEntry *cak;
|
|
Packit |
fabffb |
GtkEntry *ckn;
|
|
Packit |
fabffb |
GtkToggleButton *encryption;
|
|
Packit |
fabffb |
GtkComboBox *validation;
|
|
Packit |
fabffb |
GtkSpinButton *sci_port;
|
|
Packit |
fabffb |
} CEPageMacsecPrivate;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
macsec_private_init (CEPageMacsec *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv = CE_PAGE_MACSEC_GET_PRIVATE (self);
|
|
Packit |
fabffb |
GtkBuilder *builder;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
builder = CE_PAGE (self)->builder;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->name = GTK_ENTRY (gtk_builder_get_object (builder, "macsec_name"));
|
|
Packit |
fabffb |
priv->parent = GTK_COMBO_BOX_TEXT (gtk_builder_get_object (builder, "macsec_parent"));
|
|
Packit |
fabffb |
priv->mode = GTK_COMBO_BOX (gtk_builder_get_object (builder, "macsec_mode"));
|
|
Packit |
fabffb |
priv->cak = GTK_ENTRY (gtk_builder_get_object (builder, "macsec_cak"));
|
|
Packit |
fabffb |
priv->ckn = GTK_ENTRY (gtk_builder_get_object (builder, "macsec_ckn"));
|
|
Packit |
fabffb |
priv->encryption = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "macsec_encryption"));
|
|
Packit |
fabffb |
priv->validation = GTK_COMBO_BOX (gtk_builder_get_object (builder, "macsec_validation"));
|
|
Packit |
fabffb |
priv->sci_port = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "macsec_sci_port"));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
mode_changed (GtkComboBox *combo, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageMacsec *self = user_data;
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv = CE_PAGE_MACSEC_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingMacsecMode mode;
|
|
Packit |
fabffb |
NMConnection *connection;
|
|
Packit |
fabffb |
gboolean mode_psk;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode = gtk_combo_box_get_active (combo);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode_psk = mode == NM_SETTING_MACSEC_MODE_PSK;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->cak), mode_psk);
|
|
Packit |
fabffb |
gtk_widget_set_sensitive (GTK_WIDGET (priv->ckn), mode_psk);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (!mode_psk) {
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->cak, "");
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->ckn, "");
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
connection = CE_PAGE (self)->connection;
|
|
Packit |
fabffb |
if (!nm_connection_get_setting_802_1x (connection))
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, nm_setting_802_1x_new ());
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
nm_connection_editor_inter_page_set_value (CE_PAGE (self)->editor,
|
|
Packit |
fabffb |
INTER_PAGE_CHANGE_MACSEC_MODE,
|
|
Packit |
fabffb |
GUINT_TO_POINTER (mode));
|
|
Packit |
fabffb |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
populate_ui (CEPageMacsec *self, NMConnection *connection)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv = CE_PAGE_MACSEC_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingMacsec *setting = priv->setting;
|
|
Packit |
fabffb |
NMSettingMacsecMode mode;
|
|
Packit |
fabffb |
NMSettingMacsecValidation validation;
|
|
Packit |
fabffb |
const char *cak = "", *ckn = "", *str;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_connection_get_interface_name (CE_PAGE (self)->connection);
|
|
Packit |
fabffb |
if (str)
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->name, str);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
str = nm_setting_macsec_get_parent (setting);
|
|
Packit |
fabffb |
ce_page_setup_device_combo (CE_PAGE (self), GTK_COMBO_BOX (priv->parent),
|
|
Packit |
fabffb |
G_TYPE_NONE, str,
|
|
Packit |
fabffb |
NULL, NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode = nm_setting_macsec_get_mode (setting);
|
|
Packit |
fabffb |
if (mode >= NM_SETTING_MACSEC_MODE_PSK && mode <= NM_SETTING_MACSEC_MODE_EAP)
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->mode, mode);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (mode == NM_SETTING_MACSEC_MODE_PSK) {
|
|
Packit |
fabffb |
cak = nm_setting_macsec_get_mka_cak (setting);
|
|
Packit |
fabffb |
ckn = nm_setting_macsec_get_mka_ckn (setting);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->cak, cak ?: "");
|
|
Packit |
fabffb |
gtk_entry_set_text (priv->ckn, ckn ?: "");
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
nma_utils_setup_password_storage ((GtkWidget *) priv->cak, 0,
|
|
Packit |
fabffb |
(NMSetting *) priv->setting,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_MKA_CAK,
|
|
Packit |
fabffb |
FALSE, FALSE);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_toggle_button_set_active (priv->encryption,
|
|
Packit |
fabffb |
nm_setting_macsec_get_encrypt (setting));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
validation = nm_setting_macsec_get_validation (setting);
|
|
Packit |
fabffb |
if ( validation >= NM_SETTING_MACSEC_VALIDATION_DISABLE
|
|
Packit |
fabffb |
&& validation <= NM_SETTING_MACSEC_VALIDATION_STRICT)
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->validation, validation);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
gtk_spin_button_set_value (priv->sci_port, nm_setting_macsec_get_port (setting));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode_changed (priv->mode, self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
stuff_changed (GtkEditable *editable, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
ce_page_changed (CE_PAGE (user_data));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
finish_setup (CEPageMacsec *self, gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPage *parent = CE_PAGE (self);
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv = CE_PAGE_MACSEC_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
populate_ui (self, parent->connection);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->name, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->parent, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->mode, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->cak, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->ckn, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->sci_port, "value-changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->validation, "changed", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
g_signal_connect (priv->encryption, "toggled", G_CALLBACK (stuff_changed), self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (priv->mode, "changed", G_CALLBACK (mode_changed), self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
CEPage *
|
|
Packit |
fabffb |
ce_page_macsec_new (NMConnectionEditor *editor,
|
|
Packit |
fabffb |
NMConnection *connection,
|
|
Packit |
fabffb |
GtkWindow *parent_window,
|
|
Packit |
fabffb |
NMClient *client,
|
|
Packit |
fabffb |
const char **out_secrets_setting_name,
|
|
Packit |
fabffb |
GError **error)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageMacsec *self;
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
self = CE_PAGE_MACSEC (ce_page_new (CE_TYPE_PAGE_MACSEC,
|
|
Packit |
fabffb |
editor,
|
|
Packit |
fabffb |
connection,
|
|
Packit |
fabffb |
parent_window,
|
|
Packit |
fabffb |
client,
|
|
Packit |
fabffb |
"/org/gnome/nm_connection_editor/ce-page-macsec.ui",
|
|
Packit |
fabffb |
"MacsecPage",
|
|
Packit |
fabffb |
_("MACsec")));
|
|
Packit |
fabffb |
if (!self) {
|
|
Packit |
fabffb |
g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("Could not load MACsec user interface."));
|
|
Packit |
fabffb |
return NULL;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
macsec_private_init (self);
|
|
Packit |
fabffb |
priv = CE_PAGE_MACSEC_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
priv->setting = nm_connection_get_setting_macsec (connection);
|
|
Packit |
fabffb |
if (!priv->setting) {
|
|
Packit |
fabffb |
priv->setting = NM_SETTING_MACSEC (nm_setting_macsec_new ());
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, NM_SETTING (priv->setting));
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_signal_connect (self, CE_PAGE_INITIALIZED, G_CALLBACK (finish_setup), NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
*out_secrets_setting_name = NM_SETTING_MACSEC_SETTING_NAME;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
return CE_PAGE (self);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ui_to_setting (CEPageMacsec *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv = CE_PAGE_MACSEC_GET_PRIVATE (self);
|
|
Packit |
fabffb |
NMSettingConnection *s_con;
|
|
Packit |
fabffb |
const char *parent = NULL;
|
|
Packit |
fabffb |
const char *cak = NULL;
|
|
Packit |
fabffb |
const char *ckn = NULL;
|
|
Packit |
fabffb |
NMSettingMacsecMode mode;
|
|
Packit |
fabffb |
gboolean encryption;
|
|
Packit |
fabffb |
NMSettingMacsecValidation validation;
|
|
Packit |
fabffb |
gint sci_port;
|
|
Packit |
fabffb |
GtkWidget *entry;
|
|
Packit |
fabffb |
NMSettingSecretFlags secret_flags;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
s_con = nm_connection_get_setting_connection (CE_PAGE (self)->connection);
|
|
Packit |
fabffb |
g_return_if_fail (s_con != NULL);
|
|
Packit |
fabffb |
g_object_set (s_con,
|
|
Packit |
fabffb |
NM_SETTING_CONNECTION_INTERFACE_NAME, gtk_entry_get_text (priv->name),
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
entry = gtk_bin_get_child (GTK_BIN (priv->parent));
|
|
Packit |
fabffb |
if (entry) {
|
|
Packit |
fabffb |
ce_page_device_entry_get (GTK_ENTRY (entry), ARPHRD_ETHER, TRUE,
|
|
Packit |
fabffb |
(char **) &parent, NULL, NULL, NULL);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
mode = gtk_combo_box_get_active (priv->mode);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (mode == NM_SETTING_MACSEC_MODE_PSK) {
|
|
Packit |
fabffb |
cak = gtk_entry_get_text (priv->cak);
|
|
Packit |
fabffb |
ckn = gtk_entry_get_text (priv->ckn);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
encryption = gtk_toggle_button_get_active (priv->encryption);
|
|
Packit |
fabffb |
validation = gtk_combo_box_get_active (priv->validation);
|
|
Packit |
fabffb |
sci_port = gtk_spin_button_get_value_as_int (priv->sci_port);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_object_set (priv->setting,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_PARENT, parent,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_MODE, mode,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_MKA_CAK, cak,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_MKA_CKN, ckn,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_ENCRYPT, encryption,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_VALIDATION, validation,
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_PORT, sci_port,
|
|
Packit |
fabffb |
NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Save CAK flags to the connection */
|
|
Packit |
fabffb |
secret_flags = nma_utils_menu_to_secret_flags ((GtkWidget *) priv->cak);
|
|
Packit |
fabffb |
nm_setting_set_secret_flags (NM_SETTING (priv->setting), NM_SETTING_MACSEC_MKA_CAK,
|
|
Packit |
fabffb |
secret_flags, NULL);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* Update secret flags and popup when editing the connection */
|
|
Packit |
fabffb |
nma_utils_update_password_storage ((GtkWidget *) priv->cak, secret_flags,
|
|
Packit |
fabffb |
NM_SETTING (priv->setting), NM_SETTING_MACSEC_MKA_CAK);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static gboolean
|
|
Packit |
fabffb |
ce_page_validate_v (CEPage *page, NMConnection *connection, GError **error)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageMacsec *self = CE_PAGE_MACSEC (page);
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv = CE_PAGE_MACSEC_GET_PRIVATE (self);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
ui_to_setting (self);
|
|
Packit |
fabffb |
return nm_setting_verify (NM_SETTING (priv->setting), connection, error);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static gboolean
|
|
Packit |
fabffb |
inter_page_change (CEPage *page)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
CEPageMacsecPrivate *priv = CE_PAGE_MACSEC_GET_PRIVATE (page);
|
|
Packit |
fabffb |
gpointer enable;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
if (nm_connection_editor_inter_page_get_value (page->editor,
|
|
Packit |
fabffb |
INTER_PAGE_CHANGE_802_1X_ENABLE,
|
|
Packit |
fabffb |
&enable)) {
|
|
Packit |
fabffb |
gtk_combo_box_set_active (priv->mode,
|
|
Packit |
fabffb |
GPOINTER_TO_INT (enable) ?
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_MODE_EAP :
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_MODE_PSK);
|
|
Packit |
fabffb |
ce_page_changed (page);
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
return TRUE;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_macsec_init (CEPageMacsec *self)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
static void
|
|
Packit |
fabffb |
ce_page_macsec_class_init (CEPageMacsecClass *macsec_class)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
GObjectClass *object_class = G_OBJECT_CLASS (macsec_class);
|
|
Packit |
fabffb |
CEPageClass *parent_class = CE_PAGE_CLASS (macsec_class);
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
g_type_class_add_private (object_class, sizeof (CEPageMacsecPrivate));
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
/* virtual methods */
|
|
Packit |
fabffb |
parent_class->ce_page_validate_v = ce_page_validate_v;
|
|
Packit |
fabffb |
parent_class->inter_page_change = inter_page_change;
|
|
Packit |
fabffb |
}
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
void
|
|
Packit |
fabffb |
macsec_connection_new (FUNC_TAG_PAGE_NEW_CONNECTION_IMPL,
|
|
Packit |
fabffb |
GtkWindow *parent,
|
|
Packit |
fabffb |
const char *detail,
|
|
Packit |
fabffb |
gpointer detail_data,
|
|
Packit |
fabffb |
NMConnection *connection,
|
|
Packit |
fabffb |
NMClient *client,
|
|
Packit |
fabffb |
PageNewConnectionResultFunc result_func,
|
|
Packit |
fabffb |
gpointer user_data)
|
|
Packit |
fabffb |
{
|
|
Packit |
fabffb |
gs_unref_object NMConnection *connection_tmp = NULL;
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
connection = _ensure_connection_other (connection, &connection_tmp);
|
|
Packit |
fabffb |
ce_page_complete_connection (connection,
|
|
Packit |
fabffb |
_("MACSEC connection %d"),
|
|
Packit |
fabffb |
NM_SETTING_MACSEC_SETTING_NAME,
|
|
Packit |
fabffb |
FALSE,
|
|
Packit |
fabffb |
client);
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, nm_setting_macsec_new ());
|
|
Packit |
fabffb |
nm_connection_add_setting (connection, nm_setting_wired_new ());
|
|
Packit |
fabffb |
|
|
Packit |
fabffb |
(*result_func) (FUNC_TAG_PAGE_NEW_CONNECTION_RESULT_CALL, connection, FALSE, NULL, user_data);
|
|
Packit |
fabffb |
}
|