Enforce changeset size limit for API calls which make changes
This commit is contained in:
parent
f61ac2586f
commit
c38e3d6144
3 changed files with 27 additions and 0 deletions
|
@ -130,6 +130,8 @@ class Changeset < ApplicationRecord
|
||||||
def update_bbox!(bbox_update)
|
def update_bbox!(bbox_update)
|
||||||
bbox.expand!(bbox_update)
|
bbox.expand!(bbox_update)
|
||||||
|
|
||||||
|
raise OSM::APISizeLimitExceeded if bbox.linear_size > size_limit
|
||||||
|
|
||||||
# update active record. rails 2.1's dirty handling should take care of
|
# update active record. rails 2.1's dirty handling should take care of
|
||||||
# whether this object needs saving or not.
|
# whether this object needs saving or not.
|
||||||
self.min_lon, self.min_lat, self.max_lon, self.max_lat = @bbox.to_a.collect(&:round) if bbox.complete?
|
self.min_lon, self.min_lat, self.max_lon, self.max_lat = @bbox.to_a.collect(&:round) if bbox.complete?
|
||||||
|
@ -225,4 +227,10 @@ class Changeset < ApplicationRecord
|
||||||
def subscribed?(user)
|
def subscribed?(user)
|
||||||
subscribers.exists?(user.id)
|
subscribers.exists?(user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def size_limit
|
||||||
|
@size_limit ||= ActiveRecord::Base.connection.select_value(
|
||||||
|
"SELECT api_size_limit($1)", "api_size_limit", [user_id]
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -88,6 +88,14 @@ class BoundingBox
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def linear_size
|
||||||
|
if complete?
|
||||||
|
(max_lon - min_lon) + (max_lat - min_lat)
|
||||||
|
else
|
||||||
|
0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def complete?
|
def complete?
|
||||||
to_a.exclude?(nil)
|
to_a.exclude?(nil)
|
||||||
end
|
end
|
||||||
|
|
11
lib/osm.rb
11
lib/osm.rb
|
@ -364,6 +364,17 @@ module OSM
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Raised when a size limit is exceeded
|
||||||
|
class APISizeLimitExceeded < APIError
|
||||||
|
def initialize
|
||||||
|
super("Size limit exceeded")
|
||||||
|
end
|
||||||
|
|
||||||
|
def status
|
||||||
|
:payload_too_large
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# Helper methods for going to/from mercator and lat/lng.
|
# Helper methods for going to/from mercator and lat/lng.
|
||||||
class Mercator
|
class Mercator
|
||||||
include Math
|
include Math
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue