diff --git a/src/nmtui/nm-editor-bindings.c b/src/nmtui/nm-editor-bindings.c index 8f7162e619..360cf3ad97 100644 --- a/src/nmtui/nm-editor-bindings.c +++ b/src/nmtui/nm-editor-bindings.c @@ -848,7 +848,9 @@ peer_transform_from_persistent_keepalive_string(GBinding *binding, typedef struct { NMConnection *connection; NMSettingWirelessSecurity *s_wsec; + NMSetting8021x *s_8021x; gboolean s_wsec_in_use; + gboolean s_8021x_in_use; GObject *target; char *target_property; @@ -936,6 +938,7 @@ wireless_security_target_changed(GObject *object, GParamSpec *pspec, gpointer us { NMEditorWirelessSecurityMethodBinding *binding = user_data; char *method; + gboolean need_8021x = FALSE; if (binding->updating) return; @@ -945,11 +948,14 @@ wireless_security_target_changed(GObject *object, GParamSpec *pspec, gpointer us binding->updating = TRUE; if (!strcmp(method, "none")) { - if (!binding->s_wsec_in_use) - return; - binding->s_wsec_in_use = FALSE; - nm_connection_remove_setting(binding->connection, NM_TYPE_SETTING_WIRELESS_SECURITY); - + if (binding->s_wsec_in_use) { + binding->s_wsec_in_use = FALSE; + nm_connection_remove_setting(binding->connection, NM_TYPE_SETTING_WIRELESS_SECURITY); + } + if (binding->s_8021x_in_use) { + binding->s_8021x_in_use = FALSE; + nm_connection_remove_setting(binding->connection, NM_TYPE_SETTING_802_1X); + } binding->updating = FALSE; return; } @@ -1030,10 +1036,21 @@ wireless_security_target_changed(GObject *object, GParamSpec *pspec, gpointer us NULL, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, NM_WEP_KEY_TYPE_UNKNOWN, + NM_SETTING_WIRELESS_SECURITY_PSK, + NULL, NULL); + need_8021x = TRUE; } else g_warn_if_reached(); + if (need_8021x != binding->s_8021x_in_use) { + binding->s_8021x_in_use = need_8021x; + if (need_8021x) + nm_connection_add_setting(binding->connection, NM_SETTING(binding->s_8021x)); + else + nm_connection_remove_setting(binding->connection, NM_TYPE_SETTING_802_1X); + } + binding->updating = FALSE; } @@ -1076,6 +1093,7 @@ wireless_security_target_destroyed(gpointer user_data, GObject *ex_target) void nm_editor_bind_wireless_security_method(NMConnection *connection, NMSettingWirelessSecurity *s_wsec, + NMSetting8021x *s_8021x, gpointer target, const char *target_property, GBindingFlags flags) @@ -1099,9 +1117,11 @@ nm_editor_bind_wireless_security_method(NMConnection *connection, NM_CONNECTION_CHANGED, G_CALLBACK(wireless_connection_changed), binding); - binding->s_wsec_in_use = (nm_connection_get_setting_wireless_security(connection) != NULL); + binding->s_wsec_in_use = (nm_connection_get_setting_wireless_security(connection) != NULL); + binding->s_wsec = g_object_ref(s_wsec); + binding->s_8021x_in_use = (nm_connection_get_setting_802_1x(connection) != NULL); + binding->s_8021x = g_object_ref(s_8021x); - binding->s_wsec = g_object_ref(s_wsec); g_signal_connect(s_wsec, "notify::" NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, G_CALLBACK(wireless_security_changed), diff --git a/src/nmtui/nm-editor-bindings.h b/src/nmtui/nm-editor-bindings.h index 97353c10a2..bbd5622a14 100644 --- a/src/nmtui/nm-editor-bindings.h +++ b/src/nmtui/nm-editor-bindings.h @@ -51,6 +51,7 @@ void nm_editor_bind_ip_route_to_strings(int family, void nm_editor_bind_wireless_security_method(NMConnection *connection, NMSettingWirelessSecurity *s_wsec, + NMSetting8021x *s_8021x, gpointer target, const char *target_property, GBindingFlags flags); diff --git a/src/nmtui/nmt-page-wifi.c b/src/nmtui/nmt-page-wifi.c index b76463445a..55feaee256 100644 --- a/src/nmtui/nmt-page-wifi.c +++ b/src/nmtui/nmt-page-wifi.c @@ -23,6 +23,7 @@ #include "nmt-mac-entry.h" #include "nmt-mtu-entry.h" #include "nmt-password-fields.h" +#include "nmt-8021x-fields.h" #include "nm-editor-bindings.h" @@ -33,6 +34,7 @@ G_DEFINE_TYPE(NmtPageWifi, nmt_page_wifi, NMT_TYPE_EDITOR_PAGE_DEVICE) typedef struct { NMSettingWirelessSecurity *s_wsec; + NMSetting8021x *s_8021x; } NmtPageWifiPrivate; @@ -166,6 +168,7 @@ nmt_page_wifi_constructed(GObject *object) NmtEditorGrid *grid; NMSettingWireless *s_wireless; NMSettingWirelessSecurity *s_wsec; + NMSetting8021x *s_8021x; NmtNewtWidget *widget, *hbox, *subgrid; NmtNewtWidget *mode, *band, *security, *entry; NmtNewtStack *stack; @@ -181,7 +184,14 @@ nmt_page_wifi_constructed(GObject *object) */ s_wsec = NM_SETTING_WIRELESS_SECURITY(nm_setting_wireless_security_new()); } - priv->s_wsec = g_object_ref_sink(s_wsec); + priv->s_wsec = g_object_ref(s_wsec); + + s_8021x = nm_connection_get_setting_802_1x(conn); + if (!s_8021x) { + s_8021x = NM_SETTING_802_1X(nm_setting_802_1x_new()); + nm_setting_802_1x_add_eap_method(s_8021x, "TLS"); + } + priv->s_8021x = g_object_ref(s_8021x); deventry = nmt_editor_page_device_get_device_entry(NMT_EDITOR_PAGE_DEVICE(object)); g_object_bind_property(s_wireless, @@ -279,9 +289,7 @@ nmt_page_wifi_constructed(GObject *object) nmt_newt_stack_add(stack, "wpa3-personal", subgrid); /* "wpa-enterprise" */ - // FIXME - widget = nmt_newt_label_new(_("(No support for wpa-enterprise yet...)")); - nmt_newt_stack_add(stack, "wpa-enterprise", widget); + nmt_newt_stack_add(stack, "wpa-enterprise", nmt_8021x_fields_new(s_8021x, FALSE)); /* wep-key */ subgrid = nmt_editor_grid_new(); @@ -355,6 +363,7 @@ nmt_page_wifi_constructed(GObject *object) g_object_bind_property(security, "active-id", stack, "active-id", G_BINDING_SYNC_CREATE); nm_editor_bind_wireless_security_method(conn, s_wsec, + s_8021x, security, "active-id", G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE);