Blame src/wireless-security/eap-method-tls.c

Packit Service 639700
// SPDX-License-Identifier: GPL-2.0+
Packit fabffb
/* NetworkManager Applet -- allow user control over networking
Packit fabffb
 *
Packit fabffb
 * Dan Williams <dcbw@redhat.com>
Packit fabffb
 * Lubomir Rintel <lkundrak@v3.sk>
Packit fabffb
 *
Packit fabffb
 * Copyright 2007 - 2017 Red Hat, Inc.
Packit fabffb
 */
Packit fabffb
Packit fabffb
#include "nm-default.h"
Packit fabffb
Packit fabffb
#include <ctype.h>
Packit fabffb
#include <string.h>
Packit fabffb
Packit fabffb
#include "eap-method.h"
Packit fabffb
#include "wireless-security.h"
Packit fabffb
#include "helpers.h"
Packit fabffb
#include "nma-ui-utils.h"
Packit fabffb
#include "nma-cert-chooser.h"
Packit fabffb
#include "utils.h"
Packit fabffb
Packit fabffb
struct _EAPMethodTLS {
Packit fabffb
	EAPMethod parent;
Packit fabffb
Packit fabffb
	const char *ca_cert_password_flags_name;
Packit fabffb
	const char *client_cert_password_flags_name;
Packit fabffb
	const char *client_key_password_flags_name;
Packit fabffb
Packit fabffb
	gboolean editing_connection;
Packit fabffb
	GtkWidget *ca_cert_chooser;
Packit fabffb
	GtkWidget *client_cert_chooser;
Packit fabffb
};
Packit fabffb
Packit fabffb
Packit fabffb
static gboolean
Packit fabffb
validate (EAPMethod *parent, GError **error)
Packit fabffb
{
Packit fabffb
	EAPMethodTLS *method = (EAPMethodTLS *) parent;
Packit fabffb
	GtkWidget *widget;
Packit fabffb
	const char *identity;
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_identity_entry"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	identity = gtk_entry_get_text (GTK_ENTRY (widget));
Packit fabffb
	if (!identity || !strlen (identity)) {
Packit fabffb
		widget_set_error (widget);
Packit fabffb
		g_set_error_literal (error, NMA_ERROR, NMA_ERROR_GENERIC, _("missing EAP-TLS identity"));
Packit fabffb
		return FALSE;
Packit fabffb
	} else {
Packit fabffb
		widget_unset_error (widget);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	if (   gtk_widget_get_sensitive (method->ca_cert_chooser)
Packit fabffb
	    && !nma_cert_chooser_validate (NMA_CERT_CHOOSER (method->ca_cert_chooser), error))
Packit fabffb
		return FALSE;
Packit fabffb
Packit fabffb
	if (!nma_cert_chooser_validate (NMA_CERT_CHOOSER (method->client_cert_chooser), error))
Packit fabffb
		return FALSE;
Packit fabffb
Packit fabffb
	return TRUE;
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
ca_cert_not_required_toggled (GtkWidget *button, gpointer user_data)
Packit fabffb
{
Packit fabffb
	EAPMethodTLS *method = (EAPMethodTLS *) user_data;
Packit fabffb
Packit fabffb
	gtk_widget_set_sensitive (method->ca_cert_chooser,
Packit fabffb
	                          !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
add_to_size_group (EAPMethod *parent, GtkSizeGroup *group)
Packit fabffb
{
Packit fabffb
	EAPMethodTLS *method = (EAPMethodTLS *) parent;
Packit fabffb
	GtkWidget *widget;
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_identity_label"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	gtk_size_group_add_widget (group, widget);
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_domain_label"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	gtk_size_group_add_widget (group, widget);
Packit fabffb
Packit fabffb
	nma_cert_chooser_add_to_size_group (NMA_CERT_CHOOSER (method->client_cert_chooser), group);
Packit fabffb
	nma_cert_chooser_add_to_size_group (NMA_CERT_CHOOSER (method->ca_cert_chooser), group);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
fill_connection (EAPMethod *parent, NMConnection *connection)
Packit fabffb
{
Packit fabffb
	EAPMethodTLS *method = (EAPMethodTLS *) parent;
Packit fabffb
	NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
Packit fabffb
	NMSetting8021x *s_8021x;
Packit fabffb
	NMSettingSecretFlags secret_flags;
Packit fabffb
	GtkWidget *widget;
Packit fabffb
	char *value = NULL;
Packit fabffb
	const char *password = NULL;
Packit fabffb
	GError *error = NULL;
Packit fabffb
	gboolean ca_cert_error = FALSE;
Packit fabffb
	NMSetting8021xCKScheme scheme;
Packit fabffb
Packit fabffb
	s_8021x = nm_connection_get_setting_802_1x (connection);
Packit fabffb
	g_assert (s_8021x);
Packit fabffb
Packit fabffb
	if (parent->phase2)
Packit fabffb
		g_object_set (s_8021x, NM_SETTING_802_1X_PHASE2_AUTH, "tls", NULL);
Packit fabffb
	else
Packit fabffb
		nm_setting_802_1x_add_eap_method (s_8021x, "tls");
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_identity_entry"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	g_object_set (s_8021x, NM_SETTING_802_1X_IDENTITY, gtk_entry_get_text (GTK_ENTRY (widget)), NULL);
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_domain_entry"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	g_object_set (s_8021x,
Packit fabffb
	              parent->phase2 ? NM_SETTING_802_1X_PHASE2_DOMAIN_SUFFIX_MATCH : NM_SETTING_802_1X_DOMAIN_SUFFIX_MATCH,
Packit fabffb
	              gtk_entry_get_text (GTK_ENTRY (widget)), NULL);
Packit fabffb
Packit fabffb
	/* TLS private key */
Packit fabffb
	password = nma_cert_chooser_get_key_password (NMA_CERT_CHOOSER (method->client_cert_chooser));
Packit fabffb
	value = nma_cert_chooser_get_key (NMA_CERT_CHOOSER (method->client_cert_chooser), &scheme);
Packit fabffb
Packit fabffb
	if (parent->phase2) {
Packit fabffb
		if (!nm_setting_802_1x_set_phase2_private_key (s_8021x, value, password, scheme, &format, &error)) {
Packit fabffb
			g_warning ("Couldn't read phase2 private key '%s': %s", value, error ? error->message : "(unknown)");
Packit fabffb
			g_clear_error (&error);
Packit fabffb
		}
Packit fabffb
	} else {
Packit fabffb
		if (!nm_setting_802_1x_set_private_key (s_8021x, value, password, scheme, &format, &error)) {
Packit fabffb
			g_warning ("Couldn't read private key '%s': %s", value, error ? error->message : "(unknown)");
Packit fabffb
			g_clear_error (&error);
Packit fabffb
		}
Packit fabffb
	}
Packit fabffb
	g_free (value);
Packit fabffb
Packit fabffb
	/* Save CA certificate PIN and its flags to the connection */
Packit fabffb
	secret_flags = nma_cert_chooser_get_cert_password_flags (NMA_CERT_CHOOSER (method->ca_cert_chooser));
Packit fabffb
	nm_setting_set_secret_flags (NM_SETTING (s_8021x), method->ca_cert_password_flags_name,
Packit fabffb
	                             secret_flags, NULL);
Packit fabffb
	if (method->editing_connection) {
Packit fabffb
		/* Update secret flags and popup when editing the connection */
Packit fabffb
		nma_cert_chooser_update_cert_password_storage (NMA_CERT_CHOOSER (method->ca_cert_chooser),
Packit fabffb
		                                               secret_flags, NM_SETTING (s_8021x),
Packit fabffb
		                                               method->ca_cert_password_flags_name);
Packit fabffb
		g_object_set (s_8021x, method->ca_cert_password_flags_name,
Packit fabffb
		              nma_cert_chooser_get_cert_password (NMA_CERT_CHOOSER (method->ca_cert_chooser)),
Packit fabffb
		              NULL);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	/* Save user certificate PIN and its flags flags to the connection */
Packit fabffb
	secret_flags = nma_cert_chooser_get_cert_password_flags (NMA_CERT_CHOOSER (method->client_cert_chooser));
Packit fabffb
	nm_setting_set_secret_flags (NM_SETTING (s_8021x), method->client_cert_password_flags_name,
Packit fabffb
	                             secret_flags, NULL);
Packit fabffb
	if (method->editing_connection) {
Packit fabffb
		nma_cert_chooser_update_cert_password_storage (NMA_CERT_CHOOSER (method->client_cert_chooser),
Packit fabffb
		                                               secret_flags, NM_SETTING (s_8021x),
Packit fabffb
		                                               method->client_cert_password_flags_name);
Packit fabffb
		g_object_set (s_8021x, method->client_cert_password_flags_name,
Packit fabffb
		              nma_cert_chooser_get_cert_password (NMA_CERT_CHOOSER (method->client_cert_chooser)),
Packit fabffb
		              NULL);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	/* Save user private key password flags to the connection */
Packit fabffb
	secret_flags = nma_cert_chooser_get_key_password_flags (NMA_CERT_CHOOSER (method->client_cert_chooser));
Packit fabffb
	nm_setting_set_secret_flags (NM_SETTING (s_8021x), method->client_key_password_flags_name,
Packit fabffb
	                             secret_flags, NULL);
Packit fabffb
	if (method->editing_connection) {
Packit fabffb
		nma_cert_chooser_update_key_password_storage (NMA_CERT_CHOOSER (method->client_cert_chooser),
Packit fabffb
		                                              secret_flags, NM_SETTING (s_8021x),
Packit fabffb
		                                              method->client_key_password_flags_name);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	/* TLS client certificate */
Packit fabffb
	if (format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
Packit fabffb
		/* If the key is pkcs#12 nm_setting_802_1x_set_private_key() already
Packit fabffb
		 * set the client certificate for us.
Packit fabffb
		 */
Packit fabffb
		value = nma_cert_chooser_get_cert (NMA_CERT_CHOOSER (method->client_cert_chooser), &scheme);
Packit fabffb
		format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
Packit fabffb
		if (parent->phase2) {
Packit fabffb
			if (!nm_setting_802_1x_set_phase2_client_cert (s_8021x, value, scheme, &format, &error)) {
Packit fabffb
				g_warning ("Couldn't read phase2 client certificate '%s': %s", value, error ? error->message : "(unknown)");
Packit fabffb
				g_clear_error (&error);
Packit fabffb
			}
Packit fabffb
		} else {
Packit fabffb
			if (!nm_setting_802_1x_set_client_cert (s_8021x, value, scheme, &format, &error)) {
Packit fabffb
				g_warning ("Couldn't read client certificate '%s': %s", value, error ? error->message : "(unknown)");
Packit fabffb
				g_clear_error (&error);
Packit fabffb
			}
Packit fabffb
		}
Packit fabffb
		g_free (value);
Packit fabffb
	}
Packit fabffb
Packit fabffb
	/* TLS CA certificate */
Packit fabffb
	if (gtk_widget_get_sensitive (method->ca_cert_chooser))
Packit fabffb
		value = nma_cert_chooser_get_cert (NMA_CERT_CHOOSER (method->ca_cert_chooser), &scheme);
Packit fabffb
	else
Packit fabffb
		value = NULL;
Packit fabffb
	format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
Packit fabffb
	if (parent->phase2) {
Packit fabffb
		if (!nm_setting_802_1x_set_phase2_ca_cert (s_8021x, value, scheme, &format, &error)) {
Packit fabffb
			g_warning ("Couldn't read phase2 CA certificate '%s': %s", value, error ? error->message : "(unknown)");
Packit fabffb
			g_clear_error (&error);
Packit fabffb
			ca_cert_error = TRUE;
Packit fabffb
		}
Packit fabffb
	} else {
Packit fabffb
		if (!nm_setting_802_1x_set_ca_cert (s_8021x, value, scheme, &format, &error)) {
Packit fabffb
			g_warning ("Couldn't read CA certificate '%s': %s", value, error ? error->message : "(unknown)");
Packit fabffb
			g_clear_error (&error);
Packit fabffb
			ca_cert_error = TRUE;
Packit fabffb
		}
Packit fabffb
	}
Packit fabffb
	eap_method_ca_cert_ignore_set (parent, connection, value, ca_cert_error);
Packit fabffb
	g_free (value);
Packit fabffb
}
Packit fabffb
Packit fabffb
static GError *
Packit fabffb
client_cert_validate_cb (NMACertChooser *cert_chooser, gpointer user_data)
Packit fabffb
{
Packit fabffb
	NMSetting8021xCKScheme scheme;
Packit fabffb
        NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
Packit fabffb
	gs_unref_object NMSetting8021x *setting = NULL;
Packit fabffb
	gs_free char *value = NULL;
Packit fabffb
	GError *local = NULL;
Packit fabffb
Packit fabffb
	setting = (NMSetting8021x *) nm_setting_802_1x_new ();
Packit fabffb
Packit fabffb
	value = nma_cert_chooser_get_cert (cert_chooser, &scheme);
Packit fabffb
	if (!value) {
Packit fabffb
		return g_error_new_literal (NMA_ERROR, NMA_ERROR_GENERIC,
Packit fabffb
		                            _("no user certificate selected"));
Packit fabffb
	}
Packit fabffb
	if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
Packit fabffb
		if (!g_file_test (value, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
Packit fabffb
			return g_error_new_literal (NMA_ERROR, NMA_ERROR_GENERIC,
Packit fabffb
			                            _("selected user certificate file does not exist"));
Packit fabffb
		}
Packit fabffb
	}
Packit fabffb
Packit fabffb
	if (!nm_setting_802_1x_set_client_cert (setting, value, scheme, &format, &local))
Packit fabffb
		return local;
Packit fabffb
Packit fabffb
	return NULL;
Packit fabffb
}
Packit fabffb
Packit fabffb
static GError *
Packit fabffb
client_key_validate_cb (NMACertChooser *cert_chooser, gpointer user_data)
Packit fabffb
{
Packit fabffb
	NMSetting8021xCKScheme scheme;
Packit fabffb
	gs_free char *value = NULL;
Packit fabffb
Packit fabffb
Packit fabffb
	value = nma_cert_chooser_get_key (cert_chooser, &scheme);
Packit fabffb
	if (!value) {
Packit fabffb
		return g_error_new_literal (NMA_ERROR, NMA_ERROR_GENERIC,
Packit fabffb
		                            _("no key selected"));
Packit fabffb
	}
Packit fabffb
	if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
Packit fabffb
		if (!g_file_test (value, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) {
Packit fabffb
			return g_error_new_literal (NMA_ERROR, NMA_ERROR_GENERIC,
Packit fabffb
			                            _("selected key file does not exist"));
Packit fabffb
		}
Packit fabffb
	}
Packit fabffb
Packit fabffb
	return NULL;
Packit fabffb
}
Packit fabffb
Packit fabffb
static GError *
Packit fabffb
client_key_password_validate_cb (NMACertChooser *cert_chooser, gpointer user_data)
Packit fabffb
{
Packit fabffb
	NMSetting8021xCKScheme scheme;
Packit fabffb
	NMSettingSecretFlags secret_flags;
Packit fabffb
	gs_unref_object NMSetting8021x *setting = NULL;
Packit fabffb
	gs_free char *value = NULL;
Packit fabffb
	const char *password = NULL;
Packit fabffb
	GError *local = NULL;
Packit fabffb
Packit fabffb
	secret_flags = nma_cert_chooser_get_key_password_flags (cert_chooser);
Packit fabffb
	if (   secret_flags & NM_SETTING_SECRET_FLAG_NOT_SAVED
Packit fabffb
	    || secret_flags & NM_SETTING_SECRET_FLAG_NOT_REQUIRED)
Packit fabffb
		return NULL;
Packit fabffb
Packit fabffb
	setting = (NMSetting8021x *) nm_setting_802_1x_new ();
Packit fabffb
Packit fabffb
	value = nma_cert_chooser_get_key (cert_chooser, &scheme);
Packit fabffb
	password = nma_cert_chooser_get_key_password (cert_chooser);
Packit fabffb
	if (!nm_setting_802_1x_set_private_key (setting, value, password, scheme, NULL, &local))
Packit fabffb
		return local;
Packit fabffb
Packit fabffb
	return NULL;
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
client_cert_fixup_pkcs12 (NMACertChooser *cert_chooser, gpointer user_data)
Packit fabffb
{
Packit fabffb
	NMSetting8021xCKScheme cert_scheme, key_scheme;
Packit fabffb
        NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
Packit fabffb
	gs_free char *cert_value = NULL;
Packit fabffb
	gs_free char *key_value = NULL;
Packit fabffb
	gs_unref_object NMSetting8021x *setting = NULL;
Packit fabffb
Packit fabffb
	setting = (NMSetting8021x *) nm_setting_802_1x_new ();
Packit fabffb
Packit fabffb
	cert_value = nma_cert_chooser_get_cert (cert_chooser, &cert_scheme);
Packit fabffb
	key_value = nma_cert_chooser_get_key (cert_chooser, &key_scheme);
Packit fabffb
Packit fabffb
	if (   !cert_value || key_value
Packit fabffb
	    || !nm_setting_802_1x_set_client_cert (setting, cert_value, cert_scheme, &format, NULL))
Packit fabffb
		return;
Packit fabffb
Packit fabffb
	if (format == NM_SETTING_802_1X_CK_FORMAT_PKCS12)
Packit fabffb
		nma_cert_chooser_set_key (cert_chooser, cert_value, cert_scheme);
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
update_secrets (EAPMethod *parent, NMConnection *connection)
Packit fabffb
{
Packit fabffb
	EAPMethodTLS *method = (EAPMethodTLS *) parent;
Packit fabffb
Packit fabffb
	eap_method_setup_cert_chooser (NMA_CERT_CHOOSER (method->client_cert_chooser),
Packit fabffb
	                               nm_connection_get_setting_802_1x (connection),
Packit fabffb
	                               NULL,
Packit fabffb
	                               NULL,
Packit fabffb
	                               NULL,
Packit fabffb
	                               parent->phase2 ? nm_setting_802_1x_get_phase2_client_cert_password : nm_setting_802_1x_get_client_cert_password,
Packit fabffb
	                               parent->phase2 ? nm_setting_802_1x_get_phase2_private_key_scheme : nm_setting_802_1x_get_private_key_scheme,
Packit fabffb
	                               parent->phase2 ? nm_setting_802_1x_get_phase2_private_key_path : nm_setting_802_1x_get_private_key_path,
Packit fabffb
	                               parent->phase2 ? nm_setting_802_1x_get_phase2_private_key_uri : nm_setting_802_1x_get_private_key_uri,
Packit fabffb
	                               parent->phase2 ? nm_setting_802_1x_get_phase2_private_key_password : nm_setting_802_1x_get_private_key_password);
Packit fabffb
}
Packit fabffb
Packit fabffb
EAPMethodTLS *
Packit fabffb
eap_method_tls_new (WirelessSecurity *ws_parent,
Packit fabffb
                    NMConnection *connection,
Packit fabffb
                    gboolean phase2,
Packit fabffb
                    gboolean secrets_only)
Packit fabffb
{
Packit fabffb
	EAPMethodTLS *method;
Packit fabffb
	EAPMethod *parent;
Packit fabffb
	GtkWidget *widget;
Packit fabffb
	NMSetting8021x *s_8021x = NULL;
Packit fabffb
	gboolean ca_not_required = FALSE;
Packit fabffb
Packit fabffb
	parent = eap_method_init (sizeof (EAPMethodTLS),
Packit fabffb
	                          validate,
Packit fabffb
	                          add_to_size_group,
Packit fabffb
	                          fill_connection,
Packit fabffb
	                          update_secrets,
Packit fabffb
	                          NULL,
Packit fabffb
	                          "/org/freedesktop/network-manager-applet/eap-method-tls.ui",
Packit fabffb
	                          "eap_tls_notebook",
Packit fabffb
	                          "eap_tls_identity_entry",
Packit fabffb
	                          phase2);
Packit fabffb
	if (!parent)
Packit fabffb
		return NULL;
Packit fabffb
Packit fabffb
	method = (EAPMethodTLS *) parent;
Packit fabffb
	method->ca_cert_password_flags_name = phase2
Packit fabffb
	                                      ? NM_SETTING_802_1X_PHASE2_CA_CERT_PASSWORD
Packit fabffb
	                                      : NM_SETTING_802_1X_CA_CERT_PASSWORD;
Packit fabffb
	method->client_cert_password_flags_name = phase2
Packit fabffb
	                                          ? NM_SETTING_802_1X_PHASE2_CLIENT_CERT_PASSWORD
Packit fabffb
	                                          : NM_SETTING_802_1X_CLIENT_CERT_PASSWORD;
Packit fabffb
	method->client_key_password_flags_name = phase2
Packit fabffb
	                                         ? NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD
Packit fabffb
	                                         : NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD;
Packit fabffb
	method->editing_connection = secrets_only ? FALSE : TRUE;
Packit fabffb
Packit fabffb
	if (connection)
Packit fabffb
		s_8021x = nm_connection_get_setting_802_1x (connection);
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_ca_cert_not_required_checkbox"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	g_signal_connect (G_OBJECT (widget), "toggled",
Packit fabffb
	                  (GCallback) ca_cert_not_required_toggled,
Packit fabffb
	                  parent);
Packit fabffb
	g_signal_connect (G_OBJECT (widget), "toggled",
Packit fabffb
	                  (GCallback) wireless_security_changed_cb,
Packit fabffb
	                  ws_parent);
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_identity_entry"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	g_signal_connect (G_OBJECT (widget), "changed",
Packit fabffb
	                  (GCallback) wireless_security_changed_cb,
Packit fabffb
	                  ws_parent);
Packit fabffb
	if (s_8021x && nm_setting_802_1x_get_identity (s_8021x))
Packit fabffb
		gtk_entry_set_text (GTK_ENTRY (widget), nm_setting_802_1x_get_identity (s_8021x));
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_domain_entry"));
Packit fabffb
	g_assert (widget);
Packit fabffb
	g_signal_connect (G_OBJECT (widget), "changed",
Packit fabffb
	                  (GCallback) wireless_security_changed_cb,
Packit fabffb
	                  ws_parent);
Packit fabffb
	if (phase2) {
Packit fabffb
		if (s_8021x && nm_setting_802_1x_get_phase2_domain_suffix_match (s_8021x))
Packit fabffb
			gtk_entry_set_text (GTK_ENTRY (widget), nm_setting_802_1x_get_phase2_domain_suffix_match (s_8021x));
Packit fabffb
	} else {
Packit fabffb
		if (s_8021x && nm_setting_802_1x_get_domain_suffix_match (s_8021x))
Packit fabffb
			gtk_entry_set_text (GTK_ENTRY (widget), nm_setting_802_1x_get_domain_suffix_match (s_8021x));
Packit fabffb
	}
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_grid"));
Packit fabffb
	g_assert (widget);
Packit fabffb
Packit fabffb
	method->ca_cert_chooser = nma_cert_chooser_new ("CA",
Packit fabffb
	                                                  NMA_CERT_CHOOSER_FLAG_CERT
Packit fabffb
	                                                | (secrets_only ? NMA_CERT_CHOOSER_FLAG_PASSWORDS : 0));
Packit fabffb
	gtk_grid_attach (GTK_GRID (widget), method->ca_cert_chooser, 0, 2, 2, 1);
Packit fabffb
	gtk_widget_show (method->ca_cert_chooser);
Packit fabffb
Packit fabffb
	g_signal_connect (method->ca_cert_chooser,
Packit fabffb
	                  "cert-validate",
Packit fabffb
	                  G_CALLBACK (eap_method_ca_cert_validate_cb),
Packit fabffb
	                  NULL);
Packit fabffb
	g_signal_connect (method->ca_cert_chooser,
Packit fabffb
	                  "changed",
Packit fabffb
	                  G_CALLBACK (wireless_security_changed_cb),
Packit fabffb
	                  ws_parent);
Packit fabffb
Packit fabffb
	eap_method_setup_cert_chooser (NMA_CERT_CHOOSER (method->ca_cert_chooser), s_8021x,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_ca_cert_scheme : nm_setting_802_1x_get_ca_cert_scheme,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_ca_cert_path : nm_setting_802_1x_get_ca_cert_path,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_ca_cert_uri : nm_setting_802_1x_get_ca_cert_uri,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_ca_cert_password : nm_setting_802_1x_get_ca_cert_password,
Packit fabffb
	                               NULL,
Packit fabffb
	                               NULL,
Packit fabffb
	                               NULL,
Packit fabffb
	                               NULL);
Packit fabffb
Packit fabffb
	if (connection && eap_method_ca_cert_ignore_get (parent, connection)) {
Packit fabffb
		gchar *ca_cert;
Packit fabffb
		NMSetting8021xCKScheme scheme;
Packit fabffb
Packit fabffb
		ca_cert = nma_cert_chooser_get_cert (NMA_CERT_CHOOSER (method->ca_cert_chooser), &scheme);
Packit fabffb
		if (ca_cert)
Packit fabffb
			g_free (ca_cert);
Packit fabffb
		else
Packit fabffb
			ca_not_required = TRUE;
Packit fabffb
	}
Packit fabffb
Packit fabffb
	if (secrets_only)
Packit fabffb
		ca_not_required = TRUE;
Packit fabffb
Packit fabffb
	method->client_cert_chooser = nma_cert_chooser_new ("User",
Packit fabffb
	                                                    secrets_only ? NMA_CERT_CHOOSER_FLAG_PASSWORDS : 0);
Packit fabffb
	gtk_grid_attach (GTK_GRID (widget), method->client_cert_chooser, 0, 4, 2, 1);
Packit fabffb
	gtk_widget_show (method->client_cert_chooser);
Packit fabffb
Packit fabffb
	g_signal_connect (method->client_cert_chooser, "cert-validate",
Packit fabffb
	                  G_CALLBACK (client_cert_validate_cb),
Packit fabffb
	                  NULL);
Packit fabffb
	g_signal_connect (method->client_cert_chooser,
Packit fabffb
	                  "key-validate",
Packit fabffb
	                  G_CALLBACK (client_key_validate_cb),
Packit fabffb
	                  NULL);
Packit fabffb
	g_signal_connect (method->client_cert_chooser,
Packit fabffb
	                  "key-password-validate",
Packit fabffb
	                  G_CALLBACK (client_key_password_validate_cb),
Packit fabffb
	                  NULL);
Packit fabffb
	g_signal_connect (method->client_cert_chooser,
Packit fabffb
	                  "changed",
Packit fabffb
	                  G_CALLBACK (client_cert_fixup_pkcs12),
Packit fabffb
	                  ws_parent);
Packit fabffb
	g_signal_connect (method->client_cert_chooser,
Packit fabffb
	                  "changed",
Packit fabffb
	                  G_CALLBACK (wireless_security_changed_cb),
Packit fabffb
	                  ws_parent);
Packit fabffb
Packit fabffb
	eap_method_setup_cert_chooser (NMA_CERT_CHOOSER (method->client_cert_chooser), s_8021x,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_client_cert_scheme : nm_setting_802_1x_get_client_cert_scheme,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_client_cert_path : nm_setting_802_1x_get_client_cert_path,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_client_cert_uri : nm_setting_802_1x_get_client_cert_uri,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_client_cert_password : nm_setting_802_1x_get_client_cert_password,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_private_key_scheme : nm_setting_802_1x_get_private_key_scheme,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_private_key_path : nm_setting_802_1x_get_private_key_path,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_private_key_uri : nm_setting_802_1x_get_private_key_uri,
Packit fabffb
	                               phase2 ? nm_setting_802_1x_get_phase2_private_key_password : nm_setting_802_1x_get_private_key_password);
Packit fabffb
Packit fabffb
	widget = GTK_WIDGET (gtk_builder_get_object (parent->builder, "eap_tls_ca_cert_not_required_checkbox"));
Packit fabffb
	gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), ca_not_required);
Packit fabffb
Packit fabffb
	/* Create password-storage popup menus for password entries under their secondary icon */
Packit fabffb
	nma_cert_chooser_setup_cert_password_storage (NMA_CERT_CHOOSER (method->ca_cert_chooser),
Packit fabffb
	                                              0, (NMSetting *) s_8021x, method->ca_cert_password_flags_name,
Packit fabffb
	                                              FALSE, secrets_only);
Packit fabffb
	nma_cert_chooser_setup_cert_password_storage (NMA_CERT_CHOOSER (method->client_cert_chooser),
Packit fabffb
	                                              0, (NMSetting *) s_8021x, method->client_cert_password_flags_name,
Packit fabffb
	                                              FALSE, secrets_only);
Packit fabffb
	nma_cert_chooser_setup_key_password_storage (NMA_CERT_CHOOSER (method->client_cert_chooser),
Packit fabffb
	                                             0, (NMSetting *) s_8021x, method->client_key_password_flags_name,
Packit fabffb
	                                             FALSE, secrets_only);
Packit fabffb
Packit fabffb
	return method;
Packit fabffb
}