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:

committed by
Lubomir Rintel

parent
01b8520447
commit
199524e426
@@ -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))
|
||||||
|
Reference in New Issue
Block a user