* gss_eap_saml_assertion_provider is for retrieving the underlying
* assertion.
*/
-gss_eap_saml_assertion_provider::gss_eap_saml_assertion_provider(const gss_eap_attr_ctx *ctx,
- gss_cred_id_t gssCred,
- gss_ctx_id_t gssCtx)
- : gss_eap_attr_provider(ctx, gssCred, gssCtx)
+bool
+gss_eap_saml_assertion_provider::initFromExistingContext(const gss_eap_attr_ctx *manager,
+ const gss_eap_attr_provider *ctx)
{
- if (gssCtx == GSS_C_NO_CONTEXT) {
- /* Then we are creating from an existing attribute context */
- gss_eap_saml_assertion_provider *saml;
-
- saml = dynamic_cast<gss_eap_saml_assertion_provider *>
- (ctx->getProvider(ATTR_TYPE_SAML_ASSERTION));
- if (saml != NULL)
- setAssertion(saml->getAssertion());
- } else {
- gss_eap_radius_attr_provider *radius;
- gss_buffer_desc value = GSS_C_EMPTY_BUFFER;
- int authenticated, complete, more = -1;
- OM_uint32 minor;
-
- radius = dynamic_cast<gss_eap_radius_attr_provider *>
- (ctx->getProvider(ATTR_TYPE_RADIUS));
- if (radius != NULL &&
- radius->getAttribute(512, &authenticated, &complete,
- &value, NULL, &more)) {
- m_assertion = parseAssertion(&value);
- gss_release_buffer(&minor, &value);
- }
+ /* Then we may be creating from an existing attribute context */
+ const gss_eap_saml_assertion_provider *saml;
+
+ assert(m_assertion == NULL);
+
+ if (!gss_eap_attr_provider::initFromExistingContext(manager, ctx))
+ return false;
+
+ saml = static_cast<const gss_eap_saml_assertion_provider *>(ctx);
+ setAssertion(saml->getAssertion());
+
+ return true;
+}
+
+bool
+gss_eap_saml_assertion_provider::initFromGssContext(const gss_eap_attr_ctx *manager,
+ const gss_cred_id_t gssCred,
+ const gss_ctx_id_t gssCtx)
+{
+ const gss_eap_radius_attr_provider *radius;
+ gss_buffer_desc value = GSS_C_EMPTY_BUFFER;
+ int authenticated, complete, more = -1;
+ OM_uint32 minor;
+
+ assert(m_assertion == NULL);
+
+ if (!gss_eap_attr_provider::initFromGssContext(manager, gssCred, gssCtx))
+ return false;
+
+ radius = static_cast<const gss_eap_radius_attr_provider *>
+ (m_manager->getProvider(ATTR_TYPE_RADIUS));
+ if (radius != NULL &&
+ radius->getAttribute(512 /* XXX */, &authenticated, &complete,
+ &value, NULL, &more)) {
+ m_assertion = parseAssertion(&value);
+ gss_release_buffer(&minor, &value);
+ } else {
+ m_assertion = NULL;
}
+
+ return true;
}
gss_eap_saml_assertion_provider::~gss_eap_saml_assertion_provider(void)
{
delete m_assertion;
- m_assertion = dynamic_cast<saml2::Assertion*>(assertion->clone());
+
+ if (assertion != NULL)
+ m_assertion = dynamic_cast<saml2::Assertion*>(assertion->clone());
+ else
+ m_assertion = NULL;
}
saml2::Assertion *
}
bool
-gss_eap_saml_assertion_provider::getAttributeTypes(gss_eap_attr_enumeration_cb addAttribute, void *data) const
+gss_eap_saml_assertion_provider::getAttributeTypes(gss_eap_attr_enumeration_cb addAttribute,
+ void *data) const
{
- addAttribute(this, GSS_C_NO_BUFFER, data);
+ /* just add the prefix */
+ return addAttribute(this, GSS_C_NO_BUFFER, data);
}
void
const gss_buffer_t attr,
const gss_buffer_t value)
{
- saml2::Assertion *assertion = parseAssertion(value);
+ if (attr == GSS_C_NO_BUFFER || attr->length == 0) {
+ saml2::Assertion *assertion = parseAssertion(value);
- m_assertion = assertion;
+ delete m_assertion;
+ m_assertion = assertion;
+ }
}
void
{
string str;
- if (attr->length != 0 || m_assertion == NULL)
+ if (attr != GSS_C_NO_BUFFER || attr->length != 0)
return false;
- if (*more == -1)
- *more = 0;
+ if (m_assertion == NULL)
+ return false;
- if (*more == 0) {
- *authenticated = true;
- *complete = false;
+ if (*more != -1)
+ return false;
- XMLHelper::serialize(m_assertion->marshall((DOMDocument *)NULL), str);
+ *authenticated = true;
+ *complete = false;
- duplicateBuffer(str, value);
- }
+ XMLHelper::serialize(m_assertion->marshall((DOMDocument *)NULL), str);
+
+ duplicateBuffer(str, value);
+ *more = 0;
return true;
}
}
void
-gss_eap_saml_assertion_provider::marshall(gss_buffer_t buffer) const
+gss_eap_saml_assertion_provider::exportToBuffer(gss_buffer_t buffer) const
{
ostringstream sink;
string str;
duplicateBuffer(str, buffer);
}
-gss_eap_attr_provider *
-gss_eap_saml_assertion_provider::unmarshall(const gss_eap_attr_ctx *ctx,
- const gss_buffer_t buffer)
+bool
+gss_eap_saml_assertion_provider::initFromBuffer(const gss_eap_attr_ctx *ctx,
+ const gss_buffer_t buffer)
{
- return new gss_eap_saml_assertion_provider(ctx, buffer);
+ if (!gss_eap_attr_provider::initFromBuffer(ctx, buffer))
+ return false;
+
+ if (buffer->length == 0)
+ return true;
+
+ assert(m_assertion == NULL);
+
+ m_assertion = parseAssertion(buffer);
+ if (m_assertion == NULL)
+ return false;
+
+ return true;
}
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",
+ gss_eap_saml_assertion_provider::createAttrContext);
+ return true;
}
void
gss_eap_saml_assertion_provider::finalize(void)
{
+ gss_eap_attr_ctx::unregisterProvider(ATTR_TYPE_SAML_ASSERTION);
}
gss_eap_attr_provider *
-gss_eap_saml_assertion_provider::createAttrContext(const gss_eap_attr_ctx *ctx,
- gss_cred_id_t gssCred,
- gss_ctx_id_t gssCtx)
+gss_eap_saml_assertion_provider::createAttrContext(void)
{
- return new gss_eap_saml_assertion_provider(ctx, gssCred, gssCtx);
+ return new gss_eap_saml_assertion_provider;
}
/*
const saml2::Assertion *
gss_eap_saml_attr_provider::getAssertion(void) const
{
- gss_eap_saml_assertion_provider *saml;
+ const gss_eap_saml_assertion_provider *saml;
- saml = dynamic_cast<gss_eap_saml_assertion_provider *>(m_source->getProvider(ATTR_TYPE_SAML_ASSERTION));
- assert(saml != NULL);
-
- return saml->getAssertion();
-}
+ saml = static_cast<const gss_eap_saml_assertion_provider *>
+ (m_manager->getProvider(ATTR_TYPE_SAML_ASSERTION));
+ if (saml != NULL)
+ return saml->getAssertion();
-gss_eap_saml_attr_provider::gss_eap_saml_attr_provider(const gss_eap_attr_ctx *ctx,
- gss_cred_id_t gssCred,
- gss_ctx_id_t gssCtx)
- : gss_eap_attr_provider(ctx, gssCred, gssCtx)
-{
- /* Nothing to do, we're just a wrapper around the assertion provider. */
+ return NULL;
}
gss_eap_saml_attr_provider::~gss_eap_saml_attr_provider(void)
gss_any_t
gss_eap_saml_attr_provider::mapToAny(int authenticated,
- gss_buffer_t type_id) const
+ gss_buffer_t type_id) const
{
- return (gss_any_t)0;
+ return (gss_any_t)NULL;
}
void
}
void
-gss_eap_saml_attr_provider::marshall(gss_buffer_t buffer) const
+gss_eap_saml_attr_provider::exportToBuffer(gss_buffer_t buffer) const
{
+ buffer->length = 0;
+ buffer->value = NULL;
}
-gss_eap_attr_provider *
-gss_eap_saml_attr_provider::unmarshall(const gss_eap_attr_ctx *ctx,
- const gss_buffer_t buffer)
+bool
+gss_eap_saml_attr_provider::initFromBuffer(const gss_eap_attr_ctx *ctx,
+ const gss_buffer_t buffer)
{
- return new gss_eap_saml_attr_provider(ctx);
+ return gss_eap_attr_provider::initFromBuffer(ctx, buffer);
}
bool
gss_eap_saml_attr_provider::init(void)
{
+ gss_eap_attr_ctx::registerProvider(ATTR_TYPE_SAML,
+ "urn:ietf:params:gss-eap:saml-attr",
+ gss_eap_saml_attr_provider::createAttrContext);
return true;
}
void
gss_eap_saml_attr_provider::finalize(void)
{
+ gss_eap_attr_ctx::unregisterProvider(ATTR_TYPE_SAML);
}
gss_eap_attr_provider *
-gss_eap_saml_attr_provider::createAttrContext(const gss_eap_attr_ctx *ctx,
- gss_cred_id_t gssCred,
- gss_ctx_id_t gssCtx)
+gss_eap_saml_attr_provider::createAttrContext(void)
{
- return new gss_eap_saml_attr_provider(ctx, gssCred, gssCtx);
+ return new gss_eap_saml_attr_provider;
}