#include <algorithm>
#include <boost/shared_ptr.hpp>
+#include <boost/algorithm/string/trim.hpp>
#include <boost/tuple/tuple.hpp>
#include <shibsp/exceptions.h>
#include <shibsp/SessionCache.h>
Category& m_log;
string m_source;
// dest id, regex to apply, replacement string
- typedef tuple<string,boost::shared_ptr<RegularExpression>,const XMLCh*> regex_t;
+ typedef boost::tuple<string,boost::shared_ptr<RegularExpression>,const XMLCh*> regex_t;
vector<regex_t> m_regex;
};
vector<opensaml::Assertion*> TransformContext::m_assertions;
TransformAttributeResolver::TransformAttributeResolver(const DOMElement* e)
- : m_log(Category::getInstance(SHIBSP_LOGCAT".AttributeResolver.Transform")),
+ : m_log(Category::getInstance(SHIBSP_LOGCAT ".AttributeResolver.Transform")),
m_source(XMLHelper::getAttrString(e, nullptr, source))
{
if (m_source.empty())
try {
static XMLCh options[] = { chLatin_i, chNull };
boost::shared_ptr<RegularExpression> re(new RegularExpression(e->getAttributeNS(nullptr, match), (caseflag ? &chNull : options)));
- m_regex.push_back(make_tuple(destId, re, repl));
+ m_regex.push_back(boost::make_tuple(destId, re, repl));
}
catch (XMLException& ex) {
auto_ptr_char msg(ex.getMessage());
m_log.debug("applying transform from source attribute (%s) to dest attribute (%s)", m_source.c_str(), r->get<0>().c_str());
for (size_t i = 0; i < (*a)->valueCount(); ++i) {
- auto_arrayptr<XMLCh> srcval(fromUTF8((*a)->getSerializedValues()[i].c_str()));
try {
+ auto_arrayptr<XMLCh> srcval(fromUTF8((*a)->getSerializedValues()[i].c_str()));
XMLCh* destval = r->get<1>()->replace(srcval.get(), r->get<2>());
- if (destval) {
+ if (!destval)
+ continue;
+ // For some reason, it returns the source string if the match doesn't succeed.
+ if (!XMLString::equals(destval, srcval.get())) {
auto_arrayptr<char> narrow(toUTF8(destval));
XMLString::release(&destval);
if (dest) {
// Modify in place.
dest->getValues()[i] = narrow.get();
+ trim(dest->getValues()[i]);
}
else {
// Add to new object.
destwrapper->getValues().push_back(narrow.get());
+ trim(destwrapper->getValues().back());
}
}
+ else {
+ XMLString::release(&destval);
+ }
}
catch (XMLException& ex) {
auto_ptr_char msg(ex.getMessage());