From: Scott Cantor Date: Wed, 17 Nov 2010 03:13:33 +0000 (+0000) Subject: https://issues.shibboleth.net/jira/browse/CPPOST-58 X-Git-Tag: 2.4~6 X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-opensaml.git;a=commitdiff_plain;h=e53bd797d6d229d9cefc8cb28170e98bb493d6ba https://issues.shibboleth.net/jira/browse/CPPOST-58 --- diff --git a/cpp-opensaml2.sln b/cpp-opensaml2.sln index c662ad6..c539c82 100644 --- a/cpp-opensaml2.sln +++ b/cpp-opensaml2.sln @@ -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 schemas\sstc-saml-delegation.xsd = schemas\sstc-saml-delegation.xsd schemas\sstc-saml-idp-discovery.xsd = schemas\sstc-saml-idp-discovery.xsd - schemas\sstc-saml-metadata-algsupport.xsd = schemas\sstc-saml-metadata-algsupport.xsd + schemas\sstc-saml-metadata-algsupport-v1.0.xsd = schemas\sstc-saml-metadata-algsupport-v1.0.xsd schemas\sstc-saml-metadata-ext-query.xsd = schemas\sstc-saml-metadata-ext-query.xsd - schemas\sstc-saml-metadata-ui.xsd = schemas\sstc-saml-metadata-ui.xsd + schemas\sstc-saml-metadata-ui-v1.0.xsd = schemas\sstc-saml-metadata-ui-v1.0.xsd schemas\sstc-saml-protocol-ext-thirdparty.xsd = schemas\sstc-saml-protocol-ext-thirdparty.xsd schemas\sstc-saml1x-metadata.xsd = schemas\sstc-saml1x-metadata.xsd EndProjectSection diff --git a/saml/saml2/metadata/Metadata.h b/saml/saml2/metadata/Metadata.h index c9e0a8b..5c52354 100644 --- a/saml/saml2/metadata/Metadata.h +++ b/saml/saml2/metadata/Metadata.h @@ -440,6 +440,13 @@ namespace opensaml { 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); @@ -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); + DECL_TYPED_CHILDREN(Keywords); 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,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); diff --git a/saml/saml2/metadata/impl/DiscoverableMetadataProvider.cpp b/saml/saml2/metadata/impl/DiscoverableMetadataProvider.cpp index 72039b3..93888d5 100644 --- a/saml/saml2/metadata/impl/DiscoverableMetadataProvider.cpp +++ b/saml/saml2/metadata/impl/DiscoverableMetadataProvider.cpp @@ -163,6 +163,23 @@ void DiscoverableMetadataProvider::disco(string& s, const EntityDescriptor* enti s += "\n ]"; } + const vector& keywords = info->getKeywordss(); + if (!keywords.empty()) { + s += ",\n \"Keywords\": ["; + for (vector::const_iterator words = keywords.begin(); words != keywords.end(); ++words) { + if (words != keywords.begin()) + s += ','; + auto_arrayptr 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& infurls = info->getInformationURLs(); if (!infurls.empty()) { s += ",\n \"InformationURLs\": ["; diff --git a/saml/saml2/metadata/impl/MetadataImpl.cpp b/saml/saml2/metadata/impl/MetadataImpl.cpp index 716104e..e0822dd 100644 --- a/saml/saml2/metadata/impl/MetadataImpl.cpp +++ b/saml/saml2/metadata/impl/MetadataImpl.cpp @@ -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, @@ -2815,7 +2878,13 @@ namespace opensaml { continue; } - Logo* logo=dynamic_cast(*i); + Keywords* key=dynamic_cast(*i); + if (key) { + getKeywordss().push_back(key->cloneKeywords()); + continue; + } + + Logo* logo=dynamic_cast(*i); 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_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()); @@ -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); + 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); @@ -3001,6 +3072,7 @@ IMPL_XMLOBJECTBUILDER(DigestMethod); IMPL_XMLOBJECTBUILDER(SigningMethod); IMPL_XMLOBJECTBUILDER(DisplayName); IMPL_XMLOBJECTBUILDER(Description); +IMPL_XMLOBJECTBUILDER(Keywords); 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 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); diff --git a/saml/saml2/metadata/impl/MetadataSchemaValidators.cpp b/saml/saml2/metadata/impl/MetadataSchemaValidators.cpp index f96f791..7258fb8 100644 --- a/saml/saml2/metadata/impl/MetadataSchemaValidators.cpp +++ b/saml/saml2/metadata/impl/MetadataSchemaValidators.cpp @@ -293,6 +293,11 @@ namespace opensaml { 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); @@ -461,12 +466,14 @@ void opensaml::saml2md::registerMetadataClasses() { 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_TYPE_UI(Keywords); REGISTER_TYPE_UI(Logo); REGISTER_ELEMENT_UI_NOVAL(UIInfo); REGISTER_ELEMENT_UI_NOVAL(DiscoHints);