// SPDX-License-Identifier: GPL-2.0+ /* NetworkManager Applet -- allow user control over networking * * Dan Williams * * Copyright 2008 Novell, Inc. * Copyright 2008 - 2014 Red Hat, Inc. */ #include "nm-default.h" #include "ethernet-dialog.h" #include "wireless-security.h" #include "applet-dialogs.h" #include "eap-method.h" static void stuff_changed_cb (WirelessSecurity *sec, gpointer user_data) { GtkWidget *button = GTK_WIDGET (user_data); gtk_widget_set_sensitive (button, wireless_security_validate (sec, NULL)); } static void dialog_set_network_name (NMConnection *connection, GtkEntry *entry) { NMSettingConnection *setting; setting = nm_connection_get_setting_connection (connection); gtk_widget_set_sensitive (GTK_WIDGET (entry), FALSE); gtk_entry_set_text (entry, nm_setting_connection_get_id (setting)); } static WirelessSecurity * dialog_set_security (NMConnection *connection, GtkBuilder *builder, GtkBox *box) { GList *children; GList *iter; WirelessSecurity *security; security = (WirelessSecurity *) ws_wpa_eap_new (connection, FALSE, TRUE, NULL); /* Remove any previous wireless security widgets */ children = gtk_container_get_children (GTK_CONTAINER (box)); for (iter = children; iter; iter = iter->next) gtk_container_remove (GTK_CONTAINER (box), GTK_WIDGET (iter->data)); g_list_free (children); gtk_box_pack_start (box, wireless_security_get_widget (security), TRUE, TRUE, 0); return security; } GtkWidget * nma_ethernet_dialog_new (NMConnection *connection) { GtkBuilder *builder; GtkWidget *dialog; GError *error = NULL; WirelessSecurity *security; builder = gtk_builder_new (); if (!gtk_builder_add_from_resource (builder, "/org/freedesktop/network-manager-applet/8021x.ui", &error)) { g_warning ("Couldn't load builder resource: %s", error->message); g_error_free (error); applet_missing_ui_warning_dialog_show (); g_object_unref (builder); return NULL; } dialog = (GtkWidget *) gtk_builder_get_object (builder, "8021x_dialog"); if (!dialog) { g_warning ("Couldn't find wireless_dialog widget."); applet_missing_ui_warning_dialog_show (); g_object_unref (builder); return NULL; } gtk_window_set_title (GTK_WINDOW (dialog), _("802.1X authentication")); gtk_window_set_icon_name (GTK_WINDOW (dialog), "dialog-password"); dialog_set_network_name (connection, GTK_ENTRY (gtk_builder_get_object (builder, "network_name_entry"))); /* Handle CA cert ignore stuff */ eap_method_ca_cert_ignore_load (connection); security = dialog_set_security (connection, builder, GTK_BOX (gtk_builder_get_object (builder, "security_vbox"))); wireless_security_set_changed_notify (security, stuff_changed_cb, GTK_WIDGET (gtk_builder_get_object (builder, "ok_button"))); g_object_set_data_full (G_OBJECT (dialog), "security", security, (GDestroyNotify) wireless_security_unref); g_object_set_data_full (G_OBJECT (dialog), "connection", g_object_ref (connection), (GDestroyNotify) g_object_unref); /* Ensure the builder gets destroyed when the dialog goes away */ g_object_set_data_full (G_OBJECT (dialog), "builder", builder, (GDestroyNotify) g_object_unref); return dialog; } NMConnection * nma_ethernet_dialog_get_connection (GtkWidget *dialog) { NMConnection *connection, *tmp_connection; WirelessSecurity *security; NMSetting *s_8021x, *s_con; g_return_val_if_fail (dialog != NULL, NULL); connection = g_object_get_data (G_OBJECT (dialog), "connection"); security = g_object_get_data (G_OBJECT (dialog), "security"); /* Here's a nice hack to work around the fact that ws_802_1x_fill_connection() * needs a wireless setting and a connection setting for various things. */ tmp_connection = nm_simple_connection_new (); /* Add the fake connection setting (mainly for the UUID for cert ignore checking) */ s_con = nm_connection_get_setting (connection, NM_TYPE_SETTING_CONNECTION); g_assert (s_con); nm_connection_add_setting (tmp_connection, NM_SETTING (g_object_ref (s_con))); /* And the fake wireless setting */ nm_connection_add_setting (tmp_connection, nm_setting_wireless_new ()); /* Fill up the 802.1x setting */ ws_802_1x_fill_connection (security, "wpa_eap_auth_combo", tmp_connection); /* Grab it and add it to our original connection */ s_8021x = nm_connection_get_setting (tmp_connection, NM_TYPE_SETTING_802_1X); nm_connection_add_setting (connection, NM_SETTING (g_object_ref (s_8021x))); /* Save new CA cert ignore values to GSettings */ eap_method_ca_cert_ignore_save (tmp_connection); /* Remove the 8021x setting to prevent the clearing of secrets when the * simple-connection is destroyed. */ nm_connection_remove_setting (tmp_connection, NM_TYPE_SETTING_802_1X); g_object_unref (tmp_connection); return connection; }