Allow message-only policy rules, basic SAML SOAP client.
[shibboleth/cpp-opensaml.git] / saml / saml1 / binding / impl / SAML1POSTDecoder.cpp
index bff2e55..fd3258a 100644 (file)
@@ -52,9 +52,7 @@ namespace opensaml {
 
 SAML1POSTDecoder::SAML1POSTDecoder(const DOMElement* e) {}
 
-SAML1POSTDecoder::~SAML1POSTDecoder() {}
-
-Response* SAML1POSTDecoder::decode(
+XMLObject* SAML1POSTDecoder::decode(
     string& relayState,
     const GenericRequest& genericRequest,
     SecurityPolicy& policy
@@ -103,8 +101,20 @@ Response* SAML1POSTDecoder::decode(
         if (!m_validate)
             SchemaValidators.validate(xmlObject.get());
         
+        // Check recipient URL.
+        auto_ptr_char recipient(response->getRecipient());
+        const char* recipient2 = httpRequest->getRequestURL();
+        if (!recipient.get() || !*(recipient.get())) {
+            log.error("response missing Recipient attribute");
+            throw BindingException("SAML response did not contain Recipient attribute identifying intended destination.");
+        }
+        else if (!recipient2 || !*recipient2 || strcmp(recipient.get(),recipient2)) {
+            log.error("POST targeted at (%s), but delivered to (%s)", recipient.get(), recipient2 ? recipient2 : "none");
+            throw BindingException("SAML message delivered with POST to incorrect server URL.");
+        }
+        
         // Run through the policy.
-        policy.evaluate(genericRequest, *response);
+        policy.evaluate(*response, &genericRequest);
     }
     catch (XMLToolingException& ex) {
         // This is just to maximize the likelihood of attaching a source to the message for support purposes.