Blame src/libnma/nma-cert-chooser.c

Packit fabffb
/* NetworkManager Applet -- allow user control over networking
Packit fabffb
 *
Packit fabffb
 * Lubomir Rintel <lkundrak@v3.sk>
Packit fabffb
 *
Packit fabffb
 * This library is free software; you can redistribute it and/or
Packit fabffb
 * modify it under the terms of the GNU Lesser General Public
Packit fabffb
 * License as published by the Free Software Foundation; either
Packit fabffb
 * version 2 of the License, or (at your option) any later version.
Packit fabffb
 *
Packit fabffb
 * This library is distributed in the hope that it will be useful,
Packit fabffb
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit fabffb
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit fabffb
 * Lesser General Public License for more details.
Packit fabffb
 *
Packit fabffb
 * You should have received a copy of the GNU Lesser General Public
Packit fabffb
 * License along with this library; if not, write to the
Packit fabffb
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Packit fabffb
 * Boston, MA 02110-1301 USA.
Packit fabffb
 *
Packit fabffb
 * Copyright (C) 2017 Red Hat, Inc.
Packit fabffb
 */
Packit fabffb
Packit fabffb
#include "nm-default.h"
Packit fabffb
#include "nma-cert-chooser.h"
Packit fabffb
Packit fabffb
#include "nma-cert-chooser-private.h"
Packit fabffb
Packit fabffb
#if !LIBNM_BUILD
Packit fabffb
#define NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH "file://"
Packit fabffb
#endif
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * SECTION:nma-cert-chooser
Packit fabffb
 * @title: NMACertChooser
Packit fabffb
 *
Packit fabffb
 * Certificate chooser allows for selection of a certificate or
Packit fabffb
 * various schemes optionally accompanied with a key and passwords
Packit fabffb
 * or PIN.
Packit fabffb
 *
Packit fabffb
 * The widgets that implement this interface may allow selecting
Packit fabffb
 * the certificates from various sources such as files or cryptographic
Packit fabffb
 * tokens.
Packit fabffb
 */
Packit fabffb
Packit fabffb
enum {
Packit fabffb
	PROP_0,
Packit fabffb
	PROP_TITLE,
Packit fabffb
	PROP_FLAGS,
Packit fabffb
	LAST_PROP,
Packit fabffb
};
Packit fabffb
Packit fabffb
static GParamSpec *properties[LAST_PROP];
Packit fabffb
Packit fabffb
enum {
Packit fabffb
	CERT_VALIDATE,
Packit fabffb
	CERT_PASSWORD_VALIDATE,
Packit fabffb
	KEY_VALIDATE,
Packit fabffb
	KEY_PASSWORD_VALIDATE,
Packit fabffb
	CHANGED,
Packit fabffb
	LAST_SIGNAL,
Packit fabffb
};
Packit fabffb
Packit fabffb
static guint signals[LAST_SIGNAL] = { 0 };
Packit fabffb
Packit fabffb
G_DEFINE_TYPE (NMACertChooser, nma_cert_chooser, GTK_TYPE_GRID)
Packit fabffb
Packit fabffb
#define NMA_CERT_CHOOSER_GET_PRIVATE(self) _NM_GET_PRIVATE (self, NMACertChooser, NMA_IS_CERT_CHOOSER)
Packit fabffb
#define NMA_CERT_CHOOSER_GET_VTABLE(o) (NMA_CERT_CHOOSER_GET_PRIVATE (o)->vtable)
Packit fabffb
Packit fabffb
static gboolean
Packit fabffb
accu_validation_error (GSignalInvocationHint *ihint,
Packit fabffb
                       GValue *return_accu,
Packit fabffb
                       const GValue *handler_return,
Packit fabffb
                       gpointer data)
Packit fabffb
{
Packit fabffb
	if (g_value_get_boxed (handler_return)) {
Packit fabffb
		g_value_copy (handler_return, return_accu);
Packit fabffb
		return FALSE;
Packit fabffb
	}
Packit fabffb
Packit fabffb
	return TRUE;
Packit fabffb
}
Packit fabffb
Packit fabffb
static gchar *
Packit fabffb
value_with_scheme_to_uri (const gchar *value, NMSetting8021xCKScheme scheme)
Packit fabffb
{
Packit fabffb
	switch (scheme) {
Packit fabffb
	case NM_SETTING_802_1X_CK_SCHEME_PATH:
Packit fabffb
		return g_strdup_printf (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH "%s", value);
Packit fabffb
#if LIBNM_BUILD
Packit fabffb
	case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
Packit fabffb
		return g_strdup (value);
Packit fabffb
#endif
Packit fabffb
	default:
Packit fabffb
		g_return_val_if_reached (NULL);
Packit fabffb
	}
Packit fabffb
}
Packit fabffb
Packit fabffb
static gchar *
Packit fabffb
uri_to_value_with_scheme (const gchar *uri, NMSetting8021xCKScheme *scheme)
Packit fabffb
{
Packit fabffb
	if (!uri) {
Packit fabffb
		NM_SET_OUT (scheme, NM_SETTING_802_1X_CK_SCHEME_UNKNOWN);
Packit fabffb
		return NULL;
Packit fabffb
	}
Packit fabffb
Packit fabffb
	if (g_str_has_prefix (uri, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) {
Packit fabffb
		NM_SET_OUT (scheme, NM_SETTING_802_1X_CK_SCHEME_PATH);
Packit fabffb
		return g_uri_unescape_string (uri + NM_STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH), NULL);
Packit fabffb
	}
Packit fabffb
Packit fabffb
#if LIBNM_BUILD
Packit fabffb
	if (g_str_has_prefix (uri, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PKCS11)) {
Packit fabffb
		NM_SET_OUT (scheme, NM_SETTING_802_1X_CK_SCHEME_PKCS11);
Packit fabffb
		return g_strdup (uri);
Packit fabffb
	}
Packit fabffb
#endif
Packit fabffb
Packit fabffb
	g_return_val_if_reached (NULL);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_set_cert_uri:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @uri: the path or URI of a certificate
Packit fabffb
 *
Packit fabffb
 * Sets the certificate URI for the chooser button.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_set_cert_uri (NMACertChooser *cert_chooser,
Packit fabffb
                               const gchar *uri)
Packit fabffb
{
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->set_cert_uri (cert_chooser, uri);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_set_cert:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @value: the path or URI of a certificate
Packit fabffb
 * @scheme: the scheme of the certificate path
Packit fabffb
 *
Packit fabffb
 * Sets the certificate location for the chooser button.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_set_cert (NMACertChooser *cert_chooser,
Packit fabffb
                           const gchar *value,
Packit fabffb
                           NMSetting8021xCKScheme scheme)
Packit fabffb
{
Packit fabffb
	gs_free gchar *uri = NULL;
Packit fabffb
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	if (!value)
Packit fabffb
		return;
Packit fabffb
Packit fabffb
	uri = value_with_scheme_to_uri (value, scheme);
Packit fabffb
	nma_cert_chooser_set_cert_uri (cert_chooser, uri);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_cert_uri:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 *
Packit fabffb
 * Gets the real certificate URI from the chooser button along with the scheme.
Packit fabffb
 *
Packit fabffb
 * Returns: (transfer full) (nullable): the certificate URI
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
gchar *
Packit fabffb
nma_cert_chooser_get_cert_uri (NMACertChooser *cert_chooser)
Packit fabffb
{
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser), NULL);
Packit fabffb
Packit fabffb
	return NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->get_cert_uri (cert_chooser);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_cert:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @scheme: (out): the scheme of the returned certificate path
Packit fabffb
 *
Packit fabffb
 * Gets the real certificate location from the chooser button along with the scheme.
Packit fabffb
 *
Packit fabffb
 * Returns: (transfer full) (nullable): the certificate path
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
gchar *
Packit fabffb
nma_cert_chooser_get_cert (NMACertChooser *cert_chooser, NMSetting8021xCKScheme *scheme)
Packit fabffb
{
Packit fabffb
	gs_free gchar *uri = NULL;
Packit fabffb
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser), NULL);
Packit fabffb
Packit fabffb
	uri = nma_cert_chooser_get_cert_uri (cert_chooser);
Packit fabffb
	return uri_to_value_with_scheme (uri, scheme);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_set_cert_password:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @password: the certificate PIN or password
Packit fabffb
 *
Packit fabffb
 * Sets the password or a PIN that might be required to access the certificate.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_set_cert_password (NMACertChooser *cert_chooser, const gchar *password)
Packit fabffb
{
Packit fabffb
	const NMACertChooserVtable *vtable;
Packit fabffb
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
	g_return_if_fail (password);
Packit fabffb
Packit fabffb
	vtable = NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser);
Packit fabffb
	if (vtable->set_cert_password)
Packit fabffb
		vtable->set_cert_password (cert_chooser, password);
Packit fabffb
	else
Packit fabffb
		g_warning ("Can't set certificate password");
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_cert_password:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 *
Packit fabffb
 * Obtains the password or a PIN that was be required to access the certificate.
Packit fabffb
 *
Packit fabffb
 * Returns: the certificate PIN or password
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
const gchar *
Packit fabffb
nma_cert_chooser_get_cert_password (NMACertChooser *cert_chooser)
Packit fabffb
{
Packit fabffb
	const NMACertChooserVtable *vtable;
Packit fabffb
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser), NULL);
Packit fabffb
Packit fabffb
	vtable = NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser);
Packit fabffb
	if (!vtable->get_cert_password)
Packit fabffb
		return NULL;
Packit fabffb
	return vtable->get_cert_password (cert_chooser);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_set_key_uri:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @uri: the URI of a key
Packit fabffb
 *
Packit fabffb
 * Sets the key URI for the chooser button.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_set_key_uri (NMACertChooser *cert_chooser,
Packit fabffb
                              const gchar *uri)
Packit fabffb
{
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	return NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->set_key_uri (cert_chooser, uri);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_set_key:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @value: the path or URI of a key
Packit fabffb
 * @scheme: the scheme of the key path
Packit fabffb
 *
Packit fabffb
 * Sets the key location for the chooser button.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_set_key (NMACertChooser *cert_chooser,
Packit fabffb
                          const gchar *value,
Packit fabffb
                          NMSetting8021xCKScheme scheme)
Packit fabffb
{
Packit fabffb
	gs_free gchar *uri = NULL;
Packit fabffb
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	if (!value)
Packit fabffb
		return;
Packit fabffb
Packit fabffb
	uri = value_with_scheme_to_uri (value, scheme);
Packit fabffb
	nma_cert_chooser_set_key_uri (cert_chooser, uri);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_key:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @scheme: (out): the scheme of the returned key path
Packit fabffb
 *
Packit fabffb
 * Gets the real key location from the chooser button along with the scheme.
Packit fabffb
 *
Packit fabffb
 * Returns: (transfer full) (nullable): the key path
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
gchar *
Packit fabffb
nma_cert_chooser_get_key (NMACertChooser *cert_chooser, NMSetting8021xCKScheme *scheme)
Packit fabffb
{
Packit fabffb
	gs_free gchar *uri = NULL;
Packit fabffb
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser), NULL);
Packit fabffb
Packit fabffb
	uri = nma_cert_chooser_get_key_uri (cert_chooser);
Packit fabffb
	return uri_to_value_with_scheme (uri, scheme);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_key_uri:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 *
Packit fabffb
 * Gets the real key URI from the chooser button along with the scheme.
Packit fabffb
 *
Packit fabffb
 * Returns: (transfer full) (nullable): the key URI
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
gchar *
Packit fabffb
nma_cert_chooser_get_key_uri (NMACertChooser *cert_chooser)
Packit fabffb
{
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser), NULL);
Packit fabffb
Packit fabffb
	return NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->get_key_uri (cert_chooser);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_set_key_password:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @password: the key PIN or password
Packit fabffb
 *
Packit fabffb
 * Sets the password or a PIN that might be required to access the key.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_set_key_password (NMACertChooser *cert_chooser, const gchar *password)
Packit fabffb
{
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
	g_return_if_fail (password);
Packit fabffb
Packit fabffb
	NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->set_key_password (cert_chooser, password);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_key_password:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 *
Packit fabffb
 * Obtains the password or a PIN that was be required to access the key.
Packit fabffb
 *
Packit fabffb
 * Returns: the key PIN or password
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
const gchar *
Packit fabffb
nma_cert_chooser_get_key_password (NMACertChooser *cert_chooser)
Packit fabffb
{
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser), NULL);
Packit fabffb
Packit fabffb
	return NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->get_key_password (cert_chooser);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_add_to_size_group:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @group: a size group
Packit fabffb
 *
Packit fabffb
 * Adds the labels to the specified size group so that they are aligned
Packit fabffb
 * nicely with other entries in a form.
Packit fabffb
 *
Packit fabffb
 * It is expected that the NMACertChooser is a GtkGrid with two columns
Packit fabffb
 * with the labels in the first one.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_add_to_size_group (NMACertChooser *cert_chooser, GtkSizeGroup *group)
Packit fabffb
{
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->add_to_size_group (cert_chooser, group);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_validate:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @error: error return location
Packit fabffb
 *
Packit fabffb
 * Validates whether the chosen values make sense. The users can do further
Packit fabffb
 * validation by subscribing to the "*-changed" signals and returning an
Packit fabffb
 * error themselves.
Packit fabffb
 *
Packit fabffb
 * Returns: %TRUE if validation passes, %FALSE otherwise
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
gboolean
Packit fabffb
nma_cert_chooser_validate (NMACertChooser *cert_chooser, GError **error)
Packit fabffb
{
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser), TRUE);
Packit fabffb
Packit fabffb
	return NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->validate (cert_chooser, error);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_setup_cert_password_storage:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @initial_flags: initial secret flags to setup password menu from
Packit fabffb
 * @setting: #NMSetting containing the password, or NULL
Packit fabffb
 * @password_flags_name: name of the secret flags (like psk-flags), or NULL
Packit fabffb
 * @with_not_required: whether to include "Not required" menu item
Packit fabffb
 * @ask_mode: %TRUE if the entry is shown in ASK mode
Packit fabffb
 *
Packit fabffb
 * This method basically calls nma_utils_setup_password_storage()
Packit fabffb
 * on the certificate password entry, in case one is present.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_setup_cert_password_storage (NMACertChooser *cert_chooser,
Packit fabffb
                                              NMSettingSecretFlags initial_flags,
Packit fabffb
                                              NMSetting *setting,
Packit fabffb
                                              const char *password_flags_name,
Packit fabffb
                                              gboolean with_not_required,
Packit fabffb
                                              gboolean ask_mode)
Packit fabffb
{
Packit fabffb
	const NMACertChooserVtable *vtable;
Packit fabffb
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	vtable = NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser);
Packit fabffb
	if (vtable->setup_cert_password_storage) {
Packit fabffb
		vtable->setup_cert_password_storage (cert_chooser,
Packit fabffb
		                                     initial_flags,
Packit fabffb
		                                     setting,
Packit fabffb
		                                     password_flags_name,
Packit fabffb
		                                     with_not_required,
Packit fabffb
		                                     ask_mode);
Packit fabffb
	}
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_update_cert_password_storage:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @secret_flags: secret flags to set
Packit fabffb
 * @setting: #NMSetting containing the password, or NULL
Packit fabffb
 * @password_flags_name: name of the secret flags (like psk-flags), or NULL
Packit fabffb
 *
Packit fabffb
 * This method basically calls nma_utils_update_password_storage()
Packit fabffb
 * on the certificate password entry, in case one is present.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_update_cert_password_storage (NMACertChooser *cert_chooser,
Packit fabffb
                                               NMSettingSecretFlags secret_flags,
Packit fabffb
                                               NMSetting *setting,
Packit fabffb
                                               const char *password_flags_name)
Packit fabffb
{
Packit fabffb
	const NMACertChooserVtable *vtable;
Packit fabffb
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	vtable = NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser);
Packit fabffb
	if (vtable->update_cert_password_storage) {
Packit fabffb
		vtable->update_cert_password_storage (cert_chooser,
Packit fabffb
		                                      secret_flags,
Packit fabffb
		                                      setting,
Packit fabffb
		                                      password_flags_name);
Packit fabffb
	}
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_cert_password_flags:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 *
Packit fabffb
 * Returns secret flags corresponding to the certificate password
Packit fabffb
 * if one is present. The chooser would typically call into
Packit fabffb
 * nma_utils_menu_to_secret_flags() for the certificate password
Packit fabffb
 * entry.
Packit fabffb
 *
Packit fabffb
 * Returns: secret flags corresponding to the certificate password
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
NMSettingSecretFlags
Packit fabffb
nma_cert_chooser_get_cert_password_flags (NMACertChooser *cert_chooser)
Packit fabffb
{
Packit fabffb
	const NMACertChooserVtable *vtable;
Packit fabffb
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser),
Packit fabffb
	                      NM_SETTING_SECRET_FLAG_NONE);
Packit fabffb
Packit fabffb
	vtable = NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser);
Packit fabffb
	if (!vtable->get_cert_password_flags)
Packit fabffb
		return NM_SETTING_SECRET_FLAG_NONE;
Packit fabffb
	return vtable->get_cert_password_flags (cert_chooser);
Packit fabffb
}
Packit fabffb
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_setup_key_password_storage:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @initial_flags: initial secret flags to setup password menu from
Packit fabffb
 * @setting: #NMSetting containing the password, or NULL
Packit fabffb
 * @password_flags_name: name of the secret flags (like psk-flags), or NULL
Packit fabffb
 * @with_not_required: whether to include "Not required" menu item
Packit fabffb
 * @ask_mode: %TRUE if the entry is shown in ASK mode
Packit fabffb
 *
Packit fabffb
 * This method basically calls nma_utils_setup_password_storage()
Packit fabffb
 * on the key password entry, in case one is present.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_setup_key_password_storage (NMACertChooser *cert_chooser,
Packit fabffb
                                             NMSettingSecretFlags initial_flags,
Packit fabffb
                                             NMSetting *setting,
Packit fabffb
                                             const char *password_flags_name,
Packit fabffb
                                             gboolean with_not_required,
Packit fabffb
                                             gboolean ask_mode)
Packit fabffb
{
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->setup_key_password_storage (cert_chooser,
Packit fabffb
	                                                                        initial_flags,
Packit fabffb
	                                                                        setting,
Packit fabffb
	                                                                        password_flags_name,
Packit fabffb
	                                                                        with_not_required,
Packit fabffb
	                                                                        ask_mode);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_update_key_password_storage:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 * @secret_flags: secret flags to set
Packit fabffb
 * @setting: #NMSetting containing the password, or NULL
Packit fabffb
 * @password_flags_name: name of the secret flags (like psk-flags), or NULL
Packit fabffb
 *
Packit fabffb
 * This method basically calls nma_utils_update_password_storage()
Packit fabffb
 * on the key password entry, in case one is present.
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
void
Packit fabffb
nma_cert_chooser_update_key_password_storage (NMACertChooser *cert_chooser,
Packit fabffb
                                               NMSettingSecretFlags secret_flags,
Packit fabffb
                                               NMSetting *setting,
Packit fabffb
                                               const char *password_flags_name)
Packit fabffb
{
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->update_key_password_storage (cert_chooser,
Packit fabffb
	                                                                         secret_flags,
Packit fabffb
	                                                                         setting,
Packit fabffb
	                                                                         password_flags_name);
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_get_key_password_flags:
Packit fabffb
 * @cert_chooser: certificate chooser button instance
Packit fabffb
 *
Packit fabffb
 * Returns secret flags corresponding to the key password
Packit fabffb
 * if one is present. The chooser would typically call into
Packit fabffb
 * nma_utils_menu_to_secret_flags() for the key password
Packit fabffb
 * entry.
Packit fabffb
 *
Packit fabffb
 * Returns: secret flags corresponding to the key password
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
NMSettingSecretFlags
Packit fabffb
nma_cert_chooser_get_key_password_flags (NMACertChooser *cert_chooser)
Packit fabffb
{
Packit fabffb
	g_return_val_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser),
Packit fabffb
	                      NM_SETTING_SECRET_FLAG_NONE);
Packit fabffb
Packit fabffb
	return NMA_CERT_CHOOSER_GET_VTABLE (cert_chooser)->get_key_password_flags (cert_chooser);
Packit fabffb
}
Packit fabffb
Packit fabffb
static GObject *
Packit fabffb
constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)
Packit fabffb
{
Packit fabffb
	GObject *object;
Packit fabffb
	NMACertChooser *cert_chooser;
Packit fabffb
	NMACertChooserFlags flags = NMA_CERT_CHOOSER_FLAG_NONE;
Packit fabffb
	NMACertChooserPrivate *priv;
Packit fabffb
	int i;
Packit fabffb
	const gchar *title = NULL;
Packit fabffb
Packit fabffb
	object = G_OBJECT_CLASS (nma_cert_chooser_parent_class)->constructor (type,
Packit fabffb
	                                                                      n_construct_properties,
Packit fabffb
	                                                                      construct_properties);
Packit fabffb
	cert_chooser = NMA_CERT_CHOOSER (object);
Packit fabffb
	priv = NMA_CERT_CHOOSER_GET_PRIVATE (cert_chooser);
Packit fabffb
Packit fabffb
	for (i = 0; i < n_construct_properties; i++) {
Packit fabffb
		if (strcmp (construct_properties[i].pspec->name, "title") == 0)
Packit fabffb
			title = g_value_get_string (construct_properties[i].value);
Packit fabffb
		if (strcmp (construct_properties[i].pspec->name, "flags") == 0)
Packit fabffb
			flags |= g_value_get_uint (construct_properties[i].value);
Packit fabffb
	}
Packit fabffb
	priv->vtable = &nma_cert_chooser_vtable_file;
Packit fabffb
#if LIBNM_BUILD && WITH_GCR
Packit fabffb
	if ((flags & NMA_CERT_CHOOSER_FLAG_PEM) == 0)
Packit fabffb
		priv->vtable = &nma_cert_chooser_vtable_pkcs11;
Packit fabffb
#endif
Packit fabffb
Packit fabffb
	/* Initialize the vtable and construct-time properties */
Packit fabffb
	priv->vtable->init (cert_chooser);
Packit fabffb
	priv->vtable->set_flags (cert_chooser, flags);
Packit fabffb
	priv->vtable->set_title (cert_chooser, title);
Packit fabffb
Packit fabffb
	return object;
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
Packit fabffb
{
Packit fabffb
	NMACertChooser *cert_chooser = NMA_CERT_CHOOSER (object);
Packit fabffb
Packit fabffb
	g_return_if_fail (NMA_IS_CERT_CHOOSER (cert_chooser));
Packit fabffb
Packit fabffb
	switch (property_id) {
Packit fabffb
	case PROP_TITLE:
Packit fabffb
	case PROP_FLAGS:
Packit fabffb
		/* Just ignore these, should be set at construct time */
Packit fabffb
		break;
Packit fabffb
	default:
Packit fabffb
		G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
Packit fabffb
		break;
Packit fabffb
	}
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
nma_cert_chooser_class_init (NMACertChooserClass *klass)
Packit fabffb
{
Packit fabffb
	GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit fabffb
Packit fabffb
	g_type_class_add_private (object_class, sizeof (NMACertChooserPrivate));
Packit fabffb
Packit fabffb
	object_class->constructor = constructor;
Packit fabffb
	object_class->set_property = set_property;
Packit fabffb
Packit fabffb
	/**
Packit fabffb
	 * NMACertChooser::title:
Packit fabffb
	 *
Packit fabffb
	 * Name of the certificate or certificate/key pair to be chosen.
Packit fabffb
	 * Used in labels and chooser dialog titles.
Packit fabffb
	 *
Packit fabffb
	 * Since: 1.8.0
Packit fabffb
	 */
Packit fabffb
	properties[PROP_TITLE] = g_param_spec_string ("title",
Packit fabffb
	                                             "Title",
Packit fabffb
	                                             "Certificate Chooser Title",
Packit fabffb
	                                             NULL,
Packit fabffb
	                                               G_PARAM_WRITABLE
Packit fabffb
	                                             | G_PARAM_CONSTRUCT_ONLY
Packit fabffb
	                                             | G_PARAM_STATIC_STRINGS);
Packit fabffb
Packit fabffb
	/**
Packit fabffb
	 * NMACertChooser::flags:
Packit fabffb
	 *
Packit fabffb
	 * The #NMACertChooserFlags flags that influnce which chooser
Packit fabffb
	 * implementation is used and configure its behavior.
Packit fabffb
	 *
Packit fabffb
	 * Since: 1.8.0
Packit fabffb
	 */
Packit fabffb
	properties[PROP_FLAGS] = g_param_spec_uint ("flags",
Packit fabffb
	                                            "Flags",
Packit fabffb
	                                            "Certificate Chooser Flags",
Packit fabffb
	                                            NMA_CERT_CHOOSER_FLAG_NONE,
Packit fabffb
	                                              NMA_CERT_CHOOSER_FLAG_CERT
Packit fabffb
	                                            | NMA_CERT_CHOOSER_FLAG_PASSWORDS
Packit fabffb
	                                            | NMA_CERT_CHOOSER_FLAG_PEM,
Packit fabffb
	                                            NMA_CERT_CHOOSER_FLAG_NONE,
Packit fabffb
	                                              G_PARAM_WRITABLE
Packit fabffb
	                                            | G_PARAM_CONSTRUCT_ONLY
Packit fabffb
	                                            | G_PARAM_STATIC_STRINGS);
Packit fabffb
Packit fabffb
	g_object_class_install_properties (object_class, LAST_PROP, properties);
Packit fabffb
Packit fabffb
	/**
Packit fabffb
	 * NMACertChooser::cert-validate:
Packit fabffb
	 *
Packit fabffb
	 * Emitted when the certificate needs validation. The handlers can indicate that
Packit fabffb
	 * the certificate is invalid by returning an error, which blocks further
Packit fabffb
	 * signal processing and causes a call to nma_cert_chooser_validate()
Packit fabffb
	 * to fail.
Packit fabffb
	 *
Packit fabffb
	 * Since: 1.8.0
Packit fabffb
	 */
Packit fabffb
	signals[CERT_VALIDATE] = g_signal_new ("cert-validate",
Packit fabffb
	                                       NMA_TYPE_CERT_CHOOSER,
Packit fabffb
	                                       G_SIGNAL_RUN_LAST,
Packit fabffb
	                                       0,
Packit fabffb
	                                       accu_validation_error, NULL, NULL,
Packit fabffb
	                                       G_TYPE_ERROR, 0);
Packit fabffb
Packit fabffb
	/**
Packit fabffb
	 * NMACertChooser::cert-password-validate:
Packit fabffb
	 *
Packit fabffb
	 * Emitted when the certificate password needs validation. The handlers
Packit fabffb
	 * can indicate that the password is invalid by returning an error, which blocks further
Packit fabffb
	 * signal processing and causes a call to nma_cert_chooser_validate()
Packit fabffb
	 * to fail.
Packit fabffb
	 *
Packit fabffb
	 * Since: 1.8.0
Packit fabffb
	 */
Packit fabffb
	signals[CERT_PASSWORD_VALIDATE] = g_signal_new ("cert-password-validate",
Packit fabffb
	                                                NMA_TYPE_CERT_CHOOSER,
Packit fabffb
	                                                G_SIGNAL_RUN_LAST,
Packit fabffb
	                                                0,
Packit fabffb
	                                                accu_validation_error, NULL, NULL,
Packit fabffb
	                                                G_TYPE_ERROR, 0);
Packit fabffb
Packit fabffb
	/**
Packit fabffb
	 * NMACertChooser::key-validate:
Packit fabffb
	 *
Packit fabffb
	 * Emitted when the key needs validation. The handlers can indicate that
Packit fabffb
	 * the key is invalid by returning an error, which blocks further
Packit fabffb
	 * signal processing and causes a call to nma_cert_chooser_validate()
Packit fabffb
	 * to fail.
Packit fabffb
	 *
Packit fabffb
	 * Since: 1.8.0
Packit fabffb
	 */
Packit fabffb
	signals[KEY_VALIDATE] = g_signal_new ("key-validate",
Packit fabffb
	                                      NMA_TYPE_CERT_CHOOSER,
Packit fabffb
	                                      G_SIGNAL_RUN_LAST,
Packit fabffb
	                                      0,
Packit fabffb
	                                      accu_validation_error, NULL, NULL,
Packit fabffb
	                                      G_TYPE_ERROR, 0);
Packit fabffb
Packit fabffb
	/**
Packit fabffb
	 * NMACertChooser::key-password-validate:
Packit fabffb
	 *
Packit fabffb
	 * Emitted when the key password needs validation. The handlers can indicate
Packit fabffb
	 * that the password is invalid by returning an error, which blocks further
Packit fabffb
	 * signal processing and causes a call to nma_cert_chooser_validate()
Packit fabffb
	 * to fail.
Packit fabffb
	 *
Packit fabffb
	 * Since: 1.8.0
Packit fabffb
	 */
Packit fabffb
	signals[KEY_PASSWORD_VALIDATE] = g_signal_new ("key-password-validate",
Packit fabffb
	                                               NMA_TYPE_CERT_CHOOSER,
Packit fabffb
	                                               G_SIGNAL_RUN_LAST,
Packit fabffb
	                                               0,
Packit fabffb
	                                               accu_validation_error, NULL, NULL,
Packit fabffb
	                                               G_TYPE_ERROR, 0);
Packit fabffb
Packit fabffb
	/**
Packit fabffb
	 * NMACertChooser::changed:
Packit fabffb
	 *
Packit fabffb
	 * Emitted when anything changes in the certificate chooser, be it a certificate,
Packit fabffb
	 * a key or associated passwords.
Packit fabffb
	 *
Packit fabffb
	 * Since: 1.8.0
Packit fabffb
	 */
Packit fabffb
	signals[CHANGED] = g_signal_new ("changed",
Packit fabffb
	                                 NMA_TYPE_CERT_CHOOSER,
Packit fabffb
	                                 G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE,
Packit fabffb
	                                 0,
Packit fabffb
	                                 NULL, NULL, NULL,
Packit fabffb
	                                 G_TYPE_NONE, 0);
Packit fabffb
Packit fabffb
}
Packit fabffb
Packit fabffb
static void
Packit fabffb
nma_cert_chooser_init (NMACertChooser *file_cert_chooser)
Packit fabffb
{
Packit fabffb
}
Packit fabffb
Packit fabffb
/**
Packit fabffb
 * nma_cert_chooser_new:
Packit fabffb
 * @title: title of the certificate chooser dialog
Packit fabffb
 * @flags: the flags that configure the capabilities of the button
Packit fabffb
 *
Packit fabffb
 * Constructs the button that is capable of selecting a certificate
Packit fabffb
 * and a key.
Packit fabffb
 *
Packit fabffb
 * Returns: (transfer full): the certificate chooser button instance
Packit fabffb
 *
Packit fabffb
 * Since: 1.8.0
Packit fabffb
 */
Packit fabffb
GtkWidget *
Packit fabffb
nma_cert_chooser_new (const gchar *title, NMACertChooserFlags flags)
Packit fabffb
{
Packit fabffb
	return g_object_new (NMA_TYPE_CERT_CHOOSER,
Packit fabffb
	                     "title", title,
Packit fabffb
	                     "flags", flags,
Packit fabffb
	                     NULL);
Packit fabffb
}