Made XML parsing routines raise an exception if the document is valid XML, but not...
authorMatt Amos <zerebubuth@gmail.com>
Thu, 6 Aug 2009 17:28:49 +0000 (17:28 +0000)
committerMatt Amos <zerebubuth@gmail.com>
Thu, 6 Aug 2009 17:28:49 +0000 (17:28 +0000)
app/models/node.rb
app/models/relation.rb
app/models/way.rb
test/functional/node_controller_test.rb

index dd8d96d12aa2116b56be6e2a3b1d986c3a884f9f..df6442b833405140075cb43b2f65b557551c5b80 100644 (file)
@@ -70,6 +70,7 @@ class Node < ActiveRecord::Base
       doc.find('//osm/node').each do |pt|
         return Node.from_xml_node(pt, create)
       end
+      raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/node element.")
     rescue LibXML::XML::Error, ArgumentError => ex
       raise OSM::APIBadXMLError.new("node", xml, ex.message)
     end
index 76cd86729cdc8ed3d3ce16600b799eb9b5813bdc..e3ba69b56386dae78e9df50a0f3225eb63ae2dda 100644 (file)
@@ -33,6 +33,7 @@ class Relation < ActiveRecord::Base
       doc.find('//osm/relation').each do |pt|
         return Relation.from_xml_node(pt, create)
       end
+      raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/relation element.")
     rescue LibXML::XML::Error, ArgumentError => ex
       raise OSM::APIBadXMLError.new("relation", xml, ex.message)
     end
index e2641873284d5e84de69b47a220ed4c7cfbd6655..639f4e69a770ad94e1d2ccda8884d90cabffa459 100644 (file)
@@ -34,6 +34,7 @@ class Way < ActiveRecord::Base
       doc.find('//osm/way').each do |pt|
         return Way.from_xml_node(pt, create)
       end
+      raise OSM::APIBadXMLError.new("node", xml, "XML doesn't contain an osm/way element.")
     rescue LibXML::XML::Error, ArgumentError => ex
       raise OSM::APIBadXMLError.new("way", xml, ex.message)
     end
index 0595f3d086827163ac3ad88905133b42747e90a9..b5f93c4587eb0381073fbe22a93ee5c10527ce6e 100644 (file)
@@ -75,6 +75,12 @@ class NodeControllerTest < ActionController::TestCase
     lat = 3.434
     lon = 3.23
     
+    # test that the upload is rejected when xml is valid, but osm doc isn't
+    content("<create/>")
+    put :create
+    assert_response :bad_request, "node upload did not return bad_request status"
+    assert_equal "Cannot parse valid node from xml string <create/>. XML doesn't contain an osm/node element.", @response.body
+
     # test that the upload is rejected when no lat is supplied
     # create a minimal xml file
     content("<osm><node lon='#{lon}' changeset='#{changeset.id}'/></osm>")
@@ -184,6 +190,12 @@ class NodeControllerTest < ActionController::TestCase
     assert_response :bad_request, 
        "should not be able to delete a node with a different ID from the XML"
 
+    # try to delete a node rubbish in the payloads
+    content("<delete/>")
+    delete :delete, :id => current_nodes(:visible_node).id
+    assert_response :bad_request, 
+       "should not be able to delete a node without a valid XML payload"
+
     # valid delete now takes a payload
     content(nodes(:public_visible_node).to_xml)
     delete :delete, :id => current_nodes(:public_visible_node).id
@@ -353,6 +365,12 @@ class NodeControllerTest < ActionController::TestCase
     assert_response :bad_request, 
        "should not be able to update a node with a different ID from the XML"
 
+    ## try an update with a minimal valid XML doc which isn't a well-formed OSM doc.
+    content "<update/>"
+    put :update, :id => current_nodes(:visible_node).id
+    assert_response :bad_request, 
+       "should not be able to update a node with non-OSM XML doc."
+
     ## finally, produce a good request which should work
     content current_nodes(:public_visible_node).to_xml
     put :update, :id => current_nodes(:public_visible_node).id