]> git.openstreetmap.org Git - rails.git/blob - app/controllers/user_controller.rb
Merge 16110:16216 from trunk.
[rails.git] / app / controllers / user_controller.rb
1 class UserController < ApplicationController
2   layout 'site'
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 => [:set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image]
8   before_filter :check_database_readable, :except => [:api_details, :api_gpx_files]
9   before_filter :check_database_writable, :only => [:login, :new, :set_home, :account, :go_public, :make_friend, :remove_friend, :upload_image, :delete_image]
10   before_filter :check_api_readable, :only => [:api_details, :api_gpx_files]
11
12   filter_parameter_logging :password, :pass_crypt, :pass_crypt_confirmation
13
14   def save
15     @title = t 'user.new.title'
16
17     if Acl.find_by_address(request.remote_ip, :conditions => {:k => "no_account_creation"})
18       render :action => 'new'
19     else
20       @user = User.new(params[:user])
21
22       @user.visible = true
23       @user.data_public = true
24       @user.description = "" if @user.description.nil?
25       @user.creation_ip = request.remote_ip
26       @user.languages = request.user_preferred_languages
27
28       if @user.save
29         flash[:notice] = t 'user.new.flash create success message'
30         Notifier.deliver_signup_confirm(@user, @user.tokens.create)
31         redirect_to :action => 'login'
32       else
33         render :action => 'new'
34       end
35     end
36   end
37
38   def account
39     @title = t 'user.account.title'
40
41     if params[:user] and params[:user][:display_name] and params[:user][:description]
42       if params[:user][:email] != @user.email
43         @user.new_email = params[:user][:email]
44       end
45
46       @user.display_name = params[:user][:display_name]
47
48       if params[:user][:pass_crypt].length > 0 or params[:user][:pass_crypt_confirmation].length > 0
49         @user.pass_crypt = params[:user][:pass_crypt]
50         @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
51       end
52
53       @user.description = params[:user][:description]
54       @user.languages = params[:user][:languages].split(",")
55       @user.home_lat = params[:user][:home_lat]
56       @user.home_lon = params[:user][:home_lon]
57
58       if @user.save
59         set_locale
60
61         if params[:user][:email] == @user.new_email
62           flash[:notice] = t 'user.account.flash update success confirm needed'
63           Notifier.deliver_email_confirm(@user, @user.tokens.create)
64         else
65           flash[:notice] = t 'user.account.flash update success'
66         end
67       end
68     end
69   end
70
71   def set_home
72     if params[:user][:home_lat] and params[:user][:home_lon]
73       @user.home_lat = params[:user][:home_lat].to_f
74       @user.home_lon = params[:user][:home_lon].to_f
75       if @user.save
76         flash[:notice] = t 'user.set_home.flash success'
77         redirect_to :controller => 'user', :action => 'account'
78       end
79     end
80   end
81
82   def go_public
83     @user.data_public = true
84     @user.save
85     flash[:notice] = t 'user.go_public.flash success'
86     redirect_to :controller => 'user', :action => 'account', :display_name => @user.display_name
87   end
88
89   def lost_password
90     @title = t 'user.lost_password.title'
91
92     if params[:user] and params[:user][:email]
93       user = User.find_by_email(params[:user][:email], :conditions => {:visible => true})
94
95       if user
96         token = user.tokens.create
97         Notifier.deliver_lost_password(user, token)
98         flash[:notice] = t 'user.lost_password.notice email on way'
99       else
100         flash[:notice] = t 'user.lost_password.notice email cannot find'
101       end
102     end
103   end
104
105   def reset_password
106     @title = t 'user.reset_password.title'
107
108     if params['token']
109       token = UserToken.find_by_token(params[:token])
110       if token
111         pass = OSM::make_token(8)
112         user = token.user
113         user.pass_crypt = pass
114         user.pass_crypt_confirmation = pass
115         user.active = true
116         user.email_valid = true
117         user.save!
118         token.destroy
119         Notifier.deliver_reset_password(user, pass)
120         flash[:notice] = t 'user.reset_password.flash changed check mail'
121       else
122         flash[:notice] = t 'user.reset_password.flash token bad'
123       end
124     end
125
126     redirect_to :action => 'login'
127   end
128
129   def new
130     @title = t 'user.new.title'
131
132     # The user is logged in already, so don't show them the signup page, instead
133     # send them to the home page
134     redirect_to :controller => 'site', :action => 'index' if session[:user]
135   end
136
137   def login
138     if session[:user]
139       # The user is logged in already, if the referer param exists, redirect them to that
140       if params[:referer]
141         redirect_to params[:referer]
142       else
143         redirect_to :controller => 'site', :action => 'index'
144       end
145       return
146     end
147
148     @title = t 'user.login.title'
149
150     if params[:user]
151       email_or_display_name = params[:user][:email]
152       pass = params[:user][:password]
153       user = User.authenticate(:username => email_or_display_name, :password => pass)
154       if user
155         session[:user] = user.id
156         if params[:referer]
157           redirect_to params[:referer]
158         else
159           redirect_to :controller => 'site', :action => 'index'
160         end
161         return
162       elsif User.authenticate(:username => email_or_display_name, :password => pass, :inactive => true)
163         @notice = t 'user.login.account not active'
164       else
165         @notice = t 'user.login.auth failure'
166       end
167     end
168   end
169
170   def logout
171     if session[:token]
172       token = UserToken.find_by_token(session[:token])
173       if token
174         token.destroy
175       end
176       session[:token] = nil
177     end
178     session[:user] = nil
179     if params[:referer]
180       redirect_to params[:referer]
181     else
182       redirect_to :controller => 'site', :action => 'index'
183     end
184   end
185
186   def confirm
187     if params[:confirm_action]
188       token = UserToken.find_by_token(params[:confirm_string])
189       if token and !token.user.active?
190         @user = token.user
191         @user.active = true
192         @user.email_valid = true
193         @user.save!
194         token.destroy
195         flash[:notice] = t 'user.confirm.success'
196         session[:user] = @user.id
197         redirect_to :action => 'account', :display_name => @user.display_name
198       else
199         @notice = t 'user.confirm.failure'
200       end
201     end
202   end
203
204   def confirm_email
205     if params[:confirm_action]
206       token = UserToken.find_by_token(params[:confirm_string])
207       if token and token.user.new_email?
208         @user = token.user
209         @user.email = @user.new_email
210         @user.new_email = nil
211         @user.active = true
212         @user.email_valid = true
213         @user.save!
214         token.destroy
215         flash[:notice] = t 'user.confirm_email.success'
216         session[:user] = @user.id
217         redirect_to :action => 'account', :display_name => @user.display_name
218       else
219         @notice = t 'user.confirm_email.failure'
220       end
221     end
222   end
223
224   def upload_image
225     @user.image = params[:user][:image]
226     @user.save!
227     redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name
228   end
229
230   def delete_image
231     @user.image = nil
232     @user.save!
233     redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name
234   end
235
236   def api_details
237     render :text => @user.to_xml.to_s, :content_type => "text/xml"
238   end
239
240   def api_gpx_files
241     doc = OSM::API.new.get_xml_doc
242     @user.traces.each do |trace|
243       doc.root << trace.to_xml_node() if trace.public? or trace.user == @user
244     end
245     render :text => doc.to_s, :content_type => "text/xml"
246   end
247
248   def view
249     @this_user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
250
251     if @this_user
252       @title = @this_user.display_name
253     else
254       @title = t 'user.no_such_user.title'
255       @not_found_user = params[:display_name]
256       render :action => 'no_such_user', :status => :not_found
257     end
258   end
259
260   def make_friend
261     if params[:display_name]     
262       name = params[:display_name]
263       new_friend = User.find_by_display_name(name, :conditions => {:visible => true})
264       friend = Friend.new
265       friend.user_id = @user.id
266       friend.friend_user_id = new_friend.id
267       unless @user.is_friends_with?(new_friend)
268         if friend.save
269           flash[:notice] = t 'user.make_friend.success', :name => name
270           Notifier.deliver_friend_notification(friend)
271         else
272           friend.add_error(t('user.make_friend.failed', :name => name))
273         end
274       else
275         flash[:notice] = t 'user.make_friend.already_a_friend', :name => name
276       end
277
278       redirect_to :controller => 'user', :action => 'view'
279     end
280   end
281
282   def remove_friend
283     if params[:display_name]     
284       name = params[:display_name]
285       friend = User.find_by_display_name(name, :conditions => {:visible => true})
286       if @user.is_friends_with?(friend)
287         Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
288         flash[:notice] = t 'user.remove_friend.success', :name => friend.display_name
289       else
290         flash[:notice] = t 'user.remove_friend.not_a_friend', :name => friend.display_name
291       end
292
293       redirect_to :controller => 'user', :action => 'view'
294     end
295   end
296 end