diff --git a/.gitignore b/.gitignore index 74094e8b3..18e616bf6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ log tmp +.DS_Store diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bc71f275f..6c19b3a52 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -15,6 +15,16 @@ class ApplicationController < ActionController::Base session_expires_automatically redirect_to :controller => "user", :action => "suspended" + + # don't allow access to any auth-requiring part of the site unless + # the new CTs have been seen (and accept/decline chosen). + elsif !@user.terms_seen and flash[:skip_terms].nil? + flash[:notice] = t 'user.terms.you need to accept or decline' + if params[:referer] + redirect_to :controller => "user", :action => "terms", :referer => params[:referer] + else + redirect_to :controller => "user", :action => "terms", :referer => request.request_uri + end end elsif session[:token] @user = User.authenticate(:token => session[:token]) @@ -99,10 +109,21 @@ class ApplicationController < ActionController::Base end end - # check if the user has been banned - unless @user.nil? or @user.active_blocks.empty? - # NOTE: need slightly more helpful message than this. - render :text => t('application.setup_user_auth.blocked'), :status => :forbidden + # have we identified the user? + if @user + # check if the user has been banned + if not @user.active_blocks.empty? + # NOTE: need slightly more helpful message than this. + report_error t('application.setup_user_auth.blocked'), :forbidden + end + + # if the user hasn't seen the contributor terms then don't + # allow editing - they have to go to the web site and see + # (but can decline) the CTs to continue. + if REQUIRE_TERMS_SEEN and not @user.terms_seen and flash[:skip_terms].nil? + set_locale + report_error t('application.setup_user_auth.need_to_see_terms'), :forbidden + end end end @@ -189,6 +210,24 @@ class ApplicationController < ActionController::Base end end + if request.compatible_language_from(I18n.available_locales).nil? + request.user_preferred_languages = request.user_preferred_languages.collect do |pl| + pls = [ pl ] + + while pl.match(/^(.*)-[^-]+$/) + pls.push($1) if I18n.available_locales.include?($1.to_sym) + pl = $1 + end + + pls + end.flatten + + if @user and not request.compatible_language_from(I18n.available_locales).nil? + @user.languages = request.user_preferred_languages + @user.save + end + end + I18n.locale = request.compatible_language_from(I18n.available_locales) response.headers['Content-Language'] = I18n.locale.to_s diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb index 29b9c787b..0aeaf200d 100644 --- a/app/controllers/changeset_controller.rb +++ b/app/controllers/changeset_controller.rb @@ -312,6 +312,8 @@ class ChangesetController < ApplicationController @page = (params[:page] || 1).to_i @page_size = 20 + @bbox = bbox + @edits = Changeset.find(:all, :include => [:user, :changeset_tags], :conditions => conditions, @@ -436,7 +438,7 @@ private # query changesets which are closed # ('closed at' time has passed or changes limit is hit) def conditions_closed(closed) - return closed.nil? ? nil : ['closed_at < ? or num_changes > ?', + return closed.nil? ? nil : ['(closed_at < ? or num_changes > ?)', Time.now.getutc, Changeset::MAX_ELEMENTS] end diff --git a/app/controllers/oauth_controller.rb b/app/controllers/oauth_controller.rb index f70a644cd..5c84be0cf 100644 --- a/app/controllers/oauth_controller.rb +++ b/app/controllers/oauth_controller.rb @@ -1,5 +1,5 @@ class OauthController < ApplicationController - layout 'site' + layout 'slim' before_filter :authorize_web, :only => [:oauthorize, :revoke] before_filter :set_locale, :only => [:oauthorize, :revoke] diff --git a/app/controllers/site_controller.rb b/app/controllers/site_controller.rb index 73f38f78c..65029e4ef 100644 --- a/app/controllers/site_controller.rb +++ b/app/controllers/site_controller.rb @@ -64,7 +64,7 @@ class SiteController < ApplicationController #Currently this results in potlatch starting up at 0,0 (Atlantic ocean). end - @zoom = '14' if @zoom.nil? + @zoom = '17' if @zoom.nil? end end end diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 1193ec910..a066c1c63 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -1,6 +1,7 @@ class UserController < ApplicationController - layout 'site', :except => :api_details + layout :choose_layout + before_filter :disable_terms_redirect, :only => [:terms, :save, :logout, :api_details] before_filter :authorize, :only => [:api_details, :api_gpx_files] before_filter :authorize_web, :except => [:api_details, :api_gpx_files] before_filter :set_locale, :except => [:api_details, :api_gpx_files] @@ -24,7 +25,7 @@ class UserController < ApplicationController if request.xhr? render :update do |page| - page.replace_html "contributorTerms", :partial => "terms", :locals => { :has_decline => params[:has_decline] } + page.replace_html "contributorTerms", :partial => "terms" end elsif using_open_id? # The redirect from the OpenID provider reenters here @@ -84,17 +85,36 @@ class UserController < ApplicationController if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"}) render :action => 'new' elsif params[:decline] - redirect_to t('user.terms.declined') + if @user + @user.terms_seen = true + + if @user.save + flash[:notice] = t 'user.new.terms declined', :url => t('user.new.terms declined url') + end + + if params[:referer] + redirect_to params[:referer] + else + redirect_to :action => :account, :display_name => @user.display_name + end + else + redirect_to t('user.terms.declined') + end elsif @user if !@user.terms_agreed? @user.consider_pd = params[:user][:consider_pd] @user.terms_agreed = Time.now.getutc + @user.terms_seen = true if @user.save flash[:notice] = t 'user.new.terms accepted' end end - redirect_to :action => :account, :display_name => @user.display_name + if params[:referer] + redirect_to params[:referer] + else + redirect_to :action => :account, :display_name => @user.display_name + end else @user = User.new(params[:user]) @@ -104,14 +124,15 @@ class UserController < ApplicationController @user.creation_ip = request.remote_ip @user.languages = request.user_preferred_languages @user.terms_agreed = Time.now.getutc - + @user.terms_seen = true + if @user.save flash[:notice] = t 'user.new.flash create success message', :email => @user.email Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => session.delete(:referer))) session[:token] = @user.tokens.create.token - redirect_to :action => 'login' + redirect_to :action => 'login', :referer => params[:referer] else - render :action => 'new' + render :action => 'new', :referer => params[:referer] end end end @@ -581,15 +602,22 @@ private # process a successful login def successful_login(user) session[:user] = user.id - session_expires_after 1.month if session[:remember_me] - if user.blocked_on_view - redirect_to user.blocked_on_view, :referer => params[:referer] - elsif session[:referer] - redirect_to session[:referer] + target = params[:referer] || url_for(:controller => :site, :action => :index) + + # The user is logged in, so decide where to send them: + # + # - If they haven't seen the contributor terms, send them there. + # - If they have a block on them, show them that. + # - If they were referred to the login, send them back there. + # - Otherwise, send them to the home page. + if REQUIRE_TERMS_SEEN and not user.terms_seen + redirect_to :controller => :user, :action => :terms, :referer => target + elsif user.blocked_on_view + redirect_to user.blocked_on_view, :referer => target else - redirect_to :controller => 'site', :action => 'index' + redirect_to target end session.delete(:remember_me) @@ -651,4 +679,28 @@ private rescue ActiveRecord::RecordNotFound redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name] unless @this_user end + + ## + # Choose the layout to use. See + # https://rails.lighthouseapp.com/projects/8994/tickets/5371-layout-with-onlyexcept-options-makes-other-actions-render-without-layouts + def choose_layout + oauth_url = url_for(:controller => :oauth, :action => :oauthorize, :only_path => true) + + if [ 'api_details' ].include? action_name + nil + elsif params[:referer] and URI.parse(params[:referer]).path == oauth_url + 'slim' + else + 'site' + end + end + + ## + # + def disable_terms_redirect + # this is necessary otherwise going to the user terms page, when + # having not agreed already would cause an infinite redirect loop. + # it's .now so that this doesn't propagate to other pages. + flash.now[:skip_terms] = true + end end diff --git a/app/models/client_application.rb b/app/models/client_application.rb index 09eec40d3..ffca1c63c 100644 --- a/app/models/client_application.rb +++ b/app/models/client_application.rb @@ -9,7 +9,7 @@ class ClientApplication < ActiveRecord::Base validates_format_of :url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i validates_format_of :support_url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :allow_blank=>true - validates_format_of :callback_url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :allow_blank=>true + validates_format_of :callback_url, :with => /\A[a-z][a-z0-9.+-]*:\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :allow_blank=>true attr_accessor :token_callback_url diff --git a/app/models/node.rb b/app/models/node.rb index 7db4aed09..3a1d580e0 100644 --- a/app/models/node.rb +++ b/app/models/node.rb @@ -142,6 +142,7 @@ class Node < ActiveRecord::Base raise OSM::APIPreconditionFailedError.new("Node #{self.id} is still used by relation #{rel.relation.id}.") unless rel.nil? self.changeset_id = new_node.changeset_id + self.tags = {} self.visible = false # update the changeset with the deleted position diff --git a/app/views/browse/_common_details.html.erb b/app/views/browse/_common_details.html.erb index b6960b9c4..07b44a94a 100644 --- a/app/views/browse/_common_details.html.erb +++ b/app/views/browse/_common_details.html.erb @@ -1,11 +1,19 @@ - <%= t 'browse.common_details.edited_at' %> + <% if common_details.visible? %> + <%= t 'browse.common_details.edited_at' %> + <% else %> + <%= t 'browse.common_details.deleted_at' %> + <% end %> <%= l common_details.timestamp %> <% if common_details.changeset.user.data_public? %> - <%= t 'browse.common_details.edited_by' %> + <% if common_details.visible? %> + <%= t 'browse.common_details.edited_by' %> + <% else %> + <%= t 'browse.common_details.deleted_by' %> + <% end %> <%= link_to h(common_details.changeset.user.display_name), :controller => "user", :action => "view", :display_name => common_details.changeset.user.display_name %> <% end %> diff --git a/app/views/browse/_map.html.erb b/app/views/browse/_map.html.erb index f41deff95..13a352820 100644 --- a/app/views/browse/_map.html.erb +++ b/app/views/browse/_map.html.erb @@ -2,7 +2,7 @@ <%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> <%= javascript_include_tag 'map.js' %>
- <% if map.instance_of? Changeset or map.visible %> + <% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible %>
<%= t 'browse.map.loading' %> @@ -15,7 +15,7 @@ <%= t 'browse.map.deleted' %> <% end %>
-<% if map.instance_of? Changeset or map.visible %> +<% if map.instance_of? Changeset or (map.instance_of? Node and map.version > 1) or map.visible %> diff --git a/app/views/changeset/_changesets.html.erb b/app/views/changeset/_changesets.html.erb index e177f666e..2bd40dafc 100644 --- a/app/views/changeset/_changesets.html.erb +++ b/app/views/changeset/_changesets.html.erb @@ -1,13 +1,4 @@ <% showusername = true if showusername.nil? %> - - - - -<% if showusername %> - -<% end %> - - - +
<%= t'changeset.changesets.id' %><%= t'changeset.changesets.saved_at' %><%= t'changeset.changesets.user' %><%= t'changeset.changesets.comment' %><%= t'changeset.changesets.area' %>
<%= render :partial => 'changeset', :locals => {:showusername => showusername}, :collection => @edits unless @edits.nil? %>
diff --git a/app/views/changeset/_map.html.erb b/app/views/changeset/_map.html.erb new file mode 100644 index 000000000..5f5f4aa5d --- /dev/null +++ b/app/views/changeset/_map.html.erb @@ -0,0 +1,87 @@ +<%= javascript_include_tag '/openlayers/OpenLayers.js' %> +<%= javascript_include_tag '/openlayers/OpenStreetMap.js' %> +<%= javascript_include_tag 'map.js' %> + +
+
+ + diff --git a/app/views/changeset/list.html.erb b/app/views/changeset/list.html.erb index 0333be5cc..22a798ffe 100644 --- a/app/views/changeset/list.html.erb +++ b/app/views/changeset/list.html.erb @@ -2,7 +2,12 @@

<%= @description %>

<%= render :partial => 'changeset_paging_nav' %> -<%= render :partial => 'changesets', :locals => { :showusername => !params.has_key?(:display_name) } %> + +
+ <%= render :partial => 'map' %> + <%= render :partial => 'changesets', :locals => { :showusername => !params.has_key?(:display_name) } %> +
+ <%= render :partial => 'changeset_paging_nav' %> <%= atom_link_to params.merge({ :page => nil, :format => :atom }) %> diff --git a/app/views/diary_entry/_location.html.erb b/app/views/diary_entry/_location.html.erb index dfac3a198..4779471de 100644 --- a/app/views/diary_entry/_location.html.erb +++ b/app/views/diary_entry/_location.html.erb @@ -1,11 +1,9 @@ <%= t 'diary_entry.location.location' %> + <% cache(:controller => 'diary_entry', :action => 'view', :display_name => location.user.display_name, :id => location.id, :part => "location") do %> <%= describe_location location.latitude, location.longitude, 14, location.language_code %> <% end %> - -(<%=link_to t('diary_entry.location.view'), :controller => 'site', :action => 'index', :lat => location.latitude, :lon => location.longitude, :zoom => 14 %> -/ -<%=link_to t('diary_entry.location.edit'), :controller => 'site', :action => 'edit', :lat => location.latitude, :lon => location.longitude, :zoom => 14 %>) + diff --git a/app/views/diary_entry/view.html.erb b/app/views/diary_entry/view.html.erb index c3e49a227..1a8096d13 100644 --- a/app/views/diary_entry/view.html.erb +++ b/app/views/diary_entry/view.html.erb @@ -1,6 +1,6 @@ <%= user_image @entry.user, :style => "float: right" %> -

<%= t 'diary_entry.view.user_title', :user => h(@entry.user.display_name) %>

+

<%= link_to t('diary_entry.view.user_title', :user => h(@entry.user.display_name)), :action => :list %>

<%= render :partial => 'diary_entry', :object => @entry %> diff --git a/app/views/layouts/_flash.html.erb b/app/views/layouts/_flash.html.erb new file mode 100644 index 000000000..da559d55c --- /dev/null +++ b/app/views/layouts/_flash.html.erb @@ -0,0 +1,11 @@ +<% if flash[:error] %> +
<%= flash[:error] %>
+<% end %> + +<% if flash[:warning] %> +
<%= flash[:warning] %>
+<% end %> + +<% if flash[:notice] %> +
<%= flash[:notice] %>
+<% end %> diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb new file mode 100644 index 000000000..6c22a9475 --- /dev/null +++ b/app/views/layouts/_head.html.erb @@ -0,0 +1,18 @@ + + + <%= javascript_strings %> + <%= javascript_include_tag 'prototype' %> + <%= javascript_include_tag 'site' %> + <%= javascript_include_tag 'menu' %> + + <%= stylesheet_link_tag 'common' %> + + <%= stylesheet_link_tag 'small', :media => "only screen and (max-width:641px)" %> + <%= stylesheet_link_tag 'large', :media => "screen and (min-width: 642px)" %> + <%= stylesheet_link_tag 'print', :media => "print" %> + <%= tag("link", { :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => "/opensearch/osm.xml" }) %> + <%= tag("meta", { :name => "description", :content => "OpenStreetMap is the free wiki world map." }) %> + <%= style_rules %> + <%= yield :head %> + <%= t 'layouts.project_name.title' %><%= ' | '+ h(@title) if @title %> + diff --git a/app/views/layouts/site.html.erb b/app/views/layouts/site.html.erb index 4497e7e81..7346802a9 100644 --- a/app/views/layouts/site.html.erb +++ b/app/views/layouts/site.html.erb @@ -1,34 +1,13 @@ - - - <%= javascript_strings %> - <%= javascript_include_tag 'prototype' %> - <%= javascript_include_tag 'site' %> - <%= javascript_include_tag 'menu' %> - - <%= stylesheet_link_tag 'common' %> - - <%= stylesheet_link_tag 'small', :media => "only screen and (max-width: 481px)" %> - <%= stylesheet_link_tag 'large', :media => "screen and (min-width: 482px)" %> - <%= stylesheet_link_tag 'print', :media => "print" %> - <%= tag("link", { :rel => "search", :type => "application/opensearchdescription+xml", :title => "OpenStreetMap Search", :href => "/opensearch/osm.xml" }) %> - <%= tag("meta", { :name => "description", :content => "OpenStreetMap is the free wiki world map." }) %> - <%= style_rules %> - <%= yield :head %> - <%= t 'layouts.project_name.title' %><%= ' | '+ h(@title) if @title %> - + <%= render :partial => "layouts/head" %> +
+ <%= link_to(image_tag("osm_logo.png", :size => "16x16", :border => 0, :alt => t('layouts.logo.alt_text')), :controller => 'site', :action => 'index') %> +

<%= t 'layouts.project_name.h1' %>

+
- <% if flash[:error] %> -
<%= flash[:error] %>
- <% end %> - <% if flash[:warning] %> -
<%= flash[:warning] %>
- <% end %> - <% if flash[:notice] %> -
<%= flash[:notice] %>
- <% end %> + <%= render :partial => "layouts/flash", :locals => { :flash => flash } %> <%= yield %>
@@ -62,14 +41,14 @@ diaryclass = 'active' if params['controller'] == 'diary_entry' %>
  • <%= link_to t('layouts.view'), {:controller => 'site', :action => 'index'}, {:id => 'viewanchor', :title => t('layouts.view_tooltip'), :class => viewclass} %>
  • -
  • <%= link_to t('layouts.edit'), {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => t('javascripts.site.edit_tooltip'), :class => editclass} %>
  • +
  • <%= link_to t('layouts.edit') + ' ▾', {:controller => 'site', :action => 'edit'}, {:id => 'editanchor', :title => t('javascripts.site.edit_tooltip'), :class => editclass} %>
  • <%= link_to t('layouts.history'), {:controller => 'changeset', :action => 'list' }, {:id => 'historyanchor', :title => t('javascripts.site.history_tooltip'), :class => historyclass} %>
  • <% if params['controller'] == 'site' and (params['action'] == 'index' or params['action'] == 'export') %>
  • <%= link_to_remote t('layouts.export'), {:url => {:controller => 'export', :action => 'start'}}, {:id => 'exportanchor', :title => t('layouts.export_tooltip'), :class => exportclass, :href => url_for(:controller => 'site', :action => 'export')} %>
  • <% else %>
  • <%= link_to t('layouts.export'), {:controller => 'site', :action => 'export'}, {:id => 'exportanchor', :title => t('layouts.export_tooltip'), :class => exportclass} %>
  • <% end %> -
  • <%= link_to t('layouts.gps_traces'), {:controller => 'trace', :action => 'list', :display_name => nil}, {:id => 'traceanchor', :title => t('layouts.gps_traces_tooltip'), :class => traceclass} %>
  • +
  • <%= link_to t('layouts.gps_traces'), {:controller => 'trace', :action => 'list', :display_name => nil, :tag => nil, :page => nil}, {:id => 'traceanchor', :title => t('layouts.gps_traces_tooltip'), :class => traceclass} %>
  • <%= link_to t('layouts.user_diaries'), {:controller => 'diary_entry', :action => 'list', :display_name => nil}, {:id => 'diaryanchor', :title => t('layouts.user_diaries_tooltip'), :class => diaryclass} %>
  • @@ -96,6 +75,8 @@ + <%= yield :optionals %> + <% unless @user %>

    @@ -140,7 +121,9 @@

    - <%= yield :optionals %> +
    + <%= link_to image_tag("sotm.png", :alt => t('layouts.sotm2011'), :title => t('layouts.sotm2011'), :border => "0"), "http://stateofthemap.org/register-now/" %> +