Merge branch '2290-user-activity'
[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   test "adding and removing direct can_read links" do
7     auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:spectator).api_token}"}
8     admin_auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:admin).api_token}"}
9
10     # try to read collection as spectator
11     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
12     assert_response 404
13
14     # try to add permission as spectator
15     post "/arvados/v1/links", {
16       :format => :json,
17       :link => {
18         tail_kind: 'arvados#user',
19         tail_uuid: users(:spectator).uuid,
20         link_class: 'permission',
21         name: 'can_read',
22         head_kind: 'arvados#collection',
23         head_uuid: collections(:foo_file).uuid,
24         properties: {}
25       }
26     }, auth
27     assert_response 422
28
29     # add permission as admin
30     post "/arvados/v1/links", {
31       :format => :json,
32       :link => {
33         tail_kind: 'arvados#user',
34         tail_uuid: users(:spectator).uuid,
35         link_class: 'permission',
36         name: 'can_read',
37         head_kind: 'arvados#collection',
38         head_uuid: collections(:foo_file).uuid,
39         properties: {}
40       }
41     }, admin_auth
42     u = jresponse['uuid']
43     assert_response :success
44
45     # read collection as spectator
46     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
47     assert_response :success
48
49     # try to delete permission as spectator
50     delete "/arvados/v1/links/#{u}", {:format => :json}, auth
51     assert_response 403
52
53     # delete permission as admin
54     delete "/arvados/v1/links/#{u}", {:format => :json}, admin_auth
55     assert_response :success
56
57     # try to read collection as spectator
58     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
59     assert_response 404
60   end
61
62
63   test "adding can_read links from user to group, group to collection" do
64     auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:spectator).api_token}"}
65     admin_auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:admin).api_token}"}
66     
67     # try to read collection as spectator
68     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
69     assert_response 404
70
71     # add permission for spectator to read group
72     post "/arvados/v1/links", {
73       :format => :json,
74       :link => {
75         tail_kind: 'arvados#user',
76         tail_uuid: users(:spectator).uuid,
77         link_class: 'permission',
78         name: 'can_read',
79         head_kind: 'arvados#group',
80         head_uuid: groups(:private).uuid,
81         properties: {}
82       }
83     }, admin_auth
84     assert_response :success
85
86     # try to read collection as spectator
87     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
88     assert_response 404
89
90     # add permission for group to read collection
91     post "/arvados/v1/links", {
92       :format => :json,
93       :link => {
94         tail_kind: 'arvados#group',
95         tail_uuid: groups(:private).uuid,
96         link_class: 'permission',
97         name: 'can_read',
98         head_kind: 'arvados#collection',
99         head_uuid: collections(:foo_file).uuid,
100         properties: {}
101       }
102     }, admin_auth
103     u = jresponse['uuid']
104     assert_response :success
105
106     # try to read collection as spectator
107     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
108     assert_response :success
109
110     # delete permission for group to read collection
111     delete "/arvados/v1/links/#{u}", {:format => :json}, admin_auth
112     assert_response :success
113
114     # try to read collection as spectator
115     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
116     assert_response 404
117     
118   end
119
120
121   test "adding can_read links from group to collection, user to group" do
122     auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:spectator).api_token}"}
123     admin_auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:admin).api_token}"}
124     
125     # try to read collection as spectator
126     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
127     assert_response 404
128
129     # add permission for group to read collection
130     post "/arvados/v1/links", {
131       :format => :json,
132       :link => {
133         tail_kind: 'arvados#group',
134         tail_uuid: groups(:private).uuid,
135         link_class: 'permission',
136         name: 'can_read',
137         head_kind: 'arvados#collection',
138         head_uuid: collections(:foo_file).uuid,
139         properties: {}
140       }
141     }, admin_auth
142     assert_response :success
143
144     # try to read collection as spectator
145     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
146     assert_response 404
147
148     # add permission for spectator to read group
149     post "/arvados/v1/links", {
150       :format => :json,
151       :link => {
152         tail_kind: 'arvados#user',
153         tail_uuid: users(:spectator).uuid,
154         link_class: 'permission',
155         name: 'can_read',
156         head_kind: 'arvados#group',
157         head_uuid: groups(:private).uuid,
158         properties: {}
159       }
160     }, admin_auth
161     u = jresponse['uuid']
162     assert_response :success
163
164     # try to read collection as spectator
165     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
166     assert_response :success
167
168     # delete permission for spectator to read group
169     delete "/arvados/v1/links/#{u}", {:format => :json}, admin_auth
170     assert_response :success
171
172     # try to read collection as spectator
173     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
174     assert_response 404
175     
176   end
177
178   test "adding can_read links from user to group, group to group, group to collection" do
179     auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:spectator).api_token}"}
180     admin_auth = {'HTTP_AUTHORIZATION' => "OAuth2 #{api_client_authorizations(:admin).api_token}"}
181     
182     # try to read collection as spectator
183     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
184     assert_response 404
185
186     # add permission for user to read group
187     post "/arvados/v1/links", {
188       :format => :json,
189       :link => {
190         tail_kind: 'arvados#user',
191         tail_uuid: users(:spectator).uuid,
192         link_class: 'permission',
193         name: 'can_read',
194         head_kind: 'arvados#group',
195         head_uuid: groups(:private).uuid,
196         properties: {}
197       }
198     }, admin_auth
199     assert_response :success
200
201     # add permission for group to read group
202     post "/arvados/v1/links", {
203       :format => :json,
204       :link => {
205         tail_kind: 'arvados#group',
206         tail_uuid: groups(:private).uuid,
207         link_class: 'permission',
208         name: 'can_read',
209         head_kind: 'arvados#group',
210         head_uuid: groups(:empty_lonely_group).uuid,
211         properties: {}
212       }
213     }, admin_auth
214     assert_response :success
215
216     # add permission for group to read collection
217     post "/arvados/v1/links", {
218       :format => :json,
219       :link => {
220         tail_kind: 'arvados#group',
221         tail_uuid: groups(:empty_lonely_group).uuid,
222         link_class: 'permission',
223         name: 'can_read',
224         head_kind: 'arvados#collection',
225         head_uuid: collections(:foo_file).uuid,
226         properties: {}
227       }
228     }, admin_auth
229     u = jresponse['uuid']
230     assert_response :success
231
232     # try to read collection as spectator
233     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
234     assert_response :success
235
236     # delete permission for group to read collection
237     delete "/arvados/v1/links/#{u}", {:format => :json}, admin_auth
238     assert_response :success
239
240     # try to read collection as spectator
241     get "/arvados/v1/collections/#{collections(:foo_file).uuid}", {:format => :json}, auth
242     assert_response 404
243   end
244 end