2
* Copyright (c) 2011, JANET(UK)
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
16
* 3. Neither the name of JANET(UK) nor the names of its contributors
17
* may be used to endorse or promote products derived from this software
18
* without specific prior written permission.
20
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34
* Attribute provider interface.
38
#define _UTIL_ATTR_H_ 1
44
using namespace gss_eap_util;
46
struct gss_eap_attr_provider;
47
struct gss_eap_attr_ctx;
50
(*gss_eap_attr_enumeration_cb)(const gss_eap_attr_ctx *ctx,
51
const gss_eap_attr_provider *source,
52
const gss_buffer_t attribute,
55
#define ATTR_TYPE_RADIUS 0U /* RADIUS AVPs */
57
#define ATTR_TYPE_SAML_ASSERTION 1U /* SAML assertion */
58
#define ATTR_TYPE_SAML 2U /* SAML attributes */
60
#define ATTR_TYPE_LOCAL 3U /* Local attributes */
61
#define ATTR_TYPE_MIN ATTR_TYPE_RADIUS
62
#define ATTR_TYPE_MAX ATTR_TYPE_LOCAL
64
#define ATTR_FLAG_DISABLE_LOCAL 0x00000001
67
* Attribute provider: this represents a source of attributes derived
68
* from the security context.
70
struct gss_eap_attr_provider
73
gss_eap_attr_provider(void) {}
74
virtual ~gss_eap_attr_provider(void) {}
76
bool initWithManager(const gss_eap_attr_ctx *manager)
82
virtual bool initWithExistingContext(const gss_eap_attr_ctx *manager,
83
const gss_eap_attr_provider *ctx GSSEAP_UNUSED)
85
return initWithManager(manager);
88
virtual bool initWithGssContext(const gss_eap_attr_ctx *manager,
89
const gss_cred_id_t cred GSSEAP_UNUSED,
90
const gss_ctx_id_t ctx GSSEAP_UNUSED)
92
return initWithManager(manager);
95
virtual bool getAttributeTypes(gss_eap_attr_enumeration_cb GSSEAP_UNUSED,
96
void *data GSSEAP_UNUSED) const
101
virtual bool setAttribute(int complete GSSEAP_UNUSED,
102
const gss_buffer_t attr GSSEAP_UNUSED,
103
const gss_buffer_t value GSSEAP_UNUSED)
108
virtual bool deleteAttribute(const gss_buffer_t value GSSEAP_UNUSED)
113
virtual bool getAttribute(const gss_buffer_t attr GSSEAP_UNUSED,
114
int *authenticated GSSEAP_UNUSED,
115
int *complete GSSEAP_UNUSED,
116
gss_buffer_t value GSSEAP_UNUSED,
117
gss_buffer_t display_value GSSEAP_UNUSED,
118
int *more GSSEAP_UNUSED) const
123
virtual gss_any_t mapToAny(int authenticated GSSEAP_UNUSED,
124
gss_buffer_t type_id GSSEAP_UNUSED) const
129
virtual void releaseAnyNameMapping(gss_buffer_t type_id GSSEAP_UNUSED,
130
gss_any_t input GSSEAP_UNUSED) const
134
/* prefix to be prepended to attributes emitted by gss_get_name_attribute */
135
virtual const char *prefix(void) const
140
/* optional key for storing JSON dictionary */
141
virtual const char *name(void) const
146
virtual bool initWithJsonObject(const gss_eap_attr_ctx *manager,
147
JSONObject &object GSSEAP_UNUSED)
149
return initWithManager(manager);
153
virtual JSONObject jsonRepresentation(void) const
155
return JSONObject::null();
158
virtual time_t getExpiryTime(void) const { return 0; }
160
virtual OM_uint32 mapException(OM_uint32 *minor GSSEAP_UNUSED,
161
std::exception &e GSSEAP_UNUSED) const
163
return GSS_S_CONTINUE_NEEDED;
166
static bool init(void) { return true; }
167
static void finalize(void) {}
169
static gss_eap_attr_provider *createAttrContext(void) { return NULL; }
172
const gss_eap_attr_ctx *m_manager;
175
/* make non-copyable */
176
gss_eap_attr_provider(const gss_eap_attr_provider&);
177
gss_eap_attr_provider& operator=(const gss_eap_attr_provider&);
180
typedef gss_eap_attr_provider *(*gss_eap_attr_create_provider)(void);
183
* Attribute context: this manages a set of providers for a given
186
struct gss_eap_attr_ctx
189
gss_eap_attr_ctx(void);
190
~gss_eap_attr_ctx(void);
192
bool initWithExistingContext(const gss_eap_attr_ctx *manager);
193
bool initWithGssContext(const gss_cred_id_t cred,
194
const gss_ctx_id_t ctx);
196
bool getAttributeTypes(gss_eap_attr_enumeration_cb, void *data) const;
197
bool getAttributeTypes(gss_buffer_set_t *attrs);
199
bool setAttribute(int complete,
200
const gss_buffer_t attr,
201
const gss_buffer_t value);
202
bool deleteAttribute(const gss_buffer_t value);
203
bool getAttribute(const gss_buffer_t attr,
207
gss_buffer_t display_value,
209
gss_any_t mapToAny(int authenticated,
210
gss_buffer_t type_id) const;
211
void releaseAnyNameMapping(gss_buffer_t type_id,
212
gss_any_t input) const;
214
void exportToBuffer(gss_buffer_t buffer) const;
215
bool initWithBuffer(const gss_buffer_t buffer);
218
composeAttributeName(const gss_buffer_t prefix,
219
const gss_buffer_t suffix);
221
decomposeAttributeName(const gss_buffer_t attribute,
223
gss_buffer_t suffix);
225
composeAttributeName(const gss_buffer_t prefix,
226
const gss_buffer_t suffix,
227
gss_buffer_t attribute);
230
composeAttributeName(unsigned int type,
231
const gss_buffer_t suffix);
233
decomposeAttributeName(const gss_buffer_t attribute,
235
gss_buffer_t suffix) const;
237
composeAttributeName(unsigned int type,
238
const gss_buffer_t suffix,
239
gss_buffer_t attribute) const;
241
gss_eap_attr_provider *getProvider(unsigned int type) const;
244
registerProvider(unsigned int type,
245
gss_eap_attr_create_provider factory);
247
unregisterProvider(unsigned int type);
249
time_t getExpiryTime(void) const;
250
OM_uint32 mapException(OM_uint32 *minor, std::exception &e) const;
253
bool providerEnabled(unsigned int type) const;
254
void releaseProvider(unsigned int type);
256
unsigned int attributePrefixToType(const gss_buffer_t prefix) const;
257
gss_buffer_desc attributeTypeToPrefix(unsigned int type) const;
259
bool initWithJsonObject(JSONObject &object);
260
JSONObject jsonRepresentation(void) const;
262
gss_eap_attr_provider *getPrimaryProvider(void) const;
264
/* make non-copyable */
265
gss_eap_attr_ctx(const gss_eap_attr_ctx&);
266
gss_eap_attr_ctx& operator=(const gss_eap_attr_ctx&);
269
gss_eap_attr_provider *m_providers[ATTR_TYPE_MAX + 1];
272
#endif /* __cplusplus */
274
#include "util_radius.h"
275
#include "util_saml.h"
276
#include "util_shib.h"
281
duplicateBuffer(gss_buffer_desc &src, gss_buffer_t dst)
285
if (GSS_ERROR(duplicateBuffer(&minor, &src, dst)))
286
throw std::bad_alloc();
290
duplicateBuffer(std::string &str, gss_buffer_t buffer)
294
tmp.length = str.length();
295
tmp.value = (char *)str.c_str();
297
duplicateBuffer(tmp, buffer);
301
struct gss_eap_attr_ctx;
309
* C wrappers for attribute context functions. These match their
310
* GSS naming extension equivalents. The caller is required to
311
* obtain the name mutex.
315
gssEapCreateAttrContext(OM_uint32 *minor,
316
gss_cred_id_t acceptorCred,
317
gss_ctx_id_t acceptorCtx,
318
struct gss_eap_attr_ctx **pAttrCtx,
319
time_t *pExpiryTime);
322
gssEapInquireName(OM_uint32 *minor,
326
gss_buffer_set_t *attrs);
329
gssEapGetNameAttribute(OM_uint32 *minor,
335
gss_buffer_t display_value,
339
gssEapDeleteNameAttribute(OM_uint32 *minor,
344
gssEapSetNameAttribute(OM_uint32 *minor,
351
gssEapExportAttrContext(OM_uint32 *minor,
353
gss_buffer_t buffer);
356
gssEapImportAttrContext(OM_uint32 *minor,
361
gssEapDuplicateAttrContext(OM_uint32 *minor,
366
gssEapMapNameToAny(OM_uint32 *minor,
369
gss_buffer_t type_id,
373
gssEapReleaseAnyNameMapping(OM_uint32 *minor,
375
gss_buffer_t type_id,
379
gssEapReleaseAttrContext(OM_uint32 *minor,
383
gssEapAttrProvidersFinalize(OM_uint32 *minor);
389
#endif /* _UTIL_ATTR_H_ */