]> git.openstreetmap.org Git - rails.git/blob - app/controllers/api_controller.rb
ca09e580751b3752e1922ea65712a2b63efe9b57
[rails.git] / app / controllers / api_controller.rb
1 class ApiController < ApplicationController
2   skip_before_action :verify_authenticity_token
3
4   private
5
6   # Set format to xml unless client requires a specific format
7   def default_format_xml
8     request.format = "xml" unless params[:format]
9   end
10
11   def authorize(realm = "Web Password", errormessage = "Couldn't authenticate you")
12     # make the current_user object from any auth sources we have
13     setup_user_auth
14
15     # handle authenticate pass/fail
16     unless current_user
17       # no auth, the user does not exist or the password was wrong
18       response.headers["WWW-Authenticate"] = "Basic realm=\"#{realm}\""
19       render :plain => errormessage, :status => :unauthorized
20       false
21     end
22   end
23
24   def current_ability
25     # Use capabilities from the oauth token if it exists and is a valid access token
26     if Authenticator.new(self, [:token]).allow?
27       ApiAbility.new(nil).merge(ApiCapability.new(current_token))
28     else
29       ApiAbility.new(current_user)
30     end
31   end
32
33   def deny_access(_exception)
34     if current_token
35       set_locale
36       report_error t("oauth.permissions.missing"), :forbidden
37     elsif current_user
38       head :forbidden
39     else
40       realm = "Web Password"
41       errormessage = "Couldn't authenticate you"
42       response.headers["WWW-Authenticate"] = "Basic realm=\"#{realm}\""
43       render :plain => errormessage, :status => :unauthorized
44     end
45   end
46
47   def gpx_status
48     status = database_status
49     status = "offline" if status == "online" && Settings.status == "gpx_offline"
50     status
51   end
52
53   ##
54   # sets up the current_user for use by other methods. this is mostly called
55   # from the authorize method, but can be called elsewhere if authorisation
56   # is optional.
57   def setup_user_auth
58     # try and setup using OAuth
59     unless Authenticator.new(self, [:token]).allow?
60       username, passwd = get_auth_data # parse from headers
61       # authenticate per-scheme
62       self.current_user = if username.nil?
63                             nil # no authentication provided - perhaps first connect (client should retry after 401)
64                           elsif username == "token"
65                             User.authenticate(:token => passwd) # preferred - random token for user from db, passed in basic auth
66                           else
67                             User.authenticate(:username => username, :password => passwd) # basic auth
68                           end
69     end
70
71     # have we identified the user?
72     if current_user
73       # check if the user has been banned
74       user_block = current_user.blocks.active.take
75       unless user_block.nil?
76         set_locale
77         if user_block.zero_hour?
78           report_error t("application.setup_user_auth.blocked_zero_hour"), :forbidden
79         else
80           report_error t("application.setup_user_auth.blocked"), :forbidden
81         end
82       end
83
84       # if the user hasn't seen the contributor terms then don't
85       # allow editing - they have to go to the web site and see
86       # (but can decline) the CTs to continue.
87       if !current_user.terms_seen && flash[:skip_terms].nil?
88         set_locale
89         report_error t("application.setup_user_auth.need_to_see_terms"), :forbidden
90       end
91     end
92   end
93 end