X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml1%2Fbinding%2Fimpl%2FSAML1POSTEncoder.cpp;h=f7c8ecd338d91c36670673b211d8458458580b6d;hb=25e13c8d1138bb4a9509e359eee3ce1c26becc27;hp=2a68bb46c6de0f2c03070de52957296eee2a069f;hpb=d2160d2eb960f57e06f96aa3ef1bf80e56a0b4b6;p=shibboleth%2Fopensaml2.git diff --git a/saml/saml1/binding/impl/SAML1POSTEncoder.cpp b/saml/saml1/binding/impl/SAML1POSTEncoder.cpp index 2a68bb4..f7c8ecd 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,17 +46,19 @@ 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, XMLObject* xmlObject, const char* destination, - const char* recipientID=NULL, + const EntityDescriptor* recipient=NULL, const char* relayState=NULL, + const ArtifactGenerator* artifactGenerator=NULL, const Credential* credential=NULL, - const XMLCh* sigAlgorithm=NULL + const XMLCh* signatureAlg=NULL, + const XMLCh* digestAlg=NULL ) const; protected: @@ -62,20 +66,20 @@ namespace opensaml { 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 ArtifactGenerator* artifactGenerator, const Credential* credential, - const XMLCh* sigAlgorithm + const XMLCh* signatureAlg, + const XMLCh* digestAlg ) const { #ifdef _DEBUG @@ -97,6 +103,10 @@ long SAML1POSTEncoder::encode( #endif Category& log = Category::getInstance(SAML_LOGCAT".MessageEncoder.SAML1POST"); + TemplateEngine* engine = XMLToolingConfig::getConfig().getTemplateEngine(); + if (!engine) + throw BindingException("Encoding response using POST requires a TemplateEngine instance."); + log.debug("validating input"); if (xmlObject->getParent()) throw BindingException("Cannot encode XML content with parent."); @@ -118,8 +128,13 @@ long SAML1POSTEncoder::encode( // Build a Signature. Signature* sig = SignatureBuilder::buildSignature(); response->setSignature(sig); - if (sigAlgorithm) - sig->setSignatureAlgorithm(sigAlgorithm); + 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); @@ -130,9 +145,14 @@ long SAML1POSTEncoder::encode( log.debug("marshalling the response"); rootElement = response->marshall(); } - - string xmlbuf; + + // Push message into template. + TemplateEngine::TemplateParameters pmap; + string& xmlbuf = pmap.m_map["SAMLResponse"]; XMLHelper::serialize(rootElement, xmlbuf); + log.debug("marshalled response:\n%s", xmlbuf.c_str()); + + // Replace with base-64 encoded version. unsigned int len=0; XMLByte* out=Base64::encode(reinterpret_cast(xmlbuf.data()),xmlbuf.size(),&len); if (out) { @@ -144,20 +164,15 @@ long SAML1POSTEncoder::encode( throw BindingException("Base64 encoding of XML failed."); } - // Push message into template and send result to client. + // Fill in the rest of the data and send to the client. log.debug("message encoded, sending HTML form template to client"); - TemplateEngine* engine = XMLToolingConfig::getConfig().getTemplateEngine(); - if (!engine) - throw BindingException("Encoding response using POST requires a TemplateEngine instance."); ifstream infile(m_template.c_str()); if (!infile) throw BindingException("Failed to open HTML template for POST response ($1).", params(1,m_template.c_str())); - TemplateEngine::TemplateParameters params; - params.m_map["action"] = destination; - params.m_map["SAMLResponse"] = xmlbuf; - params.m_map["TARGET"] = relayState; + pmap.m_map["action"] = destination; + pmap.m_map["TARGET"] = relayState; stringstream s; - engine->run(infile, s, params); + engine->run(infile, s, pmap); genericResponse.setContentType("text/html"); long ret = genericResponse.sendResponse(s);