#include <saml/saml2/core/Assertions.h>
#include <saml/util/SAMLConstants.h>
+#include <ctime>
#include <xmltooling/AttributeExtensibleXMLObject.h>
#include <xmltooling/ElementProxy.h>
#include <xmltooling/SimpleElement.h>
*/
namespace saml2md {
+ /**
+ * Base class for metadata objects that feature a cacheDuration attribute.
+ */
+ class SAML_API CacheableSAMLObject : public virtual xmltooling::XMLObject
+ {
+ protected:
+ CacheableSAMLObject() {}
+ public:
+ ~CacheableSAMLObject() {}
+ DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
+ };
+
+ /**
+ * Base class for metadata objects that feature a validUntil attribute.
+ */
+ class SAML_API TimeBoundSAMLObject : public virtual xmltooling::XMLObject
+ {
+ protected:
+ TimeBoundSAMLObject() {}
+ public:
+ ~TimeBoundSAMLObject() {}
+ DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
+ /** Returns true iff the object is valid at the current time. */
+ bool isValid() const {
+ return time(NULL) <= getValidUntilEpoch();
+ }
+ };
+
DECL_XMLOBJECT_SIMPLE(SAML_API,AffiliateMember,ID,SAML 2.0 AffiliateMember element);
DECL_XMLOBJECT_SIMPLE(SAML_API,AttributeProfile,ProfileURI,SAML 2.0 AttributeProfile element);
DECL_XMLOBJECT_SIMPLE(SAML_API,Company,Name,SAML 2.0 Company element);
static const XMLCh KEYTYPE_SIGNING[];
END_XMLOBJECT;
- BEGIN_XMLOBJECT2(SAML_API,RoleDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,SAML 2.0 RoleDescriptor abstract element);
+ BEGIN_XMLOBJECT4(SAML_API,RoleDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
+ CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 RoleDescriptor abstract element);
DECL_STRING_ATTRIB(ID,ID);
- DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
- DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
DECL_STRING_ATTRIB(ProtocolSupportEnumeration,PROTOCOLSUPPORTENUMERATION);
+ /** Searches the ProtocolSupportEnumeration attribute for the indicated protocol. */
+ virtual bool hasSupport(const XMLCh* protocol) const=0;
DECL_STRING_ATTRIB(ErrorURL,ERRORURL);
DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
DECL_TYPED_CHILD(Extensions);
static const XMLCh TYPE_NAME[];
END_XMLOBJECT;
- BEGIN_XMLOBJECT2(SAML_API,AffiliationDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,SAML 2.0 AffiliationDescriptor element);
+ BEGIN_XMLOBJECT4(SAML_API,AffiliationDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
+ CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 AffiliationDescriptor element);
DECL_STRING_ATTRIB(ID,ID);
DECL_STRING_ATTRIB(AffiliationOwnerID,AFFILIATIONOWNERID);
- DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
- DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
DECL_TYPED_CHILD(Extensions);
DECL_TYPED_CHILDREN(AffiliateMember);
static const XMLCh TYPE_NAME[];
END_XMLOBJECT;
- BEGIN_XMLOBJECT2(SAML_API,EntityDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,SAML 2.0 EntityDescriptor element);
+ BEGIN_XMLOBJECT4(SAML_API,EntityDescriptor,xmltooling::AttributeExtensibleXMLObject,SignableObject,
+ CacheableSAMLObject,TimeBoundSAMLObject,SAML 2.0 EntityDescriptor element);
DECL_STRING_ATTRIB(ID,ID);
DECL_STRING_ATTRIB(EntityID,ENTITYID);
- DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
- DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
DECL_TYPED_CHILD(Extensions);
DECL_TYPED_CHILD(AffiliationDescriptor);
static const XMLCh TYPE_NAME[];
END_XMLOBJECT;
- BEGIN_XMLOBJECT(SAML_API,EntitiesDescriptor,SignableObject,SAML 2.0 EntitiesDescriptor element);
+ BEGIN_XMLOBJECT3(SAML_API,EntitiesDescriptor,SignableObject,CacheableSAMLObject,
+ TimeBoundSAMLObject,SAML 2.0 EntitiesDescriptor element);
DECL_STRING_ATTRIB(ID,ID);
DECL_STRING_ATTRIB(Name,NAME);
- DECL_DATETIME_ATTRIB(ValidUntil,VALIDUNTIL);
- DECL_DATETIME_ATTRIB(CacheDuration,CACHEDURATION);
DECL_TYPED_FOREIGN_CHILD(Signature,xmlsignature);
DECL_TYPED_CHILD(Extensions);
DECL_TYPED_CHILDREN(EntityDescriptor);
void processChildElement(XMLObject* childXMLObject, const DOMElement* root) {
PROC_TYPED_FOREIGN_CHILD(KeyInfo,xmlsignature,XMLConstants::XMLSIG_NS,false);
- PROC_TYPED_FOREIGN_CHILDREN(EncryptionMethod,xmlencryption,XMLConstants::XMLENC_NS,false);
+ PROC_TYPED_FOREIGN_CHILDREN(EncryptionMethod,xmlencryption,SAMLConstants::SAML20MD_NS,false);
AbstractXMLObjectUnmarshaller::processChildElement(childXMLObject,root);
}
IMPL_STRING_ATTRIB(ID);
IMPL_STRING_ATTRIB(ProtocolSupportEnumeration);
IMPL_STRING_ATTRIB(ErrorURL);
- IMPL_DATETIME_ATTRIB(ValidUntil);
- IMPL_DATETIME_ATTRIB(CacheDuration);
+ IMPL_DATETIME_ATTRIB(ValidUntil,LLONG_MAX);
+ IMPL_DATETIME_ATTRIB(CacheDuration,0);
IMPL_TYPED_CHILD(Extensions);
IMPL_TYPED_CHILDREN(KeyDescriptor,m_pos_Organization);
IMPL_TYPED_CHILD(Organization);
IMPL_TYPED_CHILDREN(ContactPerson,m_pos_ContactPerson);
+
+ bool hasSupport(const XMLCh* protocol) const {
+ if (m_ProtocolSupportEnumeration) {
+ // Look for first character.
+ unsigned int len=XMLString::stringLen(protocol);
+ unsigned int pos=0;
+ int index=XMLString::indexOf(m_ProtocolSupportEnumeration,protocol[0],pos);
+ while (index>=0) {
+ // Only possible match is if it's the first character or a space comes before it.
+ if (index==0 || m_ProtocolSupportEnumeration[index-1]==chSpace) {
+ // See if rest of protocol string is present.
+ if (0==XMLString::compareNString(m_ProtocolSupportEnumeration+index+1,protocol+1,len-1)) {
+ // Only possible match is if it's the last character or a space comes after it.
+ if (m_ProtocolSupportEnumeration[index+len+1]==chNull || m_ProtocolSupportEnumeration[index+len+1]==chSpace)
+ return true;
+ else
+ pos=index+len+1;
+ }
+ else {
+ // Move past last search and start again.
+ pos=index+1;
+ }
+ }
+ else {
+ // Move past last search and start again.
+ pos=index+1;
+ }
+ index=XMLString::indexOf(m_ProtocolSupportEnumeration,protocol[0],pos);
+ }
+ }
+ return false;
+ }
void setAttribute(QName& qualifiedName, const XMLCh* value) {
if (!qualifiedName.hasNamespaceURI()) {
IMPL_STRING_ATTRIB(ID);
IMPL_STRING_ATTRIB(AffiliationOwnerID);
- IMPL_DATETIME_ATTRIB(ValidUntil);
- IMPL_DATETIME_ATTRIB(CacheDuration);
+ IMPL_DATETIME_ATTRIB(ValidUntil,LLONG_MAX);
+ IMPL_DATETIME_ATTRIB(CacheDuration,0);
IMPL_TYPED_CHILD(Extensions);
IMPL_TYPED_CHILDREN(AffiliateMember,m_pos_AffiliateMember);
IMPL_TYPED_CHILDREN(KeyDescriptor,m_children.end());
IMPL_STRING_ATTRIB(ID);
IMPL_STRING_ATTRIB(EntityID);
- IMPL_DATETIME_ATTRIB(ValidUntil);
- IMPL_DATETIME_ATTRIB(CacheDuration);
+ IMPL_DATETIME_ATTRIB(ValidUntil,LLONG_MAX);
+ IMPL_DATETIME_ATTRIB(CacheDuration,0);
IMPL_TYPED_CHILD(Extensions);
IMPL_TYPED_CHILDREN(RoleDescriptor,m_pos_AffiliationDescriptor);
IMPL_TYPED_CHILDREN(IDPSSODescriptor,m_pos_AffiliationDescriptor);
IMPL_STRING_ATTRIB(ID);
IMPL_STRING_ATTRIB(Name);
- IMPL_DATETIME_ATTRIB(ValidUntil);
- IMPL_DATETIME_ATTRIB(CacheDuration);
+ IMPL_DATETIME_ATTRIB(ValidUntil,LLONG_MAX);
+ IMPL_DATETIME_ATTRIB(CacheDuration,0);
IMPL_TYPED_CHILD(Extensions);
IMPL_TYPED_CHILDREN(EntityDescriptor,m_children.end());
IMPL_TYPED_CHILDREN(EntitiesDescriptor,m_children.end());
const XMLCh AffiliationDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_21(A,f,f,i,l,i,a,t,i,o,n,D,e,s,c,r,i,p,t,o,r);
const XMLCh AffiliationDescriptor::TYPE_NAME[] = UNICODE_LITERAL_25(A,f,f,i,l,i,a,t,i,o,n,D,e,s,c,r,i,p,t,o,r,T,y,p,e);
const XMLCh AffiliationDescriptor::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
-const XMLCh AffiliationDescriptor::VALIDUNTIL_ATTRIB_NAME[] = UNICODE_LITERAL_10(v,a,l,i,d,U,n,t,i,l);
-const XMLCh AffiliationDescriptor::CACHEDURATION_ATTRIB_NAME[] = UNICODE_LITERAL_13(c,a,c,h,e,D,u,r,a,t,i,o,n);
const XMLCh AffiliationDescriptor::AFFILIATIONOWNERID_ATTRIB_NAME[] = UNICODE_LITERAL_18(a,f,f,i,l,i,a,t,i,o,n,O,w,n,e,r,I,D);
const XMLCh ArtifactResolutionService::LOCAL_NAME[] = UNICODE_LITERAL_25(A,r,t,i,f,a,c,t,R,e,s,o,l,u,t,i,o,n,S,e,r,v,i,c,e);
const XMLCh AssertionConsumerService::LOCAL_NAME[] = UNICODE_LITERAL_24(A,s,s,e,r,t,i,o,n,C,o,n,s,u,m,e,r,S,e,r,v,i,c,e);
const XMLCh AuthnAuthorityDescriptor::TYPE_NAME[] = UNICODE_LITERAL_28(A,u,t,h,n,A,u,t,h,o,r,i,t,y,D,e,s,c,r,i,p,t,o,r,T,y,p,e);
const XMLCh AuthnQueryService::LOCAL_NAME[] = UNICODE_LITERAL_17(A,u,t,h,n,Q,u,e,r,y,S,e,r,v,i,c,e);
const XMLCh AuthzService::LOCAL_NAME[] = UNICODE_LITERAL_12(A,u,t,h,z,S,e,r,v,i,c,e);
+const XMLCh CacheableSAMLObject::CACHEDURATION_ATTRIB_NAME[] = UNICODE_LITERAL_13(c,a,c,h,e,D,u,r,a,t,i,o,n);
const XMLCh Company::LOCAL_NAME[] = UNICODE_LITERAL_7(C,o,m,p,a,n,y);
const XMLCh ContactPerson::LOCAL_NAME[] = UNICODE_LITERAL_13(C,o,n,t,a,c,t,P,e,r,s,o,n);
const XMLCh ContactPerson::TYPE_NAME[] = UNICODE_LITERAL_11(C,o,n,t,a,c,t,T,y,p,e);
const XMLCh EntitiesDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_18(E,n,t,i,t,i,e,s,D,e,s,c,r,i,p,t,o,r);
const XMLCh EntitiesDescriptor::TYPE_NAME[] = UNICODE_LITERAL_22(E,n,t,i,t,i,e,s,D,e,s,c,r,i,p,t,o,r,T,y,p,e);
const XMLCh EntitiesDescriptor::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
-const XMLCh EntitiesDescriptor::VALIDUNTIL_ATTRIB_NAME[] = UNICODE_LITERAL_10(v,a,l,i,d,U,n,t,i,l);
-const XMLCh EntitiesDescriptor::CACHEDURATION_ATTRIB_NAME[] = UNICODE_LITERAL_13(c,a,c,h,e,D,u,r,a,t,i,o,n);
const XMLCh EntitiesDescriptor::NAME_ATTRIB_NAME[] = UNICODE_LITERAL_4(N,a,m,e);
const XMLCh EntityDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_16(E,n,t,i,t,y,D,e,s,c,r,i,p,t,o,r);
const XMLCh EntityDescriptor::TYPE_NAME[] = UNICODE_LITERAL_20(E,n,t,i,t,y,D,e,s,c,r,i,p,t,o,r,T,y,p,e);
const XMLCh EntityDescriptor::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
-const XMLCh EntityDescriptor::VALIDUNTIL_ATTRIB_NAME[] = UNICODE_LITERAL_10(v,a,l,i,d,U,n,t,i,l);
-const XMLCh EntityDescriptor::CACHEDURATION_ATTRIB_NAME[] = UNICODE_LITERAL_13(c,a,c,h,e,D,u,r,a,t,i,o,n);
const XMLCh EntityDescriptor::ENTITYID_ATTRIB_NAME[] = UNICODE_LITERAL_8(e,n,t,i,t,y,I,D);
const XMLCh Extensions::LOCAL_NAME[] = UNICODE_LITERAL_10(E,x,t,e,n,s,i,o,n,s);
const XMLCh Extensions::TYPE_NAME[] = UNICODE_LITERAL_14(E,x,t,e,n,s,i,o,n,s,T,y,p,e);
const XMLCh RequestedAttribute::ISREQUIRED_ATTRIB_NAME[] = UNICODE_LITERAL_10(i,s,R,e,q,u,i,r,e,d);
const XMLCh RoleDescriptor::LOCAL_NAME[] = UNICODE_LITERAL_14(R,o,l,e,D,e,s,c,r,i,p,t,o,r);
const XMLCh RoleDescriptor::ID_ATTRIB_NAME[] = UNICODE_LITERAL_2(I,D);
-const XMLCh RoleDescriptor::VALIDUNTIL_ATTRIB_NAME[] = UNICODE_LITERAL_10(v,a,l,i,d,U,n,t,i,l);
-const XMLCh RoleDescriptor::CACHEDURATION_ATTRIB_NAME[] = UNICODE_LITERAL_13(c,a,c,h,e,D,u,r,a,t,i,o,n);
const XMLCh RoleDescriptor::PROTOCOLSUPPORTENUMERATION_ATTRIB_NAME[] = UNICODE_LITERAL_26(p,r,o,t,o,c,o,l,S,u,p,p,o,r,t,E,n,u,m,e,r,a,t,i,o,n);
const XMLCh RoleDescriptor::ERRORURL_ATTRIB_NAME[] = UNICODE_LITERAL_8(e,r,r,o,r,U,R,L);
const XMLCh ServiceDescription::LOCAL_NAME[] = UNICODE_LITERAL_18(S,e,r,v,i,c,e,D,e,s,c,r,i,p,t,i,o,n);
const XMLCh SSODescriptorType::TYPE_NAME[] = UNICODE_LITERAL_17(S,S,O,D,e,s,c,r,i,p,t,o,r,T,y,p,e);
const XMLCh SurName::LOCAL_NAME[] = UNICODE_LITERAL_7(S,u,r,N,a,m,e);
const XMLCh TelephoneNumber::LOCAL_NAME[] = UNICODE_LITERAL_15(T,e,l,e,p,h,o,n,e,N,u,m,b,e,r);
+const XMLCh TimeBoundSAMLObject::VALIDUNTIL_ATTRIB_NAME[] = UNICODE_LITERAL_10(v,a,l,i,d,U,n,t,i,l);