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