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'changeset.changesets.id' %> | -<%= t'changeset.changesets.saved_at' %> | -<% if showusername %> -<%= t'changeset.changesets.user' %> | -<% end %> -<%= t'changeset.changesets.comment' %> | -<%= t'changeset.changesets.area' %> | -
---|
<%= @description %>
<%= render :partial => 'changeset_paging_nav' %> -<%= render :partial => 'changesets', :locals => { :showusername => !params.has_key?(:display_name) } %> + +@@ -140,7 +121,9 @@