Rename 'login' field back to 'email'
[gitorious:gitorious-fiit-mainline.git] / app / controllers / sessions_controller.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
4 #   Copyright (C) 2007, 2008 Johan Sørensen <johan@johansorensen.com>
5 #   Copyright (C) 2008 August Lilleaas <augustlilleaas@gmail.com>
6 #   Copyright (C) 2008 Patrick Aljord <patcito@gmail.com>
7 #   Copyright (C) 2008 Tor Arne Vestbø <tavestbo@trolltech.com>
8 #   Copyright (C) 2009 Fabio Akita <fabio.akita@gmail.com>
9 #
10 #   This program is free software: you can redistribute it and/or modify
11 #   it under the terms of the GNU Affero General Public License as published by
12 #   the Free Software Foundation, either version 3 of the License, or
13 #   (at your option) any later version.
14 #
15 #   This program is distributed in the hope that it will be useful,
16 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 #   GNU Affero General Public License for more details.
19 #
20 #   You should have received a copy of the GNU Affero General Public License
21 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
22 #++
23
24 require "openid"
25 require "yadis"
26
27 # This controller handles the login/logout function of the site.
28 class SessionsController < ApplicationController
29   skip_before_filter :public_and_logged_in
30   renders_in_site_specific_context
31   ssl_required :new, :create, :destroy
32   layout "second_generation/application"
33   before_filter :validate_request_host, :only => :create
34
35   # render new.rhtml
36   def new
37   end
38
39   def create
40     if using_open_id? and GitoriousConfig['authenticators'].index('openid') != nil
41       open_id_authentication(params[:openid_url])
42     else
43       authentication(params[:email], params[:password])
44     end
45   end
46
47   def destroy
48     self.current_user.forget_me if logged_in?
49     cookies.delete :auth_token
50     clear_varnish_auth_cookie
51     reset_session
52     flash[:notice] = "You have been logged out."
53     redirect_back_or_default('/')
54   end
55
56   protected
57
58   def validate_request_host
59     if !GitoriousConfig.valid_request_host?(request.host)
60       Rails.logger.warn("WARNING: Invalid request host '#{request.host}'. Session cookies will not work")
61     end
62   end
63
64   # if user does not exist, it gets created and activated,
65   # else if the user already exists with same identity_url, it just logs in
66   def open_id_authentication(openid_url)
67     authenticate_with_open_id(openid_url, :required => [:nickname, :email], :optional => [:fullname]) do |result, identity_url, registration|
68       if result.successful?
69         @user = User.find_or_initialize_by_identity_url(identity_url)
70         if @user.new_record?
71
72           session[:openid_nickname] = registration['nickname']
73           session[:openid_email]    = registration['email']
74           session[:openid_fullname] = registration['fullname']
75           session[:openid_url]      = identity_url
76           flash[:notice] = "You now need to finalize your account"
77           redirect_to :controller => 'users', :action => 'openid_build' and return
78         end
79         self.current_user = @user
80         successful_login
81       else
82         failed_login result.message, 'openid'
83       end
84     end
85   rescue ActiveRecord::RecordInvalid => invalid
86     flash[:error] = %Q{This login (<strong>#{@user.login}</strong>) already exists,
87       please <a href="#{@user.identity_url}"> choose a different persona/nickname
88       or modify the current one</a>}
89     redirect_to login_path(:method => 'openid')
90   end
91
92   def authentication(email, password)
93     if GitoriousConfig['authenticators'].index('password') != nil
94       password_authenticator = PasswordAuthenticator.new
95       self.current_user = password_authenticator.authenticate(email, password)
96     end
97
98     if not logged_in? and GitoriousConfig['authenticators'].index('ldap') != nil
99       ldap_authenticator = LdapAuthenticator.new
100       user = ldap_authenticator.authenticate(email, password)
101       if user == nil
102         self.current_user = nil
103       elsif user.new_record?
104         session[:ldap_login] = email
105         flash[:notice] = "You now need to finalize your account"
106         redirect_to :controller => 'users', :action => 'ldap_build' and return
107       end
108       self.current_user = user
109     end
110
111     if logged_in?
112       successful_login
113     else
114       failed_login("Email and/or password did not match, please try again.")
115     end
116   end
117
118   def failed_login(message = "Authentication failed.",method="")
119     if method==''
120       flash.now[:error] = message
121       render :action => 'new'
122     else
123       redirect_to login_path(:method=>method)
124       flash[:error] = message
125     end
126   end
127
128   def successful_login
129     if params[:remember_me] == "1"
130       self.current_user.remember_me
131       cookies[:auth_token] = {
132         :value => self.current_user.remember_token ,
133         :expires => self.current_user.remember_token_expires_at,
134         :domain => ".#{GitoriousConfig['gitorious_host']}",
135       }
136     end
137     check_state_and_redirect('/')
138   end
139
140   def check_state_and_redirect(redirection_url)
141     if current_user.pending?
142       flash[:notice] = "You need to accept the terms"
143       redirect_to user_license_path(current_user) and return
144     else
145       flash[:notice] = "Logged in successfully"
146       redirect_back_or_default(redirection_url)
147     end
148   end
149
150 end