Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package opensaml for openSUSE:Factory checked in at 2025-03-27 22:33:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/opensaml (Old) and /work/SRC/openSUSE:Factory/.opensaml.new.2696 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "opensaml" Thu Mar 27 22:33:54 2025 rev:14 rq:1261099 version:3.3.1 Changes: -------- --- /work/SRC/openSUSE:Factory/opensaml/opensaml.changes 2024-11-13 15:29:10.691510061 +0100 +++ /work/SRC/openSUSE:Factory/.opensaml.new.2696/opensaml.changes 2025-03-27 22:34:31.482128199 +0100 @@ -1,0 +2,7 @@ +Thu Mar 27 13:00:50 UTC 2025 - Marius Grossu <marius.gro...@suse.com> + +- Update to 3.3.1: + * [CPPOST-126] - Simple signature verification fails to detect parameter smuggling + (bsc#1239889) + +------------------------------------------------------------------- Old: ---- opensaml-3.3.0.tar.bz2 opensaml-3.3.0.tar.bz2.asc New: ---- opensaml-3.3.1.tar.bz2 opensaml-3.3.1.tar.bz2.asc ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ opensaml.spec ++++++ --- /var/tmp/diff_new_pack.qGCnrq/_old 2025-03-27 22:34:32.046151545 +0100 +++ /var/tmp/diff_new_pack.qGCnrq/_new 2025-03-27 22:34:32.050151711 +0100 @@ -1,7 +1,7 @@ # # spec file for package opensaml # -# Copyright (c) 2024 SUSE LLC +# Copyright (c) 2025 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %define libvers 13 %define pkgdocdir %{_docdir}/%{name} Name: opensaml -Version: 3.3.0 +Version: 3.3.1 Release: 0 Summary: Security Assertion Markup Language library License: Apache-2.0 ++++++ opensaml-3.3.0.tar.bz2 -> opensaml-3.3.1.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/Makefile.in new/opensaml-3.3.1/Makefile.in --- old/opensaml-3.3.0/Makefile.in 2024-09-10 14:02:28.000000000 +0200 +++ new/opensaml-3.3.1/Makefile.in 2025-03-11 16:27:31.000000000 +0100 @@ -230,7 +230,7 @@ $(top_srcdir)/build-aux/install-sh \ $(top_srcdir)/build-aux/ltmain.sh \ $(top_srcdir)/build-aux/missing build-aux/compile \ - build-aux/config.guess build-aux/config.sub \ + build-aux/config.guess build-aux/config.sub build-aux/depcomp \ build-aux/install-sh build-aux/ltmain.sh build-aux/missing DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/configure new/opensaml-3.3.1/configure --- old/opensaml-3.3.0/configure 2024-09-10 14:02:28.000000000 +0200 +++ new/opensaml-3.3.1/configure 2025-03-10 20:29:36.000000000 +0100 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for opensaml 3.3.0. +# Generated by GNU Autoconf 2.72 for opensaml 3.3.1. # # Report bugs to <https://issues.shibboleth.net/>. # @@ -614,8 +614,8 @@ # Identity of this package. PACKAGE_NAME='opensaml' PACKAGE_TARNAME='opensaml' -PACKAGE_VERSION='3.3.0' -PACKAGE_STRING='opensaml 3.3.0' +PACKAGE_VERSION='3.3.1' +PACKAGE_STRING='opensaml 3.3.1' PACKAGE_BUGREPORT='https://issues.shibboleth.net/' PACKAGE_URL='' @@ -1469,7 +1469,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures opensaml 3.3.0 to adapt to many kinds of systems. +'configure' configures opensaml 3.3.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1540,7 +1540,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of opensaml 3.3.0:";; + short | recursive ) echo "Configuration of opensaml 3.3.1:";; esac cat <<\_ACEOF @@ -1701,7 +1701,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -opensaml configure 3.3.0 +opensaml configure 3.3.1 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2185,7 +2185,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by opensaml $as_me 3.3.0, which was +It was created by opensaml $as_me 3.3.1, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -3877,7 +3877,7 @@ # Define the identity of the package. PACKAGE='opensaml' - VERSION='3.3.0' + VERSION='3.3.1' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -22672,7 +22672,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by opensaml $as_me 3.3.0, which was +This file was extended by opensaml $as_me 3.3.1, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -22740,7 +22740,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -opensaml config.status 3.3.0 +opensaml config.status 3.3.1 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/configure.ac new/opensaml-3.3.1/configure.ac --- old/opensaml-3.3.0/configure.ac 2024-09-09 22:11:20.000000000 +0200 +++ new/opensaml-3.3.1/configure.ac 2025-03-10 20:21:59.000000000 +0100 @@ -1,5 +1,5 @@ AC_PREREQ([2.50]) -AC_INIT([opensaml],[3.3.0],[https://issues.shibboleth.net/],[opensaml]) +AC_INIT([opensaml],[3.3.1],[https://issues.shibboleth.net/],[opensaml]) AC_CONFIG_SRCDIR(saml) AC_CONFIG_AUX_DIR(build-aux) AC_CONFIG_MACRO_DIR(m4) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/opensaml.spec new/opensaml-3.3.1/opensaml.spec --- old/opensaml-3.3.0/opensaml.spec 2024-09-10 14:02:47.000000000 +0200 +++ new/opensaml-3.3.1/opensaml.spec 2025-03-11 16:27:41.000000000 +0100 @@ -1,5 +1,5 @@ Name: opensaml -Version: 3.3.0 +Version: 3.3.1 Release: 1 Summary: OpenSAML SAML library Group: Development/Libraries/C and C++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/Makefile.am new/opensaml-3.3.1/saml/Makefile.am --- old/opensaml-3.3.0/saml/Makefile.am 2024-09-09 22:29:30.000000000 +0200 +++ new/opensaml-3.3.1/saml/Makefile.am 2025-03-10 20:22:32.000000000 +0100 @@ -183,7 +183,7 @@ # this is different from the project version # http://sources.redhat.com/autobook/autobook/autobook_91.html -libsaml_la_LDFLAGS = -version-info 13:0:0 +libsaml_la_LDFLAGS = -version-info 13:1:0 libsaml_la_CPPFLAGS = \ $(BOOST_CPPFLAGS) libsaml_la_CXXFLAGS = \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/Makefile.in new/opensaml-3.3.1/saml/Makefile.in --- old/opensaml-3.3.0/saml/Makefile.in 2024-09-10 14:02:28.000000000 +0200 +++ new/opensaml-3.3.1/saml/Makefile.in 2025-03-11 16:24:57.000000000 +0100 @@ -750,7 +750,7 @@ # this is different from the project version # http://sources.redhat.com/autobook/autobook/autobook_91.html -libsaml_la_LDFLAGS = -version-info 13:0:0 +libsaml_la_LDFLAGS = -version-info 13:1:0 libsaml_la_CPPFLAGS = \ $(BOOST_CPPFLAGS) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/binding/impl/SimpleSigningRule.cpp new/opensaml-3.3.1/saml/binding/impl/SimpleSigningRule.cpp --- old/opensaml-3.3.0/saml/binding/impl/SimpleSigningRule.cpp 2020-03-06 17:38:05.000000000 +0100 +++ new/opensaml-3.3.1/saml/binding/impl/SimpleSigningRule.cpp 2025-03-12 14:37:28.000000000 +0100 @@ -29,6 +29,7 @@ #include "binding/SecurityPolicy.h" #include "binding/SecurityPolicyRule.h" #include "saml2/core/Assertions.h" +#include "saml2/core/Protocols.h" #include "saml2/metadata/Metadata.h" #include "saml2/metadata/MetadataCredentialCriteria.h" #include "saml2/metadata/MetadataProvider.h" @@ -41,6 +42,7 @@ #include <xmltooling/signature/KeyInfo.h> #include <xmltooling/signature/Signature.h> #include <xmltooling/util/ParserPool.h> +#include <xmltooling/util/URLEncoder.h> using namespace opensaml::saml2md; using namespace opensaml; @@ -66,7 +68,8 @@ private: // Appends a raw parameter=value pair to the string. - static bool appendParameter(string& s, const char* data, const char* name); + static bool appendParameter(const GenericRequest& request, string& s, const char* data, const char* name); + static const char* getMessageParameterName(const XMLObject* message); bool m_errorFatal; }; @@ -79,21 +82,48 @@ static const XMLCh errorFatal[] = UNICODE_LITERAL_10(e,r,r,o,r,F,a,t,a,l); }; -bool SimpleSigningRule::appendParameter(string& s, const char* data, const char* name) +bool SimpleSigningRule::appendParameter(const GenericRequest& request, string& s, const char* data, const char* name) { - const char* start = strstr(data,name); + // Make sure only a single instance of the parameter specified is found in the decoded query. + vector<const char*> valueHolder; + if (request.getParameters(name, valueHolder) > 1) { + throw SecurityPolicyException("Multiple $1 parameters present.", params(1, name)); + } + + string param_name(name); + param_name += '='; + + const char* start = strstr(data, param_name.c_str()); if (!start) return false; + if (start > data && *(start - 1) != '&') + throw SecurityPolicyException("Detected attempt to smuggle a prefixed $1 parameter.", params(1, name)); + if (!s.empty()) s += '&'; - const char* end = strchr(start,'&'); + + const char* end = strchr(start, '&'); if (end) - s.append(start, end-start); + s.append(start, end - start); else s.append(start); + return true; } +const char* SimpleSigningRule::getMessageParameterName(const XMLObject* message) +{ + if (dynamic_cast<const saml2p::StatusResponseType*>(message)) { + return "SAMLResponse"; + } + else if (dynamic_cast<const saml2p::RequestAbstractType*>(message)) { + return "SAMLRequest"; + } + else { + return nullptr; + } +} + SimpleSigningRule::SimpleSigningRule(const DOMElement* e) : SecurityPolicyRule(e), m_errorFatal(XMLHelper::getAttrBool(e, false, errorFatal)) { @@ -119,34 +149,50 @@ } const HTTPRequest* httpRequest = dynamic_cast<const HTTPRequest*>(request); - if (!request || !httpRequest) + if (!request || !httpRequest) { return false; + } - const char* signature = request->getParameter("Signature"); - if (!signature) + // Make sure Signature only shows up once. + vector<const char*> valueHolder; + request->getParameters("Signature", valueHolder); + if (valueHolder.empty()) { return false; - + } + else if (valueHolder.size() > 1) { + throw SecurityPolicyException("Multiple Signature parameters present."); + } + const char* signature = valueHolder[0]; + + // The multiple parameter copy check for the GET case is applied down below in appendParameter. const char* sigAlgorithm = request->getParameter("SigAlg"); if (!sigAlgorithm) { log.warn("SigAlg parameter not found, no way to verify the signature"); return false; } + const char* messageParameterName = getMessageParameterName(&message); + if (!messageParameterName) { + log.debug("ignoring unrecognized message type"); + return false; + } + string input; const char* pch; if (!strcmp(httpRequest->getMethod(), "GET")) { // We have to construct a string containing the signature input by accessing the // request directly. We can't use the decoded parameters because we need the raw - // data and URL-encoding isn't canonical. + // data and URL-encoding isn't canonical. We have to ensure only one copy a given + // parameter appears in the string in its decoded form, to ensure that other layers + // of the code only saw/see the same value we see here. // NOTE: SimpleSign for GET means Redirect binding, which means we verify over the // base64-encoded message directly. pch = httpRequest->getQueryString(); - if (!appendParameter(input, pch, "SAMLRequest=")) - appendParameter(input, pch, "SAMLResponse="); - appendParameter(input, pch, "RelayState="); - appendParameter(input, pch, "SigAlg="); + appendParameter(*request, input, pch, messageParameterName); + appendParameter(*request, input, pch, "RelayState"); + appendParameter(*request, input, pch, "SigAlg"); } else { // With POST, the input string is concatenated from the decoded form controls. @@ -158,24 +204,14 @@ // why XMLSignature exists, and why this isn't really "simpler"). XMLSize_t x; - pch = httpRequest->getParameter("SAMLRequest"); + pch = httpRequest->getParameter(messageParameterName); if (pch) { XMLByte* decoded=Base64::decode(reinterpret_cast<const XMLByte*>(pch),&x); if (!decoded) { log.warn("unable to decode base64 in POST binding message"); return false; } - input = string("SAMLRequest=") + reinterpret_cast<const char*>(decoded); - XMLString::release((char**)&decoded); - } - else { - pch = httpRequest->getParameter("SAMLResponse"); - XMLByte* decoded=Base64::decode(reinterpret_cast<const XMLByte*>(pch),&x); - if (!decoded) { - log.warn("unable to decode base64 in POST binding message"); - return false; - } - input = string("SAMLResponse=") + reinterpret_cast<const char*>(decoded); + input = string(messageParameterName) + "=" + reinterpret_cast<const char*>(decoded); XMLString::release((char**)&decoded); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/saml.rc new/opensaml-3.3.1/saml/saml.rc --- old/opensaml-3.3.0/saml/saml.rc 2024-09-09 22:32:25.000000000 +0200 +++ new/opensaml-3.3.1/saml/saml.rc 2025-03-10 20:24:04.000000000 +0100 @@ -28,8 +28,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,3,0,0 - PRODUCTVERSION 3,3,0,0 + FILEVERSION 3,3,1,0 + PRODUCTVERSION 3,3,1,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -47,13 +47,13 @@ VALUE "Comments", "\0" VALUE "CompanyName", "Shibboleth Consortium\0" VALUE "FileDescription", "OpenSAML Library\0" - VALUE "FileVersion", "3, 3, 0, 0\0" + VALUE "FileVersion", "3, 3, 1, 0\0" #ifdef _DEBUG VALUE "InternalName", "saml3_3D\0" #else VALUE "InternalName", "saml3_3\0" #endif - VALUE "LegalCopyright", "Copyright 2001-2024 Various\0" + VALUE "LegalCopyright", "Copyright 2001-2025 Various\0" VALUE "LegalTrademarks", "\0" #ifdef _DEBUG VALUE "OriginalFilename", "saml3_3.dll\0" @@ -61,8 +61,8 @@ VALUE "OriginalFilename", "saml3_3.dll\0" #endif VALUE "PrivateBuild", "\0" - VALUE "ProductName", "OpenSAML 3.3.0\0" - VALUE "ProductVersion", "3, 3, 0, 0\0" + VALUE "ProductName", "OpenSAML 3.3.1\0" + VALUE "ProductVersion", "3, 3, 1, 0\0" VALUE "SpecialBuild", "\0" END END diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2ArtifactDecoder.cpp new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2ArtifactDecoder.cpp --- old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2ArtifactDecoder.cpp 2020-03-06 17:38:05.000000000 +0100 +++ new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2ArtifactDecoder.cpp 2025-03-12 14:37:28.000000000 +0100 @@ -95,6 +95,8 @@ const char* state = httpRequest->getParameter("RelayState"); if (state) relayState = state; + if (httpRequest->getParameter("Signature")) + throw BindingException("Request contained unexpected Signature parameter."); if (!m_artifactResolver || !policy.getMetadataProvider() || !policy.getRole()) throw BindingException("Artifact binding requires ArtifactResolver and MetadataProvider implementations be supplied."); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2ECPDecoder.cpp new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2ECPDecoder.cpp --- old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2ECPDecoder.cpp 2020-03-06 17:38:05.000000000 +0100 +++ new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2ECPDecoder.cpp 2025-03-12 14:37:28.000000000 +0100 @@ -86,7 +86,8 @@ const HTTPRequest* httpRequest = dynamic_cast<const HTTPRequest*>(&genericRequest); if (httpRequest) { string s = httpRequest->getContentType(); - if (s.find("application/vnd.paos+xml") == string::npos) { + if (s.find("application/vnd.paos+xml") == string::npos || + s.find("application/x-www-form-urlencoded") != string::npos) { log.warn("ignoring incorrect content type (%s)", s.c_str() ? s.c_str() : "none"); throw BindingException("Invalid content type for PAOS message."); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2POSTDecoder.cpp new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2POSTDecoder.cpp --- old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2POSTDecoder.cpp 2020-03-06 17:38:05.000000000 +0100 +++ new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2POSTDecoder.cpp 2025-03-12 14:37:28.000000000 +0100 @@ -92,11 +92,18 @@ throw BindingException("Unable to cast request object to HTTPRequest type."); if (strcmp(httpRequest->getMethod(),"POST")) throw BindingException("Invalid HTTP method ($1).", params(1, httpRequest->getMethod())); - const char* msg = httpRequest->getParameter("SAMLResponse"); - if (!msg) - msg = httpRequest->getParameter("SAMLRequest"); + + bool isRequest = false; + const char* msg = httpRequest->getParameter("SAMLRequest"); + if (msg) { + isRequest = true; + } else { + msg = httpRequest->getParameter("SAMLResponse"); + } + if (!msg) throw BindingException("Request missing SAMLRequest or SAMLResponse form parameter."); + const char* state = httpRequest->getParameter("RelayState"); if (state) relayState = state; @@ -121,16 +128,20 @@ saml2::RootObject* root = nullptr; StatusResponseType* response = nullptr; - RequestAbstractType* request = dynamic_cast<RequestAbstractType*>(xmlObject.get()); - if (!request) { + RequestAbstractType* request = nullptr; + if (isRequest) { + request = dynamic_cast<RequestAbstractType*>(xmlObject.get()); + if (!request) { + throw BindingException("XML content for SAML 2.0 HTTP-POST Decoder was not a SAML 2.0 request message."); + } + root = static_cast<saml2::RootObject*>(request); + } else { response = dynamic_cast<StatusResponseType*>(xmlObject.get()); - if (!response) - throw BindingException("XML content for SAML 2.0 HTTP-POST Decoder must be a SAML 2.0 protocol message."); + if (!response) { + throw BindingException("XML content for SAML 2.0 HTTP-POST Decoder was not a SAML 2.0 response message."); + } root = static_cast<saml2::RootObject*>(response); } - else { - root = static_cast<saml2::RootObject*>(request); - } SchemaValidators.validate(root); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2RedirectDecoder.cpp new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2RedirectDecoder.cpp --- old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2RedirectDecoder.cpp 2020-03-06 17:38:05.000000000 +0100 +++ new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2RedirectDecoder.cpp 2025-03-12 14:37:28.000000000 +0100 @@ -90,16 +90,24 @@ const HTTPRequest* httpRequest=dynamic_cast<const HTTPRequest*>(&genericRequest); if (!httpRequest) throw BindingException("Unable to cast request object to HTTPRequest type."); - const char* msg = httpRequest->getParameter("SAMLResponse"); - if (!msg) - msg = httpRequest->getParameter("SAMLRequest"); + + bool isRequest = false; + const char* msg = httpRequest->getParameter("SAMLRequest"); + if (msg) { + isRequest = true; + } else { + msg = httpRequest->getParameter("SAMLResponse"); + } + if (!msg) throw BindingException("Request missing SAMLRequest or SAMLResponse query string parameter."); + const char* state = httpRequest->getParameter("RelayState"); if (state) relayState = state; else relayState.erase(); + state = httpRequest->getParameter("SAMLEncoding"); if (state && strcmp(state,samlconstants::SAML20_BINDING_URL_ENCODING_DEFLATE)) { log.warn("SAMLEncoding (%s) was not recognized", state); @@ -132,16 +140,20 @@ saml2::RootObject* root = nullptr; StatusResponseType* response = nullptr; - RequestAbstractType* request = dynamic_cast<RequestAbstractType*>(xmlObject.get()); - if (!request) { + RequestAbstractType* request = nullptr; + if (isRequest) { + request = dynamic_cast<RequestAbstractType*>(xmlObject.get()); + if (!request) { + throw BindingException("XML content for SAML 2.0 HTTP-Redirect Decoder was not a SAML 2.0 request message."); + } + root = static_cast<saml2::RootObject*>(request); + } else { response = dynamic_cast<StatusResponseType*>(xmlObject.get()); - if (!response) - throw BindingException("XML content for SAML 2.0 HTTP-POST Decoder must be a SAML 2.0 protocol message."); + if (!response) { + throw BindingException("XML content for SAML 2.0 HTTP-Redirect Decoder was not a SAML 2.0 response message."); + } root = static_cast<saml2::RootObject*>(response); } - else { - root = static_cast<saml2::RootObject*>(request); - } SchemaValidators.validate(root); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2SOAPDecoder.cpp new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2SOAPDecoder.cpp --- old/opensaml-3.3.0/saml/saml2/binding/impl/SAML2SOAPDecoder.cpp 2024-09-10 16:23:36.000000000 +0200 +++ new/opensaml-3.3.1/saml/saml2/binding/impl/SAML2SOAPDecoder.cpp 2025-03-12 14:37:28.000000000 +0100 @@ -86,7 +86,7 @@ log.debug("validating input"); string s = genericRequest.getContentType(); - if (s.find("text/xml") == string::npos) { + if (s.find("text/xml") == string::npos || s.find("application/x-www-form-urlencoded") != string::npos) { log.warn("ignoring incorrect content type (%s)", s.c_str() ? s.c_str() : "none"); throw BindingException("Invalid content type for SOAP message."); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/saml/version.h new/opensaml-3.3.1/saml/version.h --- old/opensaml-3.3.0/saml/version.h 2024-09-09 22:29:11.000000000 +0200 +++ new/opensaml-3.3.1/saml/version.h 2025-03-10 20:22:57.000000000 +0100 @@ -44,7 +44,7 @@ #define OPENSAML_VERSION_MAJOR 3 #define OPENSAML_VERSION_MINOR 3 -#define OPENSAML_VERSION_REVISION 0 +#define OPENSAML_VERSION_REVISION 1 /** DO NOT MODIFY BELOW THIS LINE */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/opensaml-3.3.0/samlsign/samlsign.rc new/opensaml-3.3.1/samlsign/samlsign.rc --- old/opensaml-3.3.0/samlsign/samlsign.rc 2024-09-09 22:33:32.000000000 +0200 +++ new/opensaml-3.3.1/samlsign/samlsign.rc 2025-03-10 20:25:05.000000000 +0100 @@ -28,8 +28,8 @@ // VS_VERSION_INFO VERSIONINFO - FILEVERSION 3,3,0,0 - PRODUCTVERSION 3,3,0,0 + FILEVERSION 3,3,1,0 + PRODUCTVERSION 3,3,1,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -47,14 +47,14 @@ VALUE "Comments", "\0" VALUE "CompanyName", "Shibboleth Consortium\0" VALUE "FileDescription", "OpenSAML Signature Utility\0" - VALUE "FileVersion", "3, 3, 0, 0\0" + VALUE "FileVersion", "3, 3, 1, 0\0" VALUE "InternalName", "samlsign\0" - VALUE "LegalCopyright", "Copyright 2001-2024 Various\0" + VALUE "LegalCopyright", "Copyright 2001-2025 Various\0" VALUE "LegalTrademarks", "\0" VALUE "OriginalFilename", "samlsign.exe\0" VALUE "PrivateBuild", "\0" - VALUE "ProductName", "OpenSAML 3.3.0\0" - VALUE "ProductVersion", "3, 3, 0, 0\0" + VALUE "ProductName", "OpenSAML 3.3.1\0" + VALUE "ProductVersion", "3, 3, 1, 0\0" VALUE "SpecialBuild", "\0" END END