diff --git a/app/controllers/amf_controller.rb b/app/controllers/amf_controller.rb index 3fa47d088..aa030ca92 100644 --- a/app/controllers/amf_controller.rb +++ b/app/controllers/amf_controller.rb @@ -76,7 +76,7 @@ class AmfController < ApplicationController logger.info("Executing AMF #{message}(#{args.join(',')}):#{index}") case message - when 'getpresets'; results[index]=AMF.putdata(index,getpresets(args[0])) + when 'getpresets'; results[index]=AMF.putdata(index,getpresets(*args)) when 'whichways'; results[index]=AMF.putdata(index,whichways(*args)) when 'whichways_deleted'; results[index]=AMF.putdata(index,whichways_deleted(*args)) when 'getway'; results[index]=AMF.putdata(index,getway(args[0].to_i)) @@ -213,13 +213,21 @@ class AmfController < ApplicationController # Return presets (default tags, localisation etc.): # uses POTLATCH_PRESETS global, set up in OSM::Potlatch. - def getpresets(lang) #:doc: - lang.gsub!(/[^\w\-]/,'') + def getpresets(usertoken,lang) #:doc: + user = getuser(usertoken) + + if user && !user.languages.empty? + request.user_preferred_languages = user.languages + end + + lang = request.compatible_language_from(getlocales) begin + # if not, try the browser language localised = YAML::load(File.open("#{RAILS_ROOT}/config/potlatch/localised/#{lang}/localised.yaml")) rescue - localised = "" # guess we'll just have to use the hardcoded English text instead + # fall back to hardcoded English text + localised = "" end begin @@ -518,6 +526,8 @@ class AmfController < ApplicationController amf_handle_error("'putrelation' #{relid}") do user = getuser(usertoken) if !user then return -1,"You are not logged in, so the relation could not be saved." end + if !tags_ok(tags) then return -1,"One of the tags is invalid. Please pester Adobe to fix Flash on Linux." end + tags = strip_non_xml_chars tags relid = relid.to_i visible = (visible.to_i != 0) @@ -604,6 +614,8 @@ class AmfController < ApplicationController user = getuser(usertoken) if !user then return -1,"You are not logged in, so the way could not be saved." end if pointlist.length < 2 then return -2,"Server error - way is only #{points.length} points long." end + if !tags_ok(attributes) then return -1,"One of the tags is invalid. Please pester Adobe to fix Flash on Linux." end + attributes = strip_non_xml_chars attributes originalway = originalway.to_i pointlist.collect! {|a| a.to_i } @@ -628,6 +640,11 @@ class AmfController < ApplicationController node.lat = lat node.lon = lon node.tags = a[4] + + # fixup node tags in a way as well + if !tags_ok(node.tags) then return -1,"One of the tags is invalid. Please pester Adobe to fix Flash on Linux." end + node.tags = strip_non_xml_chars node.tags + node.tags.delete('created_by') node.version = version if id <= 0 @@ -700,6 +717,8 @@ class AmfController < ApplicationController amf_handle_error("'putpoi' #{id}") do user = getuser(usertoken) if !user then return -1,"You are not logged in, so the point could not be saved." end + if !tags_ok(tags) then return -1,"One of the tags is invalid. Please pester Adobe to fix Flash on Linux." end + tags = strip_non_xml_chars tags id = id.to_i visible = (visible.to_i == 1) @@ -851,6 +870,34 @@ class AmfController < ApplicationController } end + def getlocales + Dir.glob("#{RAILS_ROOT}/config/potlatch/localised/*").collect { |f| File.basename(f) } + end + + ## + # check that all key-value pairs are valid UTF-8. + def tags_ok(tags) + tags.each do |k, v| + return false unless UTF8.valid? k + return false unless UTF8.valid? v + end + return true + end + + ## + # strip characters which are invalid in XML documents from the strings + # in the +tags+ hash. + def strip_non_xml_chars(tags) + new_tags = Hash.new + unless tags.nil? + tags.each do |k, v| + new_k = k.delete "\000-\037", "^\011\012\015" + new_v = v.delete "\000-\037", "^\011\012\015" + new_tags[new_k] = new_v + end + end + return new_tags + end # ==================================================================== # Alternative SQL queries for getway/whichways diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb index cc1758bf3..4d9c6839e 100644 --- a/app/controllers/changeset_controller.rb +++ b/app/controllers/changeset_controller.rb @@ -285,15 +285,25 @@ class ChangesetController < ApplicationController bbox_link = "#{bbox.to_s}" end - @title = t 'changeset.list.title' + if user + user_link = "#{user.display_name}" + end if user and bbox - @description = t 'changeset.list.description_user_bbox', :user => user.display_name, :bbox => bbox_link + @title = t 'changeset.list.title_user_bbox', :user => user.display_name, :bbox => bbox.to_s + @heading = t 'changeset.list.heading_user_bbox', :user => user.display_name, :bbox => bbox.to_s + @description = t 'changeset.list.description_user_bbox', :user => user_link, :bbox => bbox_link elsif user - @description = t 'changeset.list.description_user', :user => user.display_name + @title = t 'changeset.list.title_user', :user => user.display_name + @heading = t 'changeset.list.heading_user', :user => user.display_name + @description = t 'changeset.list.description_user', :user => user_link elsif bbox + @title = t 'changeset.list.title_bbox', :bbox => bbox.to_s + @heading = t 'changeset.list.heading_bbox', :bbox => bbox.to_s @description = t 'changeset.list.description_bbox', :bbox => bbox_link else + @title = t 'changeset.list.title' + @heading = t 'changeset.list.heading' @description = t 'changeset.list.description' end diff --git a/app/controllers/geocoder_controller.rb b/app/controllers/geocoder_controller.rb index 1b2ae340b..8195b0d47 100644 --- a/app/controllers/geocoder_controller.rb +++ b/app/controllers/geocoder_controller.rb @@ -3,6 +3,7 @@ class GeocoderController < ApplicationController require 'net/http' require 'rexml/document' + before_filter :authorize_web before_filter :set_locale def search diff --git a/app/controllers/message_controller.rb b/app/controllers/message_controller.rb index e1062bc9f..db40cc03f 100644 --- a/app/controllers/message_controller.rb +++ b/app/controllers/message_controller.rb @@ -104,5 +104,26 @@ class MessageController < ApplicationController @title = t'message.no_such_user.title' render :action => 'no_such_user', :status => :not_found end + + # Delete the message. + def delete + if params[:message_id] + id = params[:message_id] + message = Message.find_by_id(id) + message.from_user_visible = false if message.sender == @user + message.to_user_visible = false if message.recipient == @user + if message.save + flash[:notice] = t 'message.delete.deleted' + + if params[:referer] + redirect_to params[:referer] + else + redirect_to :controller => 'message', :action => 'inbox', :display_name => @user.display_name + end + end + end + rescue ActiveRecord::RecordNotFound + @title = t'message.no_such_user.title' + render :action => 'no_such_user', :status => :not_found + end end - diff --git a/app/models/user.rb b/app/models/user.rb index 90d3835ac..5b6a97f39 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -1,11 +1,11 @@ class User < ActiveRecord::Base require 'xml/libxml' - has_many :traces + has_many :traces, :conditions => { :visible => true } has_many :diary_entries, :order => 'created_at DESC' - has_many :messages, :foreign_key => :to_user_id, :order => 'sent_on DESC' - has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => {:message_read => false}, :order => 'sent_on DESC' - has_many :sent_messages, :class_name => "Message", :foreign_key => :from_user_id, :order => 'sent_on DESC' + has_many :messages, :foreign_key => :to_user_id, :conditions => { :to_user_visible => true }, :order => 'sent_on DESC' + has_many :new_messages, :class_name => "Message", :foreign_key => :to_user_id, :conditions => { :message_read => false }, :order => 'sent_on DESC' + has_many :sent_messages, :class_name => "Message", :foreign_key => :from_user_id, :conditions => { :from_user_visible => true }, :order => 'sent_on DESC' has_many :friends, :include => :befriendee, :conditions => ["users.visible = ?", true] has_many :tokens, :class_name => "UserToken" has_many :preferences, :class_name => "UserPreference" diff --git a/app/models/way.rb b/app/models/way.rb index 8788bd671..e26418732 100644 --- a/app/models/way.rb +++ b/app/models/way.rb @@ -234,7 +234,7 @@ class Way < ActiveRecord::Base def preconditions_ok?(old_nodes = []) return false if self.nds.empty? if self.nds.length > APP_CONFIG['max_number_of_way_nodes'] - raise OSM::APITooManyWayNodesError.new(self.nds.length, APP_CONFIG['max_number_of_way_nodes']) + raise OSM::APITooManyWayNodesError.new(self.id, self.nds.length, APP_CONFIG['max_number_of_way_nodes']) end # check only the new nodes, for efficiency - old nodes having been checked last time and can't diff --git a/app/views/browse/_map.html.erb b/app/views/browse/_map.html.erb index f84a2ec9f..5bb83b6bf 100644 --- a/app/views/browse/_map.html.erb +++ b/app/views/browse/_map.html.erb @@ -1,19 +1,21 @@ <%= javascript_include_tag '/openlayers/OpenLayers.js' %> <%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> <%= javascript_include_tag 'map.js' %> -