]> git.openstreetmap.org Git - rails.git/blob - app/controllers/user_controller.rb
Trust Google and Yahoo to return valid email addresses
[rails.git] / app / controllers / user_controller.rb
1 class UserController < ApplicationController
2   layout :choose_layout
3
4   skip_before_filter :verify_authenticity_token, :only => [:api_read, :api_details, :api_gpx_files]
5   before_filter :disable_terms_redirect, :only => [:terms, :save, :logout, :api_details]
6   before_filter :authorize, :only => [:api_details, :api_gpx_files]
7   before_filter :authorize_web, :except => [:api_read, :api_details, :api_gpx_files]
8   before_filter :set_locale, :except => [:api_read, :api_details, :api_gpx_files]
9   before_filter :require_user, :only => [:account, :go_public, :make_friend, :remove_friend]
10   before_filter :check_database_readable, :except => [:login, :api_read, :api_details, :api_gpx_files]
11   before_filter :check_database_writable, :only => [:new, :account, :confirm, :confirm_email, :lost_password, :reset_password, :go_public, :make_friend, :remove_friend]
12   before_filter :check_api_readable, :only => [:api_read, :api_details, :api_gpx_files]
13   before_filter :require_allow_read_prefs, :only => [:api_details]
14   before_filter :require_allow_read_gpx, :only => [:api_gpx_files]
15   before_filter :require_cookies, :only => [:login, :confirm]
16   before_filter :require_administrator, :only => [:set_status, :delete, :list]
17   around_filter :api_call_handle_error, :only => [:api_read, :api_details, :api_gpx_files]
18   before_filter :lookup_user_by_id, :only => [:api_read]
19   before_filter :lookup_user_by_name, :only => [:set_status, :delete]
20
21   cache_sweeper :user_sweeper, :only => [:account, :set_status, :delete]
22
23   def terms
24     @legale = params[:legale] || OSM.IPToCountry(request.remote_ip) || DEFAULT_LEGALE
25     @text = OSM.legal_text_for_country(@legale)
26
27     if request.xhr?
28       render :partial => "terms"
29     elsif using_open_id?
30       # The redirect from the OpenID provider reenters here
31       # again and we need to pass the parameters through to
32       # the open_id_authentication function
33       @user = session.delete(:new_user)
34
35       openid_verify(nil, @user) do |user|
36       end
37
38       if @user.openid_url.nil? or @user.invalid?
39         render :action => 'new'
40       else
41         render :action => 'terms'
42       end
43     elsif params[:user] and Acl.no_account_creation(request.remote_ip, params[:user][:email].split("@").last)
44       render :action => 'blocked'
45     else
46       session[:referer] = params[:referer]
47
48       @title = t 'user.terms.title'
49       @user = User.new(params[:user]) if params[:user]
50
51       if params[:user] and params[:user][:openid_url] and @user.pass_crypt.empty?
52         # We are creating an account with OpenID and no password
53         # was specified so create a random one
54         @user.pass_crypt = SecureRandom.base64(16)
55         @user.pass_crypt_confirmation = @user.pass_crypt
56       end
57
58       if @user
59         if @user.invalid?
60           if @user.new_record?
61             # Something is wrong with a new user, so rerender the form
62             render :action => :new
63           else
64             # Error in existing user, so go to account settings
65             flash[:errors] = @user.errors
66             redirect_to :action => :account, :display_name => @user.display_name
67           end
68         elsif @user.terms_agreed?
69           # Already agreed to terms, so just show settings
70           redirect_to :action => :account, :display_name => @user.display_name
71         elsif params[:user] and params[:user][:openid_url] and not params[:user][:openid_url].empty?
72           # Verify OpenID before moving on
73           session[:new_user] = @user
74           openid_verify(params[:user][:openid_url], @user)
75         end
76       else
77         # Not logged in, so redirect to the login page
78         redirect_to :action => :login, :referer => request.fullpath
79       end
80     end
81   end
82
83   def save
84     @title = t 'user.new.title'
85
86     if params[:decline]
87       if @user
88         @user.terms_seen = true
89
90         if @user.save
91           flash[:notice] = t 'user.new.terms declined', :url => t('user.new.terms declined url')
92         end
93
94         if params[:referer]
95           redirect_to params[:referer]
96         else
97           redirect_to :action => :account, :display_name => @user.display_name
98         end
99       else
100         redirect_to t('user.terms.declined')
101       end
102     elsif @user
103       if !@user.terms_agreed?
104         @user.consider_pd = params[:user][:consider_pd]
105         @user.terms_agreed = Time.now.getutc
106         @user.terms_seen = true
107         if @user.save
108           flash[:notice] = t 'user.new.terms accepted'
109         end
110       end
111
112       if params[:referer]
113         redirect_to params[:referer]
114       else
115         redirect_to :action => :account, :display_name => @user.display_name
116       end
117     elsif Acl.no_account_creation(request.remote_ip, params[:user][:email].split("@").last)
118       render :action => 'blocked'
119     else
120       @user = User.new(params[:user])
121
122       @user.status = "pending"
123       @user.data_public = true
124       @user.description = "" if @user.description.nil?
125       @user.creation_ip = request.remote_ip
126       @user.languages = request.user_preferred_languages
127       @user.terms_agreed = Time.now.getutc
128       @user.terms_seen = true
129       @user.openid_url = nil if @user.openid_url and @user.openid_url.empty?
130
131       if (session[:openid_verified])
132         openid_verified = session.delete(:openid_verified)
133         if (openid_verified[:identity_url]) and (openid_verified[:identity_url] == @user.openid_url) and (openid_verified[:email]) and (openid_verified[:email] ==  @user.email)
134           # if we have an email from an OpenID provider that we trust to have verified the email for us, then activate the account directly
135           # without doing our own email verification.
136           @user.status = "active"
137         end
138       end
139
140       if @user.save
141         flash[:piwik_goal] = PIWIK_SIGNUP_GOAL if defined?(PIWIK_SIGNUP_GOAL)
142         flash[:notice] = t 'user.new.flash create success message', :email => @user.email
143         if @user.status == "active"
144           Notifier.signup_confirm(@user, nil).deliver
145           successful_login(@user)
146         else
147           Notifier.signup_confirm(@user, @user.tokens.create(:referer => session.delete(:referer))).deliver
148           session[:token] = @user.tokens.create.token
149           redirect_to :action => 'login', :referer => params[:referer]
150         end
151       else
152         render :action => 'new', :referer => params[:referer]
153       end
154     end
155   end
156
157   def account
158     @title = t 'user.account.title'
159     @tokens = @user.oauth_tokens.authorized
160
161     if params[:user] and params[:user][:display_name] and params[:user][:description]
162       if params[:user][:openid_url] and
163          params[:user][:openid_url].length > 0 and
164          params[:user][:openid_url] != @user.openid_url
165         # If the OpenID has changed, we want to check that it is a
166         # valid OpenID and one the user has control over before saving
167         # it as a password equivalent for the user.
168         session[:new_user_settings] = params
169         openid_verify(params[:user][:openid_url], @user)
170       else
171         update_user(@user, params)
172       end
173     elsif using_open_id?
174       # The redirect from the OpenID provider reenters here
175       # again and we need to pass the parameters through to
176       # the open_id_authentication function
177       settings = session.delete(:new_user_settings)
178       openid_verify(nil, @user) do |user|
179         update_user(user, settings)
180       end
181     end
182   end
183
184   def go_public
185     @user.data_public = true
186     @user.save
187     flash[:notice] = t 'user.go_public.flash success'
188     redirect_to :controller => 'user', :action => 'account', :display_name => @user.display_name
189   end
190
191   def lost_password
192     @title = t 'user.lost_password.title'
193
194     if params[:user] and params[:user][:email]
195       user = User.visible.find_by_email(params[:user][:email])
196
197       if user.nil?
198         users = User.visible.where("LOWER(email) = LOWER(?)", params[:user][:email])
199
200         if users.count == 1
201           user = users.first
202         end
203       end
204
205       if user
206         token = user.tokens.create
207         Notifier.lost_password(user, token).deliver
208         flash[:notice] = t 'user.lost_password.notice email on way'
209         redirect_to :action => 'login'
210       else
211         flash.now[:error] = t 'user.lost_password.notice email cannot find'
212       end
213     end
214   end
215
216   def reset_password
217     @title = t 'user.reset_password.title'
218
219     if params[:token]
220       token = UserToken.find_by_token(params[:token])
221
222       if token
223         @user = token.user
224
225         if params[:user]
226           @user.pass_crypt = params[:user][:pass_crypt]
227           @user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
228           @user.status = "active" if @user.status == "pending"
229           @user.email_valid = true
230
231           if @user.save
232             token.destroy
233             flash[:notice] = t 'user.reset_password.flash changed'
234             redirect_to :action => 'login'
235           end
236         end
237       else
238         flash[:error] = t 'user.reset_password.flash token bad'
239         redirect_to :action => 'lost_password'
240       end
241     end
242   end
243
244   def new
245     @title = t 'user.new.title'
246     @referer = params[:referer] || session[:referer]
247
248     if @user
249       # The user is logged in already, so don't show them the signup
250       # page, instead send them to the home page
251       if @referer
252         redirect_to @referer
253       else
254         redirect_to :controller => 'site', :action => 'index'
255       end
256     elsif params.key?(:openid)
257       @user = User.new(:email => params[:email],
258                        :email_confirmation => params[:email],
259                        :display_name => params[:nickname],
260                        :openid_url => params[:openid])
261
262       flash.now[:notice] = t 'user.new.openid association'
263     elsif Acl.no_account_creation(request.remote_ip)
264       render :action => 'blocked'
265     end
266   end
267
268   def login
269     if params[:username] or using_open_id?
270       session[:remember_me] ||= params[:remember_me]
271       session[:referer] ||= params[:referer]
272
273       if using_open_id?
274         openid_authentication(params[:openid_url])
275       else
276         password_authentication(params[:username], params[:password])
277       end
278     end
279   end
280
281   def logout
282     @title = t 'user.logout.title'
283
284     if params[:session] == request.session_options[:id]
285       if session[:token]
286         token = UserToken.find_by_token(session[:token])
287         if token
288           token.destroy
289         end
290         session.delete(:token)
291       end
292       session.delete(:user)
293       session_expires_automatically
294       if params[:referer]
295         redirect_to params[:referer]
296       else
297         redirect_to :controller => 'site', :action => 'index'
298       end
299     end
300   end
301
302   def confirm
303     if request.post?
304       if token = UserToken.find_by_token(params[:confirm_string])
305         if token.user.active?
306           flash[:error] = t('user.confirm.already active')
307           redirect_to :action => 'login'
308         else
309           user = token.user
310           user.status = "active"
311           user.email_valid = true
312           user.save!
313           referer = token.referer
314           token.destroy
315
316           if session[:token]
317             token = UserToken.find_by_token(session[:token])
318             session.delete(:token)
319           else
320             token = nil
321           end
322
323           if token.nil? or token.user != user
324             flash[:notice] = t('user.confirm.success')
325             redirect_to :action => :login, :referer => referer
326           else
327             token.destroy
328
329             session[:user] = user.id
330             cookies.permanent["_osm_username"] = user.display_name
331
332             if referer.nil?
333               flash[:notice] = t('user.confirm.success') + "<br /><br />" + t('user.confirm.before you start')
334               redirect_to :action => :account, :display_name => user.display_name
335             else
336               flash[:notice] = t('user.confirm.success')
337               redirect_to referer
338             end
339           end
340         end
341       else
342         user = User.find_by_display_name(params[:display_name])
343
344         if user and user.active?
345           flash[:error] = t('user.confirm.already active')
346         elsif user
347           flash[:error] = t('user.confirm.unknown token') + t('user.confirm.reconfirm', :reconfirm => url_for(:action => 'confirm_resend', :display_name => params[:display_name]))
348         else
349           flash[:error] = t('user.confirm.unknown token')
350         end
351
352         redirect_to :action => 'login'
353       end
354     end
355   end
356
357   def confirm_resend
358     if user = User.find_by_display_name(params[:display_name])
359       Notifier.signup_confirm(user, user.tokens.create).deliver
360       flash[:notice] = t 'user.confirm_resend.success', :email => user.email
361     else
362       flash[:notice] = t 'user.confirm_resend.failure', :name => params[:display_name]
363     end
364
365     redirect_to :action => 'login'
366   end
367
368   def confirm_email
369     if request.post?
370       token = UserToken.find_by_token(params[:confirm_string])
371       if token and token.user.new_email?
372         @user = token.user
373         @user.email = @user.new_email
374         @user.new_email = nil
375         @user.email_valid = true
376         if @user.save
377           flash[:notice] = t 'user.confirm_email.success'
378         else
379           flash[:errors] = @user.errors
380         end
381         token.destroy
382         session[:user] = @user.id
383         cookies.permanent["_osm_username"] = @user.display_name
384         redirect_to :action => 'account', :display_name => @user.display_name
385       else
386         flash[:error] = t 'user.confirm_email.failure'
387         redirect_to :action => 'account', :display_name => @user.display_name
388       end
389     end
390   end
391
392   def api_read
393     render :nothing => true, :status => :gone unless @this_user.visible?
394   end
395
396   def api_details
397     @this_user = @user
398     render :action => :api_read
399   end
400
401   def api_gpx_files
402     doc = OSM::API.new.get_xml_doc
403     @user.traces.each do |trace|
404       doc.root << trace.to_xml_node() if trace.public? or trace.user == @user
405     end
406     render :text => doc.to_s, :content_type => "text/xml"
407   end
408
409   def view
410     @this_user = User.find_by_display_name(params[:display_name])
411
412     if @this_user and
413        (@this_user.visible? or (@user and @user.administrator?))
414       @title = @this_user.display_name
415     else
416       render_unknown_user params[:display_name]
417     end
418   end
419
420   def make_friend
421     @new_friend = User.find_by_display_name(params[:display_name])
422
423     if @new_friend
424       if request.post?
425         friend = Friend.new
426         friend.user_id = @user.id
427         friend.friend_user_id = @new_friend.id
428         unless @user.is_friends_with?(@new_friend)
429           if friend.save
430             flash[:notice] = t 'user.make_friend.success', :name => @new_friend.display_name
431             Notifier.friend_notification(friend).deliver
432           else
433             friend.add_error(t('user.make_friend.failed', :name => @new_friend.display_name))
434           end
435         else
436           flash[:warning] = t 'user.make_friend.already_a_friend', :name => @new_friend.display_name
437         end
438
439         if params[:referer]
440           redirect_to params[:referer]
441         else
442           redirect_to :controller => 'user', :action => 'view'
443         end
444       end
445     else
446       render_unknown_user params[:display_name]
447     end
448   end
449
450   def remove_friend
451     @friend = User.find_by_display_name(params[:display_name])
452
453     if @friend
454       if request.post?
455         if @user.is_friends_with?(@friend)
456           Friend.delete_all "user_id = #{@user.id} AND friend_user_id = #{@friend.id}"
457           flash[:notice] = t 'user.remove_friend.success', :name => @friend.display_name
458         else
459           flash[:error] = t 'user.remove_friend.not_a_friend', :name => @friend.display_name
460         end
461
462         if params[:referer]
463           redirect_to params[:referer]
464         else
465           redirect_to :controller => 'user', :action => 'view'
466         end
467       end
468     else
469       render_unknown_user params[:display_name]
470     end
471   end
472
473   ##
474   # sets a user's status
475   def set_status
476     @this_user.status = params[:status]
477     @this_user.save
478     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
479   end
480
481   ##
482   # delete a user, marking them as deleted and removing personal data
483   def delete
484     @this_user.delete
485     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
486   end
487
488   ##
489   # display a list of users matching specified criteria
490   def list
491     if request.post?
492       ids = params[:user].keys.collect { |id| id.to_i }
493
494       User.update_all("status = 'confirmed'", :id => ids) if params[:confirm]
495       User.update_all("status = 'deleted'", :id => ids) if params[:hide]
496
497       redirect_to url_for(:status => params[:status], :ip => params[:ip], :page => params[:page])
498     else
499       conditions = Hash.new
500       conditions[:status] = params[:status] if params[:status]
501       conditions[:creation_ip] = params[:ip] if params[:ip]
502
503       @user_pages, @users = paginate(:users,
504                                      :conditions => conditions,
505                                      :order => :id,
506                                      :per_page => 50)
507     end
508   end
509
510 private
511
512   ##
513   # handle password authentication
514   def password_authentication(username, password)
515     if user = User.authenticate(:username => username, :password => password)
516       successful_login(user)
517     elsif user = User.authenticate(:username => username, :password => password, :pending => true)
518       failed_login t('user.login.account not active', :reconfirm => url_for(:action => 'confirm_resend', :display_name => user.display_name))
519     elsif User.authenticate(:username => username, :password => password, :suspended => true)
520       failed_login t('user.login.account is suspended', :webmaster => "mailto:webmaster@openstreetmap.org")
521     else
522       failed_login t('user.login.auth failure')
523     end
524   end
525
526   ##
527   # handle OpenID authentication
528   def openid_authentication(openid_url)
529     # If we don't appear to have a user for this URL then ask the
530     # provider for some extra information to help with signup
531     if openid_url and User.find_by_openid_url(openid_url)
532       required = nil
533     else
534       required = [:nickname, :email, "http://axschema.org/namePerson/friendly", "http://axschema.org/contact/email"]
535     end
536
537     # Start the authentication
538     authenticate_with_open_id(openid_expand_url(openid_url), :method => :get, :required => required) do |result, identity_url, sreg, ax|
539       if result.successful?
540         # We need to use the openid url passed back from the OpenID provider
541         # rather than the one supplied by the user, as these can be different.
542         #
543         # For example, you can simply enter yahoo.com in the login box rather
544         # than a user specific url. Only once it comes back from the provider
545         # provider do we know the unique address for the user.
546         if user = User.find_by_openid_url(identity_url)
547           case user.status
548             when "pending" then
549               failed_login t('user.login.account not active', :reconfirm => url_for(:action => 'confirm_resend', :display_name => user.display_name))
550             when "active", "confirmed" then
551               successful_login(user)
552             when "suspended" then
553               failed_login t('user.login.account is suspended', :webmaster => "mailto:webmaster@openstreetmap.org")
554             else
555               failed_login t('user.login.auth failure')
556           end
557         else
558           # Guard against not getting any extension data
559           sreg = Hash.new if sreg.nil?
560           ax = Hash.new if ax.nil?
561
562           # We don't have a user registered to this OpenID, so redirect
563           # to the create account page with username and email filled
564           # in if they have been given by the OpenID provider through
565           # the simple registration protocol.
566           nickname = sreg["nickname"] || ax["http://axschema.org/namePerson/friendly"].first
567           email = sreg["email"] || ax["http://axschema.org/contact/email"].first
568
569           # Check if the openID is from a "trusted" OpenID provider and thus provides a verified email address
570           session[:openid_verified] = openid_email_verified(identity_url, email)
571           redirect_to :controller => 'user', :action => 'new', :nickname => nickname, :email => email, :openid => identity_url
572         end
573       elsif result.missing?
574         failed_login t('user.login.openid missing provider')
575       elsif result.invalid?
576         failed_login t('user.login.openid invalid')
577       else
578         failed_login t('user.login.auth failure')
579       end
580     end
581   end
582
583   ##
584   # verify an OpenID URL
585   def openid_verify(openid_url, user)
586     user.openid_url = openid_url
587
588     authenticate_with_open_id(openid_expand_url(openid_url), :method => :get) do |result, identity_url|
589       if result.successful?
590         # We need to use the openid url passed back from the OpenID provider
591         # rather than the one supplied by the user, as these can be different.
592         #
593         # For example, you can simply enter yahoo.com in the login box rather
594         # than a user specific url. Only once it comes back from the provider
595         # provider do we know the unique address for the user.
596         user.openid_url = identity_url
597         yield user
598       elsif result.missing?
599         flash.now[:error] = t 'user.login.openid missing provider'
600       elsif result.invalid?
601         flash.now[:error] = t 'user.login.openid invalid'
602       else
603         flash.now[:error] = t 'user.login.auth failure'
604       end
605     end
606   end
607
608   ##
609   # special case some common OpenID providers by applying heuristics to
610   # try and come up with the correct URL based on what the user entered
611   def openid_expand_url(openid_url)
612     if openid_url.nil?
613       return nil
614     elsif openid_url.match(/(.*)gmail.com(\/?)$/) or openid_url.match(/(.*)googlemail.com(\/?)$/)
615       # Special case gmail.com as it is potentially a popular OpenID
616       # provider and, unlike yahoo.com, where it works automatically, Google
617       # have hidden their OpenID endpoint somewhere obscure this making it
618       # somewhat less user friendly.
619       return 'https://www.google.com/accounts/o8/id'
620     else
621       return openid_url
622     end
623   end
624
625   def openid_email_verified(openid_url, email)
626     # OpenID providers Google and Yahoo are guaranteed to return (if at all) an email address that has been verified by
627     # them already. So we can trust the email addresses to be valid and own by the user without having to verify them our
628     # selves.
629     # Store the email in the session to compare agains the user set email address during account creation.
630     openid_verified = Hash.new
631     openid_verified[:identity_url] = openid_url
632     if openid_url.match(/https:\/\/www.google.com\/accounts\/o8\/id?(.*)/) or openid_url.match(/https:\/\/me.yahoo.com\/(.*)/)
633         openid_verified[:email] = email
634     end
635     return openid_verified
636     
637   end
638
639   ##
640   # process a successful login
641   def successful_login(user)
642     cookies.permanent["_osm_username"] = user.display_name
643
644     session[:user] = user.id
645     session_expires_after 28.days if session[:remember_me]
646
647     target = session[:referer] || url_for(:controller => :site, :action => :index)
648
649     # The user is logged in, so decide where to send them:
650     #
651     # - If they haven't seen the contributor terms, send them there.
652     # - If they have a block on them, show them that.
653     # - If they were referred to the login, send them back there.
654     # - Otherwise, send them to the home page.
655     if REQUIRE_TERMS_SEEN and not user.terms_seen
656       redirect_to :controller => :user, :action => :terms, :referer => target
657     elsif user.blocked_on_view
658       redirect_to user.blocked_on_view, :referer => target
659     else
660       redirect_to target
661     end
662
663     session.delete(:remember_me)
664     session.delete(:referer)
665   end
666
667   ##
668   # process a failed login
669   def failed_login(message)
670     flash[:error] = message
671
672     redirect_to :action => 'login', :referer =>  session[:referer]
673
674     session.delete(:remember_me)
675     session.delete(:referer)
676   end
677
678   ##
679   # update a user's details
680   def update_user(user, params)
681     user.display_name = params[:user][:display_name]
682     user.new_email = params[:user][:new_email]
683
684     if params[:user][:pass_crypt].length > 0 or params[:user][:pass_crypt_confirmation].length > 0
685       user.pass_crypt = params[:user][:pass_crypt]
686       user.pass_crypt_confirmation = params[:user][:pass_crypt_confirmation]
687     end
688
689     if params[:user][:description] != user.description
690       user.description = params[:user][:description]
691       user.description_format = "markdown"
692     end
693
694     user.languages = params[:user][:languages].split(",")
695
696     case params[:image_action]
697     when "new" then
698       user.image = params[:user][:image]
699       user.image_use_gravatar = false
700     when "delete" then
701       user.image = nil
702       user.image_use_gravatar = false
703     when "gravatar" then
704       user.image = nil
705       user.image_use_gravatar = true
706     end
707
708     user.home_lat = params[:user][:home_lat]
709     user.home_lon = params[:user][:home_lon]
710
711     if params[:user][:preferred_editor] == "default"
712       user.preferred_editor = nil
713     else
714       user.preferred_editor = params[:user][:preferred_editor]
715     end
716
717     user.openid_url = nil if params[:user][:openid_url].blank?
718
719     if user.save
720       set_locale
721
722       cookies.permanent["_osm_username"] = user.display_name
723
724       if user.new_email.blank?
725         flash.now[:notice] = t 'user.account.flash update success'
726       else
727         user.email = user.new_email
728
729         if user.valid?
730           flash.now[:notice] = t 'user.account.flash update success confirm needed'
731
732           begin
733             Notifier.email_confirm(user, user.tokens.create).deliver
734           rescue
735             # Ignore errors sending email
736           end
737         else
738           @user.errors.set(:new_email, @user.errors.get(:email))
739           @user.errors.set(:email, [])
740         end
741
742         user.reset_email!
743       end
744     end
745   end
746
747   ##
748   # require that the user is a administrator, or fill out a helpful error message
749   # and return them to the user page.
750   def require_administrator
751     if @user and not @user.administrator?
752       flash[:error] = t('user.filter.not_an_administrator')
753
754       if params[:display_name]
755         redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name]
756       else
757         redirect_to :controller => 'user', :action => 'login', :referer => request.fullpath
758       end
759     elsif not @user
760       redirect_to :controller => 'user', :action => 'login', :referer => request.fullpath
761     end
762   end
763
764   ##
765   # ensure that there is a "this_user" instance variable
766   def lookup_user_by_id
767     @this_user = User.find(params[:id])
768   end
769
770   ##
771   # ensure that there is a "this_user" instance variable
772   def lookup_user_by_name
773     @this_user = User.find_by_display_name(params[:display_name])
774   rescue ActiveRecord::RecordNotFound
775     redirect_to :controller => 'user', :action => 'view', :display_name => params[:display_name] unless @this_user
776   end
777
778   ##
779   # Choose the layout to use. See
780   # https://rails.lighthouseapp.com/projects/8994/tickets/5371-layout-with-onlyexcept-options-makes-other-actions-render-without-layouts
781   def choose_layout
782     oauth_url = url_for(:controller => :oauth, :action => :authorize, :only_path => true)
783
784     if [ 'api_details' ].include? action_name
785       nil
786     elsif params[:referer] and URI.parse(params[:referer]).path == oauth_url
787       'slim'
788     else
789       'site'
790     end
791   end
792
793   ##
794   #
795   def disable_terms_redirect
796     # this is necessary otherwise going to the user terms page, when
797     # having not agreed already would cause an infinite redirect loop.
798     # it's .now so that this doesn't propagate to other pages.
799     flash.now[:skip_terms] = true
800   end
801 end