Commit 89331ca0 authored by Andrew Zaborowski's avatar Andrew Zaborowski Committed by Lubomir Rintel

all: pass 'hints' from secret agent to ws_wpa_eap_new

The secret agent requests contain two parameters that aren't currently
used when handling Wifi network connections: the setting name and hints.
Those parameters turned out useful with 802.1X / EAP authentication with
NM's IWD backend where it passes a specific 802_1x setting key name that
is being requested in the 'hints' array, one of: identity, password or
private_key_password.
nmcli already gained support for handling such agent requests in
1a6e53808db8bb8e75317fd5feacd74a9a98860f (which was obviously much
easier) so this is an attempt to let the src/wireless-security/* classes
in nm-applet also handle these requests as intended.

A new libnma function nma_wifi_dialog_new_for_secrets is added to
receive the values from setting name and hints without changing existing
API.
parent 755cc564
......@@ -1643,7 +1643,10 @@ wifi_get_secrets (SecretsRequest *req, GError **error)
g_return_val_if_fail (!info->dialog, FALSE);
info->dialog = nma_wifi_dialog_new (req->applet->nm_client, req->connection, NULL, NULL, TRUE);
info->dialog = nma_wifi_dialog_new_for_secrets (req->applet->nm_client,
req->connection,
req->setting_name,
(const char *const*) req->hints);
if (info->dialog) {
applet_secrets_request_set_free_func (req, free_wifi_info);
g_signal_connect (info->dialog, "response",
......
......@@ -68,7 +68,7 @@ finish_setup (CEPage8021xSecurity *self, gpointer user_data)
CEPage8021xSecurityPrivate *priv = CE_PAGE_8021X_SECURITY_GET_PRIVATE (self);
GtkWidget *parent_container;
priv->security = (WirelessSecurity *) ws_wpa_eap_new (parent->connection, TRUE, FALSE);
priv->security = (WirelessSecurity *) ws_wpa_eap_new (parent->connection, TRUE, FALSE, NULL);
if (!priv->security) {
g_warning ("Could not load 802.1X user interface.");
return;
......
......@@ -411,7 +411,7 @@ finish_setup (CEPageWifiSecurity *self, gpointer user_data)
if (security_valid (NMU_SEC_WPA_ENTERPRISE, mode) || security_valid (NMU_SEC_WPA2_ENTERPRISE, mode)) {
WirelessSecurityWPAEAP *ws_wpa_eap;
ws_wpa_eap = ws_wpa_eap_new (connection, TRUE, FALSE);
ws_wpa_eap = ws_wpa_eap_new (connection, TRUE, FALSE, NULL);
if (ws_wpa_eap) {
add_security_item (self, WIRELESS_SECURITY (ws_wpa_eap), sec_model,
&iter, _("WPA & WPA2 Enterprise"), FALSE, FALSE);
......
......@@ -57,7 +57,7 @@ dialog_set_security (NMConnection *connection,
GList *iter;
WirelessSecurity *security;
security = (WirelessSecurity *) ws_wpa_eap_new (connection, FALSE, TRUE);
security = (WirelessSecurity *) ws_wpa_eap_new (connection, FALSE, TRUE, NULL);
/* Remove any previous wireless security widgets */
children = gtk_container_get_children (GTK_CONTAINER (box));
......
......@@ -983,7 +983,7 @@ security_combo_init (NMAWifiDialog *self, gboolean secrets_only)
|| nm_utils_security_valid (NMU_SEC_WPA2_ENTERPRISE, dev_caps, !!priv->ap, is_adhoc, ap_flags, ap_wpa, ap_rsn)) {
WirelessSecurityWPAEAP *ws_wpa_eap;
ws_wpa_eap = ws_wpa_eap_new (priv->connection, FALSE, secrets_only);
ws_wpa_eap = ws_wpa_eap_new (priv->connection, FALSE, secrets_only, NULL);
if (ws_wpa_eap) {
add_security_item (self, WIRELESS_SECURITY (ws_wpa_eap), sec_model,
&iter, _("WPA & WPA2 Enterprise"));
......
......@@ -99,3 +99,7 @@ global:
libnma_1_8_12 {
nma_mobile_wizard_get_type;
} libnma_1_8_0;
libnma_1_8_20 {
nma_wifi_dialog_new_for_secrets;
} libnma_1_8_12;
......@@ -85,7 +85,9 @@ enum {
#define C_SEP_COLUMN 2
#define C_NEW_COLUMN 3
static gboolean security_combo_init (NMAWifiDialog *self, gboolean secrets_only);
static gboolean security_combo_init (NMAWifiDialog *self, gboolean secrets_only,
const char *secrets_setting_name,
const char *const*secrets_hints);
static void ssid_entry_changed (GtkWidget *entry, gpointer user_data);
void
......@@ -363,7 +365,7 @@ connection_combo_changed (GtkWidget *combo,
if (priv->connection)
eap_method_ca_cert_ignore_load (priv->connection);
if (!security_combo_init (self, priv->secrets_only)) {
if (!security_combo_init (self, priv->secrets_only, NULL, NULL)) {
g_warning ("Couldn't change Wi-Fi security combo box.");
return;
}
......@@ -574,7 +576,7 @@ device_combo_changed (GtkWidget *combo,
return;
}
if (!security_combo_init (self, priv->secrets_only)) {
if (!security_combo_init (self, priv->secrets_only, NULL, NULL)) {
g_warning ("Couldn't change Wi-Fi security combo box.");
return;
}
......@@ -824,7 +826,8 @@ out:
}
static gboolean
security_combo_init (NMAWifiDialog *self, gboolean secrets_only)
security_combo_init (NMAWifiDialog *self, gboolean secrets_only,
const char *secrets_setting_name, const char *const*secrets_hints)
{
NMAWifiDialogPrivate *priv;
GtkListStore *sec_model;
......@@ -853,7 +856,8 @@ security_combo_init (NMAWifiDialog *self, gboolean secrets_only)
/* The security options displayed are filtered based on device
* capabilities, and if provided, additionally by access point capabilities.
* If a connection is given, that connection's options should be selected
* by default.
* by default. If hints is non-empty only filter based on the setting
* keys on the hints list.
*/
dev_caps = nm_device_wifi_get_capabilities (NM_DEVICE_WIFI (priv->device));
if (priv->ap != NULL) {
......@@ -970,8 +974,12 @@ security_combo_init (NMAWifiDialog *self, gboolean secrets_only)
if ( nm_utils_security_valid (NMU_SEC_WPA_ENTERPRISE, dev_caps, !!priv->ap, is_adhoc, ap_flags, ap_wpa, ap_rsn)
|| nm_utils_security_valid (NMU_SEC_WPA2_ENTERPRISE, dev_caps, !!priv->ap, is_adhoc, ap_flags, ap_wpa, ap_rsn)) {
WirelessSecurityWPAEAP *ws_wpa_eap;
const char *const*hints = NULL;
ws_wpa_eap = ws_wpa_eap_new (priv->connection, FALSE, secrets_only);
if (secrets_setting_name && !strcmp (secrets_setting_name, NM_SETTING_802_1X_SETTING_NAME))
hints = secrets_hints;
ws_wpa_eap = ws_wpa_eap_new (priv->connection, FALSE, secrets_only, hints);
if (ws_wpa_eap) {
add_security_item (self, WIRELESS_SECURITY (ws_wpa_eap), sec_model,
&iter, _("WPA & WPA2 Enterprise"));
......@@ -1026,7 +1034,9 @@ static gboolean
internal_init (NMAWifiDialog *self,
NMConnection *specific_connection,
NMDevice *specific_device,
gboolean secrets_only)
gboolean secrets_only,
const char *secrets_setting_name,
const char *const*secrets_hints)
{
NMAWifiDialogPrivate *priv = NMA_WIFI_DIALOG_GET_PRIVATE (self);
GtkWidget *widget;
......@@ -1098,7 +1108,7 @@ internal_init (NMAWifiDialog *self,
return FALSE;
}
if (!security_combo_init (self, priv->secrets_only)) {
if (!security_combo_init (self, priv->secrets_only, secrets_setting_name, secrets_hints)) {
g_warning ("Couldn't set up Wi-Fi security combo box.");
return FALSE;
}
......@@ -1256,27 +1266,21 @@ nma_wifi_dialog_get_connection (NMAWifiDialog *self,
return connection;
}
GtkWidget *
nma_wifi_dialog_new (NMClient *client,
static GtkWidget *
internal_new_dialog (NMClient *client,
NMConnection *connection,
NMDevice *device,
NMAccessPoint *ap,
gboolean secrets_only)
gboolean secrets_only,
const char *secrets_setting_name,
const char *const*secrets_hints)
{
NMAWifiDialog *self;
NMAWifiDialogPrivate *priv;
guint32 dev_caps;
g_return_val_if_fail (NM_IS_CLIENT (client), NULL);
g_return_val_if_fail (NM_IS_CONNECTION (connection), NULL);
/* Ensure device validity */
if (device) {
dev_caps = nm_device_get_capabilities (device);
g_return_val_if_fail (dev_caps & NM_DEVICE_CAP_NM_SUPPORTED, NULL);
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
}
self = NMA_WIFI_DIALOG (g_object_new (NMA_TYPE_WIFI_DIALOG, NULL));
if (self) {
priv = NMA_WIFI_DIALOG_GET_PRIVATE (self);
......@@ -1291,7 +1295,7 @@ nma_wifi_dialog_new (NMClient *client,
/* Handle CA cert ignore stuff */
eap_method_ca_cert_ignore_load (connection);
if (!internal_init (self, connection, device, secrets_only)) {
if (!internal_init (self, connection, device, secrets_only, secrets_setting_name, secrets_hints)) {
g_warning ("Couldn't create Wi-Fi security dialog.");
gtk_widget_destroy (GTK_WIDGET (self));
self = NULL;
......@@ -1301,6 +1305,86 @@ nma_wifi_dialog_new (NMClient *client,
return GTK_WIDGET (self);
}
/**
* nma_wifi_dialog_new:
* @client: client to retrieve list of devices or connections from
* @connection: connection to be shown/edited or %NULL
* @device: device to check connection compatibility against
* @ap: AP to check connection compatibility against
* @secrets_only: whether to only ask for secrets for given connection
*
* Creates a wifi connection dialog and populates it with settings from
* @connection if given. If @device is not given a device selection combo box
* will be included. If @connection is not given a connection selection combo
* box will be included. If @secrets_only is %FALSE a complete connection
* creator/editor dialog is returned, otherwise only wifi security secrets
* relevant to the security settings in @connection are going to be shown and
* will be editable.
*
* Returns: the dialog widget or %NULL in case of error
*/
GtkWidget *
nma_wifi_dialog_new (NMClient *client,
NMConnection *connection,
NMDevice *device,
NMAccessPoint *ap,
gboolean secrets_only)
{
guint32 dev_caps;
/* Ensure device validity */
if (device) {
dev_caps = nm_device_get_capabilities (device);
g_return_val_if_fail (dev_caps & NM_DEVICE_CAP_NM_SUPPORTED, NULL);
g_return_val_if_fail (NM_IS_DEVICE_WIFI (device), NULL);
}
return internal_new_dialog (client,
connection,
device,
ap,
secrets_only,
NULL,
NULL);
}
/**
* nma_wifi_dialog_new_for_secrets:
* @client: client to retrieve list of devices or connections from
* @connection: connection for which secrets are requested
* @secrets_setting_name: setting name whose secrets are requested
* or %NULL
* @secrets_hints: array of setting key names within the setting given in
* @secrets_setting_name which are requested or %NULL
*
* Creates a wifi secrets dialog and populates it with setting values from
* @connection. If @secrets_setting_name and @secrets_hints are not given
* this function creates an identical dialog as nma_wifi_dialog_new() would
* create with the @secrets_only parameter %TRUE. Otherwise
* @secrets_setting_name and @secrets_hints determine the list of specific
* secrets that are being requested from the user and no editable entries
* are shown for any other settings.
*
* Note: only a subset of all settings and setting keys is supported as
* @secrets_setting_name and @secrets_hints.
*
* Returns: the dialog widget or %NULL in case of error
*/
GtkWidget *
nma_wifi_dialog_new_for_secrets (NMClient *client,
NMConnection *connection,
const char *secrets_setting_name,
const char *const*secrets_hints)
{
return internal_new_dialog (client,
connection,
NULL,
NULL,
TRUE,
secrets_setting_name,
secrets_hints);
}
static GtkWidget *
internal_new_operation (NMClient *client,
guint operation)
......@@ -1321,7 +1405,7 @@ internal_new_operation (NMClient *client,
priv->group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
priv->operation = operation;
if (!internal_init (self, NULL, NULL, FALSE)) {
if (!internal_init (self, NULL, NULL, FALSE, NULL, NULL)) {
g_warning ("Couldn't create Wi-Fi security dialog.");
gtk_widget_destroy (GTK_WIDGET (self));
return NULL;
......
......@@ -53,6 +53,11 @@ GtkWidget *nma_wifi_dialog_new (NMClient *client,
NMAccessPoint *ap,
gboolean secrets_only);
GtkWidget *nma_wifi_dialog_new_for_secrets (NMClient *client,
NMConnection *connection,
const char *secrets_setting_name,
const char *const*secrets_hints);
GtkWidget *nma_wifi_dialog_new_for_hidden (NMClient *client);
GtkWidget *nma_wifi_dialog_new_for_create (NMClient *client);
......
......@@ -99,7 +99,8 @@ update_secrets (WirelessSecurity *parent, NMConnection *connection)
WirelessSecurityWPAEAP *
ws_wpa_eap_new (NMConnection *connection,
gboolean is_editor,
gboolean secrets_only)
gboolean secrets_only,
const char *const*secrets_hints)
{
WirelessSecurity *parent;
GtkWidget *widget;
......
......@@ -27,6 +27,7 @@ typedef struct _WirelessSecurityWPAEAP WirelessSecurityWPAEAP;
WirelessSecurityWPAEAP * ws_wpa_eap_new (NMConnection *connection,
gboolean is_editor,
gboolean secrets_only);
gboolean secrets_only,
const char *const*secrets_hints);
#endif /* WS_WPA_EAP_H */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment