ifnet: merge ObjectType with NMSetting8021xSchemeVtable in ifnet parser

ifnet has two extra instances @p12_type/@phase2_p12_type, that only
differed from @pk_type/@phase2_pk_type by their suffix.

But as the suffix field as unused, we can drop that entirely.
This commit is contained in:
Thomas Haller
2017-02-16 14:22:17 +01:00
committed by Lubomir Rintel
parent 01b8520447
commit 199524e426

View File

@@ -1688,96 +1688,43 @@ error:
return NULL; return NULL;
} }
typedef NMSetting8021xCKScheme (*SchemeFunc) (NMSetting8021x * setting); typedef struct Setting8021xSchemeVtable {
typedef const char *(*PathFunc) (NMSetting8021x * setting); const NMSetting8021xSchemeVtable *vtable;
typedef GBytes *(*BlobFunc) (NMSetting8021x * setting); const char *ifnet_key;
} Setting8021xSchemeVtable;
typedef struct ObjectType { static const Setting8021xSchemeVtable setting_8021x_scheme_vtable[] = {
const char *setting_key; [NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT] = {
SchemeFunc scheme_func; .vtable = &nm_setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT],
PathFunc path_func; .ifnet_key = "ca_cert",
BlobFunc blob_func; },
const char *conn_name_key; [NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT] = {
const char *suffix; .vtable = &nm_setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT],
} ObjectType; .ifnet_key = "ca_cert2",
},
static const ObjectType ca_type = { [NM_SETTING_802_1X_SCHEME_TYPE_CLIENT_CERT] = {
NM_SETTING_802_1X_CA_CERT, .vtable = &nm_setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_CLIENT_CERT],
nm_setting_802_1x_get_ca_cert_scheme, .ifnet_key = "client_cert",
nm_setting_802_1x_get_ca_cert_path, },
nm_setting_802_1x_get_ca_cert_blob, [NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CLIENT_CERT] = {
"ca_cert", .vtable = &nm_setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CLIENT_CERT],
"ca-cert.der" .ifnet_key = "client_cert2",
}; },
[NM_SETTING_802_1X_SCHEME_TYPE_PRIVATE_KEY] = {
static const ObjectType phase2_ca_type = { .vtable = &nm_setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PRIVATE_KEY],
NM_SETTING_802_1X_PHASE2_CA_CERT, .ifnet_key = "private_key",
nm_setting_802_1x_get_phase2_ca_cert_scheme, },
nm_setting_802_1x_get_phase2_ca_cert_path, [NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_PRIVATE_KEY] = {
nm_setting_802_1x_get_phase2_ca_cert_blob, .vtable = &nm_setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_PRIVATE_KEY],
"ca_cert2", .ifnet_key = "private_key2",
"inner-ca-cert.der" },
};
static const ObjectType client_type = {
NM_SETTING_802_1X_CLIENT_CERT,
nm_setting_802_1x_get_client_cert_scheme,
nm_setting_802_1x_get_client_cert_path,
nm_setting_802_1x_get_client_cert_blob,
"client_cert",
"client-cert.der"
};
static const ObjectType phase2_client_type = {
NM_SETTING_802_1X_PHASE2_CLIENT_CERT,
nm_setting_802_1x_get_phase2_client_cert_scheme,
nm_setting_802_1x_get_phase2_client_cert_path,
nm_setting_802_1x_get_phase2_client_cert_blob,
"client_cert2",
"inner-client-cert.der"
};
static const ObjectType pk_type = {
NM_SETTING_802_1X_PRIVATE_KEY,
nm_setting_802_1x_get_private_key_scheme,
nm_setting_802_1x_get_private_key_path,
nm_setting_802_1x_get_private_key_blob,
"private_key",
"private-key.pem"
};
static const ObjectType phase2_pk_type = {
NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
nm_setting_802_1x_get_phase2_private_key_scheme,
nm_setting_802_1x_get_phase2_private_key_path,
nm_setting_802_1x_get_phase2_private_key_blob,
"private_key2",
"inner-private-key.pem"
};
static const ObjectType p12_type = {
NM_SETTING_802_1X_PRIVATE_KEY,
nm_setting_802_1x_get_private_key_scheme,
nm_setting_802_1x_get_private_key_path,
nm_setting_802_1x_get_private_key_blob,
"private_key",
"private-key.p12"
};
static const ObjectType phase2_p12_type = {
NM_SETTING_802_1X_PHASE2_PRIVATE_KEY,
nm_setting_802_1x_get_phase2_private_key_scheme,
nm_setting_802_1x_get_phase2_private_key_path,
nm_setting_802_1x_get_phase2_private_key_blob,
"private_key2",
"inner-private-key.p12"
}; };
static gboolean static gboolean
write_object (NMSetting8021x *s_8021x, write_object (NMSetting8021x *s_8021x,
const char *conn_name, const char *conn_name,
GBytes *override_data, GBytes *override_data,
const ObjectType *objtype, const Setting8021xSchemeVtable *objtype,
GError **error) GError **error)
{ {
NMSetting8021xCKScheme scheme; NMSetting8021xCKScheme scheme;
@@ -1792,13 +1739,13 @@ write_object (NMSetting8021x *s_8021x,
*/ */
blob = override_data; blob = override_data;
else { else {
scheme = (*(objtype->scheme_func)) (s_8021x); scheme = (*(objtype->vtable->scheme_func)) (s_8021x);
switch (scheme) { switch (scheme) {
case NM_SETTING_802_1X_CK_SCHEME_BLOB: case NM_SETTING_802_1X_CK_SCHEME_BLOB:
blob = (*(objtype->blob_func)) (s_8021x); blob = (*(objtype->vtable->blob_func)) (s_8021x);
break; break;
case NM_SETTING_802_1X_CK_SCHEME_PATH: case NM_SETTING_802_1X_CK_SCHEME_PATH:
path = (*(objtype->path_func)) (s_8021x); path = (*(objtype->vtable->path_func)) (s_8021x);
break; break;
default: default:
break; break;
@@ -1809,7 +1756,7 @@ write_object (NMSetting8021x *s_8021x,
* may have been sent. * may have been sent.
*/ */
if (path) { if (path) {
wpa_set_data (conn_name, (gchar *) objtype->conn_name_key, wpa_set_data (conn_name, (gchar *) objtype->ifnet_key,
(gchar *) path); (gchar *) path);
return TRUE; return TRUE;
} }
@@ -1828,17 +1775,16 @@ write_8021x_certs (NMSetting8021x *s_8021x,
GError **error) GError **error)
{ {
char *password = NULL; char *password = NULL;
const ObjectType *otype = NULL; const Setting8021xSchemeVtable *otype = NULL;
gboolean is_pkcs12 = FALSE, success = FALSE; gboolean is_pkcs12 = FALSE, success = FALSE;
GBytes *blob = NULL; GBytes *blob = NULL;
GBytes *enc_key = NULL; GBytes *enc_key = NULL;
gchar *generated_pw = NULL; gchar *generated_pw = NULL;
/* CA certificate */ /* CA certificate */
if (phase2) otype = phase2
otype = &phase2_ca_type; ? &setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CA_CERT]
else : &setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_CA_CERT];
otype = &ca_type;
if (!write_object (s_8021x, conn_name, NULL, otype, error)) if (!write_object (s_8021x, conn_name, NULL, otype, error))
return FALSE; return FALSE;
@@ -1864,14 +1810,13 @@ write_8021x_certs (NMSetting8021x *s_8021x,
nm_setting_802_1x_get_private_key_password (s_8021x); nm_setting_802_1x_get_private_key_password (s_8021x);
} }
if (is_pkcs12) otype = phase2
otype = phase2 ? &phase2_p12_type : &p12_type; ? &setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_PRIVATE_KEY]
else : &setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PRIVATE_KEY];
otype = phase2 ? &phase2_pk_type : &pk_type;
if ((*(otype->scheme_func)) (s_8021x) == if ((*(otype->vtable->scheme_func)) (s_8021x) ==
NM_SETTING_802_1X_CK_SCHEME_BLOB) NM_SETTING_802_1X_CK_SCHEME_BLOB)
blob = (*(otype->blob_func)) (s_8021x); blob = (*(otype->vtable->blob_func)) (s_8021x);
/* Only do the private key re-encrypt dance if we got the raw key data, which /* Only do the private key re-encrypt dance if we got the raw key data, which
* by definition will be unencrypted. If we're given a direct path to the * by definition will be unencrypted. If we're given a direct path to the
@@ -1908,10 +1853,9 @@ write_8021x_certs (NMSetting8021x *s_8021x,
wpa_set_data (conn_name, wpa_set_data (conn_name,
phase2 ? "client_cert2" : "client_cert", NULL); phase2 ? "client_cert2" : "client_cert", NULL);
} else { } else {
if (phase2) otype = phase2
otype = &phase2_client_type; ? &setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_PHASE2_CLIENT_CERT]
else : &setting_8021x_scheme_vtable[NM_SETTING_802_1X_SCHEME_TYPE_CLIENT_CERT];
otype = &client_type;
/* Save the client certificate */ /* Save the client certificate */
if (!write_object (s_8021x, conn_name, NULL, otype, error)) if (!write_object (s_8021x, conn_name, NULL, otype, error))