Rails/CreateTableWithTimestamps:
Enabled: false
+Rails/FindEach:
+ Enabled: false
+
Rails/HasManyOrHasOneDependent:
Enabled: false
if cstags
return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(cstags)
+
cstags = strip_non_xml_chars cstags
end
rel = Relation.where(:id => relid).first
return [-4, "relation", relid] if rel.nil? || !rel.visible
+
[0, "", relid, rel.tags, rel.members, rel.version]
end
end
return -1, "You must accept the contributor terms before you can edit." if REQUIRE_TERMS_AGREED && user.terms_agreed.nil?
return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(tags)
+
tags = strip_non_xml_chars tags
relid = relid.to_i
return -2, "Server error - way is only #{pointlist.length} points long." if pointlist.length < 2
return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(attributes)
+
attributes = strip_non_xml_chars attributes
originalway = originalway.to_i
# fixup node tags in a way as well
return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(node.tags)
+
node.tags = strip_non_xml_chars node.tags
node.tags.delete("created_by")
return -1, "You must accept the contributor terms before you can edit." if REQUIRE_TERMS_AGREED && user.terms_agreed.nil?
return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(tags)
+
tags = strip_non_xml_chars tags
id = id.to_i
u = if name.nil?
# user input checking, we don't have any UIDs < 1
raise OSM::APIBadUserInput, "invalid user ID" if user.to_i < 1
+
u = User.find(user.to_i)
else
u = User.find_by(:display_name => name)
new_node = Node.from_xml(request.raw_post)
raise OSM::APIBadUserInput, "The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})" unless new_node && new_node.id == node.id
+
node.delete_with_history!(new_node, current_user)
render :plain => node.version.to_s
end
ids = params["nodes"].split(",").collect(&:to_i)
raise OSM::APIBadUserInput, "No nodes were given to search for" if ids.empty?
+
doc = OSM::API.new.get_xml_doc
Node.find(ids).each do |node|
def gravatar_enable(user)
# code from example https://en.gravatar.com/site/implement/images/ruby/
return false if user.image.present?
+
hash = Digest::MD5.hexdigest(user.email.downcase)
url = "https://www.gravatar.com/avatar/#{hash}?d=404" # without d=404 we will always get an image back
response = OSM.http_client.get(URI.parse(url))
pt.find("tag").each do |tag|
raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing key") if tag["k"].nil?
raise OSM::APIBadXMLError.new("changeset", pt, "tag is missing value") if tag["v"].nil?
+
cs.add_tag_keyval(tag["k"], tag["v"])
end
def self.verify_request(request, options = {}, &block)
signature = OAuth::Signature.build(request, options, &block)
return false unless OauthNonce.remember(signature.request.nonce, signature.request.timestamp)
+
value = signature.verify
value
rescue OAuth::Signature::UnknownSignatureMethod
raise OSM::APIBadXMLError.new("node", pt, "lat missing") if pt["lat"].nil?
raise OSM::APIBadXMLError.new("node", pt, "lon missing") if pt["lon"].nil?
+
node.lat = OSM.parse_float(pt["lat"], OSM::APIBadXMLError, "node", pt, "lat not a number")
node.lon = OSM.parse_float(pt["lon"], OSM::APIBadXMLError, "node", pt, "lon not a number")
raise OSM::APIBadXMLError.new("node", pt, "Changeset id is missing") if pt["changeset"].nil?
+
node.changeset_id = pt["changeset"].to_i
raise OSM::APIBadUserInput, "The node is outside this world" unless node.in_world?
# version must be present unless creating
raise OSM::APIBadXMLError.new("node", pt, "Version is required when updating") unless create || !pt["version"].nil?
+
node.version = create ? 0 : pt["version"].to_i
unless create
raise OSM::APIBadXMLError.new("node", pt, "ID is required when updating.") if pt["id"].nil?
+
node.id = pt["id"].to_i
# .to_i will return 0 if there is no number that can be parsed.
# We want to make sure that there is no id with zero anyway
pt.find("tag").each do |tag|
raise OSM::APIBadXMLError.new("node", pt, "tag is missing key") if tag["k"].nil?
raise OSM::APIBadXMLError.new("node", pt, "tag is missing value") if tag["v"].nil?
+
node.add_tag_key_val(tag["k"], tag["v"])
end
# Remembers a nonce and it's associated timestamp. It returns false if it has already been used
def self.remember(nonce, timestamp)
return false if Time.now.to_i - timestamp.to_i > 86400
+
oauth_nonce = OauthNonce.create(:nonce => nonce, :timestamp => timestamp.to_i)
return false if oauth_nonce.new_record?
+
oauth_nonce
end
end
relation = Relation.new
raise OSM::APIBadXMLError.new("relation", pt, "Version is required when updating") unless create || !pt["version"].nil?
+
relation.version = pt["version"]
raise OSM::APIBadXMLError.new("relation", pt, "Changeset id is missing") if pt["changeset"].nil?
+
relation.changeset_id = pt["changeset"]
unless create
raise OSM::APIBadXMLError.new("relation", pt, "ID is required when updating") if pt["id"].nil?
+
relation.id = pt["id"].to_i
# .to_i will return 0 if there is no number that can be parsed.
# We want to make sure that there is no id with zero anyway
pt.find("tag").each do |tag|
raise OSM::APIBadXMLError.new("relation", pt, "tag is missing key") if tag["k"].nil?
raise OSM::APIBadXMLError.new("relation", pt, "tag is missing value") if tag["v"].nil?
+
relation.add_tag_keyval(tag["k"], tag["v"])
end
pt.find("member").each do |member|
# member_type =
raise OSM::APIBadXMLError.new("relation", pt, "The #{member['type']} is not allowed only, #{TYPES.inspect} allowed") unless TYPES.include? member["type"]
+
# member_ref = member['ref']
# member_role
member["role"] ||= "" # Allow the upload to not include this, in which case we default to an empty string.
lock!
check_consistency(self, new_relation, user)
raise OSM::APIPreconditionFailedError, "Cannot update relation #{id}: data or member data is invalid." unless new_relation.preconditions_ok?(members)
+
self.changeset_id = new_relation.changeset_id
self.changeset = new_relation.changeset
self.tags = new_relation.tags
def create_with_history(user)
check_create_consistency(self, user)
raise OSM::APIPreconditionFailedError, "Cannot create relation: data or member data is invalid." unless preconditions_ok?
+
self.version = 0
self.visible = true
save_with_history!
# and check that it is OK to use.
raise OSM::APIPreconditionFailedError, "Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}" unless element && element.visible? && element.preconditions_ok?
+
hash[m[1]] = true
end
if old_id < 0
new_id = id_map[type.downcase.to_sym][old_id]
raise OSM::APIBadUserInput, "Placeholder #{type} not found for reference #{old_id} in relation #{self.id.nil? ? placeholder_id : self.id}." if new_id.nil?
+
[type, new_id, role]
else
[type, id, role]
def authorize!(user)
return false if authorized?
+
self.user = user
self.authorized_at = Time.now
self.verifier = OAuth::Helper.generate_key(20)[0, 20] unless oauth10?
def update_from_xml_node(pt, create = false)
raise OSM::APIBadXMLError.new("trace", pt, "visibility missing") if pt["visibility"].nil?
+
self.visibility = pt["visibility"]
unless create
raise OSM::APIBadXMLError.new("trace", pt, "ID is required when updating.") if pt["id"].nil?
+
id = pt["id"].to_i
# .to_i will return 0 if there is no number that can be parsed.
# We want to make sure that there is no id with zero anyway
description = pt.find("description").first
raise OSM::APIBadXMLError.new("trace", pt, "description missing") if description.nil?
+
self.description = description.content
self.tags = pt.find("tag").collect do |tag|
way = Way.new
raise OSM::APIBadXMLError.new("way", pt, "Version is required when updating") unless create || !pt["version"].nil?
+
way.version = pt["version"]
raise OSM::APIBadXMLError.new("way", pt, "Changeset id is missing") if pt["changeset"].nil?
+
way.changeset_id = pt["changeset"]
unless create
raise OSM::APIBadXMLError.new("way", pt, "ID is required when updating") if pt["id"].nil?
+
way.id = pt["id"].to_i
# .to_i will return 0 if there is no number that can be parsed.
# We want to make sure that there is no id with zero anyway
pt.find("tag").each do |tag|
raise OSM::APIBadXMLError.new("way", pt, "tag is missing key") if tag["k"].nil?
raise OSM::APIBadXMLError.new("way", pt, "tag is missing value") if tag["v"].nil?
+
way.add_tag_keyval(tag["k"], tag["v"])
end
def create_with_history(user)
check_create_consistency(self, user)
raise OSM::APIPreconditionFailedError, "Cannot create way: data is invalid." unless preconditions_ok?
+
self.version = 0
self.visible = true
save_with_history!
if node_id < 0
new_id = id_map[:node][node_id]
raise OSM::APIBadUserInput, "Placeholder node not found for reference #{node_id} in way #{id.nil? ? placeholder_id : id}" if new_id.nil?
+
new_id
else
node_id
super
rescue InvalidPluralizationData => ex
raise ex unless ex.entry.key?(:other)
+
ex.entry[:other]
end
end
def oauth1_verify(request, options = {}, &block)
signature = OAuth::Signature.build(request, options, &block)
return false unless OauthNonce.remember(signature.request.nonce, signature.request.timestamp)
+
value = signature.verify
if request.ssl? && !value
http_request = request.dup
# check the bbox is sane
raise OSM::APIBadBoundingBox, "The minimum longitude must be less than the maximum longitude, but it wasn't" if min_lon > max_lon
raise OSM::APIBadBoundingBox, "The minimum latitude must be less than the maximum latitude, but it wasn't" if min_lat > max_lat
+
if min_lon < -LON_LIMIT || min_lat < -LAT_LIMIT || max_lon > +LON_LIMIT || max_lat > +LAT_LIMIT
raise OSM::APIBadBoundingBox, "The latitudes must be between #{-LAT_LIMIT} and #{LAT_LIMIT}," \
" and longitudes between #{-LON_LIMIT} and #{LON_LIMIT}"
def from_bbox_array(bbox_array)
raise OSM::APIBadUserInput, "The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat" unless bbox_array
+
# Take an array of length 4, create a bounding box with min_lon, min_lat, max_lon and
# max_lat within their respective boundaries.
min_lon = [[bbox_array[0].to_f, -LON_LIMIT].max, +LON_LIMIT].min
# same page number).
def ==(other)
return false if other.nil?
+
@paginator == other.paginator &&
@number == other.number
end
# if the pages do not belong to the same Paginator object.
def <=>(other)
raise ArgumentError unless @paginator == other.paginator
+
@number <=> other.number
end
def in_world?
return false if lat < -90 || lat > 90
return false if lon < -180 || lon > 180
+
true
end
arr = {}
while (key = getstring(s))
break if key == ""
+
arr[key] = getvalue(s)
end
s.getbyte # skip the 9 'end of object' value
# using the iconv library, which is in the standard library.
def self.valid?(str)
return true if str.nil?
+
str.valid_encoding?
end
end
User.where("image_use_gravatar AND id >=" + start.to_s).order("id").find_each do |user|
p "checked up to id " + user.id.to_s if (user.id % 1000).zero? # just give a rough indication where we are for restarting
next if user.image.present?
+
hash = Digest::MD5.hexdigest(user.email.downcase)
url = "https://www.gravatar.com/avatar/#{hash}?d=404" # without d=404 we will always get an image back
response = OSM.http_client.get(URI.parse(url))