X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/dbe165bbb3d6eda37d9579f1ac767599f9055607..dca0be1886d9b9fcd2cab1b7c82ac4132fbf722b:/app/controllers/user_controller.rb diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 7c20c5111..37f9cd7c2 100644 --- a/app/controllers/user_controller.rb +++ b/app/controllers/user_controller.rb @@ -45,7 +45,7 @@ class UserController < ApplicationController @user.terms_seen = true if @user.save - flash[:notice] = t "user.new.terms declined", :url => t("user.new.terms declined url") + flash[:notice] = t("user.new.terms declined", :url => t("user.new.terms declined url")).html_safe end if params[:referer] @@ -227,7 +227,7 @@ class UserController < ApplicationController @user.status = "pending" - if @user.auth_provider.present? && @user.auth_uid.present? && @user.pass_crypt.empty? + if @user.auth_provider.present? && @user.pass_crypt.empty? # We are creating an account with external authentication and # no password was specified so create a random one @user.pass_crypt = SecureRandom.base64(16) @@ -237,7 +237,7 @@ class UserController < ApplicationController if @user.invalid? # Something is wrong with a new user, so rerender the form render :action => "new" - elsif @user.auth_provider.present? && @user.auth_uid.present? + elsif @user.auth_provider.present? # Verify external authenticator before moving on session[:new_user] = @user redirect_to auth_url(@user.auth_provider, @user.auth_uid) @@ -250,16 +250,14 @@ class UserController < ApplicationController end def login - if params[:username] || params[:openid_url] - session[:referer] ||= params[:referer] + session[:referer] = params[:referer] if params[:referer] - if params[:openid_url].present? - session[:remember_me] ||= params[:remember_me_openid] - redirect_to auth_url("openid", params[:openid_url]) - else - session[:remember_me] ||= params[:remember_me] - password_authentication(params[:username], params[:password]) - end + if params[:username].present? && params[:password].present? + session[:remember_me] ||= params[:remember_me] + password_authentication(params[:username], params[:password]) + elsif params[:openid_url].present? + session[:remember_me] ||= params[:remember_me_openid] + redirect_to auth_url("openid", params[:openid_url]) end end @@ -320,16 +318,19 @@ class UserController < ApplicationController else user = User.find_by_display_name(params[:display_name]) - redirect_to root_path if !user || user.active? + redirect_to root_path if user.nil? || user.active? end end def confirm_resend - if user = User.find_by_display_name(params[:display_name]) - Notifier.signup_confirm(user, user.tokens.create).deliver_now - flash[:notice] = t "user.confirm_resend.success", :email => user.email + user = User.find_by_display_name(params[:display_name]) + token = UserToken.find_by_token(session[:token]) + + if user.nil? || token.nil? || token.user != user + flash[:error] = t "user.confirm_resend.failure", :name => params[:display_name] else - flash[:notice] = t "user.confirm_resend.failure", :name => params[:display_name] + Notifier.signup_confirm(user, user.tokens.create).deliver_now + flash[:notice] = t("user.confirm_resend.success", :email => user.email).html_safe end redirect_to :action => "login" @@ -351,26 +352,32 @@ class UserController < ApplicationController token.destroy session[:user] = @user.id redirect_to :action => "account", :display_name => @user.display_name - else + elsif token flash[:error] = t "user.confirm_email.failure" - redirect_to :action => "account", :display_name => @user.display_name + redirect_to :action => "account", :display_name => token.user.display_name + else + flash[:error] = t "user.confirm_email.unknown_token" end end end def api_read - render :text => "", :status => :gone unless @this_user.visible? + if @this_user.visible? + render :action => :api_read, :content_type => "text/xml" + else + render :text => "", :status => :gone + end end def api_details @this_user = @user - render :action => :api_read + render :action => :api_read, :content_type => "text/xml" end def api_gpx_files doc = OSM::API.new.get_xml_doc - @user.traces.each do |trace| - doc.root << trace.to_xml_node if trace.public? || trace.user == @user + @user.traces.reload.each do |trace| + doc.root << trace.to_xml_node end render :text => doc.to_s, :content_type => "text/xml" end @@ -460,8 +467,8 @@ class UserController < ApplicationController if request.post? ids = params[:user].keys.collect(&:to_i) - User.update_all("status = 'confirmed'", :id => ids) if params[:confirm] - User.update_all("status = 'deleted'", :id => ids) if params[:hide] + User.where(:id => ids).update_all(:status => "confirmed") if params[:confirm] + User.where(:id => ids).update_all(:status => "deleted") if params[:hide] redirect_to url_for(:status => params[:status], :ip => params[:ip], :page => params[:page]) else @@ -490,11 +497,21 @@ class UserController < ApplicationController when "openid" email_verified = uid.match(%r{https://www.google.com/accounts/o8/id?(.*)}) || uid.match(%r{https://me.yahoo.com/(.*)}) + when "google" + email_verified = true else email_verified = false end - if user = User.find_by_auth_provider_and_auth_uid(provider, uid) + user = User.find_by_auth_provider_and_auth_uid(provider, uid) + + if user.nil? && provider == "google" + openid_url = auth_info[:extra][:id_info]["openid_id"] + user = User.find_by_auth_provider_and_auth_uid("openid", openid_url) if openid_url + user.update(:auth_provider => provider, :auth_uid => uid) if user + end + + if user case user.status when "pending" then unconfirmed_login(user) @@ -531,7 +548,7 @@ class UserController < ApplicationController # omniauth failure callback def auth_failure flash[:error] = t("user.auth_failure." + params[:message]) - redirect_to params[:origin] + redirect_to params[:origin] || login_url end private @@ -566,7 +583,7 @@ class UserController < ApplicationController def openid_expand_url(openid_url) if openid_url.nil? return nil - elsif openid_url.match(/(.*)gmail.com(\/?)$/) || openid_url.match(/(.*)googlemail.com(\/?)$/) + elsif openid_url.match(%r{(.*)gmail.com(/?)$}) || openid_url.match(%r{(.*)googlemail.com(/?)$}) # Special case gmail.com as it is potentially a popular OpenID # provider and, unlike yahoo.com, where it works automatically, Google # have hidden their OpenID endpoint somewhere obscure this making it @@ -608,7 +625,7 @@ class UserController < ApplicationController def failed_login(message) flash[:error] = message - redirect_to :action => "login", :referer => session[:referer] + redirect_to :action => "login", :referer => session[:referer] session.delete(:remember_me) session.delete(:referer) @@ -617,6 +634,8 @@ class UserController < ApplicationController ## # def unconfirmed_login(user) + session[:token] = user.tokens.create.token + redirect_to :action => "confirm", :display_name => user.display_name session.delete(:remember_me) @@ -662,8 +681,7 @@ class UserController < ApplicationController user.preferred_editor = params[:user][:preferred_editor] end - if params[:user][:auth_provider].nil? || params[:user][:auth_provider].blank? || - params[:user][:auth_uid].nil? || params[:user][:auth_uid].blank? + if params[:user][:auth_provider].nil? || params[:user][:auth_provider].blank? user.auth_provider = nil user.auth_uid = nil end