X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=shibsp%2Fattribute%2FAttribute.h;h=c734909c9fc987a4fda4f7bd6ead2b6494a409ba;hb=a62c416b6ecfc17d89853a8f14604249c94d2f60;hp=4b0e47441304ff2bf6c10ccc0f3d92ddeee6d3f4;hpb=d30673a03fe633dfb952bb6644657574f81a8ffa;p=shibboleth%2Fsp.git diff --git a/shibsp/attribute/Attribute.h b/shibsp/attribute/Attribute.h index 4b0e474..c734909 100644 --- a/shibsp/attribute/Attribute.h +++ b/shibsp/attribute/Attribute.h @@ -1,6 +1,6 @@ /* - * Copyright 2001-2007 Internet2 - * + * Copyright 2001-2009 Internet2 + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -16,14 +16,13 @@ /** * @file shibsp/attribute/Attribute.h - * + * * A resolved attribute. */ #ifndef __shibsp_attribute_h__ #define __shibsp_attribute_h__ -#include #include #include @@ -39,16 +38,16 @@ namespace shibsp { /** * A resolved attribute. - * + * *

Resolved attributes are a neutral construct that represent both simple and * complex attribute data structures that might be found in SAML assertions * or obtained from other sources. - * + * *

Attributes consist of an id/name that is locally unique (that is, unique to a * configuration at any given point in time) and zero or more values. Values can * be of any type or structure, but will generally be made available to applications * only if a serialized string form exists. More complex values can be used with - * access control plugins that understand them, however. + * access control plugins and other components that understand them, however. */ class SHIBSP_API Attribute { @@ -56,178 +55,169 @@ namespace shibsp { protected: /** * Constructor - * - * @param id Attribute identifier + * + * @param ids array with primary identifier in first position, followed by any aliases */ - Attribute(const char* id) : m_id(id ? id : ""), m_caseSensitive(true) { - } + Attribute(const std::vector& ids); /** * Constructs based on a remoted Attribute. - * + * *

This allows Attribute objects to be recreated after marshalling. * The DDF supplied must be a struct containing a single list member named * with the Attribute's "id" and containing the values. - * + * * @param in input object containing marshalled Attribute */ - Attribute(DDF& in) : m_caseSensitive(in["case_insensitive"].isnull()) { - const char* id = in.first().name(); - if (id && *id) - m_id = id; - else - throw AttributeException("No id found in marshalled attribute content."); - } - + Attribute(DDF& in); /** * Maintains a copy of serialized attribute values, when possible. - * + * *

Implementations should maintain the array when values are added or removed. */ mutable std::vector m_serialized; public: - virtual ~Attribute() {} - + virtual ~Attribute(); + /** * Returns the Attribute identifier. - * - * @return Attribute identifier + * + * @return the Attribute identifier + */ + const char* getId() const; + + /** + * Returns all of the effective names for the Attribute. + * + * @return immutable array of identifiers, with the primary ID in the first position + */ + const std::vector& getAliases() const; + + /** + * Returns all of the effective names for the Attribute. + * + * @return mutable array of identifiers, with the primary ID in the first position */ - const char* getId() const { - return m_id.c_str(); - } + std::vector& getAliases(); /** * Sets whether case sensitivity should apply to basic value comparisons. * * @param caseSensitive true iff value comparisons should be case sensitive */ - void setCaseSensitive(bool caseSensitive) { - m_caseSensitive = caseSensitive; - } + void setCaseSensitive(bool caseSensitive); + + /** + * Sets whether the attribute should be exported for CGI use. + * + * @param export true iff the attribute should NOT be exported + */ + void setInternal(bool internal); /** * Indicates whether case sensitivity should apply to basic value comparisons. * * @return true iff value comparisons should be case sensitive */ - bool isCaseSensitive() const { - return m_caseSensitive; - } - + bool isCaseSensitive() const; + + /** + * Indicates whether the attribute should be exported for CGI use. + * + * @return true iff the attribute should NOT be exported + */ + bool isInternal() const; + /** * Returns the number of values. - * + * * @return number of values */ - virtual size_t valueCount() const { - return m_serialized.size(); - } - + virtual size_t valueCount() const; + /** * Returns serialized Attribute values encoded as UTF-8 strings. - * + * * @return an immutable vector of values */ - virtual const std::vector& getSerializedValues() const { - return m_serialized; - } - + virtual const std::vector& getSerializedValues() const; + /** * Informs the Attribute that values have changed and any serializations - * must be cleared. + * must be cleared. */ virtual void clearSerializedValues()=0; - + /** * Gets the string equivalent of the value at the specified position (starting from zero). * * @param index position of value - * @return the specified value in its "string" form, or NULL if undefined + * @return the specified value in its "string" form, or nullptr if undefined */ - virtual const char* getString(size_t index) const { - return m_serialized[index].c_str(); - } + virtual const char* getString(size_t index) const; /** * Gets the "scope" of the value at the specified position (starting from zero). * * @param index position of value - * @return the specified value's "scope", or NULL if attribute is unscoped + * @return the specified value's "scope", or nullptr if attribute is unscoped */ - virtual const char* getScope(size_t index) const { - return NULL; - } + virtual const char* getScope(size_t index) const; /** * Removes the value at the specified position (starting from zero). * * @param index position of value to remove */ - virtual void removeValue(size_t index) { - if (index < m_serialized.size()) - m_serialized.erase(m_serialized.begin() + index); - } + virtual void removeValue(size_t index); /** * Marshalls an Attribute for remoting. - * + * *

This allows Attribute objects to be communicated across process boundaries * without excess XML parsing. The DDF returned must be a struct containing * a single list member named with the Attribute's "id". The name of the struct * should contain the registered name of the Attribute implementation. */ - virtual DDF marshall() const { - DDF ddf(NULL); - ddf.structure().addmember(m_id.c_str()).list(); - if (!m_caseSensitive) - ddf.addmember("case_insensitive"); - return ddf; - } - + virtual DDF marshall() const; + /** * Unmarshalls a remoted Attribute. - * + * * @param in remoted Attribute data - * @return a resolved Attribute of the proper subclass + * @return a resolved Attribute of the proper subclass */ static Attribute* unmarshall(DDF& in); - + /** A function that unmarshalls remoted data into the proper Attribute subclass. */ typedef Attribute* AttributeFactory(DDF& in); /** * Registers an AttributeFactory function for a given attribute "type". - * + * * @param type string used at the root of remoted Attribute structures * @param factory factory function - */ - static void registerFactory(const char* type, AttributeFactory* factory) { - m_factoryMap[type] = factory; - } + */ + static void registerFactory(const char* type, AttributeFactory* factory); /** * Deregisters an AttributeFactory function for a given attribute "type". - * + * * @param type string used at the root of remoted Attribute structures - */ - static void deregisterFactory(const char* type) { - m_factoryMap.erase(type); - } + */ + static void deregisterFactory(const char* type); /** * Clears the map of factories. */ - static void deregisterFactories() { - m_factoryMap.clear(); - } - + static void deregisterFactories(); + private: static std::map m_factoryMap; - std::string m_id; - bool m_caseSensitive; + std::vector m_id; + bool m_caseSensitive,m_internal; }; #if defined (_MSC_VER) @@ -236,7 +226,7 @@ namespace shibsp { /** Registers built-in Attribute types into the runtime. */ void registerAttributeFactories(); - + }; #endif /* __shibsp_attribute_h__ */