[cpp-sp] branch master updated: SSPCPP-593 - Unable to clear/overwrite response headers

Scott Cantor cantor.2 at osu.edu
Mon Mar 26 13:38:22 EDT 2018


This is an automated email from the git hooks/post-receive script.

scantor pushed a commit to branch master
in repository cpp-sp.

View the commit online:
http://git.shibboleth.net/view/?p=cpp-sp.git;a=commit;h=fe5cd78163a74563a895ea4b7fd4dd897199cfac

The following commit(s) were added to refs/heads/master by this push:
       new  fe5cd78   SSPCPP-593 - Unable to clear/overwrite response headers
fe5cd78 is described below

commit fe5cd78163a74563a895ea4b7fd4dd897199cfac
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Mon Mar 26 13:37:53 2018 -0400

    SSPCPP-593 - Unable to clear/overwrite response headers
    
    https://issues.shibboleth.net/jira/browse/SSPCPP-593
---
 apache/mod_shib.cpp                    | 24 ++++++++++++++++++------
 fastcgi/shibauthorizer.cpp             | 12 ++++++------
 fastcgi/shibresponder.cpp              | 14 +++++++-------
 iis7_shib/IIS7Request.cpp              |  8 ++++----
 iis7_shib/headers/IIS7Request.hpp      |  2 +-
 isapi_shib/isapi_shib.cpp              | 30 +++++++++++++++---------------
 nsapi_shib/nsapi_shib.cpp              | 11 +++++++----
 shibsp/handler/impl/RemotedHandler.cpp | 21 +++++++++++++++++----
 8 files changed, 75 insertions(+), 47 deletions(-)

diff --git a/apache/mod_shib.cpp b/apache/mod_shib.cpp
index 0a1fd16..fac5fd3 100644
--- a/apache/mod_shib.cpp
+++ b/apache/mod_shib.cpp
@@ -648,9 +648,9 @@ public:
   void setContentType(const char* type) {
       m_req->content_type = ap_psprintf(m_req->pool, "%s", type);
   }
-  void setResponseHeader(const char* name, const char* value) {
-    HTTPResponse::setResponseHeader(name, value);
-    if (name) {
+  void setResponseHeader(const char* name, const char* value, bool replace=false) {
+    HTTPResponse::setResponseHeader(name, value, replace);
+    if (name && *name) {
 #ifdef SHIB_DEFERRED_HEADERS
         if (!m_rc) {
             // this happens on subrequests
@@ -660,11 +660,23 @@ public:
             if (!m_rc->hdr_out) {
                 m_rc->hdr_out = ap_make_table(m_req->pool, 5);
             }
-            ap_table_add(m_rc->hdr_out, name, value);
+            if (replace || !value)
+                ap_table_unset(m_rc->hdr_out, name);
+            if (value && *value)
+                ap_table_add(m_rc->hdr_out, name, value);
         }
-        else
-#endif
+        else {
+            if (replace || !value)
+                ap_table_unset(m_req->err_headers_out, name);
+            if (value && *value)
+                ap_table_add(m_req->err_headers_out, name, value);
+        }
+#else
+        if (replace || !value)
+            ap_table_unset(m_req->err_headers_out, name);
+        if (value && *value)
             ap_table_add(m_req->err_headers_out, name, value);
+#endif
     }
   }
   long sendResponse(istream& in, long status) {
diff --git a/fastcgi/shibauthorizer.cpp b/fastcgi/shibauthorizer.cpp
index 76d4a27..ba0bbfe 100644
--- a/fastcgi/shibauthorizer.cpp
+++ b/fastcgi/shibauthorizer.cpp
@@ -196,14 +196,14 @@ public:
         }
         return "";
     }
-    void setResponseHeader(const char* name, const char* value) {
-        HTTPResponse::setResponseHeader(name, value);
-        if (name) {
+    void setResponseHeader(const char* name, const char* value, bool replace=false) {
+        HTTPResponse::setResponseHeader(name, value, replace);
+        if (name && *name) {
             // Set for later.
-            if (value)
-                m_response_headers.insert(make_pair(name,value));
-            else
+            if (replace || !value)
                 m_response_headers.erase(name);
+            if (value && *value)
+                m_response_headers.insert(make_pair(name,value));
         }
     }
     const char* getQueryString() const {
diff --git a/fastcgi/shibresponder.cpp b/fastcgi/shibresponder.cpp
index 32afe8e..963d4c6 100644
--- a/fastcgi/shibresponder.cpp
+++ b/fastcgi/shibresponder.cpp
@@ -148,14 +148,14 @@ public:
         return s ? s : "";
     }
 
-    void setResponseHeader(const char* name, const char* value) {
-        HTTPResponse::setResponseHeader(name, value);
-        if (name) {
+    void setResponseHeader(const char* name, const char* value, bool replace = false) {
+        HTTPResponse::setResponseHeader(name, value, replace);
+        if (name && *name) {
             // Set for later.
-            if (value)
-                m_headers.insert(make_pair(name,value));
-            else
-                m_headers.erase(name);
+            if (replace || !value)
+                m_response_headers.erase(name);
+            if (value && *value)
+                m_response_headers.insert(make_pair(name, value));
         }
     }
 
diff --git a/iis7_shib/IIS7Request.cpp b/iis7_shib/IIS7Request.cpp
index a45203f..7da0be7 100644
--- a/iis7_shib/IIS7Request.cpp
+++ b/iis7_shib/IIS7Request.cpp
@@ -427,11 +427,11 @@ long IIS7Request::sendResponse(istream& in, long status)
 }
 
 // XMLTooing:: HTTPResponse
-void IIS7Request::setResponseHeader(const char* name, const char* value)
+void IIS7Request::setResponseHeader(const char* name, const char* value, bool replace)
 {
-    HTTPResponse::setResponseHeader(name, value);
+    HTTPResponse::setResponseHeader(name, value, replace);
 
-    size_t sz = strlen(value);
+    size_t sz = value ? strlen(value) : 0;
 
     if (sz > USHRT_MAX) {
         // TODO Do this elsewhere?
@@ -439,7 +439,7 @@ void IIS7Request::setResponseHeader(const char* name, const char* value)
         sz = USHRT_MAX;
     }
 
-    HRESULT hr = m_response->SetHeader(name, value,  static_cast<USHORT>(sz), FALSE);
+    HRESULT hr = m_response->SetHeader(name, value, static_cast<USHORT>(sz), replace || !value ? TRUE : FALSE);
     if (FAILED(hr)) {
         throwError("setResponseHeader", hr);
     }
diff --git a/iis7_shib/headers/IIS7Request.hpp b/iis7_shib/headers/IIS7Request.hpp
index 310e3d2..8f171e8 100644
--- a/iis7_shib/headers/IIS7Request.hpp
+++ b/iis7_shib/headers/IIS7Request.hpp
@@ -79,7 +79,7 @@ protected:
 
     // XMLTooing:: HTTPResponse, GenericResponse
     long sendResponse(istream& in, long status);
-    void setResponseHeader(const char* name, const char* value);
+    void setResponseHeader(const char* name, const char* value, bool replace=false);
     long sendRedirect(const char* url);
 
 private:
diff --git a/isapi_shib/isapi_shib.cpp b/isapi_shib/isapi_shib.cpp
index ccf458b..6393830 100644
--- a/isapi_shib/isapi_shib.cpp
+++ b/isapi_shib/isapi_shib.cpp
@@ -519,14 +519,14 @@ public:
   string getRemoteUser() const {
     return getSecureHeader("remote-user");
   }
-  void setResponseHeader(const char* name, const char* value) {
-    HTTPResponse::setResponseHeader(name, value);
-    if (name) {
+  void setResponseHeader(const char* name, const char* value, bool replace=false) {
+    HTTPResponse::setResponseHeader(name, value, replace);
+    if (name && *name) {
         // Set for later.
-        if (value)
-            m_headers.insert(make_pair(name,value));
-        else
+        if (replace || !value)
             m_headers.erase(name);
+        if (value && *value)
+            m_headers.insert(make_pair(name,value));
     }
   }
   long sendResponse(istream& in, long status) {
@@ -895,15 +895,15 @@ public:
     GetServerVariable(const_cast<char*>(hdr.c_str()), buf, 128, false);
     return buf.empty() ? "" : buf;
   }
-  void setResponseHeader(const char* name, const char* value) {
-    HTTPResponse::setResponseHeader(name, value);
-    if (name) {
-        // Set for later.
-        if (value)
-            m_headers.insert(make_pair(name,value));
-        else
-            m_headers.erase(name);
-    }
+  void setResponseHeader(const char* name, const char* value, bool replace = false) {
+      HTTPResponse::setResponseHeader(name, value, replace);
+      if (name && *name) {
+          // Set for later.
+          if (replace || !value)
+              m_headers.erase(name);
+          if (value && *value)
+              m_headers.insert(make_pair(name, value));
+      }
   }
   const char* getQueryString() const {
     return m_lpECB->lpszQueryString;
diff --git a/nsapi_shib/nsapi_shib.cpp b/nsapi_shib/nsapi_shib.cpp
index b07cb01..7ada5f1 100644
--- a/nsapi_shib/nsapi_shib.cpp
+++ b/nsapi_shib/nsapi_shib.cpp
@@ -425,10 +425,13 @@ public:
       param_free(pblock_remove("content-type", m_rq->srvhdrs));
       setResponseHeader("Content-Type", type);
   }
-  void setResponseHeader(const char* name, const char* value) {
-    HTTPResponse::setResponseHeader(name, value);
-    if (name) {
-        pblock_nvinsert(name, value, m_rq->srvhdrs);
+  void setResponseHeader(const char* name, const char* value, bool replace=false) {
+    HTTPResponse::setResponseHeader(name, value, replace);
+    if (name && *name) {
+        if (replace || !value)
+            param_free(pblock_remove(name, m_rq->srvhdrs));
+        if (value && *value)
+            pblock_nvinsert(name, value, m_rq->srvhdrs);
     }
   }
 
diff --git a/shibsp/handler/impl/RemotedHandler.cpp b/shibsp/handler/impl/RemotedHandler.cpp
index cc4e96c..21bb01e 100644
--- a/shibsp/handler/impl/RemotedHandler.cpp
+++ b/shibsp/handler/impl/RemotedHandler.cpp
@@ -166,7 +166,7 @@ namespace shibsp {
         long sendResponse(std::istream& inputStream, long status);
         
         // HTTPResponse
-        void setResponseHeader(const char* name, const char* value);
+        void setResponseHeader(const char* name, const char* value, bool replace=false);
         long sendRedirect(const char* url);
     };
 }
@@ -294,15 +294,28 @@ long RemotedResponse::sendResponse(std::istream& in, long status)
     return status;
 }
 
-void RemotedResponse::setResponseHeader(const char* name, const char* value)
+void RemotedResponse::setResponseHeader(const char* name, const char* value, bool replace)
 {
+    HTTPResponse::setResponseHeader(name, value, replace);
+
     if (!m_output.isstruct())
         m_output.structure();
     DDF hdrs = m_output["headers"];
     if (hdrs.isnull())
         hdrs = m_output.addmember("headers").list();
-    DDF h = DDF(name).string(value);
-    hdrs.add(h);
+    if (replace || !value) {
+        DDF hdr = hdrs.first();
+        while (!hdr.isnull()) {
+            if (hdr.name() && !strcmp(hdr.name(), name))
+                hdr.destroy();
+            hdr = hdrs.next();
+        }
+    }
+
+    if (value && *value) {
+        DDF h = DDF(name).string(value);
+        hdrs.add(h);
+    }
 }
 
 long RemotedResponse::sendRedirect(const char* url)

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list