make attribute prefix a class method
authorLuke Howard <lukeh@padl.com>
Sun, 27 Mar 2011 22:47:48 +0000 (09:47 +1100)
committerLuke Howard <lukeh@padl.com>
Sun, 27 Mar 2011 22:47:48 +0000 (09:47 +1100)
util_attr.cpp
util_attr.h
util_radius.cpp
util_radius.h
util_saml.cpp
util_saml.h
util_shib.cpp
util_shib.h

index ed45cd3..733662f 100644 (file)
@@ -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);
 }
 
 /*
index 90a8c91..6af4cf3 100644 (file)
@@ -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 */
index dfd8964..934aa5f 100644 (file)
@@ -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
 {
index 39caa18..bc6165b 100644 (file)
@@ -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);
index ca11172..24d125d 100644 (file)
@@ -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;
 }
 
index 99be5b8..17edb2b 100644 (file)
@@ -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);
index b2a83f6..4da9a31 100644 (file)
@@ -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 <string> 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;
 }
index 92198b0..a6fe0ec 100644 (file)
@@ -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<shibsp::Attribute *> 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<shibsp::Attribute *> getAttributes(void) const {
-        return m_attributes;
-    }
-
     bool authenticated(void) const { return m_authenticated; }
 
     friend bool