/*
- * Copyright (c) 2010, JANET(UK)
+ * Copyright (c) 2011, JANET(UK)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* SUCH DAMAGE.
*/
+/*
+ * Attribute provider interface.
+ */
+
#ifndef _UTIL_ATTR_H_
#define _UTIL_ATTR_H_ 1
#ifdef __cplusplus
#include <string>
+#include <new>
+
+using namespace gss_eap_util;
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);
#define ATTR_TYPE_MIN ATTR_TYPE_RADIUS
#define ATTR_TYPE_MAX ATTR_TYPE_LOCAL
+#define ATTR_FLAG_DISABLE_LOCAL 0x00000001
+
/*
* Attribute provider: this represents a source of attributes derived
* from the security context.
return true;
}
- virtual bool initFromExistingContext(const gss_eap_attr_ctx *manager,
- const gss_eap_attr_provider *ctx)
+ virtual bool initWithExistingContext(const gss_eap_attr_ctx *manager,
+ const gss_eap_attr_provider *ctx GSSEAP_UNUSED)
{
return initWithManager(manager);
}
- virtual bool initFromGssContext(const gss_eap_attr_ctx *manager,
- const gss_cred_id_t cred,
- const gss_ctx_id_t ctx)
+ virtual bool initWithGssContext(const gss_eap_attr_ctx *manager,
+ const gss_cred_id_t cred GSSEAP_UNUSED,
+ const gss_ctx_id_t ctx GSSEAP_UNUSED)
{
return initWithManager(manager);
}
- virtual bool getAttributeTypes(gss_eap_attr_enumeration_cb, void *data) const
+ virtual bool getAttributeTypes(gss_eap_attr_enumeration_cb GSSEAP_UNUSED,
+ void *data GSSEAP_UNUSED) const
{
return false;
}
- virtual void setAttribute(int complete,
- const gss_buffer_t attr,
- const gss_buffer_t value) {}
- virtual void deleteAttribute(const gss_buffer_t value) {}
- virtual bool getAttribute(const gss_buffer_t attr,
- int *authenticated,
- int *complete,
- gss_buffer_t value,
- gss_buffer_t display_value,
- int *more) const { return false; }
-
- virtual gss_any_t mapToAny(int authenticated,
- gss_buffer_t type_id) const { return NULL; }
- virtual void releaseAnyNameMapping(gss_buffer_t type_id,
- gss_any_t input) const {}
-
- virtual void exportToBuffer(gss_buffer_t buffer) const {}
- virtual bool initFromBuffer(const gss_eap_attr_ctx *manager,
- const gss_buffer_t buffer)
+ virtual bool setAttribute(int complete GSSEAP_UNUSED,
+ const gss_buffer_t attr GSSEAP_UNUSED,
+ const gss_buffer_t value GSSEAP_UNUSED)
+ {
+ return false;
+ }
+
+ virtual bool deleteAttribute(const gss_buffer_t value GSSEAP_UNUSED)
+ {
+ return false;
+ }
+
+ virtual bool getAttribute(const gss_buffer_t attr GSSEAP_UNUSED,
+ int *authenticated GSSEAP_UNUSED,
+ int *complete GSSEAP_UNUSED,
+ gss_buffer_t value GSSEAP_UNUSED,
+ gss_buffer_t display_value GSSEAP_UNUSED,
+ int *more GSSEAP_UNUSED) const
+ {
+ return false;
+ }
+
+ virtual gss_any_t mapToAny(int authenticated GSSEAP_UNUSED,
+ gss_buffer_t type_id GSSEAP_UNUSED) const
+ {
+ return NULL;
+ }
+
+ virtual void releaseAnyNameMapping(gss_buffer_t type_id GSSEAP_UNUSED,
+ gss_any_t input GSSEAP_UNUSED) const
+ {
+ }
+
+ /* prefix to be prepended to attributes emitted by gss_get_name_attribute */
+ virtual const char *prefix(void) const
+ {
+ return NULL;
+ }
+
+ /* optional key for storing JSON dictionary */
+ virtual const char *name(void) const
+ {
+ return NULL;
+ }
+
+ virtual bool initWithJsonObject(const gss_eap_attr_ctx *manager,
+ JSONObject &object GSSEAP_UNUSED)
{
return initWithManager(manager);
}
+
+ virtual JSONObject jsonRepresentation(void) const
+ {
+ return JSONObject::null();
+ }
+
virtual time_t getExpiryTime(void) const { return 0; }
- static bool init() { return true; }
- static void finalize() {}
+ virtual OM_uint32 mapException(OM_uint32 *minor GSSEAP_UNUSED,
+ std::exception &e GSSEAP_UNUSED) const
+ {
+ return GSS_S_CONTINUE_NEEDED;
+ }
+
+ static bool init(void) { return true; }
+ static void finalize(void) {}
static gss_eap_attr_provider *createAttrContext(void) { return NULL; }
gss_eap_attr_ctx(void);
~gss_eap_attr_ctx(void);
- bool initFromExistingContext(const gss_eap_attr_ctx *manager);
- bool initFromGssContext(const gss_cred_id_t cred,
+ bool initWithExistingContext(const gss_eap_attr_ctx *manager);
+ bool initWithGssContext(const gss_cred_id_t cred,
const gss_ctx_id_t ctx);
bool getAttributeTypes(gss_eap_attr_enumeration_cb, void *data) const;
bool getAttributeTypes(gss_buffer_set_t *attrs);
- void setAttribute(int complete,
+ bool setAttribute(int complete,
const gss_buffer_t attr,
const gss_buffer_t value);
- void deleteAttribute(const gss_buffer_t value);
+ bool deleteAttribute(const gss_buffer_t value);
bool getAttribute(const gss_buffer_t attr,
int *authenticated,
int *complete,
gss_any_t input) const;
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);
+ bool initWithBuffer(const gss_buffer_t buffer);
+ 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,
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);
time_t getExpiryTime(void) const;
+ OM_uint32 mapException(OM_uint32 *minor, std::exception &e) const;
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;
+
+ bool initWithJsonObject(JSONObject &object);
+ JSONObject jsonRepresentation(void) const;
+
gss_eap_attr_provider *getPrimaryProvider(void) const;
/* make non-copyable */
gss_eap_attr_ctx(const gss_eap_attr_ctx&);
gss_eap_attr_ctx& operator=(const gss_eap_attr_ctx&);
+ uint32_t m_flags;
gss_eap_attr_provider *m_providers[ATTR_TYPE_MAX + 1];
};
#ifdef __cplusplus
-#include <string>
-#include <new>
-
static inline void
duplicateBuffer(gss_buffer_desc &src, gss_buffer_t dst)
{
OM_uint32 minor;
if (GSS_ERROR(duplicateBuffer(&minor, &src, dst)))
- throw new std::bad_alloc();
+ throw std::bad_alloc();
}
static inline void
* obtain the name mutex.
*/
-struct gss_eap_attr_ctx *
-gssEapCreateAttrContext(gss_cred_id_t acceptorCred,
- gss_ctx_id_t acceptorCtx);
+OM_uint32
+gssEapCreateAttrContext(OM_uint32 *minor,
+ gss_cred_id_t acceptorCred,
+ gss_ctx_id_t acceptorCtx,
+ struct gss_eap_attr_ctx **pAttrCtx,
+ time_t *pExpiryTime);
OM_uint32
gssEapInquireName(OM_uint32 *minor,
gss_name_t name);
OM_uint32
-gssEapAttrProvidersInit(OM_uint32 *minor);
-
-OM_uint32
gssEapAttrProvidersFinalize(OM_uint32 *minor);
#ifdef __cplusplus