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
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
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)
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
longitude >= -180 && longitude <= 180
end
end
+
+ class FileTooBigError < RuntimeError
+ def initialise
+ super("GPX File contains too many points")
+ end
+ end
end
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)