]> git.openstreetmap.org Git - rails.git/blob - app/controllers/user_controller.rb
27d124daeae3423e7bc22a4e1d50235f9b7a00d8
[rails.git] / app / controllers / user_controller.rb
1 class UserController < ApplicationController
2   layout 'site', :except => :api_details
3
4   before_filter :authorize, :only => [:api_details, :api_gpx_files]
5   before_filter :authorize_web, :except => [:api_details, :api_gpx_files]
6   before_filter :set_locale, :except => [:api_details, :api_gpx_files]
7   before_filter :require_user, :only => [:account, :go_public, :make_friend, :remove_friend]
8   before_filter :check_database_readable, :except => [:api_details, :api_gpx_files]
9   before_filter :check_database_writable, :only => [:login, :new, :account, :go_public, :make_friend, :remove_friend]
10   before_filter :check_api_readable, :only => [:api_details, :api_gpx_files]
11   before_filter :require_allow_read_prefs, :only => [:api_details]
12   before_filter :require_allow_read_gpx, :only => [:api_gpx_files]
13   before_filter :require_cookies, :only => [:login, :confirm]
14   before_filter :require_administrator, :only => [:activate, :deactivate, :hide, :unhide, :delete]
15   before_filter :lookup_this_user, :only => [:activate, :deactivate, :hide, :unhide, :delete]
16
17   filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
18
19   cache_sweeper :user_sweeper, :only => [:account, :hide, :unhide, :delete]
20
21   def terms
22     @title = t 'user.new.title'
23     @user = User.new(params[:user])
24
25     @legale = params[:legale] || OSM.IPToCountry(request.remote_ip) || APP_CONFIG['default_legale']
26     @text = OSM.legal_text_for_country(@legale)
27
28     if request.xhr?
29       render :update do |page|
30         page.replace_html "contributorTerms", :partial => "terms"
31       end
32     elsif @user.invalid?
33       render :action => 'new'
34     end
35   end
36
37   def save
38     @title = t 'user.new.title'
39
40     if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"})
41       render :action => 'new'
42     else
43       @user = User.new(params[:user])
44
45       @user.visible = true
46       @user.data_public = true
47       @user.description = "" if @user.description.nil?
48       @user.creation_ip = request.remote_ip
49       @user.languages = request.user_preferred_languages
50       @user.terms_agreed = Time.now.getutc
51
52       if @user.save
53         flash[:notice] = t 'user.new.flash create success message'
54         Notifier.deliver_signup_confirm(@user, @user.tokens.create(:referer => params[:referer]))
55         redirect_to :action => 'login'
56       else
57         render :action => 'new'
58       end
59     end
60   end
61
62   def account
63     @title = t 'user.account.title'
64     @tokens = @user.oauth_tokens.find :all, :conditions => 'oauth_tokens.invalidated_at is null and oauth_tokens.authorized_at is not null'
65
66     if params[:user] and params[:user][:display_name] and params[:user][:description]
67       @user.display_name = params[:user][:display_name]
68       @user.new_email = params[:user][:new_email]
69
70       if params[:user][:pass_crypt].length > 0 or params[:user][:pass_crypt_confirmation].length > 0
71         @user.pass_crypt = params[:user][:pass_crypt]
72         @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
73       end
74
75       @user.description = params[:user][:description]
76       @user.languages = params[:user][:languages].split(",")
77
78       case params[:image_action]
79         when "new" then @user.image = params[:user][:image]
80         when "delete" then @user.image = nil
81       end
82
83       @user.home_lat = params[:user][:home_lat]
84       @user.home_lon = params[:user][:home_lon]
85
86       if @user.save
87         set_locale
88
89         if @user.new_email.nil? or @user.new_email.empty?
90           flash.now[:notice] = t 'user.account.flash update success'
91         else
92           flash.now[:notice] = t 'user.account.flash update success confirm needed'
93
94           begin
95             Notifier.deliver_email_confirm(@user, @user.tokens.create)
96           rescue
97             # Ignore errors sending email
98           end
99         end
100       end
101     else
102       if flash[:errors]
103         flash[:errors].each do |attr,msg|
104           attr = "new_email" if attr == "email"
105           @user.errors.add(attr,msg)
106         end
107       end
108     end
109   end
110
111   def go_public
112     @user.data_public = true
113     @user.save
114     flash[:notice] = t 'user.go_public.flash success'
115     redirect_to :controller => 'user', :action => 'account', :display_name => @user.display_name
116   end
117
118   def lost_password
119     @title = t 'user.lost_password.title'
120
121     if params[:user] and params[:user][:email]
122       user = User.find_by_email(params[:user][:email], :conditions => {:visible => true})
123
124       if user
125         token = user.tokens.create
126         Notifier.deliver_lost_password(user, token)
127         flash[:notice] = t 'user.lost_password.notice email on way'
128         redirect_to :action => 'login'
129       else
130         flash.now[:error] = t 'user.lost_password.notice email cannot find'
131       end
132     end
133   end
134
135   def reset_password
136     @title = t 'user.reset_password.title'
137
138     if params[:token]
139       token = UserToken.find_by_token(params[:token])
140
141       if token
142         @user = token.user
143
144         if params[:user]
145           @user.pass_crypt = params[:user][:pass_crypt]
146           @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
147           @user.active = true
148           @user.email_valid = true
149
150           if @user.save
151             token.destroy
152             flash[:notice] = t 'user.reset_password.flash changed'
153             redirect_to :action => 'login'
154           end
155         end
156       else
157         flash[:error] = t 'user.reset_password.flash token bad'
158         redirect_to :action => 'lost_password'
159       end
160     end
161   end
162
163   def new
164     @title = t 'user.new.title'
165
166     # The user is logged in already, so don't show them the signup
167     # page, instead send them to the home page
168     redirect_to :controller => 'site', :action => 'index' if session[:user]
169   end
170
171   def login
172     @title = t 'user.login.title'
173
174     if params[:user]
175       email_or_display_name = params[:user][:email]
176       pass = params[:user][:password]
177       user = User.authenticate(:username => email_or_display_name, :password => pass)
178
179       if user
180         session[:user] = user.id
181         session_expires_after 1.month if params[:remember_me]
182
183         # The user is logged in, if the referer param exists, redirect
184         # them to that unless they've also got a block on them, in
185         # which case redirect them to the block so they can clear it.
186         if user.blocked_on_view
187           redirect_to user.blocked_on_view, :referrer => params[:referrer]
188         elsif params[:referer]
189           redirect_to params[:referer]
190         else
191           redirect_to :controller => 'site', :action => 'index'
192         end
193        elsif User.authenticate(:username => email_or_display_name, :password => pass, :inactive => true)
194         flash.now[:error] = t 'user.login.account not active'
195       else
196         flash.now[:error] = t 'user.login.auth failure'
197       end
198     end
199   end
200
201   def logout
202     @title = t 'user.logout.title'
203
204     if params[:session] == request.session_options[:id]
205       if session[:token]
206         token = UserToken.find_by_token(session[:token])
207         if token
208           token.destroy
209         end
210         session[:token] = nil
211       end
212       session[:user] = nil
213       session_expires_automatically
214       if params[:referer]
215         redirect_to params[:referer]
216       else
217         redirect_to :controller => 'site', :action => 'index'
218       end
219     end
220   end
221
222   def confirm
223     if params[:confirm_action]
224       token = UserToken.find_by_token(params[:confirm_string])
225       if token and !token.user.active?
226         @user = token.user
227         @user.active = true
228         @user.email_valid = true
229         @user.save!
230         referer = token.referer
231         token.destroy
232         flash[:notice] = t 'user.confirm.success'
233         session[:user] = @user.id
234         unless referer.nil?
235           redirect_to referer
236         else
237           redirect_to :action => 'account', :display_name => @user.display_name
238         end
239       else
240         flash.now[:error] = t 'user.confirm.failure'
241       end
242     end
243   end
244
245   def confirm_email
246     if params[:confirm_action]
247       token = UserToken.find_by_token(params[:confirm_string])
248       if token and token.user.new_email?
249         @user = token.user
250         @user.email = @user.new_email
251         @user.new_email = nil
252         @user.active = true
253         @user.email_valid = true
254         if @user.save
255           flash[:notice] = t 'user.confirm_email.success'
256         else
257           flash[:errors] = @user.errors
258         end
259         token.destroy
260         session[:user] = @user.id
261         redirect_to :action => 'account', :display_name => @user.display_name
262       else
263         flash.now[:error] = t 'user.confirm_email.failure'
264       end
265     end
266   end
267
268   def api_gpx_files
269     doc = OSM::API.new.get_xml_doc
270     @user.traces.each do |trace|
271       doc.root << trace.to_xml_node() if trace.public? or trace.user == @user
272     end
273     render :text => doc.to_s, :content_type => "text/xml"
274   end
275
276   def view
277     @this_user = User.find_by_display_name(params[:display_name])
278
279     if @this_user and
280        (@this_user.visible? or (@user and @user.administrator?))
281       @title = @this_user.display_name
282     else
283       @title = t 'user.no_such_user.title'
284       @not_found_user = params[:display_name]
285       render :action => 'no_such_user', :status => :not_found
286     end
287   end
288
289   def make_friend
290     if params[:display_name]
291       name = params[:display_name]
292       new_friend = User.find_by_display_name(name, :conditions => {:visible => true})
293       friend = Friend.new
294       friend.user_id = @user.id
295       friend.friend_user_id = new_friend.id
296       unless @user.is_friends_with?(new_friend)
297         if friend.save
298           flash[:notice] = t 'user.make_friend.success', :name => name
299           Notifier.deliver_friend_notification(friend)
300         else
301           friend.add_error(t('user.make_friend.failed', :name => name))
302         end
303       else
304         flash[:warning] = t 'user.make_friend.already_a_friend', :name => name
305       end
306
307       if params[:referer]
308         redirect_to params[:referer]
309       else
310         redirect_to :controller => 'user', :action => 'view'
311       end
312     end
313   end
314
315   def remove_friend
316     if params[:display_name]
317       name = params[:display_name]
318       friend = User.find_by_display_name(name, :conditions => {:visible => true})
319       if @user.is_friends_with?(friend)
320         Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
321         flash[:notice] = t 'user.remove_friend.success', :name => friend.display_name
322       else
323         flash[:error] = t 'user.remove_friend.not_a_friend', :name => friend.display_name
324       end
325
326       if params[:referer]
327         redirect_to params[:referer]
328       else
329         redirect_to :controller => 'user', :action => 'view'
330       end
331     end
332   end
333
334   ##
335   # activate a user, allowing them to log in
336   def activate
337     @this_user.update_attributes(:active => true)
338     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
339   end
340
341   ##
342   # deactivate a user, preventing them from logging in
343   def deactivate
344     @this_user.update_attributes(:active => false)
345     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
346   end
347
348   ##
349   # hide a user, marking them as logically deleted
350   def hide
351     @this_user.update_attributes(:visible => false)
352     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
353   end
354
355   ##
356   # unhide a user, clearing the logically deleted flag
357   def unhide
358     @this_user.update_attributes(:visible => true)
359     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
360   end
361
362   ##
363   # delete a user, marking them as deleted and removing personal data
364   def delete
365     @this_user.delete
366     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
367   end
368 private
369   ##
370   # require that the user is a administrator, or fill out a helpful error message
371   # and return them to the user page.
372   def require_administrator
373     unless @user.administrator?
374       flash[:error] = t('user.filter.not_an_administrator')
375       redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
376     end
377   end
378
379   ##
380   # ensure that there is a "this_user" instance variable
381   def lookup_this_user
382     @this_user = User.find_by_display_name(params[:display_name])
383   rescue ActiveRecord::RecordNotFound
384     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name] unless @this_user
385   end
386 end