https://issues.shibboleth.net/jira/browse/SSPCPP-181
[shibboleth/cpp-opensaml.git] / saml / binding / impl / MessageDecoder.cpp
index 070d90d..56ddae1 100644 (file)
@@ -1,6 +1,6 @@
 /*
- *  Copyright 2001-2007 Internet2
- * 
+ *  Copyright 2001-2009 Internet2
+ *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
 
 /**
  * MessageDecoder.cpp
- * 
- * Interface to SAML protocol binding message decoders. 
+ *
+ * Interface to SAML protocol binding message decoders.
  */
 
 #include "internal.h"
 #include "binding/MessageDecoder.h"
+#include "saml2/metadata/EndpointManager.h"
+#include "saml2/metadata/Metadata.h"
 #include "util/SAMLConstants.h"
 
+using namespace opensaml::saml2md;
 using namespace opensaml;
 using namespace xmltooling;
 using namespace std;
@@ -33,7 +36,7 @@ namespace opensaml {
         SAML_DLLLOCAL PluginManager< MessageDecoder,string,pair<const DOMElement*,const XMLCh*> >::Factory SAML1ArtifactDecoderFactory;
         SAML_DLLLOCAL PluginManager< MessageDecoder,string,pair<const DOMElement*,const XMLCh*> >::Factory SAML1POSTDecoderFactory;
         SAML_DLLLOCAL PluginManager< MessageDecoder,string,pair<const DOMElement*,const XMLCh*> >::Factory SAML1SOAPDecoderFactory;
-    }; 
+    };
 
     namespace saml2p {
         SAML_DLLLOCAL PluginManager< MessageDecoder,string,pair<const DOMElement*,const XMLCh*> >::Factory SAML2ArtifactDecoderFactory;
@@ -57,3 +60,18 @@ void SAML_API opensaml::registerMessageDecoders()
     conf.MessageDecoderManager.registerFactory(samlconstants::SAML20_BINDING_SOAP, saml2p::SAML2SOAPDecoderFactory);
     conf.MessageDecoderManager.registerFactory(samlconstants::SAML20_BINDING_PAOS, saml2p::SAML2ECPDecoderFactory);
 }
+
+bool MessageDecoder::ArtifactResolver::isSupported(const SSODescriptorType& ssoDescriptor) const
+{
+    EndpointManager<ArtifactResolutionService> mgr(ssoDescriptor.getArtifactResolutionServices());
+    if (ssoDescriptor.hasSupport(samlconstants::SAML20P_NS)) {
+        auto_ptr_XMLCh binding(samlconstants::SAML20_BINDING_SOAP);
+        return (mgr.getByBinding(binding.get()) != NULL);
+    }
+    else if (ssoDescriptor.hasSupport(samlconstants::SAML11_PROTOCOL_ENUM) || ssoDescriptor.hasSupport(samlconstants::SAML10_PROTOCOL_ENUM)) {
+        auto_ptr_XMLCh binding(samlconstants::SAML1_BINDING_SOAP);
+        return (mgr.getByBinding(binding.get()) != NULL);
+    }
+
+    return false;
+}