diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index fe44740a4..2e280dac9 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -46,24 +46,10 @@ class AccountController < ApplicationController self.logged_user = nil else # Authenticate user - user = User.try_to_login(params[:username], params[:password]) - if user.nil? - # Invalid credentials - flash.now[:error] = l(:notice_account_invalid_creditentials) - elsif user.new_record? - # Onthefly creation failed, display the registration form to fill/fix attributes - @user = user - session[:auth_source_registration] = {:login => user.login, :auth_source_id => user.auth_source_id } - render :action => 'register' + unless using_open_id? + password_authentication else - # Valid user - self.logged_user = user - # generate a key and set cookie if autologin - if params[:autologin] && Setting.autologin? - token = Token.create(:user => user, :action => 'autologin') - cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now } - end - redirect_back_or_default :controller => 'my', :action => 'page' + open_id_authenticate(params[:openid_url]) end end end @@ -191,4 +177,59 @@ private session[:user_id] = nil end end + + def password_authentication + user = User.try_to_login(params[:username], params[:password]) + if user.nil? + # Invalid credentials + flash.now[:error] = l(:notice_account_invalid_creditentials) + elsif user.new_record? + # Onthefly creation failed, display the registration form to fill/fix attributes + @user = user + session[:auth_source_registration] = {:login => user.login, :auth_source_id => user.auth_source_id } + render :action => 'register' + else + # Valid user + successful_authentication(user) + end + end + + + def open_id_authenticate(openid_url) + user = nil + authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => signin_url) do |result, identity_url, registration| + if result.successful? + user = User.find_or_initialize_by_identity_url(identity_url) + if user.new_record? + # Create on the fly + # TODO: name + user.login = registration['nickname'] + user.mail = registration['email'] + user.save + end + + user.reload + if user.new_record? + # Onthefly creation failed, display the registration form to fill/fix attributes + @user = user + session[:auth_source_registration] = {:login => user.login, :identity_url => identity_url } + render :action => 'register' + else + successful_authentication(user) + end + end + end + end + + def successful_authentication(user) + # Valid user + self.logged_user = user + # generate a key and set cookie if autologin + if params[:autologin] && Setting.autologin? + token = Token.create(:user => user, :action => 'autologin') + cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now } + end + redirect_back_or_default :controller => 'my', :action => 'page' + end + end diff --git a/app/views/account/login.rhtml b/app/views/account/login.rhtml index d8c1f313f..d7a27821e 100644 --- a/app/views/account/login.rhtml +++ b/app/views/account/login.rhtml @@ -10,6 +10,10 @@
<%= select("user", "language", lang_options_for_select) %>
++<%= text_field 'user', 'identity_url' %>
+ <% @user.custom_field_values.select {|v| v.editable? || v.required?}.each do |value| %><%= custom_field_tag_with_label :user, value %>
<% end %> diff --git a/app/views/my/account.rhtml b/app/views/my/account.rhtml index ef5b222e4..2fa91afb4 100644 --- a/app/views/my/account.rhtml +++ b/app/views/my/account.rhtml @@ -15,6 +15,7 @@<%= f.text_field :lastname, :required => true %>
<%= f.text_field :mail, :required => true %>
<%= f.select :language, lang_options_for_select %>
+<%= f.text_field :identity_url %>
<% @user.custom_field_values.select(&:editable?).each do |value| %><%= custom_field_tag_with_label :user, value %>
diff --git a/app/views/users/_form.rhtml b/app/views/users/_form.rhtml index 799ebde47..1579ea53b 100644 --- a/app/views/users/_form.rhtml +++ b/app/views/users/_form.rhtml @@ -7,6 +7,7 @@<%= f.text_field :lastname, :required => true %>
<%= f.text_field :mail, :required => true %>
<%= f.select :language, lang_options_for_select %>
+<%= f.text_field :identity_url %>
<% @user.custom_field_values.each do |value| %><%= custom_field_tag_with_label :user, value %>
diff --git a/config/routes.rb b/config/routes.rb index 475d447be..d20bc3c9f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -255,4 +255,6 @@ ActionController::Routing::Routes.draw do |map| # Install the default route as the lowest priority. map.connect ':controller/:action/:id' map.connect 'robots.txt', :controller => 'welcome', :action => 'robots' + # Used for OpenID + map.root :controller => 'account', :action => 'login' end diff --git a/lang/en.yml b/lang/en.yml index 246bfb13e..a75a52990 100644 --- a/lang/en.yml +++ b/lang/en.yml @@ -147,6 +147,7 @@ field_mail_notification: Email notifications field_admin: Administrator field_last_login_on: Last connection field_language: Language +field_identity_url: OpenID URL field_effective_date: Date field_password: Password field_new_password: New password @@ -332,6 +333,7 @@ label_information: Information label_information_plural: Information label_please_login: Please log in label_register: Register +label_login_with_open_id_option: or login with OpenID label_password_lost: Lost password label_home: Home label_my_page: My page diff --git a/public/images/openid-bg.gif b/public/images/openid-bg.gif new file mode 100644 index 000000000..e2d8377db Binary files /dev/null and b/public/images/openid-bg.gif differ diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 02c4a8b1b..653ae152f 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -69,6 +69,8 @@ html>body #content { min-height: 600px; } #login-form table td {padding: 6px;} #login-form label {font-weight: bold;} +input#openid_url { background: url(../images/openid-bg.gif) no-repeat; background-color: #fff; background-position: 0 50%; padding-left: 18px; } + .clear:after{ content: "."; display: block; height: 0; clear: both; visibility: hidden; } /***** Links *****/