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
This commit is contained in:
Mitchell Augustin 2025-09-19 11:51:04 -05:00 committed by Beniamino Galvani
parent 04ddd72ce9
commit 6dd07a80e5
3 changed files with 54 additions and 0 deletions

View file

@ -191,6 +191,9 @@ static void supplicant_iface_notify_p2p_available(NMSupplicantInterface *iface,
GParamSpec *pspec, GParamSpec *pspec,
NMDeviceWifi *self); NMDeviceWifi *self);
static void supplicant_iface_notify_wpa_psk_mismatch_cb(NMSupplicantInterface *iface,
NMDeviceWifi *self);
static void periodic_update(NMDeviceWifi *self); static void periodic_update(NMDeviceWifi *self);
static void ap_add_remove(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, "notify::" NM_SUPPLICANT_INTERFACE_P2P_AVAILABLE,
G_CALLBACK(supplicant_iface_notify_p2p_available), G_CALLBACK(supplicant_iface_notify_p2p_available),
self); 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); _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); 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)); req = nm_device_get_act_request(NM_DEVICE(self));
g_return_val_if_fail(req != NULL, FALSE); 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; 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 * supplicant_connection_timeout_cb
* *

View file

@ -65,6 +65,7 @@ enum {
WPS_CREDENTIALS, /* WPS credentials received */ WPS_CREDENTIALS, /* WPS credentials received */
GROUP_STARTED, /* a new Group (interface) was created */ GROUP_STARTED, /* a new Group (interface) was created */
GROUP_FINISHED, /* a Group (interface) has been finished */ GROUP_FINISHED, /* a Group (interface) has been finished */
PSK_MISMATCH, /* supplicant reported incorrect PSK */
LAST_SIGNAL LAST_SIGNAL
}; };
@ -3105,6 +3106,10 @@ _signal_handle(NMSupplicantInterface *self,
return; return;
} }
if (nm_streq(signal_name, "PskMismatch")) {
g_signal_emit(self, signals[PSK_MISMATCH], 0);
return;
}
return; return;
} }
@ -3737,4 +3742,14 @@ nm_supplicant_interface_class_init(NMSupplicantInterfaceClass *klass)
G_TYPE_NONE, G_TYPE_NONE,
1, 1,
G_TYPE_STRING); 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);
} }

View file

@ -86,6 +86,7 @@ typedef enum {
#define NM_SUPPLICANT_INTERFACE_WPS_CREDENTIALS "wps-credentials" #define NM_SUPPLICANT_INTERFACE_WPS_CREDENTIALS "wps-credentials"
#define NM_SUPPLICANT_INTERFACE_GROUP_STARTED "group-started" #define NM_SUPPLICANT_INTERFACE_GROUP_STARTED "group-started"
#define NM_SUPPLICANT_INTERFACE_GROUP_FINISHED "group-finished" #define NM_SUPPLICANT_INTERFACE_GROUP_FINISHED "group-finished"
#define NM_SUPPLICANT_INTERFACE_PSK_MISMATCH "wpa-psk-mismatch"
typedef struct _NMSupplicantInterfaceClass NMSupplicantInterfaceClass; typedef struct _NMSupplicantInterfaceClass NMSupplicantInterfaceClass;