Adjust Lock API
[shibboleth/cpp-opensaml.git] / saml / SAMLConfig.cpp
index 9315b01..5efbb59 100644 (file)
@@ -1,17 +1,21 @@
-/*
- *  Copyright 2001-2010 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
+/**
+ * Licensed to the University Corporation for Advanced Internet
+ * Development, Inc. (UCAID) under one or more contributor license
+ * agreements. See the NOTICE file distributed with this work for
+ * additional information regarding copyright ownership.
  *
- *     http://www.apache.org/licenses/LICENSE-2.0
+ * UCAID licenses this file to you 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
  *
- * 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.
+ * 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.
  */
 
 /**
 #include <xmltooling/util/PathResolver.h>
 #include <xmltooling/util/Threads.h>
 
+#include <boost/lambda/bind.hpp>
+#include <boost/lambda/casts.hpp>
+#include <boost/lambda/lambda.hpp>
+
 #include <xsec/enc/XSECCryptoException.hpp>
 #include <xsec/enc/XSECCryptoProvider.hpp>
 #include <xsec/utils/XSECPlatformUtils.hpp>
@@ -65,6 +73,8 @@ using namespace opensaml;
 using namespace xmlsignature;
 using namespace xmltooling::logging;
 using namespace xmltooling;
+using namespace boost::lambda;
+using namespace boost;
 using namespace std;
 
 // Expose entry points when used as an extension library
@@ -110,6 +120,7 @@ SAMLConfig::SAMLConfig() : m_artifactMap(nullptr)
 
 SAMLConfig::~SAMLConfig()
 {
+    delete m_artifactMap;
 }
 
 ArtifactMap* SAMLConfig::getArtifactMap() const
@@ -129,7 +140,6 @@ SAMLInternalConfig::SAMLInternalConfig() : m_initCount(0), m_lock(Mutex::create(
 
 SAMLInternalConfig::~SAMLInternalConfig()
 {
-    delete m_lock;
 }
 
 bool SAMLInternalConfig::init(bool initXMLTooling)
@@ -230,8 +240,8 @@ void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len)
 void SAMLInternalConfig::generateRandomBytes(std::string& buf, unsigned int len)
 {
     buf.erase();
-    auto_ptr<unsigned char> hold(new unsigned char[len]);
-    generateRandomBytes(hold.get(),len);
+    auto_arrayptr<unsigned char> hold(new unsigned char[len]);
+    generateRandomBytes(const_cast<unsigned char*>(hold.get()), len);
     for (unsigned int i=0; i<len; i++)
         buf+=(hold.get())[i];
 }
@@ -283,15 +293,20 @@ using namespace saml2md;
 
 void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, const Status* status, bool rethrow)
 {
+    time_t now = time(nullptr);
     const RoleDescriptor* role = nullptr;
+    static bool (TimeBoundSAMLObject::* isValid)(time_t) const = &TimeBoundSAMLObject::isValid;
+
     if (entity) {
-        const list<XMLObject*>& roles=entity->getOrderedChildren();
-        for (list<XMLObject*>::const_iterator child=roles.begin(); !role && child!=roles.end(); ++child) {
-            role=dynamic_cast<RoleDescriptor*>(*child);
-            if (role && !role->isValid())
-                role = nullptr;
-        }
+        const XMLObject* r = find_if(
+            entity->getOrderedChildren(),
+            (ll_dynamic_cast<const RoleDescriptor*>(_1) != ((const RoleDescriptor*)nullptr) &&
+                    lambda::bind(isValid, ll_dynamic_cast<const TimeBoundSAMLObject*>(_1), now))
+            );
+        if (r)
+            role = dynamic_cast<const RoleDescriptor*>(r);
     }
+
     annotateException(e, role, status, rethrow);
 }