Trap known exceptions during request config processing.
[shibboleth/sp.git] / apache / mod_apache.cpp
index addab7d..461ec90 100644 (file)
@@ -1,4 +1,20 @@
 /*
+ *  Copyright 2001-2005 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
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*
  * mod_apache.cpp -- the core Apache Module code
  *
  * Created by: Derek Atkins <derek@ihtfp.com>
@@ -167,7 +183,7 @@ extern "C" const char* ap_set_global_string_slot(cmd_parms* parms, void*, const
 extern "C" const char* shib_set_server_string_slot(cmd_parms* parms, void*, const char* arg)
 {
     char* base=(char*)ap_get_module_config(parms->server->module_config,&mod_shib);
-    int offset=(int)parms->info;
+    size_t offset=(size_t)parms->info;
     *((char**)(base + offset))=ap_pstrdup(parms->pool,arg);
     return NULL;
 }
@@ -308,9 +324,7 @@ extern "C" int shib_check_user(request_rec* r)
   threadid << "[" << getpid() << "] shib_check_user" << '\0';
   saml::NDC ndc(threadid.str().c_str());
 
-#ifndef _DEBUG
   try {
-#endif
     ShibTargetApache sta(r);
 
     // Check user authentication and export information, then set the handler bypass
@@ -324,9 +338,13 @@ extern "C" int shib_check_user(request_rec* r)
 
     // export happened successfully..  this user is ok.
     return OK;
-
+  }
+  catch (SAMLException& e) {
+    ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, SH_AP_R(r), "shib_check_user threw an exception: %s", e.what());
+    return SERVER_ERROR;
+  }
 #ifndef _DEBUG
-  catch (...) {
+  catch (...) {
     ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, SH_AP_R(r), "shib_check_user threw an uncaught exception!");
     return SERVER_ERROR;
   }
@@ -357,9 +375,7 @@ extern "C" int shib_handler(request_rec* r)
 
   ap_log_rerror(APLOG_MARK,APLOG_DEBUG|APLOG_NOERRNO,SH_AP_R(r),"shib_handler(%d): ENTER: %s", (int)getpid(), r->handler);
 
-#ifndef _DEBUG
   try {
-#endif
     ShibTargetApache sta(r);
 
     pair<bool,void*> res = sta.doHandler();
@@ -367,9 +383,13 @@ extern "C" int shib_handler(request_rec* r)
 
     ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, SH_AP_R(r), "doHandler() did not do anything.");
     return SERVER_ERROR;
-
+  }
+  catch (SAMLException& e) {
+    ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, SH_AP_R(r), "shib_handler threw an exception: %s", e.what());
+    return SERVER_ERROR;
+  }
 #ifndef _DEBUG
-  catch (...) {
+  catch (...) {
     ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, SH_AP_R(r), "shib_handler threw an uncaught exception!");
     return SERVER_ERROR;
   }
@@ -392,9 +412,7 @@ extern "C" int shib_auth_checker(request_rec* r)
   threadid << "[" << getpid() << "] shib_auth_checker" << '\0';
   saml::NDC ndc(threadid.str().c_str());
 
-#ifndef _DEBUG
   try {
-#endif
     ShibTargetApache sta(r);
 
     pair<bool,void*> res = sta.doCheckAuthZ();
@@ -402,9 +420,13 @@ extern "C" int shib_auth_checker(request_rec* r)
 
     // We're all okay.
     return OK;
-
+  }
+  catch (SAMLException& e) {
+    ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, SH_AP_R(r), "shib_auth_checker threw an exception: %s", e.what());
+    return SERVER_ERROR;
+  }
 #ifndef _DEBUG
-  catch (...) {
+  catch (...) {
     ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, SH_AP_R(r), "shib_auth_checker threw an uncaught exception!");
     return SERVER_ERROR;
   }
@@ -725,7 +747,7 @@ bool htAccessControl::authorized(
                     
                     string vals_str(vals);
                     int j = 0;
-                    for (int i = 0;  i < vals_str.length();  i++) {
+                    for (unsigned int i = 0;  i < vals_str.length();  i++) {
                         if (vals_str.at(i) == ';') {
                             if (i == 0) {
                                 st->log(ShibTarget::LogLevelError, string("htAccessControl plugin found invalid header encoding (") +