[cpp-sp] branch main updated: Some cleanup, getting tests working again.

Scott Cantor cantor.2 at osu.edu
Wed Apr 23 17:55:56 UTC 2025


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

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

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

The following commit(s) were added to refs/heads/main by this push:
     new dca70265 Some cleanup, getting tests working again.
dca70265 is described below

commit dca70265b25353b739677760a3cad56befc58b26
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Wed Apr 23 13:55:49 2025 -0400

    Some cleanup, getting tests working again.
---
 .../impl/DefaultAttributeConfiguration.cpp         |  23 +++--
 shibsp/impl/DefaultAgent.cpp                       |  10 +-
 shibsp/util/Misc.cpp                               |  18 ++++
 shibsp/util/Misc.h                                 |   2 +
 tests/data/impl/console-shibboleth.ini             |   1 -
 tests/impl/XMLAccessControlTests.cpp               | 102 +++++++++------------
 tests/impl/XMLRequestMapperTests.cpp               |  49 ++--------
 7 files changed, 95 insertions(+), 110 deletions(-)

diff --git a/shibsp/attribute/impl/DefaultAttributeConfiguration.cpp b/shibsp/attribute/impl/DefaultAttributeConfiguration.cpp
index 79f380e8..3f5bda15 100644
--- a/shibsp/attribute/impl/DefaultAttributeConfiguration.cpp
+++ b/shibsp/attribute/impl/DefaultAttributeConfiguration.cpp
@@ -93,8 +93,20 @@ AttributeConfiguration::AttributeConfiguration() {}
 AttributeConfiguration::~AttributeConfiguration() {}
 
 DefaultAttributeConfiguration::DefaultAttributeConfiguration(const char* pathname)
-    : m_log(Category::getInstance(SHIBSP_LOGCAT ".AttributeConfiguration")), m_urlEncoding(false)
+    : m_log(Category::getInstance(SHIBSP_LOGCAT ".AttributeConfiguration")), m_urlEncoding(false), m_exportDuplicates(true)
 {
+
+    m_mappings["Shib-Application-ID"] = pair<string,string>("Shib-Application-ID", "HTTP_SHIB_APPLICATION_ID");
+    m_mappings["Shib-Session-ID"] = pair<string,string>("Shib-Session-ID", "HTTP_SHIB_SESSION_ID");
+    m_mappings["Shib-Session-Expires"] = pair<string,string>("Shib-Session-Expires", "HTTP_SHIB_SESSION_EXPIRES");
+    m_mappings["Shib-Session-Inactivity"] = pair<string,string>("Shib-Session-Inactivity", "HTTP_SHIB_SESSION_INACTIVITY");
+    m_mappings["Shib-Cookie-Name"] = pair<string,string>("Shib-Cookie-Name", "HTTP_SHIB_COOKIE_NAME");
+    m_mappings["REMOTE_USER"] = pair<string,string>("REMOTE_USER", "HTTP_REMOTE_USER");
+
+    if (!pathname) {
+        return;
+    }
+
     ini_parser::read_ini(pathname, m_pt);
     load(m_pt);
 
@@ -102,7 +114,7 @@ DefaultAttributeConfiguration::DefaultAttributeConfiguration(const char* pathnam
 
     m_urlEncoding = !strcmp(getString("encoding", ""), "URL");
     m_exportDuplicates = getBool("exportDuplicateValues", true);
-    
+
     boost::optional<ptree&> mappings = m_pt.get_child_optional("mappings");
     if (!mappings) {
         return;
@@ -125,13 +137,6 @@ DefaultAttributeConfiguration::DefaultAttributeConfiguration(const char* pathnam
             m_mappings[child.first] = make_pair(alias, transformed);
         }
     }
-
-    m_mappings["Shib-Application-ID"] = pair<string,string>("Shib-Application-ID", "HTTP_SHIB_APPLICATION_ID");
-    m_mappings["Shib-Session-ID"] = pair<string,string>("Shib-Session-ID", "HTTP_SHIB_SESSION_ID");
-    m_mappings["Shib-Session-Expires"] = pair<string,string>("Shib-Session-Expires", "HTTP_SHIB_SESSION_EXPIRES");
-    m_mappings["Shib-Session-Inactivity"] = pair<string,string>("Shib-Session-Inactivity", "HTTP_SHIB_SESSION_INACTIVITY");
-    m_mappings["Shib-Cookie-Name"] = pair<string,string>("Shib-Cookie-Name", "HTTP_SHIB_COOKIE_NAME");
-    m_mappings["REMOTE_USER"] = pair<string,string>("REMOTE_USER", "HTTP_REMOTE_USER");
 }
 
 unique_ptr<AttributeConfiguration> AttributeConfiguration::newAttributeConfiguration(const char* pathname)
diff --git a/shibsp/impl/DefaultAgent.cpp b/shibsp/impl/DefaultAgent.cpp
index c717a029..cc5413f3 100644
--- a/shibsp/impl/DefaultAgent.cpp
+++ b/shibsp/impl/DefaultAgent.cpp
@@ -161,6 +161,7 @@ void DefaultAgent::init()
     doRemotingService();
     doSessionCache();
     doRequestMapper();
+    doAttributeConfigurations();
     doHandlerConfigurations();
 }
 
@@ -255,7 +256,12 @@ void DefaultAgent::doAttributeConfigurations()
     } else {
         string path("attributes.ini");
         AgentConfig::getConfig().getPathResolver().resolve(path, PathResolver::SHIBSP_CFG_FILE);
-        m_attributeConfigurations["default"] = AttributeConfiguration::newAttributeConfiguration(path.c_str());
-        m_log.info("installed 'default' AttributeConfiguration from %s", path.c_str());
+        if (file_exists(path.c_str())) {
+            m_attributeConfigurations["default"] = AttributeConfiguration::newAttributeConfiguration(path.c_str());
+            m_log.info("installed 'default' AttributeConfiguration from %s", path.c_str());
+        } else {
+            m_attributeConfigurations["default"] = AttributeConfiguration::newAttributeConfiguration(nullptr);
+            m_log.info("installed empty 'default' AttributeConfiguration");
+        }
     }
 }
diff --git a/shibsp/util/Misc.cpp b/shibsp/util/Misc.cpp
index c8e5988d..f96632b4 100644
--- a/shibsp/util/Misc.cpp
+++ b/shibsp/util/Misc.cpp
@@ -25,6 +25,8 @@
 #include <vector>
 #include <boost/algorithm/string.hpp>
 
+#include <sys/stat.h>
+
 using namespace shibsp;
 using namespace std;
 
@@ -47,3 +49,19 @@ set<string>::size_type shibsp::split_to_container(set<string>& container, const
     }
     return container.size();
 }
+
+bool shibsp::file_exists(const char* path)
+{
+#ifdef WIN32
+    struct _stat stat_buf;
+    if (_stat(path, &stat_buf) == 0) {
+        return true;
+    }
+#else
+    struct stat stat_buf;
+    if (stat(path, &stat_buf) == 0) {
+        return true;
+    }
+#endif
+    return false;
+}
diff --git a/shibsp/util/Misc.h b/shibsp/util/Misc.h
index 96e2f09c..16a69c25 100644
--- a/shibsp/util/Misc.h
+++ b/shibsp/util/Misc.h
@@ -58,6 +58,8 @@ namespace shibsp {
         }
     };
 
+    bool file_exists(const char* path);
+
     /**
      * Splitter functions that trim the input and split on whitespace into a container.
      */
diff --git a/tests/data/impl/console-shibboleth.ini b/tests/data/impl/console-shibboleth.ini
index 8e205364..b841324a 100644
--- a/tests/data/impl/console-shibboleth.ini
+++ b/tests/data/impl/console-shibboleth.ini
@@ -1,6 +1,5 @@
 [global]
 skipHandlers = true
-skipAttributes = true
 
 [logging]
 type = console
diff --git a/tests/impl/XMLAccessControlTests.cpp b/tests/impl/XMLAccessControlTests.cpp
index 6e39ba1e..ba021018 100644
--- a/tests/impl/XMLAccessControlTests.cpp
+++ b/tests/impl/XMLAccessControlTests.cpp
@@ -22,10 +22,10 @@
 #include "AbstractSPRequest.h"
 #include "AccessControl.h"
 #include "AgentConfig.h"
-#include "attribute/Attribute.h"
-#include "attribute/SimpleAttribute.h"
 #include "logging/Category.h"
+#include "remoting/ddf.h"
 #include "session/SessionCache.h"
+#include "util/BoostPropertySet.h"
 
 #ifdef HAVE_CXX14
 # include <shared_mutex>
@@ -42,68 +42,42 @@ using namespace std;
 
 namespace {
 
+struct DummyRequestMap : public BoostPropertySet {
+};
+
 /** Open structure for testing manipulation. */
-struct DummySession : public Session, public NoOpBasicLockable
-{
+struct DummySession : public Session, public NoOpBasicLockable {
 public:
     DummySession() {}
-    ~DummySession() {}
+    ~DummySession() {
+        for (auto& a : m_attributes) {
+            a.second.destroy();
+        }
+    }
 
     const char* getID() const {
         return nullptr;
     }
-    const char* getBucketID() const {
+    const char* getApplicationID() const {
         return nullptr;
     }
-    time_t getExpiration() const {
+    time_t getCreation() const {
         return 0;
     }
     time_t getLastAccess() const {
         return 0;
     }
-    const char* getClientAddress() const {
-        return nullptr;
-    }
-    const char* getEntityID() const {
-        return nullptr;
-    }
-    const char* getProtocol() const {
-        return nullptr;
-    }
-    time_t getAuthnInstant() const {
-        return m_authInstant;
-    }
-    const char* getSessionIndex() const {
-        return nullptr;
-    }
-    const char* getAuthnContextClassRef() const {
-        return m_ac.c_str();
-    }
-    const vector<unique_ptr<Attribute>>& getAttributes() const {
+    const map<string,DDF>& getAttributes() const {
         return m_attributes;
     }
 
-    const multimap<string,const Attribute*>& getIndexedAttributes() const {
-        if (m_attributeIndex.empty()) {
-            for (const unique_ptr<Attribute>& a : m_attributes) {
-                const vector<string>& aliases = a->getAliases();
-                for (const string& alias : a->getAliases()) {
-                    m_attributeIndex.insert(multimap<string, const Attribute*>::value_type(alias, a.get()));
-                }
-            }
-        }
-        return m_attributeIndex;
-    }
-
-    time_t m_authInstant;
-    string m_ac;
-    vector<unique_ptr<Attribute>> m_attributes;
-    mutable multimap<string,const Attribute*> m_attributeIndex;
+    map<string,DDF> m_attributes;
 };
 
 class DummyRequest : public AbstractSPRequest {
 public:
     DummyRequest() : AbstractSPRequest(SHIBSP_LOGCAT ".DummyRequest") {}
+    RequestMapper::Settings getRequestSettings() const { return make_pair(&m_map, nullptr); }
     const char* getMethod() const { return nullptr; }
     const char* getScheme() const { return nullptr; }
     const char* getHostname() const { return nullptr; }
@@ -123,6 +97,7 @@ public:
     long returnOK() { return 200; }
 
     string m_user;
+    DummyRequestMap m_map;
 };
 
 class exceptionCheck {
@@ -306,10 +281,14 @@ BOOST_FIXTURE_TEST_CASE(XMLAccessControl_inline_ACRule, XMLAccessControlFixture)
     DummyRequest request;
     DummySession session;
 
-    session.m_ac = "Foo";
+    DDF ac("Shib-AuthnContext-Class");
+    ac.list();
+    ac.add(DDF(nullptr).string("Foo"));
+    session.m_attributes[ac.name()] = ac;
+
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_false);
 
-    session.m_ac = "urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken";
+    ac.add(DDF(nullptr).string("urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken"));
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_true);
 }
 
@@ -332,15 +311,16 @@ BOOST_FIXTURE_TEST_CASE(XMLAccessControl_inline_AttrRule, XMLAccessControlFixtur
     DummyRequest request;
     DummySession session;
 
-    session.m_attributes.push_back(unique_ptr<Attribute>(new SimpleAttribute({"affiliation"})));
-    SimpleAttribute& attr = dynamic_cast<SimpleAttribute&>(*(session.m_attributes.back()));
+    DDF affiliation("affiliation");
+    affiliation.list();
+    session.m_attributes[affiliation.name()] = affiliation;
 
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_false);
 
-    attr.getValues().push_back("staff");
+    affiliation.add(DDF(nullptr).string("staff"));
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_false);
 
-    attr.getValues().push_back("student");
+    affiliation.add(DDF(nullptr).string("student"));
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_true);
 }
 
@@ -363,16 +343,17 @@ BOOST_FIXTURE_TEST_CASE(XMLAccessControl_external_OR, XMLAccessControlFixture)
     DummyRequest request;
     DummySession session;
 
-    session.m_attributes.push_back(unique_ptr<Attribute>(new SimpleAttribute({"affiliation"})));
-    SimpleAttribute& attr = dynamic_cast<SimpleAttribute&>(*(session.m_attributes.back()));
-
     request.m_user = "jdoe";
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_true);
 
     request.m_user = "smith";
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_false);
 
-    attr.getValues().push_back("student");
+    DDF affiliation("affiliation");
+    affiliation.list();
+    affiliation.add(DDF(nullptr).string("student"));
+    session.m_attributes[affiliation.name()] = affiliation;
+
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_true);
 }
 
@@ -395,13 +376,14 @@ BOOST_FIXTURE_TEST_CASE(XMLAccessControl_external_AND, XMLAccessControlFixture)
     DummyRequest request;
     DummySession session;
 
-    session.m_attributes.push_back(unique_ptr<Attribute>(new SimpleAttribute({"affiliation"})));
-    SimpleAttribute& attr = dynamic_cast<SimpleAttribute&>(*(session.m_attributes.back()));
-
     request.m_user = "jdoe";
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_false);
 
-    attr.getValues().push_back("student");
+    DDF affiliation("affiliation");
+    affiliation.list();
+    affiliation.add(DDF(nullptr).string("student"));
+    session.m_attributes[affiliation.name()] = affiliation;
+
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_true);
 }
 
@@ -424,12 +406,14 @@ BOOST_FIXTURE_TEST_CASE(XMLAccessControl_external_NOT, XMLAccessControlFixture)
     DummyRequest request;
     DummySession session;
 
-    session.m_attributes.push_back(unique_ptr<Attribute>(new SimpleAttribute({"affiliation"})));
-    SimpleAttribute& attr = dynamic_cast<SimpleAttribute&>(*(session.m_attributes.back()));
+    DDF affiliation("affiliation");
+    affiliation.list();
+    session.m_attributes[affiliation.name()] = affiliation;
 
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_true);
 
-    attr.getValues().push_back("student");
+    affiliation.add(DDF(nullptr).string("student"));
+
     BOOST_CHECK_EQUAL(acl->authorized(request, &session), AccessControl::shib_acl_false);
 }
 
diff --git a/tests/impl/XMLRequestMapperTests.cpp b/tests/impl/XMLRequestMapperTests.cpp
index 226277d1..07c3a379 100644
--- a/tests/impl/XMLRequestMapperTests.cpp
+++ b/tests/impl/XMLRequestMapperTests.cpp
@@ -23,8 +23,8 @@
 #include "AccessControl.h"
 #include "AgentConfig.h"
 #include "RequestMapper.h"
-#include "attribute/Attribute.h"
 #include "logging/Category.h"
+#include "remoting/ddf.h"
 #include "session/SessionCache.h"
 #include "util/PropertySet.h"
 
@@ -48,58 +48,29 @@ struct DummySession : public Session, public NoOpBasicLockable
 {
 public:
     DummySession() {}
-    ~DummySession() {}
+    ~DummySession() {
+        for (auto& a : m_attributes) {
+            a.second.destroy();
+        }
+    }
 
     const char* getID() const {
         return nullptr;
     }
-    const char* getBucketID() const {
+    const char* getApplicationID() const {
         return nullptr;
     }
-    time_t getExpiration() const {
+    time_t getCreation() const {
         return 0;
     }
     time_t getLastAccess() const {
         return 0;
     }
-    const char* getClientAddress() const {
-        return nullptr;
-    }
-    const char* getEntityID() const {
-        return nullptr;
-    }
-    const char* getProtocol() const {
-        return nullptr;
-    }
-    time_t getAuthnInstant() const {
-        return m_authInstant;
-    }
-    const char* getSessionIndex() const {
-        return nullptr;
-    }
-    const char* getAuthnContextClassRef() const {
-        return m_ac.c_str();
-    }
-    const vector<unique_ptr<Attribute>>& getAttributes() const {
+    const map<string,DDF>& getAttributes() const {
         return m_attributes;
     }
 
-    const multimap<string,const Attribute*>& getIndexedAttributes() const {
-        if (m_attributeIndex.empty()) {
-            for (const unique_ptr<Attribute>& a : m_attributes) {
-                const vector<string>& aliases = a->getAliases();
-                for (const string& alias : a->getAliases()) {
-                    m_attributeIndex.insert(multimap<string, const Attribute*>::value_type(alias, a.get()));
-                }
-            }
-        }
-        return m_attributeIndex;
-    }
-
-    time_t m_authInstant;
-    string m_ac;
-    vector<unique_ptr<Attribute>> m_attributes;
-    mutable multimap<string,const Attribute*> m_attributeIndex;
+    map<string,DDF> m_attributes;
 };
 
 class DummyRequest : public AbstractSPRequest {

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


More information about the commits mailing list