def Yadis::get_canonical_id(iname, xrd_tree)
xrd_list = []
REXML::XPath::match(xrd_tree.root, '/xrds:XRDS/xrd:XRD', XRDS_NAMESPACES).each { |el|
xrd_list << el
}
xrd_list.reverse!
cid_elements = []
if !xrd_list.empty?
xrd_list[0].elements.each { |e|
if !e.respond_to?('name')
next
end
if e.name == 'CanonicalID'
cid_elements << e
end
}
end
cid_element = cid_elements[0]
if !cid_element
return nil
end
canonicalID = XRI.make_xri(cid_element.text)
childID = canonicalID.downcase
xrd_list[1..-1].each { |xrd|
parent_sought = childID[0...childID.rindex('!')]
parent = XRI.make_xri(xrd.elements["CanonicalID"].text)
if parent_sought != parent.downcase
raise XRDSFraud.new(sprintf("%s can not come from %s", parent_sought,
parent))
end
childID = parent_sought
}
root = XRI.root_authority(iname)
if not XRI.provider_is_authoritative(root, childID)
raise XRDSFraud.new(sprintf("%s can not come from root %s", childID, root))
end
return canonicalID
end