]> git.openstreetmap.org Git - rails.git/blob - test/integration/oauth_test.rb
Merge remote-tracking branch 'upstream/pull/2381'
[rails.git] / test / integration / oauth_test.rb
1 require "test_helper"
2
3 class OAuthTest < ActionDispatch::IntegrationTest
4   include OAuth::Helper
5
6   def test_oauth10_web_app
7     client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
8
9     post "/login", :params => { :username => client.user.email, :password => "test" }
10     follow_redirect!
11     follow_redirect!
12     assert_response :success
13
14     oauth10_without_callback(client)
15     oauth10_with_callback(client, "http://another.web.app.example.org/callback")
16     oauth10_refused(client)
17   end
18
19   def test_oauth10_desktop_app
20     client = create(:client_application, :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
21
22     post "/login", :params => { :username => client.user.email, :password => "test" }
23     follow_redirect!
24     follow_redirect!
25     assert_response :success
26
27     oauth10_without_callback(client)
28     oauth10_refused(client)
29   end
30
31   def test_oauth10a_web_app
32     client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
33
34     post "/login", :params => { :username => client.user.email, :password => "test" }
35     follow_redirect!
36     follow_redirect!
37     assert_response :success
38
39     oauth10a_without_callback(client)
40     oauth10a_with_callback(client, "http://another.web.app.example.org/callback")
41     oauth10a_refused(client)
42   end
43
44   def test_oauth10a_desktop_app
45     client = create(:client_application, :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
46
47     post "/login", :params => { :username => client.user.email, :password => "test" }
48     follow_redirect!
49     follow_redirect!
50     assert_response :success
51
52     oauth10a_without_callback(client)
53     oauth10a_refused(client)
54   end
55
56   private
57
58   def oauth10_without_callback(client)
59     token = get_request_token(client)
60
61     get "/oauth/authorize", :params => { :oauth_token => token.token }
62     assert_response :success
63     assert_template :authorize
64
65     post "/oauth/authorize",
66          :params => { :oauth_token => token.token,
67                       :allow_read_prefs => true, :allow_write_prefs => true }
68     if client.callback_url
69       assert_response :redirect
70       assert_redirected_to "#{client.callback_url}?oauth_token=#{token.token}"
71     else
72       assert_response :success
73       assert_template :authorize_success
74     end
75     token.reload
76     assert_not_nil token.created_at
77     assert_not_nil token.authorized_at
78     assert_nil token.invalidated_at
79     assert_allowed token, [:allow_read_prefs]
80
81     signed_get "/oauth/access_token", :consumer => client, :token => token
82     assert_response :success
83     token.reload
84     assert_not_nil token.created_at
85     assert_not_nil token.authorized_at
86     assert_not_nil token.invalidated_at
87     token = parse_token(response)
88     assert_instance_of AccessToken, token
89     assert_not_nil token.created_at
90     assert_not_nil token.authorized_at
91     assert_nil token.invalidated_at
92     assert_allowed token, [:allow_read_prefs]
93
94     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
95     assert_response :success
96
97     signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
98     assert_response :forbidden
99
100     post "/oauth/revoke", :params => { :token => token.token }
101     assert_redirected_to oauth_clients_url(token.user.display_name)
102     token = OauthToken.find_by(:token => token.token)
103     assert_not_nil token.invalidated_at
104
105     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
106     assert_response :unauthorized
107   end
108
109   def oauth10_refused(client)
110     token = get_request_token(client)
111
112     get "/oauth/authorize", :params => { :oauth_token => token.token }
113     assert_response :success
114     assert_template :authorize
115
116     post "/oauth/authorize", :params => { :oauth_token => token.token }
117     assert_response :success
118     assert_template :authorize_failure
119     assert_select "p", "You have denied application #{client.name} access to your account."
120     token.reload
121     assert_nil token.authorized_at
122     assert_not_nil token.invalidated_at
123
124     get "/oauth/authorize", :params => { :oauth_token => token.token }
125     assert_response :success
126     assert_template :authorize_failure
127     assert_select "p", "The authorization token is not valid."
128     token.reload
129     assert_nil token.authorized_at
130     assert_not_nil token.invalidated_at
131
132     post "/oauth/authorize", :params => { :oauth_token => token.token }
133     assert_response :success
134     assert_template :authorize_failure
135     assert_select "p", "The authorization token is not valid."
136     token.reload
137     assert_nil token.authorized_at
138     assert_not_nil token.invalidated_at
139   end
140
141   def oauth10_with_callback(client, callback_url)
142     token = get_request_token(client)
143
144     get "/oauth/authorize", :params => { :oauth_token => token.token }
145     assert_response :success
146     assert_template :authorize
147
148     post "/oauth/authorize",
149          :params => { :oauth_token => token.token, :oauth_callback => callback_url,
150                       :allow_write_api => true, :allow_read_gpx => true }
151     assert_response :redirect
152     assert_redirected_to "#{callback_url}?oauth_token=#{token.token}"
153     token.reload
154     assert_not_nil token.created_at
155     assert_not_nil token.authorized_at
156     assert_nil token.invalidated_at
157     assert_allowed token, [:allow_write_api, :allow_read_gpx]
158
159     signed_get "/oauth/access_token", :consumer => client, :token => token
160     assert_response :success
161     token.reload
162     assert_not_nil token.created_at
163     assert_not_nil token.authorized_at
164     assert_not_nil token.invalidated_at
165     token = parse_token(response)
166     assert_instance_of AccessToken, token
167     assert_not_nil token.created_at
168     assert_not_nil token.authorized_at
169     assert_nil token.invalidated_at
170     assert_allowed token, [:allow_write_api, :allow_read_gpx]
171
172     trace = create(:trace, :user => client.user)
173     signed_get "/api/0.6/gpx/#{trace.id}", :consumer => client, :token => token
174     assert_response :success
175
176     signed_get "/api/0.6/user/details", :consumer => client, :token => token
177     assert_response :forbidden
178
179     post "/oauth/revoke", :params => { :token => token.token }
180     assert_redirected_to oauth_clients_url(token.user.display_name)
181     token = OauthToken.find_by(:token => token.token)
182     assert_not_nil token.invalidated_at
183
184     signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
185     assert_response :unauthorized
186   end
187
188   def oauth10a_without_callback(client)
189     token = get_request_token(client, :oauth_callback => "oob")
190
191     get "/oauth/authorize", :params => { :oauth_token => token.token }
192     assert_response :success
193     assert_template :authorize
194
195     post "/oauth/authorize",
196          :params => { :oauth_token => token.token,
197                       :allow_read_prefs => true, :allow_write_prefs => true }
198     if client.callback_url
199       assert_response :redirect
200       verifier = parse_verifier(response)
201       assert_redirected_to "http://some.web.app.example.org/callback?oauth_token=#{token.token}&oauth_verifier=#{verifier}"
202     else
203       assert_response :success
204       assert_template :authorize_success
205       m = response.body.match("<p>The verification code is ([A-Za-z0-9]+).</p>")
206       assert_not_nil m
207       verifier = m[1]
208     end
209     token.reload
210     assert_not_nil token.created_at
211     assert_not_nil token.authorized_at
212     assert_nil token.invalidated_at
213     assert_allowed token, [:allow_read_prefs]
214
215     signed_get "/oauth/access_token", :consumer => client, :token => token
216     assert_response :unauthorized
217
218     signed_get "/oauth/access_token",
219                :consumer => client, :token => token, :oauth_verifier => verifier
220     assert_response :success
221     token.reload
222     assert_not_nil token.created_at
223     assert_not_nil token.authorized_at
224     assert_not_nil token.invalidated_at
225     token = parse_token(response)
226     assert_instance_of AccessToken, token
227     assert_not_nil token.created_at
228     assert_not_nil token.authorized_at
229     assert_nil token.invalidated_at
230     assert_allowed token, [:allow_read_prefs]
231
232     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
233     assert_response :success
234
235     trace = create(:trace, :user => client.user)
236     signed_get "/api/0.6/gpx/#{trace.id}", :consumer => client, :token => token
237     assert_response :forbidden
238
239     post "/oauth/revoke", :params => { :token => token.token }
240     assert_redirected_to oauth_clients_url(token.user.display_name)
241     token = OauthToken.find_by(:token => token.token)
242     assert_not_nil token.invalidated_at
243
244     signed_get "/api/0.6/user/preferences", :consumer => client, :token => token
245     assert_response :unauthorized
246   end
247
248   def oauth10a_with_callback(client, callback_url)
249     token = get_request_token(client, :oauth_callback => callback_url)
250
251     get "/oauth/authorize", :params => { :oauth_token => token.token }
252     assert_response :success
253     assert_template :authorize
254
255     post "/oauth/authorize",
256          :params => { :oauth_token => token.token,
257                       :allow_write_api => true, :allow_read_gpx => true }
258     assert_response :redirect
259     verifier = parse_verifier(response)
260     assert_redirected_to "#{callback_url}?oauth_token=#{token.token}&oauth_verifier=#{verifier}"
261     token.reload
262     assert_not_nil token.created_at
263     assert_not_nil token.authorized_at
264     assert_nil token.invalidated_at
265     assert_allowed token, [:allow_write_api, :allow_read_gpx]
266
267     signed_get "/oauth/access_token", :consumer => client, :token => token
268     assert_response :unauthorized
269
270     signed_get "/oauth/access_token",
271                :consumer => client, :token => token, :oauth_verifier => verifier
272     assert_response :success
273     token.reload
274     assert_not_nil token.created_at
275     assert_not_nil token.authorized_at
276     assert_not_nil token.invalidated_at
277     token = parse_token(response)
278     assert_instance_of AccessToken, token
279     assert_not_nil token.created_at
280     assert_not_nil token.authorized_at
281     assert_nil token.invalidated_at
282     assert_allowed token, [:allow_write_api, :allow_read_gpx]
283
284     trace = create(:trace, :user => client.user)
285     signed_get "/api/0.6/gpx/#{trace.id}", :consumer => client, :token => token
286     assert_response :success
287
288     signed_get "/api/0.6/user/details", :consumer => client, :token => token
289     assert_response :forbidden
290
291     post "/oauth/revoke", :params => { :token => token.token }
292     assert_redirected_to oauth_clients_url(token.user.display_name)
293     token = OauthToken.find_by(:token => token.token)
294     assert_not_nil token.invalidated_at
295
296     signed_get "/api/0.6/gpx/2", :consumer => client, :token => token
297     assert_response :unauthorized
298   end
299
300   def oauth10a_refused(client)
301     token = get_request_token(client, :oauth_callback => "oob")
302
303     get "/oauth/authorize", :params => { :oauth_token => token.token }
304     assert_response :success
305     assert_template :authorize
306
307     post "/oauth/authorize", :params => { :oauth_token => token.token }
308     assert_response :success
309     assert_template :authorize_failure
310     assert_select "p", "You have denied application #{client.name} access to your account."
311     token.reload
312     assert_nil token.authorized_at
313     assert_not_nil token.invalidated_at
314
315     get "/oauth/authorize", :params => { :oauth_token => token.token }
316     assert_response :success
317     assert_template :authorize_failure
318     assert_select "p", "The authorization token is not valid."
319     token.reload
320     assert_nil token.authorized_at
321     assert_not_nil token.invalidated_at
322
323     post "/oauth/authorize", :params => { :oauth_token => token.token }
324     assert_response :success
325     assert_template :authorize_failure
326     assert_select "p", "The authorization token is not valid."
327     token.reload
328     assert_nil token.authorized_at
329     assert_not_nil token.invalidated_at
330   end
331
332   def get_request_token(client, options = {})
333     signed_get "/oauth/request_token", options.merge(:consumer => client)
334     assert_response :success
335     token = parse_token(response)
336     assert_instance_of RequestToken, token
337     assert_not_nil token.created_at
338     assert_nil token.authorized_at
339     assert_nil token.invalidated_at
340     assert_equal_allowing_nil options[:oauth_callback], token.callback_url
341     assert_allowed token, client.permissions
342
343     token
344   end
345
346   def signed_get(uri, options)
347     uri = URI.parse(uri)
348     uri.scheme ||= "http"
349     uri.host ||= "www.example.com"
350
351     helper = OAuth::Client::Helper.new(nil, options)
352
353     request = OAuth::RequestProxy.proxy(
354       "method" => "GET",
355       "uri" => uri,
356       "parameters" => helper.oauth_parameters
357     )
358
359     request.sign!(options)
360
361     get request.signed_uri
362   end
363
364   def parse_token(response)
365     params = CGI.parse(response.body)
366
367     token = OauthToken.find_by(:token => params["oauth_token"].first)
368     assert_equal token.secret, params["oauth_token_secret"].first
369
370     token
371   end
372
373   def parse_verifier(response)
374     params = CGI.parse(URI.parse(response.location).query)
375
376     assert_not_nil params["oauth_verifier"]
377     assert params["oauth_verifier"].first.present?
378
379     params["oauth_verifier"].first
380   end
381
382   def assert_allowed(token, allowed)
383     ClientApplication.all_permissions.each do |p|
384       assert_equal allowed.include?(p), token.attributes[p.to_s]
385     end
386   end
387 end