X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml2%2Fbinding%2Fimpl%2FSAML2RedirectEncoder.cpp;h=82308f9e9d4118f376e1335e81840a3bba499a68;hb=197bcbae7339bc779bc5780882d11fdeb45f8223;hp=f345866a0fccb9940997f3de20416c6b9568ab43;hpb=ceba6432d156e82a9016190c06ae4640c651a257;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/saml2/binding/impl/SAML2RedirectEncoder.cpp b/saml/saml2/binding/impl/SAML2RedirectEncoder.cpp index f345866..82308f9 100644 --- a/saml/saml2/binding/impl/SAML2RedirectEncoder.cpp +++ b/saml/saml2/binding/impl/SAML2RedirectEncoder.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. @@ -23,19 +23,16 @@ #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 #include +#include using namespace opensaml::saml2p; using namespace opensaml; @@ -46,6 +43,23 @@ using namespace std; namespace opensaml { namespace saml2p { + class SAML_DLLLOCAL SAML2RedirectEncoder : public MessageEncoder + { + public: + SAML2RedirectEncoder(const DOMElement* e) {} + virtual ~SAML2RedirectEncoder() {} + + long encode( + GenericResponse& genericResponse, + xmltooling::XMLObject* xmlObject, + const char* destination, + const char* recipientID=NULL, + const char* relayState=NULL, + const xmltooling::CredentialResolver* credResolver=NULL, + const XMLCh* sigAlgorithm=NULL + ) const; + }; + MessageEncoder* SAML_DLLLOCAL SAML2RedirectEncoderFactory(const DOMElement* const & e) { return new SAML2RedirectEncoder(e); @@ -66,7 +80,7 @@ long SAML2RedirectEncoder::encode( #ifdef _DEBUG xmltooling::NDC ndc("encode"); #endif - Category& log = Category::getInstance(SAML_LOGCAT".MessageEncoder.SAML2POST"); + Category& log = Category::getInstance(SAML_LOGCAT".MessageEncoder.SAML2Redirect"); log.debug("validating input"); HTTPResponse* httpResponse=dynamic_cast(&genericResponse); @@ -80,7 +94,7 @@ long SAML2RedirectEncoder::encode( if (!request) { response = dynamic_cast(xmlObject); if (!response) - throw BindingException("XML content for SAML 2.0 HTTP-POST Encoder must be a SAML 2.0 protocol message."); + throw BindingException("XML content for SAML 2.0 HTTP-Redirect Encoder must be a SAML 2.0 protocol message."); } // Check for XML signature. @@ -105,7 +119,7 @@ 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()); @@ -119,20 +133,11 @@ long SAML2RedirectEncoder::encode( auto_ptr_char alg(sigAlgorithm); xmlbuf = xmlbuf + "&SigAlg=" + escaper->encode(alg.get()); - try { - 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); - xmlbuf = xmlbuf + "&Signature=" + escaper->encode(sigbuf); - } - catch(XSECException& e) { - auto_ptr_char temp(e.getMsg()); - throw SignatureException(string("Caught an XMLSecurity exception while signing: ") + temp.get()); - } - catch(XSECCryptoException& e) { - throw SignatureException(string("Caught an XMLSecurity exception while signing: ") + e.getMsg()); - } + 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); + xmlbuf = xmlbuf + "&Signature=" + escaper->encode(sigbuf); } // Generate redirect.