X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml1%2Fbinding%2Fimpl%2FSAML1POSTEncoder.cpp;h=6b4a7d4370735094d44fed2a50d2e0c917dad4fa;hb=f3a43f14f9dd53428f9e879bb489d6a4cf2674a8;hp=ccc55102e64372883043872f70f77f4c1f409ebc;hpb=b0c11eb8bfd9daa93de903f1ab94f0f34df46c2e;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml1/binding/impl/SAML1POSTEncoder.cpp b/saml/saml1/binding/impl/SAML1POSTEncoder.cpp index ccc5510..6b4a7d4 100644 --- a/saml/saml1/binding/impl/SAML1POSTEncoder.cpp +++ b/saml/saml1/binding/impl/SAML1POSTEncoder.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Internet2 + * Copyright 2001-2007 Internet2 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,8 @@ #include "internal.h" #include "exceptions.h" -#include "saml1/binding/SAML1POSTEncoder.h" +#include "binding/MessageEncoder.h" +#include "signature/ContentReference.h" #include "saml1/core/Protocols.h" #include @@ -41,6 +42,28 @@ using namespace std; namespace opensaml { namespace saml1p { + class SAML_DLLLOCAL SAML1POSTEncoder : public MessageEncoder + { + public: + SAML1POSTEncoder(const DOMElement* e); + virtual ~SAML1POSTEncoder() {} + + long encode( + GenericResponse& genericResponse, + XMLObject* xmlObject, + const char* destination, + const char* recipientID=NULL, + const char* relayState=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. */ + string m_template; + }; + MessageEncoder* SAML_DLLLOCAL SAML1POSTEncoderFactory(const DOMElement* const & e) { return new SAML1POSTEncoder(e); @@ -48,37 +71,36 @@ namespace opensaml { }; }; -static const XMLCh templat[] = UNICODE_LITERAL_8(t,e,m,p,l,a,t,e); +static const XMLCh _template[] = UNICODE_LITERAL_8(t,e,m,p,l,a,t,e); SAML1POSTEncoder::SAML1POSTEncoder(const DOMElement* e) { if (e) { - auto_ptr_char t(e->getAttributeNS(NULL, templat)); + auto_ptr_char t(e->getAttributeNS(NULL, _template)); if (t.get()) m_template = t.get(); } if (m_template.empty()) - throw XMLToolingException("SAML1POSTEncoder requires template attribute."); + throw XMLToolingException("SAML1POSTEncoder requires template XML attribute."); } -SAML1POSTEncoder::~SAML1POSTEncoder() {} - long SAML1POSTEncoder::encode( - HTTPResponse& httpResponse, + GenericResponse& genericResponse, XMLObject* xmlObject, const char* destination, const char* recipientID, const char* relayState, - const CredentialResolver* credResolver, - const XMLCh* sigAlgorithm + const Credential* credential, + const XMLCh* signatureAlg, + const XMLCh* digestAlg ) const { #ifdef _DEBUG xmltooling::NDC ndc("encode"); #endif Category& log = Category::getInstance(SAML_LOGCAT".MessageEncoder.SAML1POST"); + log.debug("validating input"); - if (xmlObject->getParent()) throw BindingException("Cannot encode XML content with parent."); Response* response = dynamic_cast(xmlObject); @@ -88,7 +110,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"); @@ -97,12 +119,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 { @@ -131,13 +160,14 @@ long SAML1POSTEncoder::encode( 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())); - map params; - params["action"] = destination; - params["SAMLResponse"] = xmlbuf; - params["TARGET"] = relayState; + TemplateEngine::TemplateParameters params; + params.m_map["action"] = destination; + params.m_map["SAMLResponse"] = xmlbuf; + params.m_map["TARGET"] = relayState; stringstream s; engine->run(infile, s, params); - long ret = httpResponse.sendResponse(s); + genericResponse.setContentType("text/html"); + long ret = genericResponse.sendResponse(s); // Cleanup by destroying XML. delete xmlObject;