Removed unnecessary class from string literals.
[shibboleth/cpp-opensaml.git] / saml / binding / impl / MessageEncoder.cpp
index 7510254..16ca166 100644 (file)
 
 #include "internal.h"
 #include "binding/MessageEncoder.h"
+#include "util/samlconstants.h"
+
+#include <xmltooling/signature/KeyInfo.h>
+#include <xmltooling/signature/Signature.h>
 
 using namespace opensaml;
+using namespace xmlsignature;
 using namespace xmltooling;
 using namespace std;
 
@@ -32,11 +37,51 @@ namespace opensaml {
         SAML_DLLLOCAL PluginManager<MessageEncoder,const DOMElement*>::Factory SAML1ArtifactEncoderFactory;
         SAML_DLLLOCAL PluginManager<MessageEncoder,const DOMElement*>::Factory SAML1POSTEncoderFactory;
     }; 
+
+    namespace saml2p {
+        SAML_DLLLOCAL PluginManager<MessageEncoder,const DOMElement*>::Factory SAML2ArtifactEncoderFactory;
+        SAML_DLLLOCAL PluginManager<MessageEncoder,const DOMElement*>::Factory SAML2POSTEncoderFactory;
+    };
 };
 
 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::SAML20_BINDING_HTTP_ARTIFACT, saml2p::SAML2ArtifactEncoderFactory);
+    conf.MessageEncoderManager.registerFactory(samlconstants::SAML20_BINDING_HTTP_POST, saml2p::SAML2POSTEncoderFactory);
+}
+
+namespace {
+    class SAML_DLLLOCAL _addcert : public binary_function<X509Data*,XSECCryptoX509*,void> {
+    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<XSECCryptoX509*>& 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;
 }