- def map
- GC.start
- @@count+=1
-
- # Figure out the bbox
- bbox = params['bbox']
- unless bbox and bbox.count(',') == 3
- report_error("The parameter bbox is required, and must be of the form min_lon,min_lat,max_lon,max_lat")
- return
- end
-
- bbox = bbox.split(',')
-
- min_lon = bbox[0].to_f
- min_lat = bbox[1].to_f
- max_lon = bbox[2].to_f
- max_lat = bbox[3].to_f
-
- # check the bbox is sane
- unless min_lon <= max_lon
- report_error("The minimum longitude must be less than the maximum longitude, but it wasn't")
- return
- end
- unless min_lat <= max_lat
- report_error("The minimum latitude must be less than the maximum latitude, but it wasn't")
- return
- end
- unless min_lon >= -180 && min_lat >= -90 && max_lon <= 180 && max_lat <= 90
- report_error("The latitudes must be between -90 and 90, and longitudes between -180 and 180")
- return
- end
-
- # check the bbox isn't too large
- requested_area = (max_lat-min_lat)*(max_lon-min_lon)
- if requested_area > MAX_REQUEST_AREA
- report_error("The maximum bbox size is " + MAX_REQUEST_AREA.to_s +
- ", and your request was too large. Either request a smaller area, or use planet.osm")
- return
- end
-
- # get all the nodes
- nodes = Node.find_by_area(min_lat, min_lon, max_lat, max_lon, :conditions => "visible = 1")
-
- node_ids = nodes.collect {|node| node.id }
-
- if node_ids.length > 50_000
- report_error("You requested too many nodes (limit is 50,000). Either request a smaller area, or use planet.osm")
- return
- end
-
- if node_ids.length == 0
- render :text => "<osm version='0.5'></osm>", :content_type => "text/xml"
- return
- end
-
- relations = Array.new
-
- doc = OSM::API.new.get_xml_doc
-
- # get ways
- # find which ways are needed
- ways = Array.new
- if node_ids.length > 0
- way_nodes = WayNode.find_all_by_node_id(node_ids)
- way_ids = way_nodes.collect {|way_node| way_node.id[0] }
- ways = Way.find(way_ids)
-
- list_of_way_nodes = ways.collect { |way|
- way.way_nodes.collect { |way_node| way_node.node_id }
- }
- list_of_way_nodes.flatten!
-
- else
- list_of_way_nodes = Array.new
- end
-
- # - [0] in case some thing links to node 0 which doesn't exist. Shouldn't actually ever happen but it does. FIXME: file a ticket for this
- nodes_to_fetch = (list_of_way_nodes.uniq - node_ids) - [0]
-
- if nodes_to_fetch.length > 0
- nodes += Node.find(nodes_to_fetch)
- end
-
- visible_nodes = {}
- user_display_name_cache = {}
-
- nodes.each do |node|
- if node.visible?
- doc.root << node.to_xml_node(user_display_name_cache)
- visible_nodes[node.id] = node
+ def authorize(realm = "Web Password", errormessage = "Couldn't authenticate you")
+ # make the current_user object from any auth sources we have
+ setup_user_auth
+
+ # handle authenticate pass/fail
+ unless current_user
+ # no auth, the user does not exist or the password was wrong
+ if Settings.basic_auth_support
+ response.headers["WWW-Authenticate"] = "Basic realm=\"#{realm}\""
+ render :plain => errormessage, :status => :unauthorized
+ else
+ render :plain => errormessage, :status => :forbidden