Put decrypted objects into their own document.
[shibboleth/opensaml2.git] / saml / saml2 / core / impl / Protocols20Impl.cpp
index ab3b970..e4b652e 100644 (file)
@@ -1288,18 +1288,22 @@ namespace opensaml {
                 }
             }
     
-            XMLObject* decrypt(const CredentialResolver* KEKresolver, const XMLCh* recipient) const
+            XMLObject* decrypt(const CredentialResolver& credResolver, const XMLCh* recipient, CredentialCriteria* criteria) const
             {
                 if (!m_EncryptedData)
                     throw DecryptionException("No encrypted data present.");
-                EncryptedKeyResolver ekr(*this, recipient);
-                Decrypter decrypter(KEKresolver, &ekr);
-                DOMDocumentFragment* frag = decrypter.decryptData(*m_EncryptedData);
+                EncryptedKeyResolver ekr(*this);
+                Decrypter decrypter(&credResolver, criteria, &ekr);
+                DOMDocumentFragment* frag = decrypter.decryptData(*m_EncryptedData, recipient);
                 if (frag->hasChildNodes() && frag->getFirstChild()==frag->getLastChild()) {
                     DOMNode* plaintext=frag->getFirstChild();
                     if (plaintext->getNodeType()==DOMNode::ELEMENT_NODE) {
-                        auto_ptr<XMLObject> ret(XMLObjectBuilder::buildOneFromElement(static_cast<DOMElement*>(plaintext)));
-                        ret->releaseThisAndChildrenDOM();
+                        // Import the tree into a new Document that we can bind to the unmarshalled object.
+                        XercesJanitor<DOMDocument> newdoc(XMLToolingConfig::getConfig().getParser().newDocument());
+                        DOMElement* treecopy = static_cast<DOMElement*>(newdoc->importNode(plaintext, true));
+                        newdoc->appendChild(treecopy);
+                        auto_ptr<XMLObject> ret(XMLObjectBuilder::buildOneFromElement(treecopy, true));
+                        newdoc.release();
                         return ret.release();
                     }
                 }