}
static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX + 1];
-static gss_buffer_desc gssEapAttrPrefixes[ATTR_TYPE_MAX + 1];
/*
* Register a provider for a particular type and prefix
*/
void
gss_eap_attr_ctx::registerProvider(unsigned int type,
- const char *prefix,
gss_eap_attr_create_provider factory)
{
assert(type <= ATTR_TYPE_MAX);
assert(gssEapAttrFactories[type] == NULL);
gssEapAttrFactories[type] = factory;
- if (prefix != NULL) {
- gssEapAttrPrefixes[type].value = (void *)prefix;
- gssEapAttrPrefixes[type].length = strlen(prefix);
- } else {
- gssEapAttrPrefixes[type].value = NULL;
- gssEapAttrPrefixes[type].length = 0;
- }
}
/*
assert(type <= ATTR_TYPE_MAX);
gssEapAttrFactories[type] = NULL;
- gssEapAttrPrefixes[type].value = NULL;
- gssEapAttrPrefixes[type].length = 0;
}
/*
* Convert an attribute prefix to a type
*/
unsigned int
-gss_eap_attr_ctx::attributePrefixToType(const gss_buffer_t prefix)
+gss_eap_attr_ctx::attributePrefixToType(const gss_buffer_t prefix) const
{
unsigned int i;
for (i = ATTR_TYPE_MIN; i < ATTR_TYPE_MAX; i++) {
- if (bufferEqual(&gssEapAttrPrefixes[i], prefix))
+ const char *pprefix;
+
+ if (!providerEnabled(i))
+ continue;
+
+ pprefix = m_providers[i]->prefix();
+ if (pprefix == NULL)
+ continue;
+
+ if (strlen(pprefix) == prefix->length &&
+ memcmp(pprefix, prefix->value, prefix->length) == 0)
return i;
}
/*
* Convert a type to an attribute prefix
*/
-const gss_buffer_t
-gss_eap_attr_ctx::attributeTypeToPrefix(unsigned int type)
+gss_buffer_desc
+gss_eap_attr_ctx::attributeTypeToPrefix(unsigned int type) const
{
+ gss_buffer_desc prefix = GSS_C_EMPTY_BUFFER;
+
if (type < ATTR_TYPE_MIN || type >= ATTR_TYPE_MAX)
- return GSS_C_NO_BUFFER;
+ return prefix;
- return &gssEapAttrPrefixes[type];
+ if (!providerEnabled(type))
+ return prefix;
+
+ prefix.value = (void *)m_providers[type]->prefix();
+ if (prefix.value != NULL)
+ prefix.length = strlen((char *)prefix.value);
+
+ return prefix;
}
bool
}
/*
- * Locate provider for a given prefix
- */
-gss_eap_attr_provider *
-gss_eap_attr_ctx::getProvider(const gss_buffer_t prefix) const
-{
- unsigned int type;
-
- type = attributePrefixToType(prefix);
-
- return m_providers[type];
-}
-
-/*
* Get primary provider. Only the primary provider is serialised when
* gss_export_sec_context() or gss_export_name_composite() is called.
*/
};
static bool
-addAttribute(const gss_eap_attr_provider *provider GSSEAP_UNUSED,
+addAttribute(const gss_eap_attr_ctx *manager,
+ const gss_eap_attr_provider *provider GSSEAP_UNUSED,
const gss_buffer_t attribute,
void *data)
{
OM_uint32 major, minor;
if (args->type != ATTR_TYPE_LOCAL) {
- gss_eap_attr_ctx::composeAttributeName(args->type, attribute, &qualified);
+ manager->composeAttributeName(args->type, attribute, &qualified);
major = gss_add_buffer_set_member(&minor, &qualified, &args->attrs);
gss_release_buffer(&minor, &qualified);
} else {
void
gss_eap_attr_ctx::decomposeAttributeName(const gss_buffer_t attribute,
unsigned int *type,
- gss_buffer_t suffix)
+ gss_buffer_t suffix) const
{
gss_buffer_desc prefix = GSS_C_EMPTY_BUFFER;
gss_eap_attr_ctx::composeAttributeName(unsigned int type,
const gss_buffer_t suffix)
{
- const gss_buffer_t prefix = attributeTypeToPrefix(type);
+ gss_buffer_desc prefix = attributeTypeToPrefix(type);
- return composeAttributeName(prefix, suffix);
+ return composeAttributeName(&prefix, suffix);
}
/*
void
gss_eap_attr_ctx::composeAttributeName(unsigned int type,
const gss_buffer_t suffix,
- gss_buffer_t attribute)
+ gss_buffer_t attribute) const
{
- gss_buffer_t prefix = attributeTypeToPrefix(type);
+ gss_buffer_desc prefix = attributeTypeToPrefix(type);
- return composeAttributeName(prefix, suffix, attribute);
+ return composeAttributeName(&prefix, suffix, attribute);
}
/*