X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml2%2Fbinding%2Fimpl%2FSAML2RedirectEncoder.cpp;h=937f8eaae9d20224ae47274ecf6285af16a880a4;hb=11cd3b15c71ee22f2818d810a17c213123e8c248;hp=38bf52c69890773580d08f4f5c89395b014c9f45;hpb=932cfaae2176c2eba1a9938dc420591a9551a7f3;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml2/binding/impl/SAML2RedirectEncoder.cpp b/saml/saml2/binding/impl/SAML2RedirectEncoder.cpp index 38bf52c..937f8ea 100644 --- a/saml/saml2/binding/impl/SAML2RedirectEncoder.cpp +++ b/saml/saml2/binding/impl/SAML2RedirectEncoder.cpp @@ -22,19 +22,20 @@ #include "internal.h" #include "exceptions.h" -#include "binding/HTTPResponse.h" -#include "binding/URLEncoder.h" +#include "binding/MessageEncoder.h" #include "saml2/binding/SAML2Redirect.h" -#include "saml2/binding/SAML2RedirectEncoder.h" #include "saml2/core/Protocols.h" #include #include #include #include +#include #include +#include using namespace opensaml::saml2p; +using namespace opensaml::saml2md; using namespace opensaml; using namespace xmlsignature; using namespace xmltooling; @@ -43,9 +44,32 @@ using namespace std; namespace opensaml { namespace saml2p { - MessageEncoder* SAML_DLLLOCAL SAML2RedirectEncoderFactory(const DOMElement* const & e) + class SAML_DLLLOCAL SAML2RedirectEncoder : public MessageEncoder { - return new SAML2RedirectEncoder(e); + public: + SAML2RedirectEncoder() {} + virtual ~SAML2RedirectEncoder() {} + + bool isCompact() const { + return true; + } + + long encode( + GenericResponse& genericResponse, + XMLObject* xmlObject, + const char* destination, + const EntityDescriptor* recipient=NULL, + const char* relayState=NULL, + const ArtifactGenerator* artifactGenerator=NULL, + const Credential* credential=NULL, + const XMLCh* signatureAlg=NULL, + const XMLCh* digestAlg=NULL + ) const; + }; + + MessageEncoder* SAML_DLLLOCAL SAML2RedirectEncoderFactory(const pair& p) + { + return new SAML2RedirectEncoder(); } }; }; @@ -54,10 +78,12 @@ long SAML2RedirectEncoder::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 @@ -102,30 +128,31 @@ long SAML2RedirectEncoder::encode( throw BindingException("Base64 encoding of XML failed."); // Create beginnings of redirect query string. - URLEncoder* escaper = SAMLConfig::getConfig().getURLEncoder(); + const URLEncoder* escaper = XMLToolingConfig::getConfig().getURLEncoder(); xmlbuf.erase(); xmlbuf.append(reinterpret_cast(encoded),len); xmlbuf = (request ? "SAMLRequest=" : "SAMLResponse=") + escaper->encode(xmlbuf.c_str()); - if (relayState) + if (relayState && *relayState) xmlbuf = xmlbuf + "&RelayState=" + escaper->encode(relayState); - if (credResolver) { + if (credential) { + log.debug("signing the message"); + // Sign the query string after adding the algorithm. - if (!sigAlgorithm) - sigAlgorithm = DSIGConstants::s_unicodeStrURIRSA_SHA1; - auto_ptr_char alg(sigAlgorithm); + if (!signatureAlg) + signatureAlg = DSIGConstants::s_unicodeStrURIRSA_SHA1; + auto_ptr_char alg(signatureAlg); xmlbuf = xmlbuf + "&SigAlg=" + escaper->encode(alg.get()); char sigbuf[1024]; memset(sigbuf,0,sizeof(sigbuf)); - auto_ptr key(credResolver->getKey()); - Signature::createRawSignature(key.get(), sigAlgorithm, xmlbuf.c_str(), xmlbuf.length(), sigbuf, sizeof(sigbuf)-1); + Signature::createRawSignature(credential->getPrivateKey(), signatureAlg, xmlbuf.c_str(), xmlbuf.length(), sigbuf, sizeof(sigbuf)-1); xmlbuf = xmlbuf + "&Signature=" + escaper->encode(sigbuf); } // Generate redirect. log.debug("message encoded, sending redirect to client"); - xmlbuf.insert(0,1,(strchr(destination,'?') ? '&' : '?')); + xmlbuf.insert((string::size_type)0,(string::size_type)1,(strchr(destination,'?') ? '&' : '?')); xmlbuf.insert(0,destination); long ret = httpResponse->sendRedirect(xmlbuf.c_str());