summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lasso/xml/saml-2.0/saml2_assertion.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/lasso/xml/saml-2.0/saml2_assertion.c b/lasso/xml/saml-2.0/saml2_assertion.c
index 35c8e472..5bf46b6f 100644
--- a/lasso/xml/saml-2.0/saml2_assertion.c
+++ b/lasso/xml/saml-2.0/saml2_assertion.c
@@ -27,6 +27,7 @@
#include "../private.h"
#include <xmlsec/xmldsig.h>
#include <xmlsec/templates.h>
+#include <xmlsec/xmltree.h>
#include "saml2_assertion.h"
@@ -118,9 +119,25 @@ static xmlNode*
get_xmlNode(LassoNode *node, gboolean lasso_dump)
{
LassoSaml2Assertion *assertion = LASSO_SAML2_ASSERTION(node);
- xmlNode *xmlnode;
+ xmlNode *xmlnode, *original_xmlnode;
int rc = 0;
+ /* If assertion has been deserialized and contain a signature, dump it from the
+ * original xmlnode. */
+ original_xmlnode = lasso_node_get_original_xmlnode(node);
+ while (original_xmlnode) {
+ xmlNode *signature, *signature_value;
+
+ signature = xmlSecFindChild(original_xmlnode, xmlSecNodeSignature, xmlSecDSigNs);
+ if (! signature)
+ break;
+ signature_value = xmlSecFindNode(signature, xmlSecNodeSignatureValue, xmlSecDSigNs);
+ if (signature_value && signature_value->children) {
+ return xmlCopyNode(original_xmlnode, 1);
+ }
+ break;
+ }
+
xmlnode = parent_class->get_xmlNode(node, lasso_dump);
if (lasso_dump == FALSE && assertion->sign_type) {