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