]> git.openstreetmap.org Git - rails.git/blob - app/controllers/user_controller.rb
Have a nice translated alt and title for the sotm and donation.
[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 :set_locale, :except => [:api_details, :api_gpx_files]
6   before_filter :authorize_web, :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 = 'create account'
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.locale = Language.find_by_code(I18n.locale.to_s)
27       @user.locale = Language.find_by_code("en") if @user.locale.nil?
28
29       if @user.save
30         flash[:notice] = I18n.t('user.new.flash create success message')
31         Notifier.deliver_signup_confirm(@user, @user.tokens.create)
32         redirect_to :action => 'login'
33       else
34         render :action => 'new'
35       end
36     end
37   end
38
39   def account
40     @title = 'edit account'
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.home_lat = params[:user][:home_lat]
55       @user.home_lon = params[:user][:home_lon]
56
57       if @user.save
58         if params[:user][:email] == @user.new_email
59           flash[:notice] = I18n.t('user.account.flash update success confirm needed')
60           Notifier.deliver_email_confirm(@user, @user.tokens.create)
61         else
62           flash[:notice] = I18n.t('user.account.flash update success')
63         end
64       end
65     end
66   end
67
68   def set_home
69     if params[:user][:home_lat] and params[:user][:home_lon]
70       @user.home_lat = params[:user][:home_lat].to_f
71       @user.home_lon = params[:user][:home_lon].to_f
72       if @user.save
73         flash[:notice] = I18n.t('user.set_home.flash success')
74         redirect_to :controller => 'user', :action => 'account'
75       end
76     end
77   end
78
79   def go_public
80     @user.data_public = true
81     @user.save
82     flash[:notice] = I18n.t('user.go_public.flash success')
83     redirect_to :controller => 'user', :action => 'account', :display_name => @user.display_name
84   end
85
86   def lost_password
87     @title = I18n.t('user.lost_password.title')
88     if params[:user] and params[:user][:email]
89       user = User.find_by_email(params[:user][:email], :conditions => {:visible => true})
90
91       if user
92         token = user.tokens.create
93         Notifier.deliver_lost_password(user, token)
94         flash[:notice] = I18n.t('user.lost_password.notice.email on way')
95       else
96         flash[:notice] = I18n.t('user.lost_password.notice email cannot find')
97       end
98     end
99   end
100
101   def reset_password
102     @title = I18n.t('user.reset_password.title')
103     if params['token']
104       token = UserToken.find_by_token(params[:token])
105       if token
106         pass = OSM::make_token(8)
107         user = token.user
108         user.pass_crypt = pass
109         user.pass_crypt_confirmation = pass
110         user.active = true
111         user.email_valid = true
112         user.save!
113         token.destroy
114         Notifier.deliver_reset_password(user, pass)
115         flash[:notice] = I18n.t('user.reset_password.flash changed check mail')
116       else
117         flash[:notice] = I18n.t('user.reset_password.flash token bad')
118       end
119     end
120
121     redirect_to :action => 'login'
122   end
123
124   def new
125     @title = 'create account'
126     # The user is logged in already, so don't show them the signup page, instead
127     # send them to the home page
128     redirect_to :controller => 'site', :action => 'index' if session[:user]
129   end
130
131   def login
132     if session[:user]
133       # The user is logged in already, if the referer param exists, redirect them to that
134       if params[:referer]
135         redirect_to params[:referer]
136       else
137         redirect_to :controller => 'site', :action => 'index'
138       end
139       return
140     end
141     @title = 'login'
142     if params[:user]
143       email_or_display_name = params[:user][:email]
144       pass = params[:user][:password]
145       user = User.authenticate(:username => email_or_display_name, :password => pass)
146       if user
147         session[:user] = user.id
148         if params[:referer]
149           redirect_to params[:referer]
150         else
151           redirect_to :controller => 'site', :action => 'index'
152         end
153         return
154       elsif User.authenticate(:username => email_or_display_name, :password => pass, :inactive => true)
155         @notice = "Sorry, your account is not active yet.<br>Please click on the link in the account confirmation email to activate your account."
156       else
157         @notice = "Sorry, couldn't log in with those details."
158       end
159     end
160   end
161
162   def logout
163     if session[:token]
164       token = UserToken.find_by_token(session[:token])
165       if token
166         token.destroy
167       end
168       session[:token] = nil
169     end
170     session[:user] = nil
171     if params[:referer]
172       redirect_to params[:referer]
173     else
174       redirect_to :controller => 'site', :action => 'index'
175     end
176   end
177
178   def confirm
179     if params[:confirm_action]
180       token = UserToken.find_by_token(params[:confirm_string])
181       if token and !token.user.active?
182         @user = token.user
183         @user.active = true
184         @user.email_valid = true
185         @user.save!
186         token.destroy
187         flash[:notice] = 'Confirmed your account, thanks for signing up!'
188         session[:user] = @user.id
189         redirect_to :action => 'account', :display_name => @user.display_name
190       else
191         @notice = 'Something went wrong confirming that user.'
192       end
193     end
194   end
195
196   def confirm_email
197     if params[:confirm_action]
198       token = UserToken.find_by_token(params[:confirm_string])
199       if token and token.user.new_email?
200         @user = token.user
201         @user.email = @user.new_email
202         @user.new_email = nil
203         @user.active = true
204         @user.email_valid = true
205         @user.save!
206         token.destroy
207         flash[:notice] = 'Confirmed your email address, thanks for signing up!'
208         session[:user] = @user.id
209         redirect_to :action => 'account', :display_name => @user.display_name
210       else
211         @notice = 'Something went wrong confirming that email address.'
212       end
213     end
214   end
215
216   def upload_image
217     @user.image = params[:user][:image]
218     @user.save!
219     redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name
220   end
221
222   def delete_image
223     @user.image = nil
224     @user.save!
225     redirect_to :controller => 'user', :action => 'view', :display_name => @user.display_name
226   end
227
228   def api_details
229     render :text => @user.to_xml.to_s, :content_type => "text/xml"
230   end
231
232   def api_gpx_files
233     doc = OSM::API.new.get_xml_doc
234     @user.traces.each do |trace|
235       doc.root << trace.to_xml_node() if trace.public? or trace.user == @user
236     end
237     render :text => doc.to_s, :content_type => "text/xml"
238   end
239
240   def view
241     @this_user = User.find_by_display_name(params[:display_name], :conditions => {:visible => true})
242
243     if @this_user
244       @title = @this_user.display_name
245     else
246       @not_found_user = params[:display_name]
247       render :action => 'no_such_user', :status => :not_found
248     end
249   end
250
251   def make_friend
252     if params[:display_name]     
253       name = params[:display_name]
254       new_friend = User.find_by_display_name(name, :conditions => {:visible => true})
255       friend = Friend.new
256       friend.user_id = @user.id
257       friend.friend_user_id = new_friend.id
258       unless @user.is_friends_with?(new_friend)
259         if friend.save
260           flash[:notice] = "#{name} is now your friend."
261           Notifier.deliver_friend_notification(friend)
262         else
263           friend.add_error("Sorry, failed to add #{name} as a friend.")
264         end
265       else
266         flash[:notice] = "You are already friends with #{name}."  
267       end
268
269       redirect_to :controller => 'user', :action => 'view'
270     end
271   end
272
273   def remove_friend
274     if params[:display_name]     
275       name = params[:display_name]
276       friend = User.find_by_display_name(name, :conditions => {:visible => true})
277       if @user.is_friends_with?(friend)
278         Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{friend.id}"
279         flash[:notice] = "#{friend.display_name} was removed from your friends."
280       else
281         flash[:notice] = "#{friend.display_name} is not one of your friends."
282       end
283
284       redirect_to :controller => 'user', :action => 'view'
285     end
286   end
287 end