X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fbinding%2Fimpl%2FMessageEncoder.cpp;h=5b6f761c046348a73b2635fe3e57c98f91b32dcb;hb=c3c89629114e8a29b8c9a769956b6b4e7e2c4c24;hp=7510254de97e96d7cf2e4fa9c0021616b734719e;hpb=54bc3fd9396935d92c53bbb69d003e8d121720c2;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/binding/impl/MessageEncoder.cpp b/saml/binding/impl/MessageEncoder.cpp index 7510254..5b6f761 100644 --- a/saml/binding/impl/MessageEncoder.cpp +++ b/saml/binding/impl/MessageEncoder.cpp @@ -22,8 +22,13 @@ #include "internal.h" #include "binding/MessageEncoder.h" +#include "util/SAMLConstants.h" + +#include +#include using namespace opensaml; +using namespace xmlsignature; using namespace xmltooling; using namespace std; @@ -31,12 +36,60 @@ namespace opensaml { namespace saml1p { SAML_DLLLOCAL PluginManager::Factory SAML1ArtifactEncoderFactory; SAML_DLLLOCAL PluginManager::Factory SAML1POSTEncoderFactory; + SAML_DLLLOCAL PluginManager::Factory SAML1SOAPEncoderFactory; }; + + namespace saml2p { + SAML_DLLLOCAL PluginManager::Factory SAML2ArtifactEncoderFactory; + SAML_DLLLOCAL PluginManager::Factory SAML2POSTEncoderFactory; + SAML_DLLLOCAL PluginManager::Factory SAML2POSTSimpleSignEncoderFactory; + SAML_DLLLOCAL PluginManager::Factory SAML2RedirectEncoderFactory; + SAML_DLLLOCAL PluginManager::Factory SAML2SOAPEncoderFactory; + }; }; void SAML_API opensaml::registerMessageEncoders() { SAMLConfig& conf=SAMLConfig::getConfig(); - conf.MessageEncoderManager.registerFactory(SAML1_ARTIFACT_ENCODER, saml1p::SAML1ArtifactEncoderFactory); - conf.MessageEncoderManager.registerFactory(SAML1_POST_ENCODER, saml1p::SAML1POSTEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML1_PROFILE_BROWSER_ARTIFACT, saml1p::SAML1ArtifactEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML1_PROFILE_BROWSER_POST, saml1p::SAML1POSTEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML1_BINDING_SOAP, saml1p::SAML1SOAPEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML20_BINDING_HTTP_ARTIFACT, saml2p::SAML2ArtifactEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML20_BINDING_HTTP_POST, saml2p::SAML2POSTEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML20_BINDING_HTTP_POST_SIMPLESIGN, saml2p::SAML2POSTSimpleSignEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML20_BINDING_HTTP_REDIRECT, saml2p::SAML2RedirectEncoderFactory); + conf.MessageEncoderManager.registerFactory(samlconstants::SAML20_BINDING_SOAP, saml2p::SAML2SOAPEncoderFactory); +} + +namespace { + class SAML_DLLLOCAL _addcert : public binary_function { + public: + void operator()(X509Data* bag, XSECCryptoX509* cert) const { + safeBuffer& buf=cert->getDEREncodingSB(); + X509Certificate* x=X509CertificateBuilder::buildX509Certificate(); + x->setValue(buf.sbStrToXMLCh()); + bag->getX509Certificates().push_back(x); + } + }; +}; + +Signature* MessageEncoder::buildSignature(const CredentialResolver* credResolver, const XMLCh* sigAlgorithm) const +{ + // Build a Signature. + Signature* sig = SignatureBuilder::buildSignature(); + if (sigAlgorithm) + sig->setSignatureAlgorithm(sigAlgorithm); + sig->setSigningKey(credResolver->getKey()); + + // Build KeyInfo. + const vector& certs = credResolver->getCertificates(); + if (!certs.empty()) { + KeyInfo* keyInfo=KeyInfoBuilder::buildKeyInfo(); + X509Data* x509Data=X509DataBuilder::buildX509Data(); + keyInfo->getX509Datas().push_back(x509Data); + for_each(certs.begin(),certs.end(),bind1st(_addcert(),x509Data)); + sig->setKeyInfo(keyInfo); + } + + return sig; }