#include <exception>
#include <new>
-static gss_eap_attr_create_provider gssEapAttrFactories[ATTR_TYPE_MAX];
-static gss_buffer_desc gssEapAttrPrefixes[ATTR_TYPE_MAX];
+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
const char *prefix,
gss_eap_attr_create_provider factory)
{
- assert(type < ATTR_TYPE_MAX);
+ assert(type <= ATTR_TYPE_MAX);
assert(gssEapAttrFactories[type] == NULL);
void
gss_eap_attr_ctx::unregisterProvider(unsigned int type)
{
- assert(type < ATTR_TYPE_MAX);
+ assert(type <= ATTR_TYPE_MAX);
gssEapAttrFactories[type] = NULL;
gssEapAttrPrefixes[type].value = NULL;
*/
gss_eap_attr_ctx::gss_eap_attr_ctx(void)
{
- for (unsigned int i = 0; i < ATTR_TYPE_MAX; i++) {
+ for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
gss_eap_attr_provider *provider;
provider = (gssEapAttrFactories[i])();
{
bool ret = true;
- for (unsigned int i = 0; i < ATTR_TYPE_MAX; i++) {
+ for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
gss_eap_attr_provider *provider = m_providers[i];
ret = provider->initFromExistingContext(this, manager->m_providers[i]);
{
bool ret = true;
- for (unsigned int i = 0; i < ATTR_TYPE_MAX; i++) {
+ for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
gss_eap_attr_provider *provider = m_providers[i];
ret = provider->initFromGssContext(this, cred, ctx);
if (ret == false)
return ret;
- for (unsigned int i = ATTR_TYPE_MIN; i < ATTR_TYPE_MAX; i++) {
+ for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
gss_eap_attr_provider *provider = m_providers[i];
if (provider == primaryProvider)
gss_eap_attr_ctx::~gss_eap_attr_ctx(void)
{
- for (unsigned int i = ATTR_TYPE_MIN; i < ATTR_TYPE_MAX; i++)
+ for (unsigned int i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++)
delete m_providers[i];
}
gss_eap_attr_provider *
gss_eap_attr_ctx::getProvider(unsigned int type) const
{
- assert(type >= ATTR_TYPE_MIN && type < ATTR_TYPE_MAX);
+ assert(type >= ATTR_TYPE_MIN && type <= ATTR_TYPE_MAX);
return m_providers[type];
}
bool ret = false;
size_t i;
- for (i = 0; i < ATTR_TYPE_MAX; i++) {
+ for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
ret = m_providers[i]->getAttributeTypes(cb, data);
if (ret == false)
break;
args.attrs = *attrs;
- for (i = 0; i < ATTR_TYPE_MAX; i++) {
+ for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
args.type = i;
ret = m_providers[i]->getAttributeTypes(addAttribute, (void *)&args);
unsigned int i;
time_t expiryTime = 0;
- for (i = ATTR_TYPE_MIN; i < ATTR_TYPE_MAX; i++) {
+ for (i = ATTR_TYPE_MIN; i <= ATTR_TYPE_MAX; i++) {
time_t providerExpiryTime = m_providers[i]->getExpiryTime();
if (providerExpiryTime == 0)
#define ATTR_TYPE_SAML 2U
#define ATTR_TYPE_LOCAL 3U
#define ATTR_TYPE_MIN ATTR_TYPE_RADIUS
-#define ATTR_TYPE_MAX (ATTR_TYPE_LOCAL + 1U)
+#define ATTR_TYPE_MAX ATTR_TYPE_LOCAL
#ifdef __cplusplus
#include <string>
const gss_buffer_t attribute,
void *data);
+/*
+ * Attribute provider: this represents a source of attributes derived
+ * from the security context.
+ */
struct gss_eap_attr_provider
{
public:
typedef gss_eap_attr_provider *(*gss_eap_attr_create_provider)(void);
+/*
+ * Attribute context: this manages a set of providers for a given
+ * security context.
+ */
struct gss_eap_attr_ctx
{
public:
gss_eap_attr_ctx(const gss_eap_attr_ctx&);
gss_eap_attr_ctx& operator=(const gss_eap_attr_ctx&);
- gss_eap_attr_provider *m_providers[ATTR_TYPE_MAX];
+ gss_eap_attr_provider *m_providers[ATTR_TYPE_MAX + 1];
};
#include "util_radius.h"
extern "C" {
#endif
+/*
+ * C wrappers for attribute context functions. These match their
+ * GSS naming extension equivalents. The caller is required to
+ * obtain the name mutex.
+ */
+
struct gss_eap_attr_ctx *
gssEapCreateAttrContext(gss_cred_id_t acceptorCred,
gss_ctx_id_t acceptorCtx);