Merge remote-tracking branch 'origin/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   verify :method => :put, :only => [:update_password, :update]
40   verify :method => :delete, :only => :avatar
41   verify :method => :post, :only => [:create, :forgot_password_create]
42
43   renders_in_global_context
44   layout :decide_layout
45   # render new.rhtml
46   def new
47   end
48
49   def show
50     @projects = if logged_in?
51                   @user.projects.visibility_publics.find(:all,
52                     :include => [:tags, { :repositories => :project }])
53                 else
54                   @user.projects.visibility_all.find(:all,
55                     :include => [:tags, { :repositories => :project }])
56                 end
57     @repositories = if logged_in?
58                       @user.commit_repositories.visibility_publics
59                     else
60                       @user.commit_repositories.visibility_all
61                     end
62     @events = @user.events.excluding_commits.paginate(
63       :page => params[:page], :order => "events.created_at desc",
64       :include => [:user, :project]).delete_if { |e| !e.visible?(logged_in?) }
65     @messages = @user.messages_in_inbox(3) if @user == current_user
66     @favorites = @user.favorites.all(:include => :watchable).delete_if { |f| !f.visible?(logged_in?) }
67
68     @atom_auto_discovery_url = feed_user_path(@user, :format => :atom)
69     @atom_auto_discovery_title = "Public activity feed"
70
71     respond_to do |format|
72       format.html { }
73       format.atom { redirect_to feed_user_path(@user, :format => :atom) }
74     end
75   end
76
77   def feed
78     @user = User.find_by_login!(params[:id])
79     @events = @user.events.find(:all, :order => "events.created_at desc",
80       :include => [:user, :project], :limit => 30)
81     @events.delete_if { |e| !e.visibility_all? } if VisibilityFeatureEnabled
82     respond_to do |format|
83       format.html { redirect_to user_path(@user) }
84       format.atom { }
85     end
86   end
87
88   def watchlist
89     @user = User.find_by_login!(params[:id])
90     @events = @user.paginated_events_in_watchlist({:page => 1})
91     respond_to do |wants|
92       wants.atom { render :template => "users/feed" }
93     end
94   end
95
96   def create
97     @user = User.new(params[:user])
98     @user.login = params[:user][:login]
99     @user.password = params[:user][:password]
100     @user.password_confirmation = params[:user][:password_confirmation]
101     @user.save!
102     if !@user.terms_of_use.blank?
103       @user.accept_terms!
104     end
105     redirect_to :action => "pending_activation"
106   rescue ActiveRecord::RecordInvalid
107     render :action => 'new'
108   end
109
110   # render pending_activation.html.erb
111   def pending_activation
112   end
113
114   def activate
115     if user = User.find_by_activation_code(params[:activation_code])
116       self.current_user = user
117       if logged_in? && !current_user.activated?
118         current_user.activate
119         flash[:notice] = I18n.t "users_controller.activate_notice"
120       end
121     else
122       flash[:error] = I18n.t "users_controller.activate_error"
123     end
124     redirect_back_or_default('/')
125   end
126
127   def forgot_password
128   end
129
130   def forgot_password_create
131     if params[:user] && user = User.find_by_email(params[:user][:email])
132       if user.activated?
133         password_key = user.forgot_password!
134         Mailer.deliver_forgotten_password(user, password_key)
135         flash[:success] = "A password confirmation link has been sent to your email address"
136         redirect_to(root_path)
137       else
138         flash[:error] = I18n.t 'users_controller.reset_password_inactive_account'
139         redirect_to forgot_password_users_path
140       end
141     else
142       flash[:error] = I18n.t "users_controller.reset_password_error"
143       redirect_to forgot_password_users_path
144     end
145   end
146
147   def reset_password
148     @user = User.find_by_password_key(params[:token])
149     unless @user
150       flash[:error] = I18n.t "users_controller.reset_password_error"
151       redirect_to forgot_password_users_path
152       return
153     end
154
155     if request.put?
156       @user.password = params[:user][:password]
157       @user.password_confirmation = params[:user][:password_confirmation]
158       if @user.save
159         flash[:success] = "Password updated"
160         redirect_to(new_sessions_path)
161       end
162     end
163   end
164
165   def edit
166     @user = current_user
167   end
168
169   def update
170     @user = current_user
171     @user.attributes = params[:user]
172     if current_user.save
173       flash[:success] = "Your account details were updated"
174       redirect_to user_path
175     else
176       render :action => "edit"
177     end
178   end
179
180   def password
181     @user = current_user
182   end
183
184   def update_password
185     @user = current_user
186     if User.authenticate(current_user.email, params[:user][:current_password]) || @user.is_openid_only?
187       @user.password = params[:user][:password]
188       @user.password_confirmation = params[:user][:password_confirmation]
189       if @user.save
190         flash[:success] = "Your password has been changed"
191         redirect_to user_path(@user)
192       else
193         render :action => "password"
194       end
195     else
196       flash[:error] = "Your current password does not seem to match the one your supplied"
197       render :action => "password"
198     end
199   end
200
201   def openid_build
202     @user = User.new(:identity_url => session[:openid_url], :email => session[:openid_email], :login => session[:openid_nickname], :fullname => session[:openid_fullname])
203   end
204
205   def openid_create
206     @user = User.new(params[:user])
207     @user.login = params[:user][:login]
208     @user.identity_url = session[:openid_url]
209     if @user.save
210       if !@user.terms_of_use.blank?
211         @user.accept_terms!
212       end
213       @user.activate
214       [:openid_url, :openid_email, :openid_nickname, :openid_fullname].each do |k|
215         session.delete(k)
216       end
217       self.current_user = @user
218       flash[:success] = "Your user profile was successfully created"
219       redirect_to root_path
220     else
221       render :action => 'openid_build'
222     end
223   end
224
225   # DELETE avatar
226   def avatar
227     @user.avatar.destroy
228     @user.save
229     flash[:success] = "You profile image was deleted"
230     redirect_to user_path
231   end
232
233   protected
234     def ssl_required?
235       GitoriousConfig["use_ssl"]
236     end
237
238     def find_user
239       @user = User.find_by_login!(params[:id])
240     end
241
242     def require_identity_url_in_session
243       if session[:openid_url].blank?
244         redirect_to :action => "new" and return
245       end
246     end
247
248     def require_public_user
249       unless @user.public?
250         flash[:notice] = "This user profile is not public"
251         redirect_back_or_default root_path
252       end
253     end
254
255     def decide_layout
256       if [:new, :create, :forgot_password, :pending_activation, :reset_password ].include?(action_name.to_sym)
257         "second_generation/application"
258       else
259         "application"
260       end
261     end
262 end