From 43146f6400fc19e112ed1a7c7d6e8dce3755f008 Mon Sep 17 00:00:00 2001 From: Luke Howard Date: Mon, 28 Mar 2011 09:47:48 +1100 Subject: [PATCH] make attribute prefix a class method --- mech_eap/util_attr.cpp | 72 +++++++++++++++++++++++------------------------- mech_eap/util_attr.h | 41 +++++++++++++-------------- mech_eap/util_radius.cpp | 12 +++++--- mech_eap/util_radius.h | 2 ++ mech_eap/util_saml.cpp | 24 ++++++++++------ mech_eap/util_saml.h | 4 +++ mech_eap/util_shib.cpp | 21 ++++++++++---- mech_eap/util_shib.h | 10 ++++--- 8 files changed, 106 insertions(+), 80 deletions(-) diff --git a/mech_eap/util_attr.cpp b/mech_eap/util_attr.cpp index ed45cd3..733662f 100644 --- a/mech_eap/util_attr.cpp +++ b/mech_eap/util_attr.cpp @@ -95,14 +95,12 @@ gssEapAttrProvidersFinalize(OM_uint32 *minor) } 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); @@ -110,13 +108,6 @@ gss_eap_attr_ctx::registerProvider(unsigned int type, 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; - } } /* @@ -128,8 +119,6 @@ gss_eap_attr_ctx::unregisterProvider(unsigned int type) assert(type <= ATTR_TYPE_MAX); gssEapAttrFactories[type] = NULL; - gssEapAttrPrefixes[type].value = NULL; - gssEapAttrPrefixes[type].length = 0; } /* @@ -156,12 +145,22 @@ gss_eap_attr_ctx::gss_eap_attr_ctx(void) * 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; } @@ -171,13 +170,22 @@ gss_eap_attr_ctx::attributePrefixToType(const gss_buffer_t prefix) /* * 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 @@ -378,19 +386,6 @@ gss_eap_attr_ctx::getProvider(unsigned int type) const } /* - * 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. */ @@ -475,7 +470,8 @@ struct eap_gss_get_attr_types_args { }; 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) { @@ -484,7 +480,7 @@ addAttribute(const gss_eap_attr_provider *provider GSSEAP_UNUSED, 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 { @@ -759,7 +755,7 @@ gss_eap_attr_ctx::decomposeAttributeName(const gss_buffer_t attribute, 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; @@ -796,9 +792,9 @@ std::string 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); } /* @@ -825,11 +821,11 @@ gss_eap_attr_ctx::composeAttributeName(const gss_buffer_t prefix, 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); } /* diff --git a/mech_eap/util_attr.h b/mech_eap/util_attr.h index 90a8c91..6af4cf3 100644 --- a/mech_eap/util_attr.h +++ b/mech_eap/util_attr.h @@ -45,7 +45,8 @@ struct gss_eap_attr_provider; struct gss_eap_attr_ctx; typedef bool -(*gss_eap_attr_enumeration_cb)(const gss_eap_attr_provider *source, +(*gss_eap_attr_enumeration_cb)(const gss_eap_attr_ctx *ctx, + const gss_eap_attr_provider *source, const gss_buffer_t attribute, void *data); @@ -125,6 +126,11 @@ public: { } + virtual const char *prefix(void) const + { + return NULL; + } + virtual void exportToBuffer(gss_buffer_t buffer GSSEAP_UNUSED) const { } @@ -194,12 +200,9 @@ public: void exportToBuffer(gss_buffer_t buffer) const; bool initFromBuffer(const gss_buffer_t buffer); - static unsigned int - attributePrefixToType(const gss_buffer_t prefix); - - static const gss_buffer_t - attributeTypeToPrefix(unsigned int type); - + static std::string + composeAttributeName(const gss_buffer_t prefix, + const gss_buffer_t suffix); static void decomposeAttributeName(const gss_buffer_t attribute, gss_buffer_t prefix, @@ -208,28 +211,23 @@ public: composeAttributeName(const gss_buffer_t prefix, const gss_buffer_t suffix, gss_buffer_t attribute); - static void + + std::string + composeAttributeName(unsigned int type, + const gss_buffer_t suffix); + void decomposeAttributeName(const gss_buffer_t attribute, unsigned int *type, - gss_buffer_t suffix); - static void + gss_buffer_t suffix) const; + void composeAttributeName(unsigned int type, const gss_buffer_t suffix, - gss_buffer_t attribute); - - static std::string - composeAttributeName(const gss_buffer_t prefix, - const gss_buffer_t suffix); - static std::string - composeAttributeName(unsigned int type, - const gss_buffer_t suffix); + gss_buffer_t attribute) const; gss_eap_attr_provider *getProvider(unsigned int type) const; - gss_eap_attr_provider *getProvider(const gss_buffer_t prefix) const; static void registerProvider(unsigned int type, - const char *prefix, gss_eap_attr_create_provider factory); static void unregisterProvider(unsigned int type); @@ -241,6 +239,9 @@ private: bool providerEnabled(unsigned int type) const; void releaseProvider(unsigned int type); + unsigned int attributePrefixToType(const gss_buffer_t prefix) const; + gss_buffer_desc attributeTypeToPrefix(unsigned int type) const; + gss_eap_attr_provider *getPrimaryProvider(void) const; /* make non-copyable */ diff --git a/mech_eap/util_radius.cpp b/mech_eap/util_radius.cpp index dfd8964..934aa5f 100644 --- a/mech_eap/util_radius.cpp +++ b/mech_eap/util_radius.cpp @@ -223,7 +223,7 @@ gss_eap_radius_attr_provider::getAttributeTypes(gss_eap_attr_enumeration_cb addA attribute.value = attrid; attribute.length = strlen(attrid); - if (!addAttribute(this, &attribute, data)) + if (!addAttribute(m_manager, this, &attribute, data)) return false; seen.push_back(std::string(vp->name)); @@ -449,9 +449,7 @@ gss_eap_radius_attr_provider::init(void) { struct rs_context *radContext; - gss_eap_attr_ctx::registerProvider(ATTR_TYPE_RADIUS, - "urn:ietf:params:gss-eap:radius-avp", - createAttrContext); + gss_eap_attr_ctx::registerProvider(ATTR_TYPE_RADIUS, createAttrContext); #if 1 /* @@ -766,6 +764,12 @@ gss_eap_radius_attr_provider::initFromBuffer(const gss_eap_attr_ctx *ctx, return true; } +const char * +gss_eap_radius_attr_provider::prefix(void) const +{ + return "urn:ietf:params:gss-eap:radius-avp"; +} + void gss_eap_radius_attr_provider::exportToBuffer(gss_buffer_t buffer) const { diff --git a/mech_eap/util_radius.h b/mech_eap/util_radius.h index 39caa18..bc6165b 100644 --- a/mech_eap/util_radius.h +++ b/mech_eap/util_radius.h @@ -66,6 +66,8 @@ public: void releaseAnyNameMapping(gss_buffer_t type_id, gss_any_t input) const; + const char *prefix(void) const; + void exportToBuffer(gss_buffer_t buffer) const; bool initFromBuffer(const gss_eap_attr_ctx *ctx, const gss_buffer_t buffer); diff --git a/mech_eap/util_saml.cpp b/mech_eap/util_saml.cpp index ca11172..24d125d 100644 --- a/mech_eap/util_saml.cpp +++ b/mech_eap/util_saml.cpp @@ -186,7 +186,7 @@ gss_eap_saml_assertion_provider::getAttributeTypes(gss_eap_attr_enumeration_cb a /* just add the prefix */ if (m_assertion != NULL) - ret = addAttribute(this, GSS_C_NO_BUFFER, data); + ret = addAttribute(m_manager, this, GSS_C_NO_BUFFER, data); else ret = true; @@ -304,6 +304,12 @@ gss_eap_saml_assertion_provider::releaseAnyNameMapping(gss_buffer_t type_id GSSE delete ((saml2::Assertion *)input); } +const char * +gss_eap_saml_assertion_provider::prefix(void) const +{ + return "urn:ietf:params:gss-eap:saml-aaa-assertion"; +} + void gss_eap_saml_assertion_provider::exportToBuffer(gss_buffer_t buffer) const { @@ -321,9 +327,7 @@ gss_eap_saml_assertion_provider::initFromBuffer(const gss_eap_attr_ctx *ctx GSSE bool gss_eap_saml_assertion_provider::init(void) { - gss_eap_attr_ctx::registerProvider(ATTR_TYPE_SAML_ASSERTION, - "urn:ietf:params:gss-eap:saml-aaa-assertion", - createAttrContext); + gss_eap_attr_ctx::registerProvider(ATTR_TYPE_SAML_ASSERTION, createAttrContext); return true; } @@ -442,7 +446,7 @@ gss_eap_saml_attr_provider::getAttributeTypes(gss_eap_attr_enumeration_cb addAtt utf8.value = (void *)toUTF8(qualifiedName); utf8.length = strlen((char *)utf8.value); - ret = addAttribute(this, &utf8, data); + ret = addAttribute(m_manager, this, &utf8, data); delete qualifiedName; @@ -684,6 +688,12 @@ gss_eap_saml_attr_provider::releaseAnyNameMapping(gss_buffer_t type_id GSSEAP_UN { } +const char * +gss_eap_saml_attr_provider::prefix(void) const +{ + return "urn:ietf:params:gss-eap:saml-attr"; +} + void gss_eap_saml_attr_provider::exportToBuffer(gss_buffer_t buffer) const { @@ -701,9 +711,7 @@ gss_eap_saml_attr_provider::initFromBuffer(const gss_eap_attr_ctx *ctx GSSEAP_UN bool gss_eap_saml_attr_provider::init(void) { - gss_eap_attr_ctx::registerProvider(ATTR_TYPE_SAML, - "urn:ietf:params:gss-eap:saml-attr", - createAttrContext); + gss_eap_attr_ctx::registerProvider(ATTR_TYPE_SAML, createAttrContext); return true; } diff --git a/mech_eap/util_saml.h b/mech_eap/util_saml.h index 99be5b8..17edb2b 100644 --- a/mech_eap/util_saml.h +++ b/mech_eap/util_saml.h @@ -74,7 +74,9 @@ public: void releaseAnyNameMapping(gss_buffer_t type_id, gss_any_t input) const; + const char *prefix(void) const; void exportToBuffer(gss_buffer_t buffer) const; + bool initFromBuffer(const gss_eap_attr_ctx *ctx, const gss_buffer_t buffer); @@ -129,6 +131,8 @@ public: void releaseAnyNameMapping(gss_buffer_t type_id, gss_any_t input) const; + const char *prefix(void) const; + void exportToBuffer(gss_buffer_t buffer) const; bool initFromBuffer(const gss_eap_attr_ctx *ctx, const gss_buffer_t buffer); diff --git a/mech_eap/util_shib.cpp b/mech_eap/util_shib.cpp index b2a83f6..4da9a31 100644 --- a/mech_eap/util_shib.cpp +++ b/mech_eap/util_shib.cpp @@ -103,12 +103,13 @@ gss_eap_shib_attr_provider::initFromExistingContext(const gss_eap_attr_ctx *mana } bool -addRadiusAttribute(const gss_eap_attr_provider *provider, +addRadiusAttribute(const gss_eap_attr_ctx *manager, + const gss_eap_attr_provider *provider, const gss_buffer_t attribute, void *data) { - const gss_eap_shib_attr_provider *shib; const gss_eap_radius_attr_provider *radius; + const gss_eap_shib_attr_provider *shib; int authenticated, complete, more = -1; vector attributeIds(1); SimpleAttribute *a; @@ -119,7 +120,7 @@ addRadiusAttribute(const gss_eap_attr_provider *provider, assert(radius != NULL && shib != NULL); string attributeName = - gss_eap_attr_ctx::composeAttributeName(ATTR_TYPE_RADIUS, attribute); + manager->composeAttributeName(ATTR_TYPE_RADIUS, attribute); attributeIds.push_back(attributeName); a = new SimpleAttribute(attributeIds); @@ -202,7 +203,9 @@ gss_eap_shib_attr_provider::initFromGssContext(const gss_eap_attr_ctx *manager, m_attributes = resolver->getResolvedAttributes(); resolver->getResolvedAttributes().clear(); } catch (exception &e) { - //fprintf(stderr, "%s", e.what()); +#if 0 + fprintf(stderr, "%s", e.what()); +#endif } return true; @@ -278,7 +281,7 @@ gss_eap_shib_attr_provider::getAttributeTypes(gss_eap_attr_enumeration_cb addAtt attribute.value = (void *)((*a)->getId()); attribute.length = strlen((char *)attribute.value); - if (!addAttribute(this, &attribute, data)) + if (!addAttribute(m_manager, this, &attribute, data)) return false; } @@ -381,6 +384,12 @@ gss_eap_shib_attr_provider::releaseAnyNameMapping(gss_buffer_t type_id GSSEAP_UN delete v; } +const char * +gss_eap_shib_attr_provider::prefix(void) const +{ + return NULL; +} + void gss_eap_shib_attr_provider::exportToBuffer(gss_buffer_t buffer) const { @@ -452,7 +461,7 @@ gss_eap_shib_attr_provider::init(void) if (!ShibbolethResolver::init()) return false; - gss_eap_attr_ctx::registerProvider(ATTR_TYPE_LOCAL, NULL, createAttrContext); + gss_eap_attr_ctx::registerProvider(ATTR_TYPE_LOCAL, createAttrContext); return true; } diff --git a/mech_eap/util_shib.h b/mech_eap/util_shib.h index 92198b0..a6fe0ec 100644 --- a/mech_eap/util_shib.h +++ b/mech_eap/util_shib.h @@ -76,6 +76,8 @@ public: void releaseAnyNameMapping(gss_buffer_t type_id, gss_any_t input) const; + const char *prefix(void) const; + void exportToBuffer(gss_buffer_t buffer) const; bool initFromBuffer(const gss_eap_attr_ctx *ctx, const gss_buffer_t buffer); @@ -87,6 +89,10 @@ public: static gss_eap_attr_provider *createAttrContext(void); + std::vector getAttributes(void) const { + return m_attributes; + } + private: static shibsp::Attribute * duplicateAttribute(const shibsp::Attribute *src); @@ -96,10 +102,6 @@ private: ssize_t getAttributeIndex(const gss_buffer_t attr) const; const shibsp::Attribute *getAttribute(const gss_buffer_t attr) const; - std::vector getAttributes(void) const { - return m_attributes; - } - bool authenticated(void) const { return m_authenticated; } friend bool -- 2.1.4