X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml1%2Fbinding%2Fimpl%2FSAML1POSTEncoder.cpp;h=3a6feaef06379857aec60e7f6aa3916cf7787e7c;hb=9fddf9054c76de6239295b98a559fcc75453effc;hp=de3b37740995e0aa5961224fc9802c8bc257aae7;hpb=f9aa9375e0908e119af283278d00468a9b2249f5;p=shibboleth%2Fopensaml2.git diff --git a/saml/saml1/binding/impl/SAML1POSTEncoder.cpp b/saml/saml1/binding/impl/SAML1POSTEncoder.cpp index de3b377..3a6feae 100644 --- a/saml/saml1/binding/impl/SAML1POSTEncoder.cpp +++ b/saml/saml1/binding/impl/SAML1POSTEncoder.cpp @@ -23,20 +23,22 @@ #include "internal.h" #include "exceptions.h" #include "binding/MessageEncoder.h" +#include "signature/ContentReference.h" #include "saml1/core/Protocols.h" #include #include -#include #include +#include #include #include using namespace opensaml::saml1p; +using namespace opensaml::saml2md; using namespace opensaml; using namespace xmlsignature; +using namespace xmltooling::logging; using namespace xmltooling; -using namespace log4cpp; using namespace std; namespace opensaml { @@ -44,38 +46,40 @@ namespace opensaml { class SAML_DLLLOCAL SAML1POSTEncoder : public MessageEncoder { public: - SAML1POSTEncoder(const DOMElement* e); + SAML1POSTEncoder(const DOMElement* e, const XMLCh* ns); virtual ~SAML1POSTEncoder() {} long encode( GenericResponse& genericResponse, - xmltooling::XMLObject* xmlObject, + XMLObject* xmlObject, const char* destination, - const char* recipientID=NULL, + const EntityDescriptor* recipient=NULL, const char* relayState=NULL, - const xmltooling::CredentialResolver* credResolver=NULL, - const XMLCh* sigAlgorithm=NULL + const ArtifactGenerator* artifactGenerator=NULL, + const Credential* credential=NULL, + const XMLCh* signatureAlg=NULL, + const XMLCh* digestAlg=NULL ) const; protected: /** Pathname of HTML template for transmission of message via POST. */ - std::string m_template; + string m_template; }; - MessageEncoder* SAML_DLLLOCAL SAML1POSTEncoderFactory(const DOMElement* const & e) + MessageEncoder* SAML_DLLLOCAL SAML1POSTEncoderFactory(const pair& p) { - return new SAML1POSTEncoder(e); + return new SAML1POSTEncoder(p.first, p.second); } }; }; static const XMLCh _template[] = UNICODE_LITERAL_8(t,e,m,p,l,a,t,e); -SAML1POSTEncoder::SAML1POSTEncoder(const DOMElement* e) +SAML1POSTEncoder::SAML1POSTEncoder(const DOMElement* e, const XMLCh* ns) { if (e) { - auto_ptr_char t(e->getAttributeNS(NULL, _template)); - if (t.get()) + auto_ptr_char t(e->getAttributeNS(ns, _template)); + if (t.get() && *t.get()) m_template = t.get(); } if (m_template.empty()) @@ -86,10 +90,12 @@ long SAML1POSTEncoder::encode( GenericResponse& genericResponse, XMLObject* xmlObject, const char* destination, - const char* recipientID, + const EntityDescriptor* recipient, const char* relayState, - const CredentialResolver* credResolver, - const XMLCh* sigAlgorithm + const ArtifactGenerator* artifactGenerator, + const Credential* credential, + const XMLCh* signatureAlg, + const XMLCh* digestAlg ) const { #ifdef _DEBUG @@ -107,7 +113,7 @@ long SAML1POSTEncoder::encode( throw BindingException("SAML 1.x POST Encoder requires relay state (TARGET) value."); DOMElement* rootElement = NULL; - if (credResolver) { + if (credential) { // Signature based on native XML signing. if (response->getSignature()) { log.debug("response already signed, skipping signature operation"); @@ -116,12 +122,19 @@ long SAML1POSTEncoder::encode( log.debug("signing and marshalling the response"); // Build a Signature. - Signature* sig = buildSignature(credResolver, sigAlgorithm); + Signature* sig = SignatureBuilder::buildSignature(); response->setSignature(sig); + if (signatureAlg) + sig->setSignatureAlgorithm(signatureAlg); + if (digestAlg) { + opensaml::ContentReference* cr = dynamic_cast(sig->getContentReference()); + if (cr) + cr->setDigestAlgorithm(digestAlg); + } // Sign response while marshalling. vector sigs(1,sig); - rootElement = response->marshall((DOMDocument*)NULL,&sigs); + rootElement = response->marshall((DOMDocument*)NULL,&sigs,credential); } } else {