@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)
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)
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
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)
# 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
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
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