[cpp-sp] branch main updated: Remove old source file.
Scott Cantor
cantor.2 at osu.edu
Thu Nov 6 14:19:13 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:
https://git.shibboleth.net/view/?p=cpp-sp.git;a=commit;h=6f0dd40057d9eb644546e61d05b94329754a7a61
The following commit(s) were added to refs/heads/main by this push:
new 6f0dd400 Remove old source file.
6f0dd400 is described below
commit 6f0dd40057d9eb644546e61d05b94329754a7a61
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Thu Nov 6 09:19:08 2025 -0500
Remove old source file.
---
plugins/AttributeResolverHandler.cpp | 527 -----------------------------------
1 file changed, 527 deletions(-)
diff --git a/plugins/AttributeResolverHandler.cpp b/plugins/AttributeResolverHandler.cpp
deleted file mode 100644
index 9a5dc524..00000000
--- a/plugins/AttributeResolverHandler.cpp
+++ /dev/null
@@ -1,527 +0,0 @@
-/**
- * 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.
- *
- * 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
- *
- * 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.
- */
-
-/**
- * AttributeResolverHandler.cpp
- *
- * Handler that runs the attribute resolver machinery and outputs the results directly.
- */
-
-#include "internal.h"
-
-#include <shibsp/Application.h>
-#include <shibsp/exceptions.h>
-#include <shibsp/ServiceProvider.h>
-#include <shibsp/SPConfig.h>
-#include <shibsp/SPRequest.h>
-#include <shibsp/handler/SecuredHandler.h>
-#include <shibsp/handler/RemotedHandler.h>
-
-#include <boost/scoped_ptr.hpp>
-
-#ifndef SHIBSP_LITE
-#include <shibsp/attribute/Attribute.h>
-#include <shibsp/attribute/filtering/AttributeFilter.h>
-#include <shibsp/attribute/filtering/BasicFilteringContext.h>
-#include <shibsp/attribute/resolver/AttributeExtractor.h>
-#include <shibsp/attribute/resolver/AttributeResolver.h>
-#include <shibsp/attribute/resolver/ResolutionContext.h>
-#include <shibsp/metadata/MetadataProviderCriteria.h>
-
-#include <saml/exceptions.h>
-#include <saml/saml1/core/Assertions.h>
-#include <saml/saml2/core/Assertions.h>
-#include <saml/saml2/metadata/Metadata.h>
-#include <saml/saml2/metadata/MetadataProvider.h>
-#include <xmltooling/XMLToolingConfig.h>
-#include <xmltooling/util/ParserPool.h>
-#include <xmltooling/util/XMLHelper.h>
-#include <xercesc/util/XMLUniDefs.hpp>
-#include <boost/iterator/indirect_iterator.hpp>
-#endif
-
-using namespace std;
-using namespace shibsp;
-using namespace opensaml;
-using namespace xmltooling;
-using namespace xercesc;
-using namespace boost;
-
-#ifndef SHIBSP_LITE
-using namespace opensaml::saml2md;
-#endif
-
-namespace shibsp {
-
-#if defined (_MSC_VER)
- #pragma warning( push )
- #pragma warning( disable : 4250 )
-#endif
-
- class SHIBSP_DLLLOCAL AttributeResolverHandler : public SecuredHandler, public RemotedHandler
- {
- public:
- AttributeResolverHandler(const DOMElement* e, const char* appId);
- virtual ~AttributeResolverHandler() {}
-
- pair<bool,long> run(SPRequest& request, bool isHandler=true) const;
- void receive(DDF& in, ostream& out);
-
- private:
- pair<bool,long> processMessage(
- const Application& application,
- const HTTPRequest& httpRequest,
- HTTPResponse& httpResponse
- ) const;
-
-#ifndef SHIBSP_LITE
- ResolutionContext* resolveAttributes(
- const Application& application,
- const HTTPRequest& httpRequest,
- const RoleDescriptor* issuer,
- const XMLCh* protocol,
- const saml1::NameIdentifier* v1nameid,
- const saml2::NameID* nameid
- ) const;
-
- ostream& buildJSON(ostream& os, vector<shibsp::Attribute*>& attributes, const char* encoding) const;
-#endif
- };
-
-#if defined (_MSC_VER)
- #pragma warning( pop )
-#endif
-
- Handler* SHIBSP_DLLLOCAL AttributeResolverHandlerFactory(const pair<const DOMElement*,const char*>& p, bool)
- {
- return new AttributeResolverHandler(p.first, p.second);
- }
-
-};
-
-#ifndef SHIBSP_LITE
-
-namespace {
- class SHIBSP_DLLLOCAL DummyContext : public shibsp::ResolutionContext
- {
- public:
- DummyContext(const vector<Attribute*>& attributes) : m_attributes(attributes) {
- }
-
- virtual ~DummyContext() {
- for_each(m_attributes.begin(), m_attributes.end(), xmltooling::cleanup<Attribute>());
- }
-
- vector<Attribute*>& getResolvedAttributes() {
- return m_attributes;
- }
- vector<Assertion*>& getResolvedAssertions() {
- return m_tokens;
- }
-
- private:
- vector<Attribute*> m_attributes;
- static vector<Assertion*> m_tokens; // never any tokens, so just share an empty vector
- };
-
- static ostream& json_safe(ostream& os, const char* buf)
- {
- os << '"';
- for (; *buf; ++buf) {
- switch (*buf) {
- case '\\':
- case '"':
- os << '\\';
- os << *buf;
- break;
- case '\b':
- os << "\\b";
- break;
- case '\t':
- os << "\\t";
- break;
- case '\n':
- os << "\\n";
- break;
- case '\f':
- os << "\\f";
- break;
- case '\r':
- os << "\\r";
- break;
- default:
- os << *buf;
- }
- }
- os << '"';
- return os;
- }
-};
-
-vector<Assertion*> DummyContext::m_tokens;
-
-#endif
-
-AttributeResolverHandler::AttributeResolverHandler(const DOMElement* e, const char* appId)
- : SecuredHandler(e, Category::getInstance(SHIBSP_LOGCAT".AttributeResolverHandler"), "acl", "127.0.0.1 ::1")
-{
- SPConfig::getConfig().deprecation().warn("AttributeResolver Handler");
-
- pair<bool,const char*> prop = getString("Location");
- if (!prop.first)
- throw ConfigurationException("AttributeQuery handler requires Location property.");
- string address(appId);
- address += prop.second;
- setAddress(address.c_str());
-}
-
-pair<bool,long> AttributeResolverHandler::run(SPRequest& request, bool isHandler) const
-{
- // Check ACL in base class.
- pair<bool,long> ret = SecuredHandler::run(request, isHandler);
- if (ret.first)
- return ret;
-
- request.setResponseHeader("Expires","Wed, 01 Jan 1997 12:00:00 GMT");
- request.setResponseHeader("Cache-Control","private,no-store,no-cache,max-age=0");
- request.setContentType("application/json; charset=utf-8");
-
- try {
- if (SPConfig::getConfig().isEnabled(SPConfig::OutOfProcess)) {
- // When out of process, we run natively and directly process the message.
- return processMessage(request.getApplication(), request, request);
- }
- else {
- // When not out of process, we remote all the message processing.
- DDF out, in = wrap(request);
- DDFJanitor jin(in), jout(out);
- out = send(request, in);
- return unwrap(request, out);
- }
- }
- catch (std::exception& ex) {
- m_log.error("error while processing request: %s", ex.what());
- istringstream msg("{}");
- return make_pair(true, request.sendError(msg));
- }
-}
-
-void AttributeResolverHandler::receive(DDF& in, ostream& out)
-{
- // Find application.
- const char* aid = in["application_id"].string();
- const Application* app = aid ? SPConfig::getConfig().getServiceProvider()->getApplication(aid) : nullptr;
- if (!app) {
- // Something's horribly wrong.
- m_log.error("couldn't find application (%s) for AttributeResolver request", aid ? aid : "(missing)");
- throw ConfigurationException("Unable to locate application for request, deleted?");
- }
-
- // Wrap a response shim.
- DDF ret(nullptr);
- DDFJanitor jout(ret);
- scoped_ptr<HTTPResponse> resp(getResponse(*app, ret));
- scoped_ptr<HTTPRequest> req(getRequest(*app, in));
-
- // Since we're remoted, the result should either be a throw, a false/0 return,
- // which we just return as an empty structure, or a response/redirect,
- // which we capture in the facade and send back.
- try {
- processMessage(*app, *req, *resp);
- }
- catch (std::exception& ex) {
- m_log.error("raising exception: %s", ex.what());
- throw;
- }
- out << ret;
-}
-
-pair<bool,long> AttributeResolverHandler::processMessage(
- const Application& application, const HTTPRequest& httpRequest, HTTPResponse& httpResponse
- ) const
-{
-#ifndef SHIBSP_LITE
- stringstream msg;
-
- pair<bool,const char*> param_protocol = getString("protocol", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
- pair<bool,const char*> param_issuer = getString("entityID", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
- pair<bool,const char*> param_format = getString("format", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
- pair<bool,const char*> param_qual = getString("nameQualifier", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
- pair<bool,const char*> param_spqual = getString("spNameQualifier", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
- pair<bool,const char*> param_nameid = getString("nameId", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
- pair<bool,const char*> param_omit = getString("omitQualifiers", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
- pair<bool,const char*> param_encoding = getString("encoding", httpRequest, HANDLER_PROPERTY_REQUEST|HANDLER_PROPERTY_FIXED);
-
- if (!param_nameid.first) {
- // Something's horribly wrong.
- m_log.error("no nameId parameter supplied for request");
- throw FatalProfileException("Required nameId parameter not found");
- }
-
- auto_ptr_XMLCh entityID(param_issuer.second);
- auto_ptr_XMLCh nameID(param_nameid.second);
- auto_ptr_XMLCh format(param_format.second);
-
- if (param_protocol.first) {
- if (!strcmp(param_protocol.second, "SAML2.0"))
- param_protocol.second = "urn:oasis:names:tc:SAML:2.0:protocol"; // samlconstants::SAML20P_NS;
- else if (!strcmp(param_protocol.second, "SAML1.1"))
- param_protocol.second = "urn:oasis:names:tc:SAML:1.1:protocol"; // samlconstants::SAML11_PROTOCOL_ENUM;
- else if (!strcmp(param_protocol.second, "SAML1.0"))
- param_protocol.second = "urn:oasis:names:tc:SAML:1.0:protocol"; // samlconstants::SAML10_PROTOCOL_ENUM;
- }
- else {
- param_protocol.second = "urn:oasis:names:tc:SAML:2.0:protocol"; // samlconstants::SAML20P_NS;
- }
- auto_ptr_XMLCh protocol(param_protocol.second);
-
- try {
- MetadataProvider* m = application.getMetadataProvider();
- Locker mlock(m);
-
- pair<const EntityDescriptor*,const RoleDescriptor*> site = pair<const EntityDescriptor*,const RoleDescriptor*>(nullptr, nullptr);
- if (entityID.get()) {
- MetadataProviderCriteria mc(application, entityID.get(), &IDPSSODescriptor::ELEMENT_QNAME, protocol.get());
- site = m->getEntityDescriptor(mc);
- if (!site.first)
- m_log.info("Unable to locate metadata for IdP (%s).", param_issuer.second);
- }
-
- auto_ptr_XMLCh nameQualifier(param_qual.first ? param_qual.second : param_issuer.second);
- auto_ptr_XMLCh spNameQualifier(param_spqual.first ? param_spqual.second
- : application.getRelyingParty(site.first)->getString("entityID").second);
-
- // Build NameID(s).
- scoped_ptr<saml1::NameIdentifier> v1name;
- scoped_ptr<saml2::NameID> v2name(saml2::NameIDBuilder::buildNameID());
- v2name->setName(nameID.get());
- v2name->setFormat(format.get());
- if (!param_omit.first || !param_omit.second) {
- v2name->setNameQualifier(nameQualifier.get());
- v2name->setSPNameQualifier(spNameQualifier.get());
- }
- if (!XMLString::equals(protocol.get(), samlconstants::SAML20P_NS)) {
- v1name.reset(saml1::NameIdentifierBuilder::buildNameIdentifier());
- v1name->setName(nameID.get());
- v1name->setFormat(format.get());
- if (!param_omit.first || !param_omit.second) {
- v1name->setNameQualifier(nameQualifier.get());
- }
- }
-
- scoped_ptr<ResolutionContext> ctx(resolveAttributes(application, httpRequest, site.second, protocol.get(), v1name.get(), v2name.get()));
-
- if (ctx) {
- buildJSON(msg, ctx->getResolvedAttributes(), param_encoding.second);
- }
- else {
- vector<Attribute*> noattrs;
- buildJSON(msg, noattrs, param_encoding.second);
- }
- }
- catch (const std::exception& ex) {
- // Logging should be handled by the resolver plugin at whatever level is appropriate.
- msg << "{}";
- return make_pair(true, httpResponse.sendError(msg));
- }
- return make_pair(true, httpResponse.sendResponse(msg));
-#else
- return make_pair(false, 0L);
-#endif
-}
-
-#ifndef SHIBSP_LITE
-ResolutionContext* AttributeResolverHandler::resolveAttributes(
- const Application& application,
- const HTTPRequest& httpRequest,
- const RoleDescriptor* issuer,
- const XMLCh* protocol,
- const saml1::NameIdentifier* v1nameid,
- const saml2::NameID* nameid
- ) const
-{
- // First we do the extraction of any pushed information, including from metadata.
- vector<Attribute*> resolvedAttributes;
- AttributeExtractor* extractor = application.getAttributeExtractor();
- if (extractor) {
- Locker extlocker(extractor);
- if (issuer) {
- pair<bool,const char*> mprefix = application.getString("metadataAttributePrefix");
- if (mprefix.first) {
- m_log.debug("extracting metadata-derived attributes...");
- try {
- // We pass nullptr for "issuer" because the IdP isn't the one asserting metadata-based attributes.
- extractor->extractAttributes(application, &httpRequest, nullptr, *issuer, resolvedAttributes);
- for (indirect_iterator<vector<Attribute*>::iterator> a = make_indirect_iterator(resolvedAttributes.begin());
- a != make_indirect_iterator(resolvedAttributes.end()); ++a) {
- vector<string>& ids = a->getAliases();
- for (vector<string>::iterator id = ids.begin(); id != ids.end(); ++id)
- *id = mprefix.second + *id;
- }
- }
- catch (const std::exception& ex) {
- m_log.error("caught exception extracting attributes: %s", ex.what());
- }
- }
- }
-
- m_log.debug("extracting attributes from NameID/NameIdentifier...");
-
- if (v1nameid || nameid) {
- try {
- if (v1nameid)
- extractor->extractAttributes(application, &httpRequest, issuer, *v1nameid, resolvedAttributes);
- else
- extractor->extractAttributes(application, &httpRequest, issuer, *nameid, resolvedAttributes);
- }
- catch (std::exception& ex) {
- m_log.error("caught exception extracting attributes: %s", ex.what());
- }
- }
-
- AttributeFilter* filter = application.getAttributeFilter();
- if (filter && !resolvedAttributes.empty()) {
- BasicFilteringContext fc(application, resolvedAttributes, issuer, nullptr, nullptr);
- Locker filtlocker(filter);
- try {
- filter->filterAttributes(fc, resolvedAttributes);
- }
- catch (const std::exception& ex) {
- m_log.error("caught exception filtering attributes: %s", ex.what());
- m_log.error("dumping extracted attributes due to filtering exception");
- for_each(resolvedAttributes.begin(), resolvedAttributes.end(), xmltooling::cleanup<shibsp::Attribute>());
- resolvedAttributes.clear();
- }
- }
- }
-
- AttributeResolver* resolver = application.getAttributeResolver();
- if (resolver) {
- m_log.debug("resolving attributes...");
-
- try {
- Locker locker(resolver);
- auto_ptr<ResolutionContext> ctx(
- resolver->createResolutionContext(
- application,
- &httpRequest,
- issuer ? dynamic_cast<const saml2md::EntityDescriptor*>(issuer->getParent()) : nullptr,
- protocol,
- nameid,
- nullptr,
- nullptr,
- nullptr,
- &resolvedAttributes
- )
- );
- resolver->resolveAttributes(*ctx);
-
- // Copy over any previous attributes.
- while (!resolvedAttributes.empty()) {
- ctx->getResolvedAttributes().push_back(resolvedAttributes.back());
- resolvedAttributes.pop_back();
- }
- return ctx.release();
- }
- catch (...) {
- for_each(resolvedAttributes.begin(), resolvedAttributes.end(), xmltooling::cleanup<shibsp::Attribute>());
- resolvedAttributes.clear();
- throw;
- }
- }
-
- if (!resolvedAttributes.empty()) {
- try {
- return new DummyContext(resolvedAttributes);
- }
- catch (...) {
- for_each(resolvedAttributes.begin(), resolvedAttributes.end(), xmltooling::cleanup<shibsp::Attribute>());
- resolvedAttributes.clear();
- throw;
- }
- }
-
- return nullptr;
-}
-
-ostream& AttributeResolverHandler::buildJSON(ostream& os, vector<shibsp::Attribute*>& attributes, const char* encoding) const
-{
- m_log.debug("building JSON from attributes..");
-
- os << '{';
-
- indirect_iterator<vector<Attribute*>::const_iterator> ahead = make_indirect_iterator(attributes.begin());
- indirect_iterator<vector<Attribute*>::const_iterator> a = ahead;
- for (; a != make_indirect_iterator(attributes.end()); ++a) {
-
- if (a != ahead)
- os << ',';
-
- vector<string>::const_iterator shead = a->getAliases().begin();
- for (vector<string>::const_iterator s = shead; s != a->getAliases().end(); ++s) {
- if (s != shead)
- os << ',';
- os << endl << " ";
- json_safe(os, s->c_str());
- os << " : ";
-
- if (!encoding || !strcmp(encoding,"JSON")) {
- os << '[' << endl;
- vector<string>::const_iterator vhead = a->getSerializedValues().begin();
- for (vector<string>::const_iterator v = vhead; v != a->getSerializedValues().end(); ++v) {
- if (v != vhead)
- os << ',';
- os << endl << " ";
- json_safe(os, v->c_str());
- }
- os << endl << " ]";
- }
- else if (!strcmp(encoding,"JSON/CGI")) {
- string attrValues;
- vector<string>::const_iterator vhead = a->getSerializedValues().begin();
- for (vector<string>::const_iterator v = vhead; v != a->getSerializedValues().end(); ++v) {
- if (v != vhead)
- attrValues += ';';
- string::size_type pos = v->find_first_of(';', string::size_type(0));
- if (pos != string::npos) {
- string value(*v);
- for (; pos != string::npos; pos = value.find_first_of(';', pos)) {
- value.insert(pos, "\\");
- pos += 2;
- }
- attrValues += value;
- }
- else {
- attrValues += *v;
- }
- }
- json_safe(os, attrValues.c_str());
- }
-
- }
- }
- if (a != ahead)
- os << endl;
-
- os << '}';
-
- return os;
-}
-#endif
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list