Merge branch 'master' of ssh://moonshot.suchdamage.org:822/srv/git/moonshot
[mech_eap.orig] / util_attr.h
index c846864..9dd4787 100644 (file)
  * SUCH DAMAGE.
  */
 
+/*
+ * Attribute provider interface.
+ */
+
 #ifndef _UTIL_ATTR_H_
 #define _UTIL_ATTR_H_ 1
 
-#define ATTR_TYPE_RADIUS            0U
-#define ATTR_TYPE_SAML_ASSERTION    1U
-#define ATTR_TYPE_SAML              2U
-#define ATTR_TYPE_LOCAL             3U
-#define ATTR_TYPE_MIN               ATTR_TYPE_RADIUS
-#define ATTR_TYPE_MAX               ATTR_TYPE_LOCAL
-
 #ifdef __cplusplus
 #include <string>
 
@@ -51,6 +48,15 @@ typedef bool
                                const gss_buffer_t attribute,
                                void *data);
 
+#define ATTR_TYPE_RADIUS            0U                  /* RADIUS AVPs */
+#define ATTR_TYPE_SAML_ASSERTION    1U                  /* SAML assertion */
+#define ATTR_TYPE_SAML              2U                  /* SAML attributes */
+#define ATTR_TYPE_LOCAL             3U                  /* Local attributes */
+#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.
@@ -85,10 +91,10 @@ public:
         return false;
     }
 
-    virtual void setAttribute(int complete,
+    virtual bool setAttribute(int complete,
                               const gss_buffer_t attr,
-                              const gss_buffer_t value) {}
-    virtual void deleteAttribute(const gss_buffer_t value) {}
+                              const gss_buffer_t value) { return false; }
+    virtual bool deleteAttribute(const gss_buffer_t value) { return false; }
     virtual bool getAttribute(const gss_buffer_t attr,
                               int *authenticated,
                               int *complete,
@@ -110,8 +116,8 @@ public:
 
     virtual time_t getExpiryTime(void) const { return 0; }
 
-    static bool init() { return true; }
-    static void finalize() {}
+    static bool init(void) { return true; }
+    static void finalize(void) {}
 
     static gss_eap_attr_provider *createAttrContext(void) { return NULL; }
 
@@ -143,10 +149,10 @@ public:
     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,
@@ -204,19 +210,27 @@ public:
     time_t getExpiryTime(void) const;
 
 private:
+    bool providerEnabled(unsigned int type) const;
+    void releaseProvider(unsigned int type);
+
     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];
 };
 
+#endif /* __cplusplus */
+
 #include "util_radius.h"
 #include "util_saml.h"
 #include "util_shib.h"
 
+#ifdef __cplusplus
+
 #include <string>
 #include <new>
 
@@ -320,9 +334,6 @@ gssEapReleaseAttrContext(OM_uint32 *minor,
                          gss_name_t name);
 
 OM_uint32
-gssEapAttrProvidersInit(OM_uint32 *minor);
-
-OM_uint32
 gssEapAttrProvidersFinalize(OM_uint32 *minor);
 
 #ifdef __cplusplus