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