Merge branch 'master' into 2272-setup-user-in-workbench
[arvados.git] / services / api / test / integration / permissions_test.rb
1 require 'test_helper'
2
3 class PermissionsTest < ActionDispatch::IntegrationTest
4   fixtures :users, :groups, :api_client_authorizations, :collections
5
6   def auth auth_fixture
7     {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(auth_fixture).api_token}"}
8   end
9
10   test "adding and removing direct can_read links" do
11     # try to read collection as spectator
12     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
13     assert_response 404
14
15     # try to add permission as spectator
16     post "/arvados/v1/links", {
17       :format => :json,
18       :link => {
19         tail_kind: 'arvados#user',
20         tail_uuid: users(:spectator).uuid,
21         link_class: 'permission',
22         name: 'can_read',
23         head_kind: 'arvados#collection',
24         head_uuid: collections(:foo_file).uuid,
25         properties: {}
26       }
27     }, auth(:spectator)
28     assert_response 422
29
30     # add permission as admin
31     post "/arvados/v1/links", {
32       :format => :json,
33       :link => {
34         tail_kind: 'arvados#user',
35         tail_uuid: users(:spectator).uuid,
36         link_class: 'permission',
37         name: 'can_read',
38         head_kind: 'arvados#collection',
39         head_uuid: collections(:foo_file).uuid,
40         properties: {}
41       }
42     }, auth(:admin)
43     u = jresponse['uuid']
44     assert_response :success
45
46     # read collection as spectator
47     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
48     assert_response :success
49
50     # try to delete permission as spectator
51     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:spectator)
52     assert_response 403
53
54     # delete permission as admin
55     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
56     assert_response :success
57
58     # try to read collection as spectator
59     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
60     assert_response 404
61   end
62
63
64   test "adding can_read links from user to group, group to collection" do
65     # try to read collection as spectator
66     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
67     assert_response 404
68
69     # add permission for spectator to read group
70     post "/arvados/v1/links", {
71       :format => :json,
72       :link => {
73         tail_kind: 'arvados#user',
74         tail_uuid: users(:spectator).uuid,
75         link_class: 'permission',
76         name: 'can_read',
77         head_kind: 'arvados#group',
78         head_uuid: groups(:private).uuid,
79         properties: {}
80       }
81     }, auth(:admin)
82     assert_response :success
83
84     # try to read collection as spectator
85     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
86     assert_response 404
87
88     # add permission for group to read collection
89     post "/arvados/v1/links", {
90       :format => :json,
91       :link => {
92         tail_kind: 'arvados#group',
93         tail_uuid: groups(:private).uuid,
94         link_class: 'permission',
95         name: 'can_read',
96         head_kind: 'arvados#collection',
97         head_uuid: collections(:foo_file).uuid,
98         properties: {}
99       }
100     }, auth(:admin)
101     u = jresponse['uuid']
102     assert_response :success
103
104     # try to read collection as spectator
105     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
106     assert_response :success
107
108     # delete permission for group to read collection
109     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
110     assert_response :success
111
112     # try to read collection as spectator
113     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
114     assert_response 404
115     
116   end
117
118
119   test "adding can_read links from group to collection, user to group" do
120     # try to read collection as spectator
121     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
122     assert_response 404
123
124     # add permission for group to read collection
125     post "/arvados/v1/links", {
126       :format => :json,
127       :link => {
128         tail_kind: 'arvados#group',
129         tail_uuid: groups(:private).uuid,
130         link_class: 'permission',
131         name: 'can_read',
132         head_kind: 'arvados#collection',
133         head_uuid: collections(:foo_file).uuid,
134         properties: {}
135       }
136     }, auth(:admin)
137     assert_response :success
138
139     # try to read collection as spectator
140     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
141     assert_response 404
142
143     # add permission for spectator to read group
144     post "/arvados/v1/links", {
145       :format => :json,
146       :link => {
147         tail_kind: 'arvados#user',
148         tail_uuid: users(:spectator).uuid,
149         link_class: 'permission',
150         name: 'can_read',
151         head_kind: 'arvados#group',
152         head_uuid: groups(:private).uuid,
153         properties: {}
154       }
155     }, auth(:admin)
156     u = jresponse['uuid']
157     assert_response :success
158
159     # try to read collection as spectator
160     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
161     assert_response :success
162
163     # delete permission for spectator to read group
164     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
165     assert_response :success
166
167     # try to read collection as spectator
168     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
169     assert_response 404
170     
171   end
172
173   test "adding can_read links from user to group, group to group, group to collection" do
174     # try to read collection as spectator
175     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
176     assert_response 404
177
178     # add permission for user to read group
179     post "/arvados/v1/links", {
180       :format => :json,
181       :link => {
182         tail_kind: 'arvados#user',
183         tail_uuid: users(:spectator).uuid,
184         link_class: 'permission',
185         name: 'can_read',
186         head_kind: 'arvados#group',
187         head_uuid: groups(:private).uuid,
188         properties: {}
189       }
190     }, auth(:admin)
191     assert_response :success
192
193     # add permission for group to read group
194     post "/arvados/v1/links", {
195       :format => :json,
196       :link => {
197         tail_kind: 'arvados#group',
198         tail_uuid: groups(:private).uuid,
199         link_class: 'permission',
200         name: 'can_read',
201         head_kind: 'arvados#group',
202         head_uuid: groups(:empty_lonely_group).uuid,
203         properties: {}
204       }
205     }, auth(:admin)
206     assert_response :success
207
208     # add permission for group to read collection
209     post "/arvados/v1/links", {
210       :format => :json,
211       :link => {
212         tail_kind: 'arvados#group',
213         tail_uuid: groups(:empty_lonely_group).uuid,
214         link_class: 'permission',
215         name: 'can_read',
216         head_kind: 'arvados#collection',
217         head_uuid: collections(:foo_file).uuid,
218         properties: {}
219       }
220     }, auth(:admin)
221     u = jresponse['uuid']
222     assert_response :success
223
224     # try to read collection as spectator
225     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
226     assert_response :success
227
228     # delete permission for group to read collection
229     delete "/arvados/v1/links/#{u}", {:format => :json}, auth(:admin)
230     assert_response :success
231
232     # try to read collection as spectator
233     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth(:spectator)
234     assert_response 404
235   end
236
237   test "read-only group-admin sees correct subset of user list" do
238     get "/arvados/v1/users", {:format => :json}, auth(:rominiadmin)
239     assert_response :success
240     resp_uuids = jresponse['items'].collect { |i| i['uuid'] }
241     [[true, users(:rominiadmin).uuid],
242      [true, users(:active).uuid],
243      [false, users(:miniadmin).uuid],
244      [false, users(:spectator).uuid]].each do |should_find, uuid|
245       assert_equal should_find, !resp_uuids.index(uuid).nil?, "rominiadmin should #{'not ' if !should_find}see #{uuid} in user list"
246     end
247   end
248
249   test "read-only group-admin cannot modify administered user" do
250     put "/arvados/v1/users/#{users(:active).uuid}", {
251       :user => {
252         first_name: 'KilroyWasHere'
253       },
254       :format => :json
255     }, auth(:rominiadmin)
256     assert_response 403
257   end
258
259   test "read-only group-admin cannot read or update non-administered user" do
260     get "/arvados/v1/users/#{users(:spectator).uuid}", {
261       :format => :json
262     }, auth(:rominiadmin)
263     assert_response 404
264
265     put "/arvados/v1/users/#{users(:spectator).uuid}", {
266       :user => {
267         first_name: 'KilroyWasHere'
268       },
269       :format => :json
270     }, auth(:rominiadmin)
271     assert_response 404
272   end
273
274   test "RO group-admin finds user's specimens, RW group-admin can update" do
275     [[:rominiadmin, false],
276      [:miniadmin, true]].each do |which_user, update_should_succeed|
277       get "/arvados/v1/specimens", {:format => :json}, auth(which_user)
278       assert_response :success
279       resp_uuids = jresponse['items'].collect { |i| i['uuid'] }
280       [[true, specimens(:owned_by_active_user).uuid],
281        [true, specimens(:owned_by_private_group).uuid],
282        [false, specimens(:owned_by_spectator).uuid],
283       ].each do |should_find, uuid|
284         assert_equal(should_find, !resp_uuids.index(uuid).nil?,
285                      "%s should%s see %s in specimen list" %
286                      [which_user.to_s,
287                       should_find ? '' : 'not ',
288                       uuid])
289         put "/arvados/v1/specimens/#{uuid}", {
290           :specimen => {
291             properties: {
292               miniadmin_was_here: true
293             }
294           },
295           :format => :json
296         }, auth(which_user)
297         if !should_find
298           assert_response 404
299         elsif !update_should_succeed
300           assert_response 403
301         else
302           assert_response :success
303         end
304       end
305     end
306   end
307
308 end