#include "gssapiP_eap.h"
-bool
-gss_eap_radius_attr_source::initFromExistingContext(const gss_eap_attr_ctx *manager,
- const gss_eap_attr_source *ctx)
+gss_eap_radius_attr_provider::gss_eap_radius_attr_provider(void)
{
- if (!gss_eap_attr_source::initFromExistingContext(manager, ctx))
- return false;
+ m_authenticated = false;
+}
- return true;
+gss_eap_radius_attr_provider::~gss_eap_radius_attr_provider(void)
+{
}
bool
-gss_eap_radius_attr_source::initFromGssContext(const gss_eap_attr_ctx *manager,
- const gss_cred_id_t gssCred,
- const gss_ctx_id_t gssCtx)
+gss_eap_radius_attr_provider::initFromExistingContext(const gss_eap_attr_ctx *manager,
+ const gss_eap_attr_provider *ctx)
{
- if (!gss_eap_attr_source::initFromGssContext(manager, gssCred, gssCtx))
+ if (!gss_eap_attr_provider::initFromExistingContext(manager, ctx))
return false;
return true;
}
-gss_eap_radius_attr_source::~gss_eap_radius_attr_source(void)
+bool
+gss_eap_radius_attr_provider::initFromGssContext(const gss_eap_attr_ctx *manager,
+ const gss_cred_id_t gssCred,
+ const gss_ctx_id_t gssCtx)
{
+ if (!gss_eap_attr_provider::initFromGssContext(manager, gssCred, gssCtx))
+ return false;
+
+ return true;
}
bool
-gss_eap_radius_attr_source::getAttributeTypes(gss_eap_attr_enumeration_cb addAttribute, void *data) const
+gss_eap_radius_attr_provider::getAttributeTypes(gss_eap_attr_enumeration_cb addAttribute, void *data) const
{
return true;
}
void
-gss_eap_radius_attr_source::setAttribute(int complete,
- const gss_buffer_t attr,
- const gss_buffer_t value)
+gss_eap_radius_attr_provider::setAttribute(int complete,
+ const gss_buffer_t attr,
+ const gss_buffer_t value)
{
}
void
-gss_eap_radius_attr_source::deleteAttribute(const gss_buffer_t value)
+gss_eap_radius_attr_provider::deleteAttribute(const gss_buffer_t value)
{
}
bool
-gss_eap_radius_attr_source::getAttribute(const gss_buffer_t attr,
- int *authenticated,
- int *complete,
- gss_buffer_t value,
- gss_buffer_t display_value,
- int *more) const
+gss_eap_radius_attr_provider::getAttribute(const gss_buffer_t attr,
+ int *authenticated,
+ int *complete,
+ gss_buffer_t value,
+ gss_buffer_t display_value,
+ int *more) const
{
return false;
}
bool
-gss_eap_radius_attr_source::getAttribute(unsigned int attr,
- int *authenticated,
- int *complete,
- gss_buffer_t value,
- gss_buffer_t display_value,
- int *more) const
+gss_eap_radius_attr_provider::getAttribute(unsigned int attr,
+ int *authenticated,
+ int *complete,
+ gss_buffer_t value,
+ gss_buffer_t display_value,
+ int *more) const
{
return false;
}
gss_any_t
-gss_eap_radius_attr_source::mapToAny(int authenticated,
+gss_eap_radius_attr_provider::mapToAny(int authenticated,
gss_buffer_t type_id) const
{
return (gss_any_t)NULL;
}
void
-gss_eap_radius_attr_source::releaseAnyNameMapping(gss_buffer_t type_id,
- gss_any_t input) const
+gss_eap_radius_attr_provider::releaseAnyNameMapping(gss_buffer_t type_id,
+ gss_any_t input) const
{
}
void
-gss_eap_radius_attr_source::exportToBuffer(gss_buffer_t buffer) const
+gss_eap_radius_attr_provider::exportToBuffer(gss_buffer_t buffer) const
{
+ buffer->length = 0;
+ buffer->value = NULL;
}
bool
-gss_eap_radius_attr_source::initFromBuffer(const gss_eap_attr_ctx *ctx,
- const gss_buffer_t buffer)
+gss_eap_radius_attr_provider::initFromBuffer(const gss_eap_attr_ctx *ctx,
+ const gss_buffer_t buffer)
{
- if (!gss_eap_attr_source::initFromBuffer(ctx, buffer))
+ if (!gss_eap_attr_provider::initFromBuffer(ctx, buffer))
return false;
- return false;
+ return true;
}
bool
-gss_eap_radius_attr_source::init(void)
+gss_eap_radius_attr_provider::init(void)
{
+ gss_eap_attr_ctx::registerProvider(ATTR_TYPE_RADIUS,
+ "urn:ietf:params:gss-eap:radius-avp",
+ gss_eap_radius_attr_provider::createAttrContext);
return true;
}
void
-gss_eap_radius_attr_source::finalize(void)
+gss_eap_radius_attr_provider::finalize(void)
+{
+ gss_eap_attr_ctx::unregisterProvider(ATTR_TYPE_RADIUS);
+}
+
+gss_eap_attr_provider *
+gss_eap_radius_attr_provider::createAttrContext(void)
+{
+ return new gss_eap_radius_attr_provider;
+}
+
+OM_uint32
+addAvpFromBuffer(OM_uint32 *minor,
+ rc_handle *rh,
+ VALUE_PAIR **vp,
+ int type,
+ gss_buffer_t buffer)
+{
+ if (rc_avpair_add(rh, vp, type, buffer->value, buffer->length, 0) == NULL) {
+ return GSS_S_FAILURE;
+ }
+
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32
+getBufferFromAvps(OM_uint32 *minor,
+ VALUE_PAIR *vps,
+ int type,
+ gss_buffer_t buffer,
+ int concat)
+{
+ VALUE_PAIR *vp;
+ unsigned char *p;
+
+ buffer->length = 0;
+ buffer->value = NULL;
+
+ vp = rc_avpair_get(vps, type, 0);
+ if (vp == NULL)
+ return GSS_S_UNAVAILABLE;
+
+ do {
+ buffer->length += vp->lvalue;
+ } while (concat && (vp = rc_avpair_get(vp->next, type, 0)) != NULL);
+
+ buffer->value = GSSEAP_MALLOC(buffer->length);
+ if (buffer->value == NULL) {
+ *minor = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+
+ p = (unsigned char *)buffer->value;
+
+ for (vp = rc_avpair_get(vps, type, 0);
+ concat && vp != NULL;
+ vp = rc_avpair_get(vp->next, type, 0)) {
+ memcpy(p, vp->strvalue, vp->lvalue);
+ p += vp->lvalue;
+ }
+
+ *minor = 0;
+ return GSS_S_COMPLETE;
+}
+
+OM_uint32
+gssEapRadiusAttrProviderInit(OM_uint32 *minor)
{
+ return gss_eap_radius_attr_provider::init()
+ ? GSS_S_COMPLETE : GSS_S_FAILURE;
}
-gss_eap_attr_source *
-gss_eap_radius_attr_source::createAttrContext(void)
+OM_uint32
+gssEapRadiusAttrProviderFinalize(OM_uint32 *minor)
{
- return new gss_eap_radius_attr_source;
+ gss_eap_radius_attr_provider::finalize();
+ return GSS_S_COMPLETE;
}