From 6dd07a80e535a2e76e7304c92d4db97097af98a4 Mon Sep 17 00:00:00 2001 From: Mitchell Augustin Date: Fri, 19 Sep 2025 11:51:04 -0500 Subject: [PATCH] core: add handlers for PskMismatch signal Trigger a new PSK request to the user when the PskMismatch signal is received from wpa_supplicant. Closes #904 --- src/core/devices/wifi/nm-device-wifi.c | 38 +++++++++++++++++++ src/core/supplicant/nm-supplicant-interface.c | 15 ++++++++ src/core/supplicant/nm-supplicant-interface.h | 1 + 3 files changed, 54 insertions(+) diff --git a/src/core/devices/wifi/nm-device-wifi.c b/src/core/devices/wifi/nm-device-wifi.c index b890b11052..395e0c8e5f 100644 --- a/src/core/devices/wifi/nm-device-wifi.c +++ b/src/core/devices/wifi/nm-device-wifi.c @@ -191,6 +191,9 @@ static void supplicant_iface_notify_p2p_available(NMSupplicantInterface *iface, GParamSpec *pspec, NMDeviceWifi *self); +static void supplicant_iface_notify_wpa_psk_mismatch_cb(NMSupplicantInterface *iface, + NMDeviceWifi *self); + static void periodic_update(NMDeviceWifi *self); static void ap_add_remove(NMDeviceWifi *self, @@ -624,6 +627,10 @@ supplicant_interface_acquire_cb(NMSupplicantManager *supplicant_manager, "notify::" NM_SUPPLICANT_INTERFACE_P2P_AVAILABLE, G_CALLBACK(supplicant_iface_notify_p2p_available), self); + g_signal_connect(priv->sup_iface, + NM_SUPPLICANT_INTERFACE_PSK_MISMATCH, + G_CALLBACK(supplicant_iface_notify_wpa_psk_mismatch_cb), + self); _scan_notify_is_scanning(self); @@ -2398,6 +2405,9 @@ handle_8021x_or_psk_auth_fail(NMDeviceWifi *self, g_return_val_if_fail(new_state == NM_SUPPLICANT_INTERFACE_STATE_DISCONNECTED, FALSE); + if (nm_device_get_state(device) != NM_DEVICE_STATE_CONFIG) + return FALSE; + req = nm_device_get_act_request(NM_DEVICE(self)); g_return_val_if_fail(req != NULL, FALSE); @@ -2841,6 +2851,34 @@ handle_auth_or_fail(NMDeviceWifi *self, NMActRequest *req, gboolean new_secrets) return TRUE; } +static void +supplicant_iface_notify_wpa_psk_mismatch_cb(NMSupplicantInterface *iface, NMDeviceWifi *self) +{ + NMDevice *device = NM_DEVICE(self); + NMActRequest *req; + const char *setting_name = NM_SETTING_WIRELESS_SECURITY_SETTING_NAME; + + if (nm_device_get_state(device) != NM_DEVICE_STATE_CONFIG) + return; + + _LOGI(LOGD_DEVICE | LOGD_WIFI, + "Activation: (wifi) psk mismatch reported by supplicant, asking for new key"); + + req = nm_device_get_act_request(NM_DEVICE(self)); + g_return_if_fail(req != NULL); + + nm_act_request_clear_secrets(req); + + cleanup_association_attempt(self, TRUE); + nm_device_state_changed(device, + NM_DEVICE_STATE_NEED_AUTH, + NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT); + wifi_secrets_get_secrets(self, + setting_name, + NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION + | NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW); +} + /* * supplicant_connection_timeout_cb * diff --git a/src/core/supplicant/nm-supplicant-interface.c b/src/core/supplicant/nm-supplicant-interface.c index 514b7c0d39..43926d4228 100644 --- a/src/core/supplicant/nm-supplicant-interface.c +++ b/src/core/supplicant/nm-supplicant-interface.c @@ -65,6 +65,7 @@ enum { WPS_CREDENTIALS, /* WPS credentials received */ GROUP_STARTED, /* a new Group (interface) was created */ GROUP_FINISHED, /* a Group (interface) has been finished */ + PSK_MISMATCH, /* supplicant reported incorrect PSK */ LAST_SIGNAL }; @@ -3105,6 +3106,10 @@ _signal_handle(NMSupplicantInterface *self, return; } + if (nm_streq(signal_name, "PskMismatch")) { + g_signal_emit(self, signals[PSK_MISMATCH], 0); + return; + } return; } @@ -3737,4 +3742,14 @@ nm_supplicant_interface_class_init(NMSupplicantInterfaceClass *klass) G_TYPE_NONE, 1, G_TYPE_STRING); + + signals[PSK_MISMATCH] = g_signal_new(NM_SUPPLICANT_INTERFACE_PSK_MISMATCH, + G_OBJECT_CLASS_TYPE(object_class), + G_SIGNAL_RUN_LAST, + 0, + NULL, + NULL, + NULL, + G_TYPE_NONE, + 0); } diff --git a/src/core/supplicant/nm-supplicant-interface.h b/src/core/supplicant/nm-supplicant-interface.h index b8d9b013d2..961de1b149 100644 --- a/src/core/supplicant/nm-supplicant-interface.h +++ b/src/core/supplicant/nm-supplicant-interface.h @@ -86,6 +86,7 @@ typedef enum { #define NM_SUPPLICANT_INTERFACE_WPS_CREDENTIALS "wps-credentials" #define NM_SUPPLICANT_INTERFACE_GROUP_STARTED "group-started" #define NM_SUPPLICANT_INTERFACE_GROUP_FINISHED "group-finished" +#define NM_SUPPLICANT_INTERFACE_PSK_MISMATCH "wpa-psk-mismatch" typedef struct _NMSupplicantInterfaceClass NMSupplicantInterfaceClass;