cli: add property type for 802-1x certificate properties (pt1)

This commit is contained in:
Thomas Haller 2019-03-19 09:40:22 +01:00
parent b83c88783e
commit df0d5f8dee
2 changed files with 45 additions and 10 deletions

View file

@ -2048,22 +2048,25 @@ done:
/*****************************************************************************/
static gconstpointer
_get_fcn_802_1x_ca_cert (ARGS_GET_FCN)
_get_fcn_cert_8021x (ARGS_GET_FCN)
{
NMSetting8021x *s_8021X = NM_SETTING_802_1X (setting);
const NMSetting8021xSchemeVtable *vtable;
char *ca_cert_str = NULL;
RETURN_UNSUPPORTED_GET_TYPE ();
switch (nm_setting_802_1x_get_ca_cert_scheme (s_8021X)) {
vtable = &nm_setting_8021x_scheme_vtable[property_info->property_typ_data->subtype.cert_8021x.scheme_type];
switch (vtable->scheme_func (s_8021X)) {
case NM_SETTING_802_1X_CK_SCHEME_BLOB:
ca_cert_str = bytes_to_string (nm_setting_802_1x_get_ca_cert_blob (s_8021X));
ca_cert_str = bytes_to_string (vtable->blob_func (s_8021X));
break;
case NM_SETTING_802_1X_CK_SCHEME_PATH:
ca_cert_str = g_strdup (nm_setting_802_1x_get_ca_cert_path (s_8021X));
ca_cert_str = g_strdup (vtable->path_func (s_8021X));
break;
case NM_SETTING_802_1X_CK_SCHEME_PKCS11:
ca_cert_str = g_strdup (nm_setting_802_1x_get_ca_cert_uri (s_8021X));
ca_cert_str = g_strdup (vtable->uri_func (s_8021X));
break;
case NM_SETTING_802_1X_CK_SCHEME_UNKNOWN:
break;
@ -2073,6 +2076,32 @@ _get_fcn_802_1x_ca_cert (ARGS_GET_FCN)
RETURN_STR_TO_FREE (ca_cert_str);
}
static gboolean
_set_fcn_cert_8021x (ARGS_SET_FCN)
{
gs_free char *value_to_free = NULL;
NMSetting8021xCKScheme scheme = NM_SETTING_802_1X_CK_SCHEME_PATH;
const NMSetting8021xSchemeVtable *vtable;
if (_SET_FCN_DO_RESET_DEFAULT (value))
return _gobject_property_reset_default (setting, property_info->property_name);
value = nm_strstrip_avoid_copy (value, &value_to_free);
if (strncmp (value, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PKCS11, NM_STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PKCS11)) == 0)
scheme = NM_SETTING_802_1X_CK_SCHEME_PKCS11;
else if (strncmp (value, NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH, NM_STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH)) == 0)
value += NM_STRLEN (NM_SETTING_802_1X_CERT_SCHEME_PREFIX_PATH);
vtable = &nm_setting_8021x_scheme_vtable[property_info->property_typ_data->subtype.cert_8021x.scheme_type];
return vtable->set_cert_func (NM_SETTING_802_1X (setting),
value,
scheme,
NULL,
error);
}
static gconstpointer
_get_fcn_802_1x_client_cert (ARGS_GET_FCN)
{
@ -2280,8 +2309,6 @@ _get_fcn_802_1x_phase2_private_key (ARGS_GET_FCN)
return set_func (NM_SETTING_802_1X (setting), path, password, scheme, NULL, error); \
}
DEFINE_SETTER_CERT (_set_fcn_802_1x_ca_cert, nm_setting_802_1x_set_ca_cert)
DEFINE_SETTER_CERT (_set_fcn_802_1x_client_cert, nm_setting_802_1x_set_client_cert)
DEFINE_SETTER_CERT (_set_fcn_802_1x_phase2_ca_cert, nm_setting_802_1x_set_phase2_ca_cert)
@ -4651,6 +4678,11 @@ static const NMMetaPropertyType _pt_dcb = {
.set_fcn = _set_fcn_dcb,
};
static const NMMetaPropertyType _pt_cert_8021x = {
.get_fcn = _get_fcn_cert_8021x,
.set_fcn = _set_fcn_cert_8021x,
};
static const NMMetaPropertyType _pt_ethtool = {
.get_fcn = _get_fcn_ethtool,
.set_fcn = _set_fcn_ethtool,
@ -4782,9 +4814,9 @@ static const NMMetaPropertyInfo *const property_infos_802_1X[] = {
" [file://]<file path>\n"
"Note that nmcli does not support specifying certificates as raw blob data.\n"
"Example: /home/cimrman/cacert.crt\n"),
.property_type = DEFINE_PROPERTY_TYPE (
.get_fcn = _get_fcn_802_1x_ca_cert,
.set_fcn = _set_fcn_802_1x_ca_cert,
.property_type = &_pt_cert_8021x,
.property_typ_data = DEFINE_PROPERTY_TYP_DATA_SUBTYPE (cert_8021x,
.scheme_type = NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT,
),
),
PROPERTY_INFO_WITH_DESC (NM_SETTING_802_1X_CA_CERT_PASSWORD,

View file

@ -290,6 +290,9 @@ struct _NMMetaPropertyTypData {
struct {
guint32 (*get_fcn) (NMSetting *setting);
} mtu;
struct {
NMSetting8021xSchemeType scheme_type;
} cert_8021x;
struct {
NMMetaPropertyTypeMacMode mode;
} mac;