#define ATTR_TYPE_MAX (ATTR_TYPE_LOCAL + 1U)
#ifdef __cplusplus
+#include <string>
+
+struct gss_eap_attr_provider;
struct gss_eap_attr_ctx;
+typedef bool
+(*gss_eap_attr_enumeration_cb)(const gss_eap_attr_provider *source,
+ const gss_buffer_t attribute,
+ void *data);
+
struct gss_eap_attr_provider
{
public:
- gss_eap_attr_provider(const gss_eap_attr_ctx *ctx,
- gss_cred_id_t acceptorCred = GSS_C_NO_CREDENTIAL,
- gss_ctx_id_t acceptorCtx = GSS_C_NO_CONTEXT)
+ gss_eap_attr_provider(void) {}
+ virtual ~gss_eap_attr_provider(void) {}
+
+ bool initWithManager(const gss_eap_attr_ctx *manager)
{
- m_source = ctx;
+ m_manager = manager;
+ return true;
}
- gss_eap_attr_provider(const gss_eap_attr_provider &ctx) {}
- virtual ~gss_eap_attr_provider(void) {}
+ virtual bool initFromExistingContext(const gss_eap_attr_ctx *manager,
+ const gss_eap_attr_provider *ctx)
+ {
+ return initWithManager(manager);
+ }
- typedef bool
- gss_eap_attr_enumeration_cb(const gss_eap_attr_provider *provider,
- const gss_buffer_t attribute,
- void *data);
+ virtual bool initFromGssContext(const gss_eap_attr_ctx *manager,
+ const gss_cred_id_t cred,
+ const gss_ctx_id_t ctx)
+ {
+ return initWithManager(manager);
+ }
virtual bool getAttributeTypes(gss_eap_attr_enumeration_cb, void *data) const
{
virtual void releaseAnyNameMapping(gss_buffer_t type_id,
gss_any_t input) const {}
- virtual void marshall(gss_buffer_t buffer) const {}
- virtual bool unmarshall(const gss_eap_attr_ctx *ctx,
- const gss_buffer_t buffer) { return false; }
+ virtual void exportToBuffer(gss_buffer_t buffer) const {}
+ virtual bool initFromBuffer(const gss_eap_attr_ctx *manager,
+ const gss_buffer_t buffer)
+ {
+ return initWithManager(manager);
+ }
static bool init() { return true; }
static void finalize() {}
- static gss_eap_attr_provider *
- createAttrContext(const gss_eap_attr_ctx *ctx,
- gss_cred_id_t acceptorCred,
- gss_ctx_id_t acceptorCtx) { return NULL; }
+ static gss_eap_attr_provider *createAttrContext(void) { return NULL; }
protected:
- const gss_eap_attr_ctx *m_source;
+ const gss_eap_attr_ctx *m_manager;
+
+private:
+ /* make non-copyable */
+ gss_eap_attr_provider(const gss_eap_attr_provider&);
+ gss_eap_attr_provider& operator=(const gss_eap_attr_provider&);
};
-typedef gss_eap_attr_provider * (*gss_eap_attr_create_cb)(
- const gss_eap_attr_ctx *ctx,
- gss_cred_id_t acceptorCred,
- gss_ctx_id_t acceptorCtx);
+typedef gss_eap_attr_provider *(*gss_eap_attr_create_provider)(void);
-struct gss_eap_attr_ctx : gss_eap_attr_provider
+struct gss_eap_attr_ctx
{
public:
- gss_eap_attr_ctx(const gss_eap_attr_ctx *ctx,
- gss_cred_id_t acceptorCred,
- gss_ctx_id_t acceptorCtx) :
- gss_eap_attr_provider(ctx, acceptorCred, acceptorCtx) {}
-
- gss_eap_attr_ctx(const gss_eap_attr_ctx &ctx);
-
+ gss_eap_attr_ctx(void);
~gss_eap_attr_ctx(void);
- static gss_eap_attr_ctx *createAttrContext(gss_cred_id_t acceptorCred,
- gss_ctx_id_t acceptorCtx);
+ bool initFromExistingContext(const gss_eap_attr_ctx *manager);
+ bool initFromGssContext(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 releaseAnyNameMapping(gss_buffer_t type_id,
gss_any_t input) const;
- void marshall(gss_buffer_t buffer) const;
- bool unmarshall(const gss_eap_attr_ctx *ctx,
- const gss_buffer_t buffer);
- static bool init();
- static void finalize();
+ void exportToBuffer(gss_buffer_t buffer) const;
+ bool initFromBuffer(const gss_buffer_t buffer);
static unsigned int
attributePrefixToType(const gss_buffer_t prefix);
- static gss_buffer_t
+ static const gss_buffer_t
attributeTypeToPrefix(unsigned int type);
static void
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_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);
+
private:
+ 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&);
+
gss_eap_attr_provider *m_providers[ATTR_TYPE_MAX];
};