merged cont.
[opensuse:yast-rest-service.git] / webservice / app / controllers / sessions_controller.rb
1 #--
2 # Webyast Webservice framework
3 #
4 # Copyright (C) 2009, 2010 Novell, Inc. 
5 #   This library is free software; you can redistribute it and/or modify
6 # it only under the terms of version 2.1 of the GNU Lesser General Public
7 # License as published by the Free Software Foundation. 
8 #
9 #   This library is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
12 # details. 
13 #
14 #   You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software 
16 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 #++
18
19
20 #
21 # SessionsController
22 #
23 #
24 # This controller handles the login/logout function of the site.
25 #
26 # /login -> SessionsController.create
27 # /logout -> SessionsController.destroy
28 #
29 # and implements a 'session' resource
30 #
31 #
32 class SessionsController < ApplicationController
33   layout 'main'
34
35   def index
36     redirect_to "/"
37   end
38
39   def show
40     #FIXME this is cryptic. @ret = { :hash => { :login => 'nobody' } } but do we need so complex hash and why set nobody ENODOC!
41     @ret = Hash.new
42     @ret[:hash] = Hash.new
43     @ret[:hash][:login] = 'nobody'
44     respond_to do |format|
45       format.html { redirect_to "/" }
46       format.json {}
47       format.xml {}
48     end
49   end
50
51   #
52   # Start new session
53   #  render login screen
54   #
55   def new
56     # Set @host to display info at login screen
57     @host = "localhost"
58
59     # render login screen, asking for username/password
60   end
61   
62   def create
63     #FIXME XXX tom: also reset_session here to fix possible session fixation attack etc.
64     if params["hash"].is_a? Hash #FIXME report that "hash" value is not hash
65       #checking if the session description is hosted in a own Hash
66       params["hash"].each do |name,value|
67          params[name] = value
68       end
69     end
70     if request.format.html?
71       if params[:login].blank?
72         flash[:warning] = _("No login specified")
73         redirect_to :action => "new"
74       elsif params[:password].blank?
75         flash[:warning] = _("No password specified")
76         redirect_to :action => "new", :login => params[:login]
77       end
78     end
79
80     if params.has_key?(:login) && params[:password]
81        ip = params[:ip] || request.remote_ip
82        self.current_account = Account.authenticate(params[:login], params[:password], ip)
83     end
84     @cmd_ret = Hash.new
85     if BruteForceProtection.instance.blocked? params[:login]
86       @cmd_ret["login"] = "blocked"
87       @cmd_ret["remain"] = BruteForceProtection.instance.last_failed(params[:login]) + BruteForceProtection::BAN_TIMEOUT
88     elsif logged_in?
89       if params[:remember_me] || request.format.html?
90         current_account.remember_me unless current_account.remember_token?
91         cookies[:auth_token] = { :value => self.current_account.remember_token , :expires => self.current_account.remember_token_expires_at }
92       end
93
94       @cmd_ret["login"] = "granted"
95       @cmd_ret["auth_token"] = { :value => self.current_account.remember_token , :expires => self.current_account.remember_token_expires_at }
96       logger.info "Login success."
97       respond_to do |format|
98         format.html { redirect_back_or_default("/") }
99         format.json {}
100         format.xml {}
101       end
102       
103     else
104       logger.warn "Login failed from ip #{request.remote_ip} with user #{params[:login] ||""}"
105       @cmd_ret["login"] = "denied"
106       BruteForceProtection.instance.fail_attempt params[:login]
107       respond_to do |format|
108         format.html { 
109           flash[:warning] = _("Login incorrect. Check your username and password.")
110           redirect_to :action => "new"
111         }
112         format.json {}
113         format.xml {}
114       end
115     end
116
117   end
118
119   def destroy
120     self.current_account.forget_me if logged_in?
121     cookies.delete :auth_token
122     reset_session # RORSCAN_ITL
123     @cmd_ret = Hash.new
124     @cmd_ret["logout"] = "Goodbye!"
125     respond_to do |format|
126       format.html { 
127         # reset_session clears all flash messages, make a backup before the call
128         flash_backup = flash
129
130         reset_session # RORSCAN_ITL
131
132         # restore the values from backup
133         flash.replace(flash_backup)
134
135         flash[:notice] = _("You have been logged out.") unless flash[:notice]
136         redirect_to :controller => "session", :action => "new"
137       }
138       format.json {}
139       format.xml {}
140     end
141   end
142 end