Merge branch 'master' of gitorious.org:+fiit/gitorious/gitorious-fiit-mainline
[gitorious:gitorious-fiit-mainline.git] / app / controllers / users_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 David A. Cuadrado <krawek@gmail.com>
6 #   Copyright (C) 2008 Tor Arne Vestbø <tavestbo@trolltech.com>
7 #   Copyright (C) 2009 Fabio Akita <fabio.akita@gmail.com>
8 #
9 #   This program is free software: you can redistribute it and/or modify
10 #   it under the terms of the GNU Affero General Public License as published by
11 #   the Free Software Foundation, either version 3 of the License, or
12 #   (at your option) any later version.
13 #
14 #   This program is distributed in the hope that it will be useful,
15 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
16 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 #   GNU Affero General Public License for more details.
18 #
19 #   You should have received a copy of the GNU Affero General Public License
20 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 #++
22
23 class UsersController < ApplicationController
24   skip_before_filter :public_and_logged_in,
25     :only => [:pending_activation, :activate, :forgot_password,
26               :forgot_password_create, :reset_password]
27   before_filter :require_not_logged_in, :only => [:pending_activation]
28   before_filter :login_required,
29     :only => [:edit, :update, :password, :update_password, :avatar]
30   before_filter :find_user,
31     :only => [:show, :edit, :update, :password, :update_password, :avatar]
32   before_filter :require_current_user,
33     :only => [:edit, :update, :password, :update_password, :avatar, ]
34   before_filter :require_identity_url_in_session, :only => [:openid_build, :openid_create]
35   before_filter :require_public_user, :only => :show
36
37   renders_in_global_context
38   layout :decide_layout
39   # render new.rhtml
40   def new
41   end
42
43   def show
44     @projects = @user.projects.find(:all,
45       :include => [:tags, { :repositories => :project }])
46     @repositories = @user.commit_repositories
47     @events = @user.events.excluding_commits.paginate(
48       :page => params[:page], :order => "events.created_at desc",
49       :include => [:user, :project])
50     @messages = @user.messages_in_inbox(3) if @user == current_user
51     @favorites = @user.favorites.all(:include => :watchable)
52
53     @atom_auto_discovery_url = feed_user_path(@user, :format => :atom)
54     @atom_auto_discovery_title = "Public activity feed"
55
56     respond_to do |format|
57       format.html { }
58       format.atom { redirect_to feed_user_path(@user, :format => :atom) }
59     end
60   end
61
62   def feed
63     @user = User.find_by_login!(params[:id])
64     @events = @user.events.find(:all, :order => "events.created_at desc",
65       :include => [:user, :project], :limit => 30)
66     respond_to do |format|
67       format.html { redirect_to user_path(@user) }
68       format.atom { }
69     end
70   end
71
72   def watchlist
73     @user = User.find_by_login!(params[:id])
74     @events = @user.paginated_events_in_watchlist({:page => 1})
75     respond_to do |wants|
76       wants.atom { render :template => "users/feed" }
77     end
78   end
79
80   def create
81     @user = User.new(params[:user])
82     @user.login = params[:user][:login]
83     if GitoriousConfig['is_new_user_suspended']
84       @user.suspended_at = Time.now
85       admins = ""
86       User.find_all_by_is_admin(1).each do |admin|
87         admins += ",#{admin.login}"
88       end
89       @messages = MessageThread.new(:body => I18n.t("mailer.new_user", :user => @user.login), :sender => @user, :subject =>  I18n.t("mailer.new_user_subject"), :recipients => admins)
90       @messages.save
91     end
92     @user.save!
93     if !@user.terms_of_use.blank?
94       @user.accept_terms!
95     end
96     redirect_to :action => "pending_activation"
97   rescue ActiveRecord::RecordInvalid
98     render :action => 'new'
99   end
100
101   # render pending_activation.html.erb
102   def pending_activation
103   end
104
105   def activate
106     if user = User.find_by_activation_code(params[:activation_code])
107       if GitoriousConfig['is_new_user_suspended']
108         if user != nil && !user.activated?
109           user.activate
110           flash[:notice] = I18n.t "users_controller.activate_suspend_notice"
111         end
112       else
113         self.current_user = user
114         if logged_in? && !current_user.activated?
115           current_user.activate
116           flash[:notice] = I18n.t "users_controller.activate_notice"
117         end
118       end
119     else
120       flash[:error] = I18n.t "users_controller.activate_error"
121     end
122     redirect_back_or_default('/')
123   end
124
125   def forgot_password
126   end
127
128   def forgot_password_create
129     if params[:user] && user = User.find_by_email(params[:user][:email])
130       if user.activated?
131         password_key = user.forgot_password!
132         Mailer.deliver_forgotten_password(user, password_key)
133         flash[:success] = "A password confirmation link has been sent to your email address"
134         redirect_to(root_path)
135       else
136         flash[:error] = I18n.t 'users_controller.reset_password_inactive_account'
137         redirect_to forgot_password_users_path
138       end
139     else
140       flash[:error] = I18n.t "users_controller.reset_password_error"
141       redirect_to forgot_password_users_path
142     end
143   end
144
145   def reset_password
146     @user = User.find_by_password_key(params[:token])
147     unless @user
148       flash[:error] = I18n.t "users_controller.reset_password_error"
149       redirect_to forgot_password_users_path
150       return
151     end
152
153     if request.put?
154       @user.password = params[:user][:password]
155       @user.password_confirmation = params[:user][:password_confirmation]
156       if @user.save
157         flash[:success] = "Password updated"
158         redirect_to(new_sessions_path)
159       end
160     end
161   end
162
163   def edit
164     @user = current_user
165   end
166
167   def update
168     @user = current_user
169     @user.attributes = params[:user]
170     if current_user.save
171       flash[:success] = "Your account details were updated"
172       redirect_to user_path
173     else
174       render :action => "edit"
175     end
176   end
177
178   def password
179     @user = current_user
180   end
181
182   def update_password
183     @user = current_user
184     password_authenticator = PasswordAuthenticator.new
185     if password_authenticator.authenticate(current_user.email, params[:user][:current_password]) || @user.is_openid_only?
186       @user.password = params[:user][:password]
187       @user.password_confirmation = params[:user][:password_confirmation]
188       if @user.save
189         flash[:success] = "Your password has been changed"
190         redirect_to user_path(@user)
191       else
192         render :action => "password"
193       end
194     else
195       flash[:error] = "Your current password does not seem to match the one your supplied"
196       render :action => "password"
197     end
198   end
199
200   def openid_build
201     @user = User.new(:identity_url => session[:openid_url], :email => session[:openid_email], :login => session[:openid_nickname], :fullname => session[:openid_fullname])
202   end
203
204   def openid_create
205     @user = User.new(params[:user])
206     @user.login = params[:user][:login]
207     @user.identity_url = session[:openid_url]
208     if @user.save
209       if !@user.terms_of_use.blank?
210         @user.accept_terms!
211       end
212       @user.activate
213       [:openid_url, :openid_email, :openid_nickname, :openid_fullname].each do |k|
214         session.delete(k)
215       end
216       self.current_user = @user
217       flash[:success] = "Your user profile was successfully created"
218       redirect_to root_path
219     else
220       render :action => 'openid_build'
221     end
222   end
223
224   def ldap_build
225     @login = session[:ldap_login]
226     @user = User.new(:ldap_login => session[:ldap_login], :login => session[:ldap_login])
227   end
228
229   def ldap_create
230     @user = User.new(params[:user])
231     @user.login = params[:user][:ldap_login]
232     @user.ldap_login = params[:user][:ldap_login]
233     if @user.save
234       if !@user.terms_of_use.blank?
235         @user.accept_terms!
236       end
237       @user.activate
238       session.delete(:ldap_login)
239       self.current_user = @user
240       redirect_back_or_default '/'
241     else
242       render :action => 'ldap_build'
243     end
244   end
245
246   # DELETE avatar
247   def avatar
248     @user.avatar.destroy
249     @user.save
250     flash[:success] = "You profile image was deleted"
251     redirect_to user_path
252   end
253
254   protected
255     def ssl_required?
256       GitoriousConfig["use_ssl"]
257     end
258
259     def find_user
260       @user = User.find_by_login!(params[:id])
261     end
262
263     def require_identity_url_in_session
264       if session[:openid_url].blank?
265         redirect_to :action => "new" and return
266       end
267     end
268
269     def require_public_user
270       unless @user.public?
271         flash[:notice] = "This user profile is not public"
272         redirect_back_or_default root_path
273       end
274     end
275
276     def decide_layout
277       if [:new, :create, :forgot_password, :pending_activation, :reset_password ].include?(action_name.to_sym)
278         "second_generation/application"
279       else
280         "application"
281       end
282     end
283 end