Load arbitrary (non-host) attributes from strongswan.conf
This allows to e.g. load Cisco-specific attributes that contain FQDNs.
This commit is contained in:
@@ -185,6 +185,7 @@ static void load_entries(private_attr_provider_t *this)
|
|||||||
configuration_attribute_type_t type;
|
configuration_attribute_type_t type;
|
||||||
attribute_type_key_t *mapped = NULL;
|
attribute_type_key_t *mapped = NULL;
|
||||||
attribute_entry_t *entry;
|
attribute_entry_t *entry;
|
||||||
|
chunk_t data;
|
||||||
host_t *host;
|
host_t *host;
|
||||||
char *pos;
|
char *pos;
|
||||||
int i, mask = -1, family;
|
int i, mask = -1, family;
|
||||||
@@ -218,34 +219,44 @@ static void load_entries(private_attr_provider_t *this)
|
|||||||
host = host_create_from_string(token, 0);
|
host = host_create_from_string(token, 0);
|
||||||
if (!host)
|
if (!host)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "invalid host in key %s: %s", key, token);
|
if (!type)
|
||||||
continue;
|
{
|
||||||
}
|
DBG1(DBG_CFG, "invalid host in key %s: %s", key, token);
|
||||||
family = host->get_family(host);
|
continue;
|
||||||
entry = malloc_thing(attribute_entry_t);
|
}
|
||||||
entry->type = type ?: (family == AF_INET ? mapped->v4 : mapped->v6);
|
/* store numeric attributes that are no IP addresses as strings */
|
||||||
if (mask == -1)
|
data = chunk_clone(chunk_from_str(token));
|
||||||
{
|
|
||||||
entry->value = chunk_clone(host->get_address(host));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (family == AF_INET)
|
family = host->get_family(host);
|
||||||
{ /* IPv4 attributes contain a subnet mask */
|
if (mask == -1)
|
||||||
u_int32_t netmask;
|
{
|
||||||
|
data = chunk_clone(host->get_address(host));
|
||||||
mask = 32 - mask;
|
|
||||||
netmask = htonl((0xFFFFFFFF >> mask) << mask);
|
|
||||||
entry->value = chunk_cat("cc", host->get_address(host),
|
|
||||||
chunk_from_thing(netmask));
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{ /* IPv6 addresses the prefix only */
|
{
|
||||||
entry->value = chunk_cat("cc", host->get_address(host),
|
if (family == AF_INET)
|
||||||
chunk_from_chars(mask));
|
{ /* IPv4 attributes contain a subnet mask */
|
||||||
|
u_int32_t netmask;
|
||||||
|
|
||||||
|
mask = 32 - mask;
|
||||||
|
netmask = htonl((0xFFFFFFFF >> mask) << mask);
|
||||||
|
data = chunk_cat("cc", host->get_address(host),
|
||||||
|
chunk_from_thing(netmask));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{ /* IPv6 addresses the prefix only */
|
||||||
|
data = chunk_cat("cc", host->get_address(host),
|
||||||
|
chunk_from_chars(mask));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
host->destroy(host);
|
||||||
}
|
}
|
||||||
host->destroy(host);
|
INIT(entry,
|
||||||
|
.type = type ?: (family == AF_INET ? mapped->v4 : mapped->v6),
|
||||||
|
.value = data,
|
||||||
|
);
|
||||||
DBG2(DBG_CFG, "loaded attribute %N: %#B",
|
DBG2(DBG_CFG, "loaded attribute %N: %#B",
|
||||||
configuration_attribute_type_names, entry->type, &entry->value);
|
configuration_attribute_type_names, entry->type, &entry->value);
|
||||||
this->attributes->insert_last(this->attributes, entry);
|
this->attributes->insert_last(this->attributes, entry);
|
||||||
|
|||||||
Reference in New Issue
Block a user