in xsec/dsig/DSIGReference.cpp [544:758]
void DSIGReference::load(void) {
// Load reference info from XML
DOMNamedNodeMap *atts = mp_referenceNode->getAttributes();
DOMNode *tmpElt;
const XMLCh * name;
safeBuffer sbName;
if (atts != 0) {
XMLSize_t size = atts->getLength();
for (XMLSize_t i = 0; i < size; ++i) {
name = atts->item(i)->getNodeName();
sbName << (*mp_formatter << atts->item(i)->getNodeName());
if (strEquals(name, s_unicodeStrURI)) {
mp_URI = atts->item(i)->getNodeValue();
}
else if (strEquals(name, "Type")) {
// Check if a manifest, otherwise ignore for now
if (strEquals(atts->item(i)->getNodeValue(), DSIGConstants::s_unicodeStrURIMANIFEST))
m_isManifest = true;
}
else if (strEquals(name, "Id")) {
// For now ignore
}
else if (sbName.sbStrncmp("xmlns", 5) == 0) {
// Ignore name spaces
}
else {
//safeBuffer tmp, error;
//error << (*mp_formatter << name);
//tmp.sbStrcpyIn("Unknown attribute in <Reference> Element : ");
//tmp.sbStrcatIn(error);
throw XSECException(XSECException::UnknownDSIGAttribute,
"Unknown attribute in <Reference> Element");
}
}
}
// Now check for Transforms
tmpElt = mp_referenceNode->getFirstChild();
while (tmpElt != 0 && (tmpElt->getNodeType() != DOMNode::ELEMENT_NODE)) {
if (tmpElt->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"EntityReference nodes in <Reference> are unsupported.");
}
// Skip text and comments
tmpElt = tmpElt->getNextSibling();
}
if (tmpElt == 0) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected <Transforms> or <DigestMethod> within <Reference>");
}
if (strEquals(getDSIGLocalName(tmpElt), "Transforms")) {
// Store node for later use
mp_transformsNode = tmpElt;
// Load the transforms
mp_transformList = loadTransforms(tmpElt, mp_formatter, mp_env);
// Find next node
tmpElt = tmpElt->getNextSibling();
while (tmpElt != 0 && (tmpElt->getNodeType() != DOMNode::ELEMENT_NODE)) {
if (tmpElt->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"EntityReference nodes in <Reference> are unsupported.");
}
tmpElt = tmpElt->getNextSibling();
}
} /* if tmpElt node type = transforms */
else {
mp_transformList = NULL;
}
if (tmpElt == NULL || !strEquals(getDSIGLocalName(tmpElt), "DigestMethod")) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected <DigestMethod> element");
}
// Determine what the digest method actually is
atts = tmpElt->getAttributes();
unsigned int i;
for (i = 0; i < atts->getLength() &&
!strEquals(atts->item(i)->getNodeName(), DSIGConstants::s_unicodeStrAlgorithm); ++i);
if (i == atts->getLength()) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected 'Algorithm' attribute in <DigestMethod>");
}
mp_algorithmURI = atts->item(i)->getNodeValue();
// Find the hash value node
tmpElt = tmpElt->getNextSibling();
while (tmpElt != 0 &&
(tmpElt->getNodeType() != DOMNode::ELEMENT_NODE || !strEquals(getDSIGLocalName(tmpElt), "DigestValue"))) {
if (tmpElt->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"EntityReference nodes in <Reference> are unsupported.");
}
tmpElt = tmpElt->getNextSibling();
}
if (tmpElt == 0) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected <DigestValue> within <Reference>");
}
mp_hashValueNode = tmpElt;
// If we are a manifest, then we need to load the manifest references
if (m_isManifest) {
// Find the manifest node - we cheat and use a transform
TXFMBase * docObject;
DOMNode * manifestNode, * referenceNode;
docObject = getURIBaseTXFM(mp_referenceNode->getOwnerDocument(), mp_URI,
mp_env);
manifestNode = docObject->getFragmentNode();
delete docObject;
// Now search downwards to find a <Manifest>
if (manifestNode == 0 || manifestNode->getNodeType() != DOMNode::ELEMENT_NODE ||
(!strEquals(getDSIGLocalName(manifestNode), "Object") && !strEquals(getDSIGLocalName(manifestNode), "Manifest"))) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected <Manifest> or <Object> URI for Manifest Type <Reference>");
}
if (strEquals(getDSIGLocalName(manifestNode), "Object")) {
// Find Manifest child
manifestNode = manifestNode->getFirstChild();
while (manifestNode != 0 && manifestNode->getNodeType() != DOMNode::ELEMENT_NODE) {
if (manifestNode->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"EntityReference nodes in <Reference> are unsupported.");
}
manifestNode = manifestNode->getNextSibling();
}
if (manifestNode == 0 || !strEquals(getDSIGLocalName(manifestNode), "Manifest"))
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected <Manifest> as child of <Object> for Manifest Type <Reference>");
}
// Now have the manifest node, find the first reference and load!
referenceNode = manifestNode->getFirstChild();
while (referenceNode != 0 &&
(referenceNode->getNodeType() != DOMNode::ELEMENT_NODE || !strEquals(getDSIGLocalName(referenceNode), "Reference"))) {
if (referenceNode->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) {
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"EntityReference nodes in <Reference> are unsupported.");
}
referenceNode = referenceNode->getNextSibling();
}
if (referenceNode == 0)
throw XSECException(XSECException::ExpectedDSIGChildNotFound,
"Expected <Reference> as child of <Manifest>");
// Have reference node, so lets create a list!
mp_manifestList = DSIGReference::loadReferenceListFromXML(mp_env, referenceNode);
} /* m_isManifest */
m_loaded = true;
}