X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=shibsp%2Fattribute%2FAttribute.h;h=c734909c9fc987a4fda4f7bd6ead2b6494a409ba;hb=a62c416b6ecfc17d89853a8f14604249c94d2f60;hp=a997a552b86d033d457973a6363e033550f33ac0;hpb=7a57d5b3bca7e52fdb5b737d72426923caad4303;p=shibboleth%2Fsp.git diff --git a/shibsp/attribute/Attribute.h b/shibsp/attribute/Attribute.h index a997a55..c734909 100644 --- a/shibsp/attribute/Attribute.h +++ b/shibsp/attribute/Attribute.h @@ -1,6 +1,6 @@ /* - * Copyright 2001-2006 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,7 +16,7 @@ /** * @file shibsp/attribute/Attribute.h - * + * * A resolved attribute. */ @@ -25,23 +25,29 @@ #include +#include #include #include namespace shibsp { +#if defined (_MSC_VER) + #pragma warning( push ) + #pragma warning( disable : 4251 ) +#endif + /** * 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 { @@ -49,72 +55,178 @@ 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) {} + 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); /** * 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 + */ + 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); + + /** + * 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 */ - const char* getId() const { - return m_id.c_str(); - } - + 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. - * + * 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. + * Informs the Attribute that values have changed and any serializations + * 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 nullptr if undefined + */ + 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 nullptr if attribute is unscoped + */ + 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); + /** * Marshalls an Attribute for remoting. - * - * This allows Attribute objects to be communicated across process boundaries + * + *

This allows Attribute objects to be communicated across process boundaries * without excess XML parsing. The DDF returned must be a struct containing - * a string member called "id" and a list called "values". The name of the struct - * should contain the registered name of the Attribute implementation. - */ - virtual DDF marshall() const { - DDF ddf(NULL); - ddf.structure().addmember("id").string(m_id.c_str()); - return ddf; - } - + * 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; + + /** + * Unmarshalls a remoted Attribute. + * + * @param in remoted Attribute data + * @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); + + /** + * 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); + + /** + * Clears the map of factories. + */ + static void deregisterFactories(); + private: - std::string m_id; + static std::map m_factoryMap; + std::vector m_id; + bool m_caseSensitive,m_internal; }; +#if defined (_MSC_VER) + #pragma warning( pop ) +#endif + + /** Registers built-in Attribute types into the runtime. */ + void registerAttributeFactories(); + }; #endif /* __shibsp_attribute_h__ */