]> git.openstreetmap.org Git - rails.git/blob - app/controllers/concerns/session_methods.rb
Merge pull request #7302 from tomhughes/terms-locale
[rails.git] / app / controllers / concerns / session_methods.rb
1 # frozen_string_literal: true
2
3 module SessionMethods
4   extend ActiveSupport::Concern
5
6   private
7
8   ##
9   # Read @preferred_auth_provider and @client_app_name from oauth2 authorization request's referer
10   def parse_oauth_referer(referer)
11     referer_query = URI(referer).query if referer
12     return unless referer_query
13
14     ref_params = CGI.parse referer_query
15     preferred = ref_params["preferred_auth_provider"].first
16     @preferred_auth_provider = preferred if preferred && Settings.key?(:"#{preferred}_auth_id")
17     @client_app_name = Oauth2Application.where(:uid => ref_params["client_id"].first).pick(:name)
18
19     @hide_signup = ref_params["allow_signup"].first == "false"
20   end
21
22   ##
23   # return the URL to use for authentication
24   def auth_url(provider, referer = nil)
25     params = { :provider => provider }
26
27     if referer.nil?
28       params[:origin] = request.path
29     else
30       params[:origin] = "#{request.path}?referer=#{CGI.escape(referer)}"
31       params[:referer] = referer
32     end
33
34     auth_path(params)
35   end
36
37   ##
38   # process a successful login
39   def successful_login(user, referer = nil)
40     session[:user] = user.id
41     session[:fingerprint] = user.fingerprint
42     session_expires_after 28.days if session[:remember_me]
43
44     cookies.delete :_osm_anonymous_notes_count
45
46     target = referer || url_for(:controller => :site, :action => :index)
47
48     # The user is logged in, so decide where to send them:
49     #
50     # - If they haven't seen the contributor terms, send them there.
51     # - If they have a block on them, show them that.
52     # - If they were referred to the login, send them back there.
53     # - Otherwise, send them to the home page.
54     if !user.terms_seen
55       redirect_to account_terms_path(:referer => target)
56     elsif user.blocked_on_view
57       redirect_to user.blocked_on_view, :referer => target
58     else
59       redirect_to target
60     end
61
62     session.delete(:remember_me)
63   end
64
65   ##
66   # process a failed login
67   def failed_login(message, username, referer = nil)
68     flash[:error] = message
69
70     redirect_to :controller => "sessions", :action => "new", :referer => referer,
71                 :username => username, :remember_me => session[:remember_me]
72
73     session.delete(:remember_me)
74   end
75
76   ##
77   #
78   def unconfirmed_login(user, referer = nil)
79     session[:pending_user] = user.id
80
81     redirect_to :controller => "confirmations", :action => "confirm",
82                 :display_name => user.display_name, :referer => referer
83
84     session.delete(:remember_me)
85   end
86 end