https://issues.shibboleth.net/jira/browse/CPPOST-58
authorScott Cantor <cantor.2@osu.edu>
Wed, 17 Nov 2010 03:13:33 +0000 (03:13 +0000)
committerScott Cantor <cantor.2@osu.edu>
Wed, 17 Nov 2010 03:13:33 +0000 (03:13 +0000)
cpp-opensaml2.sln
saml/saml2/metadata/Metadata.h
saml/saml2/metadata/impl/DiscoverableMetadataProvider.cpp
saml/saml2/metadata/impl/MetadataImpl.cpp
saml/saml2/metadata/impl/MetadataSchemaValidators.cpp

index c662ad6..c539c82 100644 (file)
@@ -49,9 +49,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Schemas", "Schemas", "{5548
                schemas\sstc-saml-attribute-ext.xsd = schemas\sstc-saml-attribute-ext.xsd\r
                schemas\sstc-saml-delegation.xsd = schemas\sstc-saml-delegation.xsd\r
                schemas\sstc-saml-idp-discovery.xsd = schemas\sstc-saml-idp-discovery.xsd\r
                schemas\sstc-saml-attribute-ext.xsd = schemas\sstc-saml-attribute-ext.xsd\r
                schemas\sstc-saml-delegation.xsd = schemas\sstc-saml-delegation.xsd\r
                schemas\sstc-saml-idp-discovery.xsd = schemas\sstc-saml-idp-discovery.xsd\r
-               schemas\sstc-saml-metadata-algsupport.xsd = schemas\sstc-saml-metadata-algsupport.xsd\r
+               schemas\sstc-saml-metadata-algsupport-v1.0.xsd = schemas\sstc-saml-metadata-algsupport-v1.0.xsd\r
                schemas\sstc-saml-metadata-ext-query.xsd = schemas\sstc-saml-metadata-ext-query.xsd\r
                schemas\sstc-saml-metadata-ext-query.xsd = schemas\sstc-saml-metadata-ext-query.xsd\r
-               schemas\sstc-saml-metadata-ui.xsd = schemas\sstc-saml-metadata-ui.xsd\r
+               schemas\sstc-saml-metadata-ui-v1.0.xsd = schemas\sstc-saml-metadata-ui-v1.0.xsd\r
                schemas\sstc-saml-protocol-ext-thirdparty.xsd = schemas\sstc-saml-protocol-ext-thirdparty.xsd\r
                schemas\sstc-saml1x-metadata.xsd = schemas\sstc-saml1x-metadata.xsd\r
        EndProjectSection\r
                schemas\sstc-saml-protocol-ext-thirdparty.xsd = schemas\sstc-saml-protocol-ext-thirdparty.xsd\r
                schemas\sstc-saml1x-metadata.xsd = schemas\sstc-saml1x-metadata.xsd\r
        EndProjectSection\r
index c9e0a8b..5c52354 100644 (file)
@@ -440,6 +440,13 @@ namespace opensaml {
             DECL_SIMPLE_CONTENT(Description);
         END_XMLOBJECT;
 
             DECL_SIMPLE_CONTENT(Description);
         END_XMLOBJECT;
 
+        BEGIN_XMLOBJECT(SAML_API,Keywords,xmltooling::XMLObject,SAML Metadata Extension for Login UI Keywords element);
+            DECL_STRING_ATTRIB(Lang,LANG);
+            DECL_SIMPLE_CONTENT(Values);
+            /** KeywordsType local name */
+            static const XMLCh TYPE_NAME[];
+        END_XMLOBJECT;
+
         BEGIN_XMLOBJECT(SAML_API,Logo,xmltooling::XMLObject,SAML Metadata Extension for Login UI Logo element);
             DECL_STRING_ATTRIB(Lang,LANG);
             DECL_INTEGER_ATTRIB(Height,HEIGHT);
         BEGIN_XMLOBJECT(SAML_API,Logo,xmltooling::XMLObject,SAML Metadata Extension for Login UI Logo element);
             DECL_STRING_ATTRIB(Lang,LANG);
             DECL_INTEGER_ATTRIB(Height,HEIGHT);
@@ -460,6 +467,7 @@ namespace opensaml {
         BEGIN_XMLOBJECT(SAML_API,UIInfo,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Login UI UIInfo element);
             DECL_TYPED_CHILDREN(DisplayName);
             DECL_TYPED_CHILDREN(Description);
         BEGIN_XMLOBJECT(SAML_API,UIInfo,xmltooling::ElementExtensibleXMLObject,SAML Metadata Extension for Login UI UIInfo element);
             DECL_TYPED_CHILDREN(DisplayName);
             DECL_TYPED_CHILDREN(Description);
+                       DECL_TYPED_CHILDREN(Keywords);
             DECL_TYPED_CHILDREN(Logo);
             DECL_TYPED_CHILDREN(InformationURL);
             DECL_TYPED_CHILDREN(PrivacyStatementURL);
             DECL_TYPED_CHILDREN(Logo);
             DECL_TYPED_CHILDREN(InformationURL);
             DECL_TYPED_CHILDREN(PrivacyStatementURL);
@@ -585,6 +593,7 @@ namespace opensaml {
         DECL_XMLOBJECTBUILDER(SAML_API,UIInfo,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,DisplayName,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,Description,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,UIInfo,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,DisplayName,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,Description,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
+               DECL_XMLOBJECTBUILDER(SAML_API,Keywords,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,Logo,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,InformationURL,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,PrivacyStatementURL,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,Logo,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,InformationURL,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
         DECL_XMLOBJECTBUILDER(SAML_API,PrivacyStatementURL,samlconstants::SAML20MD_UI_NS,samlconstants::SAML20MD_UI_PREFIX);
index 72039b3..93888d5 100644 (file)
@@ -163,6 +163,23 @@ void DiscoverableMetadataProvider::disco(string& s, const EntityDescriptor* enti
                                 s += "\n ]";
                             }
 
                                 s += "\n ]";
                             }
 
+                            const vector<Keywords*>& keywords = info->getKeywordss();
+                            if (!keywords.empty()) {
+                                s += ",\n \"Keywords\": [";
+                                for (vector<Keywords*>::const_iterator words = keywords.begin(); words != keywords.end(); ++words) {
+                                    if (words != keywords.begin())
+                                        s += ',';
+                                    auto_arrayptr<char> val(toUTF8((*words)->getValues()));
+                                    auto_ptr_char lang((*words)->getLang());
+                                    s += "\n  {\n  \"value\": \"";
+                                    json_safe(s, val.get());
+                                    s += "\",\n  \"lang\": \"";
+                                    s += lang.get();
+                                    s += "\"\n  }";
+                                }
+                                s += "\n ]";
+                            }
+
                             const vector<InformationURL*>& infurls = info->getInformationURLs();
                             if (!infurls.empty()) {
                                 s += ",\n \"InformationURLs\": [";
                             const vector<InformationURL*>& infurls = info->getInformationURLs();
                             if (!infurls.empty()) {
                                 s += ",\n \"InformationURLs\": [";
index 716104e..e0822dd 100644 (file)
@@ -2711,6 +2711,69 @@ namespace opensaml {
             }
         };
 
             }
         };
 
+        class SAML_DLLLOCAL KeywordsImpl : public virtual Keywords,
+            public AbstractSimpleElement,
+            public AbstractDOMCachingXMLObject,
+            public AbstractXMLObjectMarshaller,
+            public AbstractXMLObjectUnmarshaller
+        {
+            void init() {
+                m_Lang=nullptr;
+                m_LangPrefix=nullptr;
+            }
+
+        protected:
+            KeywordsImpl() {
+                init();
+            }
+
+        public:
+            virtual ~KeywordsImpl() {
+                XMLString::release(&m_Lang);
+                XMLString::release(&m_LangPrefix);
+            }
+
+            KeywordsImpl(const XMLCh* nsURI, const XMLCh* localName, const XMLCh* prefix, const xmltooling::QName* schemaType)
+                    : AbstractXMLObject(nsURI, localName, prefix, schemaType) {
+                init();
+            }
+
+            KeywordsImpl(const KeywordsImpl& src)
+                    : AbstractXMLObject(src), AbstractSimpleElement(src), AbstractDOMCachingXMLObject(src) {
+                init();
+                setLang(src.getLang());
+                if (src.m_LangPrefix)
+                    m_LangPrefix = XMLString::replicate(src.m_LangPrefix);
+            }
+
+            IMPL_XMLOBJECT_CLONE(Keywords);
+            IMPL_XMLOBJECT_FOREIGN_ATTRIB(Lang,XMLCh);
+
+        protected:
+            void marshallAttributes(DOMElement* domElement) const {
+                if (m_Lang && *m_Lang) {
+                    DOMAttr* attr=domElement->getOwnerDocument()->createAttributeNS(xmlconstants::XML_NS, LANG_ATTRIB_NAME);
+                    if (m_LangPrefix && *m_LangPrefix)
+                        attr->setPrefix(m_LangPrefix);
+                    else
+                        attr->setPrefix(xmlconstants::XML_PREFIX);
+                    attr->setNodeValue(m_Lang);
+                    domElement->setAttributeNodeNS(attr);
+                }
+            }
+
+            void processAttribute(const DOMAttr* attribute) {
+                if (XMLHelper::isNodeNamed(attribute, xmlconstants::XML_NS, LANG_ATTRIB_NAME)) {
+                    setLang(attribute->getValue());
+                    const XMLCh* temp = attribute->getPrefix();
+                    if (temp && *temp && !XMLString::equals(temp, xmlconstants::XML_NS))
+                        m_LangPrefix = XMLString::replicate(temp);
+                    return;
+                }
+                AbstractXMLObjectUnmarshaller::processAttribute(attribute);
+            }
+        };
+
         class SAML_DLLLOCAL LogoImpl : public virtual Logo,
             public AbstractSimpleElement,
             public AbstractDOMCachingXMLObject,
         class SAML_DLLLOCAL LogoImpl : public virtual Logo,
             public AbstractSimpleElement,
             public AbstractDOMCachingXMLObject,
@@ -2815,7 +2878,13 @@ namespace opensaml {
                             continue;
                         }
 
                             continue;
                         }
 
-                        Logo* logo=dynamic_cast<Logo*>(*i);
+                        Keywords* key=dynamic_cast<Keywords*>(*i);
+                        if (key) {
+                            getKeywordss().push_back(key->cloneKeywords());
+                            continue;
+                        }
+
+                                               Logo* logo=dynamic_cast<Logo*>(*i);
                         if (logo) {
                             getLogos().push_back(logo->cloneLogo());
                             continue;
                         if (logo) {
                             getLogos().push_back(logo->cloneLogo());
                             continue;
@@ -2841,6 +2910,7 @@ namespace opensaml {
             IMPL_XMLOBJECT_CLONE(UIInfo);
             IMPL_TYPED_CHILDREN(DisplayName,m_children.end());
             IMPL_TYPED_CHILDREN(Description,m_children.end());
             IMPL_XMLOBJECT_CLONE(UIInfo);
             IMPL_TYPED_CHILDREN(DisplayName,m_children.end());
             IMPL_TYPED_CHILDREN(Description,m_children.end());
+                       IMPL_TYPED_CHILDREN(Keywords,m_children.end());
             IMPL_TYPED_CHILDREN(Logo,m_children.end());
             IMPL_TYPED_CHILDREN(InformationURL,m_children.end());
             IMPL_TYPED_CHILDREN(PrivacyStatementURL,m_children.end());
             IMPL_TYPED_CHILDREN(Logo,m_children.end());
             IMPL_TYPED_CHILDREN(InformationURL,m_children.end());
             IMPL_TYPED_CHILDREN(PrivacyStatementURL,m_children.end());
@@ -2850,6 +2920,7 @@ namespace opensaml {
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
                 PROC_TYPED_CHILDREN(DisplayName,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(Description,SAML20MD_UI_NS,false);
             void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
                 PROC_TYPED_CHILDREN(DisplayName,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(Description,SAML20MD_UI_NS,false);
+                               PROC_TYPED_CHILDREN(Keywords,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(Logo,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(InformationURL,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(PrivacyStatementURL,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(Logo,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(InformationURL,SAML20MD_UI_NS,false);
                 PROC_TYPED_CHILDREN(PrivacyStatementURL,SAML20MD_UI_NS,false);
@@ -3001,6 +3072,7 @@ IMPL_XMLOBJECTBUILDER(DigestMethod);
 IMPL_XMLOBJECTBUILDER(SigningMethod);
 IMPL_XMLOBJECTBUILDER(DisplayName);
 IMPL_XMLOBJECTBUILDER(Description);
 IMPL_XMLOBJECTBUILDER(SigningMethod);
 IMPL_XMLOBJECTBUILDER(DisplayName);
 IMPL_XMLOBJECTBUILDER(Description);
+IMPL_XMLOBJECTBUILDER(Keywords);
 IMPL_XMLOBJECTBUILDER(Logo);
 IMPL_XMLOBJECTBUILDER(InformationURL);
 IMPL_XMLOBJECTBUILDER(PrivacyStatementURL);
 IMPL_XMLOBJECTBUILDER(Logo);
 IMPL_XMLOBJECTBUILDER(InformationURL);
 IMPL_XMLOBJECTBUILDER(PrivacyStatementURL);
@@ -3199,6 +3271,9 @@ const XMLCh KeyDescriptor::TYPE_NAME[] =                UNICODE_LITERAL_17(K,e,y
 const XMLCh KeyDescriptor::USE_ATTRIB_NAME[] =          UNICODE_LITERAL_3(u,s,e);
 const XMLCh KeyDescriptor::KEYTYPE_ENCRYPTION[] =       UNICODE_LITERAL_10(e,n,c,r,y,p,t,i,o,n);
 const XMLCh KeyDescriptor::KEYTYPE_SIGNING[] =          UNICODE_LITERAL_7(s,i,g,n,i,n,g);
 const XMLCh KeyDescriptor::USE_ATTRIB_NAME[] =          UNICODE_LITERAL_3(u,s,e);
 const XMLCh KeyDescriptor::KEYTYPE_ENCRYPTION[] =       UNICODE_LITERAL_10(e,n,c,r,y,p,t,i,o,n);
 const XMLCh KeyDescriptor::KEYTYPE_SIGNING[] =          UNICODE_LITERAL_7(s,i,g,n,i,n,g);
+const XMLCh Keywords::LOCAL_NAME[] =                                   UNICODE_LITERAL_8(K,e,y,w,o,r,d,s);
+const XMLCh Keywords::TYPE_NAME[] =                                            UNICODE_LITERAL_12(K,e,y,w,o,r,d,s,T,y,p,e);
+const XMLCh Keywords::LANG_ATTRIB_NAME[] =              UNICODE_LITERAL_4(l,a,n,g);
 const XMLCh Logo::LOCAL_NAME[] =                        UNICODE_LITERAL_4(L,o,g,o);
 const XMLCh Logo::TYPE_NAME[] =                         UNICODE_LITERAL_8(L,o,g,o,T,y,p,e);
 const XMLCh Logo::LANG_ATTRIB_NAME[] =                  UNICODE_LITERAL_4(l,a,n,g);
 const XMLCh Logo::LOCAL_NAME[] =                        UNICODE_LITERAL_4(L,o,g,o);
 const XMLCh Logo::TYPE_NAME[] =                         UNICODE_LITERAL_8(L,o,g,o,T,y,p,e);
 const XMLCh Logo::LANG_ATTRIB_NAME[] =                  UNICODE_LITERAL_4(l,a,n,g);
index f96f791..7258fb8 100644 (file)
@@ -293,6 +293,11 @@ namespace opensaml {
             XMLOBJECTVALIDATOR_REQUIRE(Description,Lang);
         END_XMLOBJECTVALIDATOR;
 
             XMLOBJECTVALIDATOR_REQUIRE(Description,Lang);
         END_XMLOBJECTVALIDATOR;
 
+        BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Keywords);
+            XMLOBJECTVALIDATOR_REQUIRE(Keywords,TextContent);
+            XMLOBJECTVALIDATOR_REQUIRE(Keywords,Lang);
+        END_XMLOBJECTVALIDATOR;
+
         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Logo);
             XMLOBJECTVALIDATOR_REQUIRE(Logo,TextContent);
             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(Logo,Height);
         BEGIN_XMLOBJECTVALIDATOR(SAML_DLLLOCAL,Logo);
             XMLOBJECTVALIDATOR_REQUIRE(Logo,TextContent);
             XMLOBJECTVALIDATOR_REQUIRE_INTEGER(Logo,Height);
@@ -461,12 +466,14 @@ void opensaml::saml2md::registerMetadataClasses() {
 
     REGISTER_ELEMENT_UI(DisplayName);
     REGISTER_ELEMENT_UI(Description);
 
     REGISTER_ELEMENT_UI(DisplayName);
     REGISTER_ELEMENT_UI(Description);
+       REGISTER_ELEMENT_UI(Keywords);
     REGISTER_ELEMENT_UI(Logo);
     REGISTER_ELEMENT_UI(InformationURL);
     REGISTER_ELEMENT_UI(PrivacyStatementURL);
     REGISTER_ELEMENT_UI(IPHint);
     REGISTER_ELEMENT_UI(DomainHint);
     REGISTER_ELEMENT_UI(GeolocationHint);
     REGISTER_ELEMENT_UI(Logo);
     REGISTER_ELEMENT_UI(InformationURL);
     REGISTER_ELEMENT_UI(PrivacyStatementURL);
     REGISTER_ELEMENT_UI(IPHint);
     REGISTER_ELEMENT_UI(DomainHint);
     REGISTER_ELEMENT_UI(GeolocationHint);
+       REGISTER_TYPE_UI(Keywords);
     REGISTER_TYPE_UI(Logo);
     REGISTER_ELEMENT_UI_NOVAL(UIInfo);
     REGISTER_ELEMENT_UI_NOVAL(DiscoHints);
     REGISTER_TYPE_UI(Logo);
     REGISTER_ELEMENT_UI_NOVAL(UIInfo);
     REGISTER_ELEMENT_UI_NOVAL(DiscoHints);