mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-03-05 03:00:39 +01:00
keyfile: reuse NMSetting8021xSchemeVtable in NMKeyfileWriteTypeDataCert
This commit is contained in:
parent
199524e426
commit
7a21ae3e77
3 changed files with 22 additions and 35 deletions
|
|
@ -27,6 +27,8 @@
|
|||
#include "nm-connection.h"
|
||||
#include "nm-setting-8021x.h"
|
||||
|
||||
#include "nm-core-internal.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define NM_KEYFILE_CERT_SCHEME_PREFIX_PATH "file://"
|
||||
|
|
@ -138,17 +140,8 @@ typedef gboolean (*NMKeyfileWriteHandler) (NMConnection *connection,
|
|||
* type %NM_KEYFILE_WRITE_TYPE_CERT.
|
||||
*/
|
||||
typedef struct {
|
||||
const NMSetting8021xSchemeVtable *vtable;
|
||||
NMSetting8021x *setting;
|
||||
const char *property_name;
|
||||
|
||||
/* The following functions are helpers that simplify the implementation
|
||||
* of the handler. */
|
||||
const char *suffix;
|
||||
NMSetting8021xCKScheme (*scheme_func) (NMSetting8021x *setting);
|
||||
NMSetting8021xCKFormat (*format_func) (NMSetting8021x *setting);
|
||||
const char * (*path_func) (NMSetting8021x *setting);
|
||||
GBytes * (*blob_func) (NMSetting8021x *setting);
|
||||
const char * (*uri_func) (NMSetting8021x *setting);
|
||||
} NMKeyfileWriteTypeDataCert;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -383,13 +383,13 @@ cert_writer_default (NMConnection *connection,
|
|||
const char *setting_name = nm_setting_get_name (NM_SETTING (cert_data->setting));
|
||||
NMSetting8021xCKScheme scheme;
|
||||
|
||||
scheme = cert_data->scheme_func (cert_data->setting);
|
||||
scheme = cert_data->vtable->scheme_func (cert_data->setting);
|
||||
if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
|
||||
const char *path;
|
||||
char *path_free = NULL, *tmp;
|
||||
gs_free char *base_dir = NULL;
|
||||
|
||||
path = cert_data->path_func (cert_data->setting);
|
||||
path = cert_data->vtable->path_func (cert_data->setting);
|
||||
g_assert (path);
|
||||
|
||||
/* If the path is relative, make it an absolute path.
|
||||
|
|
@ -413,7 +413,7 @@ cert_writer_default (NMConnection *connection,
|
|||
/* Path contains at least a '/', hence it cannot be recognized as the old
|
||||
* binary format consisting of a list of integers. */
|
||||
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, path);
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->vtable->setting_key, path);
|
||||
g_free (tmp);
|
||||
g_free (path_free);
|
||||
} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
|
||||
|
|
@ -422,19 +422,19 @@ cert_writer_default (NMConnection *connection,
|
|||
gsize blob_len;
|
||||
char *blob_base64, *val;
|
||||
|
||||
blob = cert_data->blob_func (cert_data->setting);
|
||||
blob = cert_data->vtable->blob_func (cert_data->setting);
|
||||
g_assert (blob);
|
||||
blob_data = g_bytes_get_data (blob, &blob_len);
|
||||
|
||||
blob_base64 = g_base64_encode (blob_data, blob_len);
|
||||
val = g_strconcat (NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB, blob_base64, NULL);
|
||||
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, val);
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->vtable->setting_key, val);
|
||||
g_free (val);
|
||||
g_free (blob_base64);
|
||||
} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PKCS11) {
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name,
|
||||
cert_data->uri_func (cert_data->setting));
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->vtable->setting_key,
|
||||
cert_data->vtable->uri_func (cert_data->setting));
|
||||
} else {
|
||||
/* scheme_func() returns UNKNOWN in all other cases. The only valid case
|
||||
* where a scheme is allowed to be UNKNOWN, is unsetting the value. In this
|
||||
|
|
@ -466,13 +466,7 @@ cert_writer (KeyfileWriterInfo *info,
|
|||
g_return_if_reached ();
|
||||
|
||||
type_data.setting = NM_SETTING_802_1X (setting);
|
||||
type_data.property_name = key;
|
||||
type_data.suffix = objtype->keyfile_suffix;
|
||||
type_data.scheme_func = objtype->scheme_func;
|
||||
type_data.format_func = objtype->format_func;
|
||||
type_data.path_func = objtype->path_func;
|
||||
type_data.blob_func = objtype->blob_func;
|
||||
type_data.uri_func = objtype->uri_func;
|
||||
type_data.vtable = objtype;
|
||||
|
||||
if (info->handler) {
|
||||
if (info->handler (info->connection,
|
||||
|
|
|
|||
|
|
@ -51,12 +51,12 @@ cert_writer (NMConnection *connection,
|
|||
NMSetting8021xCKFormat format;
|
||||
const char *path = NULL, *ext = "pem";
|
||||
|
||||
scheme = cert_data->scheme_func (cert_data->setting);
|
||||
scheme = cert_data->vtable->scheme_func (cert_data->setting);
|
||||
if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
|
||||
char *tmp = NULL;
|
||||
const char *accepted_path = NULL;
|
||||
|
||||
path = cert_data->path_func (cert_data->setting);
|
||||
path = cert_data->vtable->path_func (cert_data->setting);
|
||||
g_assert (path);
|
||||
|
||||
if (g_str_has_prefix (path, info->keyfile_dir)) {
|
||||
|
|
@ -92,11 +92,11 @@ cert_writer (NMConnection *connection,
|
|||
|
||||
if (!accepted_path)
|
||||
accepted_path = tmp = g_strconcat (NM_KEYFILE_CERT_SCHEME_PREFIX_PATH, path, NULL);
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, accepted_path);
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->vtable->setting_key, accepted_path);
|
||||
g_free (tmp);
|
||||
} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PKCS11) {
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name,
|
||||
cert_data->uri_func (cert_data->setting));
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->vtable->setting_key,
|
||||
cert_data->vtable->uri_func (cert_data->setting));
|
||||
} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
|
||||
GBytes *blob;
|
||||
const guint8 *blob_data;
|
||||
|
|
@ -105,13 +105,13 @@ cert_writer (NMConnection *connection,
|
|||
GError *local = NULL;
|
||||
char *new_path;
|
||||
|
||||
blob = cert_data->blob_func (cert_data->setting);
|
||||
blob = cert_data->vtable->blob_func (cert_data->setting);
|
||||
g_assert (blob);
|
||||
blob_data = g_bytes_get_data (blob, &blob_len);
|
||||
|
||||
if (cert_data->format_func) {
|
||||
if (cert_data->vtable->format_func) {
|
||||
/* Get the extension for a private key */
|
||||
format = cert_data->format_func (cert_data->setting);
|
||||
format = cert_data->vtable->format_func (cert_data->setting);
|
||||
if (format == NM_SETTING_802_1X_CK_FORMAT_PKCS12)
|
||||
ext = "p12";
|
||||
} else {
|
||||
|
|
@ -124,17 +124,17 @@ cert_writer (NMConnection *connection,
|
|||
* from now on instead of pushing around the certificate data.
|
||||
*/
|
||||
new_path = g_strdup_printf ("%s/%s-%s.%s", info->keyfile_dir, nm_connection_get_uuid (connection),
|
||||
cert_data->suffix, ext);
|
||||
cert_data->vtable->keyfile_suffix, ext);
|
||||
|
||||
success = nm_utils_file_set_contents (new_path, (const gchar *) blob_data,
|
||||
blob_len, 0600, &local);
|
||||
if (success) {
|
||||
/* Write the path value to the keyfile.
|
||||
* We know, that basename(new_path) starts with a UUID, hence no conflict with "data:;base64," */
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->property_name, strrchr (new_path, '/') + 1);
|
||||
nm_keyfile_plugin_kf_set_string (file, setting_name, cert_data->vtable->setting_key, strrchr (new_path, '/') + 1);
|
||||
} else {
|
||||
nm_log_warn (LOGD_SETTINGS, "keyfile: %s.%s: failed to write certificate to file %s: %s",
|
||||
setting_name, cert_data->property_name, new_path, local->message);
|
||||
setting_name, cert_data->vtable->setting_key, new_path, local->message);
|
||||
g_error_free (local);
|
||||
}
|
||||
g_free (new_path);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue