
This code will be used later. We want to remember which keyfiles are currently loaded (or hidden). With the addition or multiple keyfile directories (soon), there are two cases where this matters: - if there are multiple keyfiles which reference the same UUID, we can only load one of them. That is already a problem today with only one keyfile directory, where multiple files can reference the same UUID. The implementation will pick the file based on priorities (like the file modification date). However, the user may call explicitly call `nmcli connection load`. In that case, we cannot reload all files to find out whether the to be loaded file is hidden according to the defined priorities. We cannot do that, because we must not make decisions based on files on disk, which we are not told to reload. So, during a `nmcli connection load` we must look at unrelated files, to determine how to load the file. Instead, we do allow the user to load any file, even if it would be shadowed by other files. When we do that, we may want to persist which file is currently loaded, so that a service restart and a `nmcli connection reload` does not undo the load again. This can be later later be solved by writing a symlink "/var/run/NetworkManager/system-connections/.loaded-$UUID.nmkeyfile" which targets the currently active file. - if a profile was loaded from read-only persistant storage, the user may still delete the profile. We also need to remember the deletion of the file. That will be achieved by symlinking "/dev/null" as "/etc/NetworkManager/system-connections/.loaded-$UUID.nmkeyfile". Add helper functions to read and write these symlinks.
187 lines
7.0 KiB
C
187 lines
7.0 KiB
C
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
|
/* NetworkManager system settings service - keyfile plugin
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Copyright (C) 2008 Novell, Inc.
|
|
* Copyright (C) 2015 Red Hat, Inc.
|
|
*/
|
|
|
|
#ifndef __NM_KEYFILE_INTERNAL_H__
|
|
#define __NM_KEYFILE_INTERNAL_H__
|
|
|
|
#if !((NETWORKMANAGER_COMPILATION) & NM_NETWORKMANAGER_COMPILATION_WITH_LIBNM_CORE_INTERNAL)
|
|
#error Cannot use this header.
|
|
#endif
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include "nm-connection.h"
|
|
#include "nm-setting-8021x.h"
|
|
|
|
#include "nm-core-internal.h"
|
|
#include "nm-meta-setting.h"
|
|
|
|
/*****************************************************************************/
|
|
|
|
#define NM_KEYFILE_CERT_SCHEME_PREFIX_PATH "file://"
|
|
#define NM_KEYFILE_CERT_SCHEME_PREFIX_PKCS11 "pkcs11:"
|
|
#define NM_KEYFILE_CERT_SCHEME_PREFIX_BLOB "data:;base64,"
|
|
|
|
char *nm_keyfile_detect_unqualified_path_scheme (const char *base_dir,
|
|
gconstpointer pdata,
|
|
gsize data_len,
|
|
gboolean consider_exists,
|
|
gboolean *out_exists);
|
|
|
|
typedef enum {
|
|
NM_KEYFILE_READ_TYPE_WARN = 1,
|
|
} NMKeyfileReadType;
|
|
|
|
/**
|
|
* NMKeyfileReadHandler:
|
|
*
|
|
* Hook to nm_keyfile_read(). The user might fail the reading by setting
|
|
* @error.
|
|
*
|
|
* Returns: should return TRUE, if the reading was handled. Otherwise,
|
|
* a default action will be performed that depends on the @type.
|
|
* For %NM_KEYFILE_READ_TYPE_WARN type, the default action is doing nothing.
|
|
*/
|
|
typedef gboolean (*NMKeyfileReadHandler) (GKeyFile *keyfile,
|
|
NMConnection *connection,
|
|
NMKeyfileReadType type,
|
|
void *type_data,
|
|
void *user_data,
|
|
GError **error);
|
|
|
|
typedef enum {
|
|
NM_KEYFILE_WARN_SEVERITY_DEBUG = 1000,
|
|
NM_KEYFILE_WARN_SEVERITY_INFO = 2000,
|
|
NM_KEYFILE_WARN_SEVERITY_INFO_MISSING_FILE = 2901,
|
|
NM_KEYFILE_WARN_SEVERITY_WARN = 3000,
|
|
} NMKeyfileWarnSeverity;
|
|
|
|
/**
|
|
* NMKeyfileReadTypeDataWarn:
|
|
*
|
|
* this struct is passed as @type_data for the @NMKeyfileReadHandler of
|
|
* type %NM_KEYFILE_READ_TYPE_WARN.
|
|
*/
|
|
typedef struct {
|
|
/* might be %NULL, if the warning is not about a group. */
|
|
const char *group;
|
|
|
|
/* might be %NULL, if the warning is not about a setting. */
|
|
NMSetting *setting;
|
|
|
|
/* might be %NULL, if the warning is not about a property. */
|
|
const char *property_name;
|
|
|
|
NMKeyfileWarnSeverity severity;
|
|
const char *message;
|
|
} NMKeyfileReadTypeDataWarn;
|
|
|
|
NMConnection *nm_keyfile_read (GKeyFile *keyfile,
|
|
const char *base_dir,
|
|
NMKeyfileReadHandler handler,
|
|
void *user_data,
|
|
GError **error);
|
|
|
|
gboolean nm_keyfile_read_ensure_id (NMConnection *connection,
|
|
const char *fallback_id);
|
|
|
|
gboolean nm_keyfile_read_ensure_uuid (NMConnection *connection,
|
|
const char *fallback_uuid_seed);
|
|
|
|
/*****************************************************************************/
|
|
|
|
typedef enum {
|
|
NM_KEYFILE_WRITE_TYPE_CERT = 1,
|
|
} NMKeyfileWriteType;
|
|
|
|
/**
|
|
* NMKeyfileWriteHandler:
|
|
*
|
|
* This is a hook to tweak the serialization.
|
|
*
|
|
* Handler for certain properties or events that are not entirely contained
|
|
* within the keyfile or that might be serialized differently. The @type and
|
|
* @type_data arguments tell which kind of argument we have at hand.
|
|
*
|
|
* Currently only the type %NM_KEYFILE_WRITE_TYPE_CERT is supported, which provides
|
|
* @type_data as %NMKeyfileWriteTypeDataCert. However, this handler should be generic enough
|
|
* to support other types as well.
|
|
*
|
|
* This don't have to be only "properties". For example, nm_keyfile_read() uses
|
|
* a similar handler to push warnings to the caller.
|
|
*
|
|
* If the handler raises an error, it should set the @error value. This causes
|
|
* the an overall failure.
|
|
*
|
|
* Returns: whether the issue was handled. If the type was unhandled,
|
|
* a default action will be performed. This might be raise an error,
|
|
* do some fallback parsing, or do nothing.
|
|
*/
|
|
typedef gboolean (*NMKeyfileWriteHandler) (NMConnection *connection,
|
|
GKeyFile *keyfile,
|
|
NMKeyfileWriteType type,
|
|
void *type_data,
|
|
void *user_data,
|
|
GError **error);
|
|
|
|
/**
|
|
* NMKeyfileWriteTypeDataCert:
|
|
*
|
|
* this struct is passed as @type_data for the @NMKeyfileWriteHandler of
|
|
* type %NM_KEYFILE_WRITE_TYPE_CERT.
|
|
*/
|
|
typedef struct {
|
|
const NMSetting8021xSchemeVtable *vtable;
|
|
NMSetting8021x *setting;
|
|
} NMKeyfileWriteTypeDataCert;
|
|
|
|
GKeyFile *nm_keyfile_write (NMConnection *connection,
|
|
NMKeyfileWriteHandler handler,
|
|
void *user_data,
|
|
GError **error);
|
|
|
|
/*****************************************************************************/
|
|
|
|
char *nm_keyfile_plugin_kf_get_string (GKeyFile *kf, const char *group, const char *key, GError **error);
|
|
void nm_keyfile_plugin_kf_set_string (GKeyFile *kf, const char *group, const char *key, const char *value);
|
|
|
|
void _nm_keyfile_copy (GKeyFile *dst, GKeyFile *src);
|
|
gboolean _nm_keyfile_a_contains_all_in_b (GKeyFile *kf_a, GKeyFile *kf_b);
|
|
gboolean _nm_keyfile_equals (GKeyFile *kf_a, GKeyFile *kf_b, gboolean consider_order);
|
|
gboolean _nm_keyfile_has_values (GKeyFile *keyfile);
|
|
|
|
/*****************************************************************************/
|
|
|
|
#define NM_KEYFILE_PATH_NAME_ETC_DEFAULT NMCONFDIR "/system-connections"
|
|
#define NM_KEYFILE_PATH_NAME_RUN NMRUNDIR "/system-connections"
|
|
|
|
#define NM_KEYFILE_PATH_SUFFIX_NMCONNECTION ".nmconnection"
|
|
|
|
#define NM_KEYFILE_PATH_PREFIX_NMLOADED ".loaded-"
|
|
|
|
#define NM_KEYFILE_PATH_NMLOADED_NULL "/dev/null"
|
|
|
|
gboolean nm_keyfile_utils_ignore_filename (const char *filename, gboolean require_extension);
|
|
|
|
char *nm_keyfile_utils_create_filename (const char *filename, gboolean with_extension);
|
|
|
|
#endif /* __NM_KEYFILE_INTERNAL_H__ */
|