X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fsaml2%2Fbinding%2Fimpl%2FSAML2POSTEncoder.cpp;h=5820150e0d6c4648e0e38deb92d27d087b3c0116;hb=6b6567475b3e640fd24017ab26f6acbc23febba4;hp=efa5a57a444a0b7e87e6dcf838ef72cce1bb4077;hpb=cc07469677e2713f7839410186872e409f54bb7d;p=shibboleth%2Fopensaml2.git diff --git a/saml/saml2/binding/impl/SAML2POSTEncoder.cpp b/saml/saml2/binding/impl/SAML2POSTEncoder.cpp index efa5a57..5820150 100644 --- a/saml/saml2/binding/impl/SAML2POSTEncoder.cpp +++ b/saml/saml2/binding/impl/SAML2POSTEncoder.cpp @@ -28,8 +28,8 @@ #include #include -#include #include +#include #include #include @@ -37,8 +37,8 @@ using namespace opensaml::saml2p; 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 { @@ -46,7 +46,7 @@ namespace opensaml { class SAML_DLLLOCAL SAML2POSTEncoder : public MessageEncoder { public: - SAML2POSTEncoder(const DOMElement* e, bool simple=false); + SAML2POSTEncoder(const DOMElement* e, const XMLCh* ns, bool simple=false); virtual ~SAML2POSTEncoder() {} long encode( @@ -55,6 +55,7 @@ namespace opensaml { 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 @@ -65,25 +66,25 @@ namespace opensaml { bool m_simple; }; - MessageEncoder* SAML_DLLLOCAL SAML2POSTEncoderFactory(const DOMElement* const & e) + MessageEncoder* SAML_DLLLOCAL SAML2POSTEncoderFactory(const pair& p) { - return new SAML2POSTEncoder(e, false); + return new SAML2POSTEncoder(p.first, p.second, false); } - MessageEncoder* SAML_DLLLOCAL SAML2POSTSimpleSignEncoderFactory(const DOMElement* const & e) + MessageEncoder* SAML_DLLLOCAL SAML2POSTSimpleSignEncoderFactory(const pair& p) { - return new SAML2POSTEncoder(e, true); + return new SAML2POSTEncoder(p.first, p.second, true); } }; }; static const XMLCh _template[] = UNICODE_LITERAL_8(t,e,m,p,l,a,t,e); -SAML2POSTEncoder::SAML2POSTEncoder(const DOMElement* e, bool simple) : m_simple(simple) +SAML2POSTEncoder::SAML2POSTEncoder(const DOMElement* e, const XMLCh* ns, bool simple) : m_simple(simple) { 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()) @@ -96,6 +97,7 @@ long SAML2POSTEncoder::encode( const char* destination, const EntityDescriptor* recipient, const char* relayState, + const ArtifactGenerator* artifactGenerator, const Credential* credential, const XMLCh* signatureAlg, const XMLCh* digestAlg @@ -173,6 +175,19 @@ long SAML2POSTEncoder::encode( memset(sigbuf,0,sizeof(sigbuf)); Signature::createRawSignature(credential->getPrivateKey(), signatureAlg, input.c_str(), input.length(), sigbuf, sizeof(sigbuf)-1); pmap.m_map["Signature"] = sigbuf; + + auto_ptr keyInfo(credential->getKeyInfo()); + if (keyInfo.get()) { + string& kstring = pmap.m_map["KeyInfo"]; + XMLHelper::serialize(keyInfo->marshall((DOMDocument*)NULL), kstring); + unsigned int len=0; + XMLByte* out=Base64::encode(reinterpret_cast(kstring.data()),kstring.size(),&len); + if (!out) + throw BindingException("Base64 encoding of XML failed."); + kstring.erase(); + kstring.append(reinterpret_cast(out),len); + XMLString::release(&out); + } } // Base64 the message.