]> git.openstreetmap.org Git - rails.git/commitdiff
Add a limit on the number of points in a GPS trace
authorTom Hughes <tom@compton.nu>
Sat, 24 Feb 2024 14:34:09 +0000 (14:34 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 25 Feb 2024 09:50:02 +0000 (09:50 +0000)
app/models/trace.rb
config/settings.yml
lib/gpx.rb
test/models/trace_test.rb

index 2411fb9b7a3c56c2f2adc57787a6194f83058c51..3ab25ce3098735a6058d1a94d053c8143483bdaa 100644 (file)
@@ -202,7 +202,7 @@ class Trace < ApplicationRecord
     logger.info("GPX Import importing #{name} (#{id}) from #{user.email}")
 
     file.open do |file|
-      gpx = GPX::File.new(file.path)
+      gpx = GPX::File.new(file.path, :maximum_points => Settings.max_trace_size)
 
       f_lat = 0
       f_lon = 0
index 6eab4807ea6daf9ec852d101e123829cc52b4a1b..c057be978a841485174d6714ea3499744011fd2e 100644 (file)
@@ -45,6 +45,8 @@ default_note_query_limit: 100
 max_note_query_limit: 10000
 # Maximum value of open issues counter for moderators, anything equal or greater to this value "n" is shown as "n+"
 max_issues_count: 99
+# Maximum number of points in a GPX trace
+max_trace_size: 1000000
 # Zoom level to use for postcode results from the geocoder
 postcode_zoom: 15
 # Timeout for API calls in seconds
index 274ece7d9a3160e6eba8f194fcbe6eb7956bffbc..3e1cb9afa6d9cf6da4ca51d80255576c3f25f309 100644 (file)
@@ -6,8 +6,9 @@ module GPX
 
     attr_reader :possible_points, :actual_points, :tracksegs
 
-    def initialize(file)
+    def initialize(file, options = {})
       @file = file
+      @maximum_points = options[:maximum_points] || Float::INFINITY
     end
 
     def parse_file(reader)
@@ -19,6 +20,7 @@ module GPX
           if reader.name == "trkpt"
             point = TrkPt.new(@tracksegs, reader["lat"].to_f, reader["lon"].to_f)
             @possible_points += 1
+            raise FileTooBigError if @possible_points > @maximum_points
           elsif reader.name == "ele" && point
             point.altitude = reader.read_string.to_f
           elsif reader.name == "time" && point
@@ -172,4 +174,10 @@ module GPX
         longitude >= -180 && longitude <= 180
     end
   end
+
+  class FileTooBigError < RuntimeError
+    def initialise
+      super("GPX File contains too many points")
+    end
+  end
 end
index 1a2376ca87e35d063e5c6c53b2d119650f98a960..f95ebe4c320bd3dafa90de6d4ecb9cfb2633be1b 100644 (file)
@@ -289,6 +289,18 @@ class TraceTest < ActiveSupport::TestCase
     assert_equal 2, trace.size
   end
 
+  def test_import_enforces_limit
+    trace = create(:trace, :inserted => false, :fixture => "f")
+
+    with_settings(:max_trace_size => 1) do
+      assert_raise GPX::FileTooBigError do
+        trace.import
+      end
+    end
+
+    assert_not trace.inserted
+  end
+
   private
 
   def check_query(query, traces)