X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/629ae62b730409b46de6abc8c5166155841b5a00..a1ff77ec56969346ecb5ba978879f5a96f166735:/app/controllers/user_controller.rb diff --git a/app/controllers/user_controller.rb b/app/controllers/user_controller.rb index 0c2514927..d250cf21c 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] @@ -131,6 +131,10 @@ class UserController < ApplicationController session[:new_user_settings] = params redirect_to auth_url(params[:user][:auth_provider], params[:user][:auth_uid]) end + elsif errors = session.delete(:user_errors) + errors.each do |attribute, error| + @user.errors.add(attribute, error) + end end end @@ -182,7 +186,7 @@ class UserController < ApplicationController if @user.save token.destroy flash[:notice] = t "user.reset_password.flash changed" - redirect_to :action => "login" + successful_login(@user) end end else @@ -213,7 +217,7 @@ class UserController < ApplicationController :auth_provider => params[:auth_provider], :auth_uid => params[:auth_uid]) - flash.now[:notice] = t "user.new.auth association" + flash.now[:notice] = render_to_string :partial => "auth_association" else check_signup_allowed end @@ -257,7 +261,7 @@ class UserController < ApplicationController 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]) + redirect_to auth_url("openid", params[:openid_url], params[:referer]) end end @@ -293,6 +297,7 @@ class UserController < ApplicationController user = token.user user.status = "active" user.email_valid = true + flash[:notice] = gravatar_status_message(user) if gravatar_enable(user) user.save! referer = token.referer token.destroy @@ -330,7 +335,7 @@ class UserController < ApplicationController flash[:error] = t "user.confirm_resend.failure", :name => params[:display_name] else Notifier.signup_confirm(user, user.tokens.create).deliver_now - flash[:notice] = t "user.confirm_resend.success", :email => user.email + flash[:notice] = t("user.confirm_resend.success", :email => user.email, :sender => SUPPORT_EMAIL).html_safe end redirect_to :action => "login" @@ -344,8 +349,13 @@ class UserController < ApplicationController @user.email = @user.new_email @user.new_email = nil @user.email_valid = true + gravatar_enabled = gravatar_enable(@user) if @user.save - flash[:notice] = t "user.confirm_email.success" + flash[:notice] = if gravatar_enabled + t("user.confirm_email.success") + " " + gravatar_status_message(@user) + else + t("user.confirm_email.success") + end else flash[:errors] = @user.errors end @@ -403,13 +413,11 @@ class UserController < ApplicationController friend.friend_user_id = @new_friend.id if @user.is_friends_with?(@new_friend) flash[:warning] = t "user.make_friend.already_a_friend", :name => @new_friend.display_name + elsif friend.save + flash[:notice] = t "user.make_friend.success", :name => @new_friend.display_name + Notifier.friend_notification(friend).deliver_now else - if friend.save - flash[:notice] = t "user.make_friend.success", :name => @new_friend.display_name - Notifier.friend_notification(friend).deliver_now - else - friend.add_error(t("user.make_friend.failed", :name => @new_friend.display_name)) - end + friend.add_error(t("user.make_friend.failed", :name => @new_friend.display_name)) end if params[:referer] @@ -497,37 +505,20 @@ 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" + when "google", "facebook" email_verified = true else email_verified = false end - 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) - when "active", "confirmed" then - successful_login(user) - when "suspended" then - failed_login t("user.login.account is suspended", :webmaster => "mailto:webmaster@openstreetmap.org") - else - failed_login t("user.login.auth failure") - end - elsif settings = session.delete(:new_user_settings) + if settings = session.delete(:new_user_settings) @user.auth_provider = provider @user.auth_uid = uid update_user(@user, settings) + session[:user_errors] = @user.errors.as_json + redirect_to :action => "account", :display_name => @user.display_name elsif session[:new_user] session[:new_user].auth_provider = provider @@ -539,8 +530,29 @@ class UserController < ApplicationController redirect_to :action => "terms" else - redirect_to :action => "new", :nickname => name, :email => email, - :auth_provider => provider, :auth_uid => 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) + when "active", "confirmed" then + successful_login(user, env["omniauth.params"]["referer"]) + when "suspended" then + failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}") + else + failed_login t("user.login.auth failure") + end + else + redirect_to :action => "new", :nickname => name, :email => email, + :auth_provider => provider, :auth_uid => uid + end end end @@ -561,20 +573,27 @@ class UserController < ApplicationController elsif user = User.authenticate(:username => username, :password => password, :pending => true) unconfirmed_login(user) elsif User.authenticate(:username => username, :password => password, :suspended => true) - failed_login t("user.login.account is suspended", :webmaster => "mailto:webmaster@openstreetmap.org") + failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}"), username else - failed_login t("user.login.auth failure") + failed_login t("user.login.auth failure"), username end end ## # return the URL to use for authentication - def auth_url(provider, uid) - if provider == "openid" - auth_path(:provider => "openid", :openid_url => openid_expand_url(uid), :origin => request.path) + def auth_url(provider, uid, referer = nil) + params = { :provider => provider } + + params[:openid_url] = openid_expand_url(uid) if provider == "openid" + + if referer.nil? + params[:origin] = request.path else - auth_path(:provider => provider, :origin => request.path) + params[:origin] = request.path + "?referer=" + CGI.escape(referer) + params[:referer] = referer end + + auth_path(params) end ## @@ -596,11 +615,11 @@ class UserController < ApplicationController ## # process a successful login - def successful_login(user) + def successful_login(user, referer = nil) session[:user] = user.id session_expires_after 28.days if session[:remember_me] - target = session[:referer] || url_for(:controller => :site, :action => :index) + target = referer || session[:referer] || url_for(:controller => :site, :action => :index) # The user is logged in, so decide where to send them: # @@ -622,10 +641,11 @@ class UserController < ApplicationController ## # process a failed login - def failed_login(message) + def failed_login(message, username = nil) flash[:error] = message - redirect_to :action => "login", :referer => session[:referer] + redirect_to :action => "login", :referer => session[:referer], + :username => username, :remember_me => session[:remember_me] session.delete(:remember_me) session.delete(:referer) @@ -648,7 +668,7 @@ class UserController < ApplicationController user.display_name = params[:user][:display_name] user.new_email = params[:user][:new_email] - if params[:user][:pass_crypt].length > 0 || params[:user][:pass_crypt_confirmation].length > 0 + unless params[:user][:pass_crypt].empty? && params[:user][:pass_crypt_confirmation].empty? user.pass_crypt = params[:user][:pass_crypt] user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation] end @@ -675,11 +695,11 @@ class UserController < ApplicationController user.home_lat = params[:user][:home_lat] user.home_lon = params[:user][:home_lon] - if params[:user][:preferred_editor] == "default" - user.preferred_editor = nil - else - user.preferred_editor = params[:user][:preferred_editor] - end + user.preferred_editor = if params[:user][:preferred_editor] == "default" + nil + else + params[:user][:preferred_editor] + end if params[:user][:auth_provider].nil? || params[:user][:auth_provider].blank? user.auth_provider = nil @@ -771,11 +791,11 @@ class UserController < ApplicationController ## # check signup acls def check_signup_allowed(email = nil) - if email.nil? - domain = nil - else - domain = email.split("@").last - end + domain = if email.nil? + nil + else + email.split("@").last + end if blocked = Acl.no_account_creation(request.remote_ip, domain) logger.info "Blocked signup from #{request.remote_ip} for #{email}" @@ -785,4 +805,27 @@ class UserController < ApplicationController !blocked end + + ## + # check if this user has a gravatar and set the user pref is true + def gravatar_enable(user) + # code from example https://en.gravatar.com/site/implement/images/ruby/ + return false if user.image.present? + hash = Digest::MD5.hexdigest(user.email.downcase) + url = "https://www.gravatar.com/avatar/#{hash}?d=404" # without d=404 we will always get an image back + response = OSM.http_client.get(URI.parse(url)) + oldsetting = user.image_use_gravatar + user.image_use_gravatar = response.success? + oldsetting != user.image_use_gravatar + end + + ## + # display a message about th current status of the gravatar setting + def gravatar_status_message(user) + if user.image_use_gravatar + return t "user.account.gravatar.enabled" + else + return t "user.account.gravatar.disabled" + end + end end