X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=shibsp%2Fhandler%2Fimpl%2FTransformSessionInitiator.cpp;h=02e6dc4180095c4638bbdacbc58d7b58367a422f;hb=c51bfd77603cf0ddb0b5e374c35586a8435895d6;hp=440668ba11db03d15192ccdc6ece64994d0151f0;hpb=bd6c776a3b4f396a0c36bb50dbcfb06e2382e62e;p=shibboleth%2Fcpp-sp.git diff --git a/shibsp/handler/impl/TransformSessionInitiator.cpp b/shibsp/handler/impl/TransformSessionInitiator.cpp index 440668b..02e6dc4 100644 --- a/shibsp/handler/impl/TransformSessionInitiator.cpp +++ b/shibsp/handler/impl/TransformSessionInitiator.cpp @@ -1,17 +1,21 @@ -/* - * Copyright 2001-2007 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. */ /** @@ -31,8 +35,10 @@ #include "util/SPConstants.h" #ifndef SHIBSP_LITE +# include "metadata/MetadataProviderCriteria.h" # include #endif +#include #include #include #include @@ -42,6 +48,7 @@ using namespace shibsp; using namespace opensaml::saml2md; using namespace opensaml; using namespace xmltooling; +using namespace boost; using namespace std; namespace shibsp { @@ -54,7 +61,12 @@ namespace shibsp { class SHIBSP_DLLLOCAL TransformSINodeFilter : public DOMNodeFilter { public: - short acceptNode(const DOMNode* node) const { +#ifdef SHIBSP_XERCESC_SHORT_ACCEPTNODE + short +#else + FilterAction +#endif + acceptNode(const DOMNode* node) const { return FILTER_REJECT; } }; @@ -62,7 +74,6 @@ namespace shibsp { static SHIBSP_DLLLOCAL TransformSINodeFilter g_TSINFilter; #ifndef SHIBSP_LITE - static const XMLCh alwaysRun[] = UNICODE_LITERAL_9(a,l,w,a,y,s,R,u,n); static const XMLCh force[] = UNICODE_LITERAL_5(f,o,r,c,e); static const XMLCh match[] = UNICODE_LITERAL_5(m,a,t,c,h); static const XMLCh Regex[] = UNICODE_LITERAL_5(R,e,g,e,x); @@ -73,13 +84,14 @@ namespace shibsp { { public: TransformSessionInitiator(const DOMElement* e, const char* appId) - : AbstractHandler(e, Category::getInstance(SHIBSP_LOGCAT".SessionInitiator.Transform"), &g_TSINFilter), m_appId(appId) { + : AbstractHandler(e, Category::getInstance(SHIBSP_LOGCAT ".SessionInitiator.Transform"), &g_TSINFilter), m_appId(appId) { // If Location isn't set, defer address registration until the setParent call. pair loc = getString("Location"); if (loc.first) { string address = m_appId + loc.second + "::run::TransformSI"; setAddress(address.c_str()); } + m_supportedOptions.insert("isPassive"); #ifndef SHIBSP_LITE if (SPConfig::getConfig().isEnabled(SPConfig::OutOfProcess)) { @@ -87,17 +99,17 @@ namespace shibsp { e = XMLHelper::getFirstChildElement(e); while (e) { if (e->hasChildNodes()) { - const XMLCh* flag = e->getAttributeNS(NULL, force); - if (!flag) - flag = &chNull; + bool flag = XMLHelper::getAttrBool(e, false, force); if (XMLString::equals(e->getLocalName(), Subst)) { - auto_ptr_char temp(e->getFirstChild()->getNodeValue()); - m_subst.push_back(pair((*flag==chDigit_1 || *flag==chLatin_t), temp.get())); + auto_ptr_char temp(e->getTextContent()); + if (temp.get() && *temp.get()) + m_subst.push_back(pair(flag, temp.get())); } - else if (XMLString::equals(e->getLocalName(), Regex) && e->hasAttributeNS(NULL, match)) { - auto_ptr_char m(e->getAttributeNS(NULL, match)); - auto_ptr_char repl(e->getFirstChild()->getNodeValue()); - m_regex.push_back(make_pair((*flag==chDigit_1 || *flag==chLatin_t), pair(m.get(), repl.get()))); + else if (XMLString::equals(e->getLocalName(), Regex) && e->hasAttributeNS(nullptr, match)) { + auto_ptr_char m(e->getAttributeNS(nullptr, match)); + auto_ptr_char repl(e->getTextContent()); + if (m.get() && *m.get() && repl.get() && *repl.get()) + m_regex.push_back(tuple(flag, m.get(), repl.get())); } else { m_log.warn("Unknown element found in Transform SessionInitiator configuration, check for errors."); @@ -121,7 +133,7 @@ namespace shibsp { #ifndef SHIBSP_LITE bool m_alwaysRun; vector< pair > m_subst; - vector< pair< bool, pair > > m_regex; + vector< tuple > m_regex; #endif }; @@ -152,11 +164,10 @@ void TransformSessionInitiator::setParent(const PropertySet* parent) pair TransformSessionInitiator::run(SPRequest& request, string& entityID, bool isHandler) const { // We have to have a candidate name to function. - if (entityID.empty()) - return make_pair(false,0L); + if (entityID.empty() || !checkCompatibility(request, isHandler)) + return make_pair(false, 0L); - string target; - const Application& app=request.getApplication(); + const Application& app = request.getApplication(); m_log.debug("attempting to transform input (%s) into a valid entityID", entityID.c_str()); @@ -175,14 +186,14 @@ pair TransformSessionInitiator::run(SPRequest& request, string& entit entityID = out.string(); } - return make_pair(false,0L); + return make_pair(false, 0L); } void TransformSessionInitiator::receive(DDF& in, ostream& out) { // Find application. - const char* aid=in["application_id"].string(); - const Application* app=aid ? SPConfig::getConfig().getServiceProvider()->getApplication(aid) : NULL; + 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) to generate AuthnRequest", aid ? aid : "(missing)"); @@ -195,7 +206,7 @@ void TransformSessionInitiator::receive(DDF& in, ostream& out) string copy(entityID); doRequest(*app, copy); - DDF ret = DDF(NULL).string(copy.c_str()); + DDF ret = DDF(nullptr).string(copy.c_str()); DDFJanitor jout(ret); out << ret; } @@ -203,10 +214,10 @@ void TransformSessionInitiator::receive(DDF& in, ostream& out) void TransformSessionInitiator::doRequest(const Application& application, string& entityID) const { #ifndef SHIBSP_LITE - MetadataProvider* m=application.getMetadataProvider(); + MetadataProvider* m = application.getMetadataProvider(); Locker locker(m); - MetadataProvider::Criteria mc(entityID.c_str(), &IDPSSODescriptor::ELEMENT_QNAME); + MetadataProviderCriteria mc(application, entityID.c_str(), &IDPSSODescriptor::ELEMENT_QNAME); pair entity; if (!m_alwaysRun) { // First check the original value, it might be valid already. @@ -243,10 +254,10 @@ void TransformSessionInitiator::doRequest(const Application& application, string } // Now try regexs. - for (vector< pair< bool, pair > >::const_iterator r = m_regex.begin(); r != m_regex.end(); ++r) { + for (vector< tuple >::const_iterator r = m_regex.begin(); r != m_regex.end(); ++r) { try { - RegularExpression exp(r->second.first.c_str()); - XMLCh* temp = exp.replace(entityID.c_str(), r->second.second.c_str()); + RegularExpression exp(r->get<1>().c_str()); + XMLCh* temp = exp.replace(entityID.c_str(), r->get<2>().c_str()); if (temp) { auto_ptr_char narrow(temp); XMLString::release(&temp); @@ -255,7 +266,7 @@ void TransformSessionInitiator::doRequest(const Application& application, string if (entityID == narrow.get()) continue; - if (r->first) { + if (r->get<0>()) { m_log.info("forcibly transformed entityID from (%s) to (%s)", entityID.c_str(), narrow.get()); entityID = narrow.get(); } @@ -266,7 +277,7 @@ void TransformSessionInitiator::doRequest(const Application& application, string entity = m->getEntityDescriptor(mc); if (entity.first) { m_log.info("transformed entityID from (%s) to (%s)", entityID.c_str(), narrow.get()); - if (!r->first) + if (!r->get<0>()) entityID = narrow.get(); return; }