mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-05-26 00:28:16 +02:00
Historically, keyfile read/write code was part of core, and thus GPL-2.0+ licensed. Keyfile is the native file format for NetworkManager connection profiles, and code to handle that should be part of libnm. This would unlock many interesting features, like tools being able to import/export connection profiles in the native file format. However, libnm is LGPL-2.1+ licensed, so this is a problem. The alternative would be to add a separate, GPL licensed library (libnm-keyfile.so or libnm-gpl.so). However that also requires a larger rework, because the current keyfile implementation uses internal API from libnm-core and it would need to be reworked to only use public API of libnm. Relicense the code instead. According to research and "keyfile-history.sh" script, the following individuals and companies possibly hold copyright on the code: <bgalvani(at)redhat.com> <blueowl(at)centrum.cz> <daniel(at)gnoutcheff.name> <danw(at)redhat.com> <dcantrell(at)redhat.com> <dcbw(at)redhat.com> <evan(at)ebroder.net> <fgiudici(at)redhat.com> <floe(at)butterbrot.org> <j(at)bootlab.org> <kmaraas(at)gnome.org> <lkundrak(at)v3.sk> <luzpaz(at)users.noreply.github.com> <martinpitt(at)gnome.org> <michael.i.doherty(at)intel.com> <pavlix(at)pavlix.net> <pmarti(at)warp.es> <rafaelff(at)gnome.org> <rstrode(at)redhat.com> <tambet(at)gmail.com> <tgraf(at)redhat.com> <thaller(at)redhat.com> <walters(at)verbum.org> <yurchor(at)ukr.net> Intel Corporation Novell, Inc. Red Hat, Inc. Ximian, Inc. Most contributors on this list agreed to relicensing according to RELICENSE.md. The following copyright holders did not answer the request for agreeing to relicensing: - <j(at)bootlab.org>: no contributions were made that are related to keyfile implementation. The script just gives a false positive. - <pmarti(at)warp.es>: the contribution is a fix of a spelling error (commit6029288ffb). - <tgraf(at)redhat.com>: the contribution to keyfile code are small (I only identified commit5b7503e95e). Also, Thomas worked for Red Hat at the time. After research, I think it's fair to conclude that everybody who holds non-trivial copyright on the keyfile code agreed to the relicensing.
213 lines
8.3 KiB
C
213 lines
8.3 KiB
C
/* SPDX-License-Identifier: LGPL-2.1+ */
|
|
/*
|
|
* 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 { /*< flags >*/
|
|
NM_KEYFILE_HANDLER_FLAGS_NONE = 0,
|
|
} NMKeyfileHandlerFlags;
|
|
|
|
typedef enum {
|
|
NM_KEYFILE_HANDLER_TYPE_WARN = 1,
|
|
NM_KEYFILE_HANDLER_TYPE_WRITE_CERT = 2,
|
|
} NMKeyfileHandlerType;
|
|
|
|
typedef struct _NMKeyfileHandlerData NMKeyfileHandlerData;
|
|
|
|
/**
|
|
* 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 @handler_type.
|
|
* For %NM_KEYFILE_HANDLER_TYPE_WARN handler_type, the default action is doing nothing.
|
|
*/
|
|
typedef gboolean (*NMKeyfileReadHandler)(GKeyFile * keyfile,
|
|
NMConnection * connection,
|
|
NMKeyfileHandlerType handler_type,
|
|
NMKeyfileHandlerData *handler_data,
|
|
void * user_data);
|
|
|
|
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;
|
|
|
|
NMConnection *nm_keyfile_read(GKeyFile * keyfile,
|
|
const char * base_dir,
|
|
NMKeyfileHandlerFlags handler_flags,
|
|
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);
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
|
* 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 @handler_type and
|
|
* @handler_data arguments tell which kind of argument we have at hand.
|
|
*
|
|
* Currently only the handler_type %NM_KEYFILE_HANDLER_TYPE_WRITE_CERT is supported, which provides
|
|
* @handler_data as %NMKeyfileHandlerDataWriteCert. 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,
|
|
NMKeyfileHandlerType handler_type,
|
|
NMKeyfileHandlerData *handler_data,
|
|
void * user_data);
|
|
|
|
GKeyFile *nm_keyfile_write(NMConnection * connection,
|
|
NMKeyfileHandlerFlags handler_flags,
|
|
NMKeyfileWriteHandler handler,
|
|
void * user_data,
|
|
GError ** error);
|
|
|
|
/*****************************************************************************/
|
|
|
|
/**
|
|
* NMKeyfileHandlerDataWarn:
|
|
*
|
|
* this struct is passed as @handler_data for the @NMKeyfileReadHandler of
|
|
* handler_type %NM_KEYFILE_HANDLER_TYPE_WARN.
|
|
*/
|
|
typedef struct {
|
|
NMKeyfileWarnSeverity severity;
|
|
char * message;
|
|
const char * fmt;
|
|
va_list ap;
|
|
} NMKeyfileHandlerDataWarn;
|
|
|
|
/**
|
|
* NMKeyfileHandlerDataWriteCert:
|
|
*
|
|
* this struct is passed as @handler_data for the @NMKeyfileWriteHandler of
|
|
* handler_type %NM_KEYFILE_HANDLER_TYPE_WRITE_CERT.
|
|
*/
|
|
typedef struct {
|
|
const NMSetting8021xSchemeVtable *vtable;
|
|
} NMKeyfileHandlerDataWriteCert;
|
|
|
|
struct _NMKeyfileHandlerData {
|
|
NMKeyfileHandlerType type;
|
|
|
|
GError **p_error;
|
|
|
|
const char *kf_group_name;
|
|
const char *kf_key;
|
|
|
|
NMSetting * cur_setting;
|
|
const char *cur_property;
|
|
|
|
union {
|
|
NMKeyfileHandlerDataWarn warn;
|
|
NMKeyfileHandlerDataWriteCert write_cert;
|
|
};
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
|
|
void nm_keyfile_handler_data_fail_with_error(NMKeyfileHandlerData *handler_data, GError *src);
|
|
|
|
void nm_keyfile_handler_data_get_context(const NMKeyfileHandlerData *handler_data,
|
|
const char ** out_kf_group_name,
|
|
const char ** out_kf_key_name,
|
|
NMSetting ** out_cur_setting,
|
|
const char ** out_cur_property_name);
|
|
|
|
void nm_keyfile_handler_data_warn_get(const NMKeyfileHandlerData *handler_data,
|
|
const char ** out_message,
|
|
NMKeyfileWarnSeverity * out_severity);
|
|
|
|
const char *_nm_keyfile_handler_data_warn_get_message(const NMKeyfileHandlerData *handler_data);
|
|
|
|
/*****************************************************************************/
|
|
|
|
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);
|
|
|
|
int nm_key_file_get_boolean(GKeyFile *kf, const char *group, const char *key, int default_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_GROUP_NMMETA ".nmmeta"
|
|
#define NM_KEYFILE_KEY_NMMETA_NM_GENERATED "nm-generated"
|
|
#define NM_KEYFILE_KEY_NMMETA_VOLATILE "volatile"
|
|
#define NM_KEYFILE_KEY_NMMETA_EXTERNAL "external"
|
|
#define NM_KEYFILE_KEY_NMMETA_SHADOWED_STORAGE "shadowed-storage"
|
|
#define NM_KEYFILE_KEY_NMMETA_SHADOWED_OWNED "shadowed-owned"
|
|
|
|
#define NM_KEYFILE_PATH_NAME_LIB NMLIBDIR "/system-connections"
|
|
#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_SUFFIX_NMMETA ".nmmeta"
|
|
|
|
#define NM_KEYFILE_PATH_NMMETA_SYMLINK_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__ */
|