[api] fix test case for read access protected branches
[opensuse:build-service.git] / src / api / test / functional / read_permission_test.rb
1 # encoding: UTF-8
2 require File.expand_path(File.dirname(__FILE__) + "/..") + "/test_helper"
3 require 'source_controller'
4
5 class ReadPermissionTest < ActionController::IntegrationTest 
6
7   fixtures :all
8   
9   def test_basic_read_tests_public
10     # anonymous access only, it is anyway mapped to nobody in public controller
11     ActionController::IntegrationTest::reset_auth 
12     get "/public/source/SourceprotectedProject/pack"
13     assert_response 403
14     get "/public/source/SourceprotectedProject/pack/my_file"
15     assert_response 403
16   end
17
18   def test_basic_repository_tests_public
19     # anonymous access only, it is anyway mapped to nobody in public controller
20     ActionController::IntegrationTest::reset_auth 
21     get "/public/build/SourceprotectedProject/repo/i586/pack"
22     assert_response 200
23
24     srcrpm="package-1.0-1.src.rpm"
25
26     get "/public/build/SourceprotectedProject/repo/i586/pack"
27     assert_response :success
28     assert_tag( :tag => "binarylist" )
29     assert_tag( :tag => "binary", :attributes => { :filename => "package-1.0-1.i586.rpm" } )
30     assert_no_tag( :tag => "binary", :attributes => { :filename => srcrpm } )
31
32     # test aggregated package
33     get "/public/build/home:adrian:ProtectionTest/repo/i586/aggregate"
34     assert_response :success
35     assert_tag( :tag => "binarylist" )
36     assert_tag( :tag => "binary", :attributes => { :filename => "package-1.0-1.i586.rpm" } )
37     assert_no_tag( :tag => "binary", :attributes => { :filename => srcrpm } )
38   end
39
40   def test_basic_read_tests
41     # anonymous access
42     ActionController::IntegrationTest::reset_auth 
43     get "/source/SourceprotectedProject"
44     assert_response 401
45     get "/source/SourceprotectedProject/_meta"
46     assert_response 401
47     get "/source/SourceprotectedProject/pack"
48     assert_response 401
49
50     # user access
51     prepare_request_with_user "tom", "thunder"
52     get "/source/SourceprotectedProject"
53     assert_response :success
54     get "/source/SourceprotectedProject/_meta"
55     assert_response :success
56     get "/source/SourceprotectedProject/pack"
57     assert_response 403
58
59     # reader access
60     prepare_request_with_user "sourceaccess_homer", "homer"
61     get "/source/SourceprotectedProject"
62     assert_response :success
63     get "/source/SourceprotectedProject/_meta"
64     assert_response :success
65     get "/source/SourceprotectedProject/pack"
66     assert_response :success
67   end
68
69   def test_basic_repository_tests
70     # anonymous access
71     ActionController::IntegrationTest::reset_auth 
72     get "/build/SourceprotectedProject/repo/i586/pack"
73     assert_response 401
74
75     srcrpm="package-1.0-1.src.rpm"
76
77     # user access
78     prepare_request_with_user "tom", "thunder"
79     get "/source/SourceprotectedProject/_meta"
80     get "/build/SourceprotectedProject/repo/i586/pack"
81     assert_response :success
82     assert_tag( :tag => "binarylist" )
83     assert_tag( :tag => "binary", :attributes => { :filename => "package-1.0-1.i586.rpm" } )
84     assert_no_tag( :tag => "binary", :attributes => { :filename => srcrpm } )
85
86     get "/build/SourceprotectedProject/repo/i586/pack/#{srcrpm}"
87     assert_response 404
88
89     # test aggregated package
90     get "/build/home:adrian:ProtectionTest/repo/i586/aggregate"
91     assert_response :success
92     assert_tag( :tag => "binarylist" )
93     assert_tag( :tag => "binary", :attributes => { :filename => "package-1.0-1.i586.rpm" } )
94     assert_no_tag( :tag => "binary", :attributes => { :filename => srcrpm } )
95   end
96
97   def test_deleted_projectlist
98     prepare_request_valid_user
99     get "/source?deleted"
100     assert_response 403
101     assert_match(/only admins can see deleted projects/, @response.body )
102
103     prepare_request_with_user "king", "sunflower"
104     get "/source?deleted"
105     assert_response :success
106     # can't do any check on the list without also deleting projects, which is too much for this test
107     assert_tag( :tag => "directory" )
108   end 
109
110   def do_read_access_all_pathes(user, response, debug=false)
111     ActionController::IntegrationTest::reset_auth 
112     prepare_request_with_user user, "so_alone" #adrian users have all the same password
113     get "/source/HiddenProject/_meta"
114     assert_response response
115     get "/source/HiddenProject"
116     assert_response response
117     get "/source/HiddenProject/pack"
118     assert_response response
119     get "/source/HiddenProject/pack/_meta"
120     assert_response response
121     get "/source/HiddenProject/pack/my_file"
122     assert_response response
123   end
124   protected :do_read_access_all_pathes
125
126   def test_read_hidden_prj_maintainer
127     # Access as a maintainer to a hidden project
128     do_read_access_all_pathes( "adrian", :success )
129   end
130   def test_read_hidden_prj_reader
131     # Hidden project is visible to all involved users
132     do_read_access_all_pathes( "adrian_reader", :success )
133   end
134   def test_read_hidden_prj_downloader
135     # Visible to all involved users
136     do_read_access_all_pathes( "adrian_downloader", :success )
137   end
138   def test_read_hidden_prj_nobody
139     # Hidden project not visible to external user
140     do_read_access_all_pathes( "adrian_nobody", 404 )
141   end
142
143   def test_branch_package_hidden_project_new
144     # unauthorized
145     ActionController::IntegrationTest::reset_auth 
146     sprj="HiddenProject"  # source project
147     spkg="pack"           # source package
148     tprj="home:tom"       # target project
149     resp=401              # response
150     match=/Authentication required/
151     testflag=nil          # test for flag in target meta
152     delresp=401           # delete again
153     debug=false
154     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
155     # tom/thunder
156     prepare_request_with_user "tom", "thunder"
157     resp=404
158     match=/unknown_project/
159     delresp=404
160     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
161     # maintainer
162     prepare_request_with_user "hidden_homer", "homer"
163     tprj="home:hidden_homer:tmp"
164     get "/source/#{tprj}"
165     assert_response 404
166     resp=:success
167     delresp=:success
168     match=/>HiddenProject</
169     testflag=/<access>/
170     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
171     delete "/source/#{tprj}"
172     assert_response :success
173     # admin
174     prepare_request_with_user "king", "sunflower"
175     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
176     delete "/source/#{tprj}"
177     assert_response :success
178
179     # open -> hidden
180     # unauthorized
181     ActionController::IntegrationTest::reset_auth 
182     sprj="home:coolo:test"       # source project
183     spkg="kdelibs_DEVEL_package" # source package
184     tprj="HiddenProject"         # target project
185     resp=401                     # response
186     match=/Authentication required/
187     testflag=nil          # test for flag in target meta
188     delresp=401           # delete again
189     debug=false
190     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
191     # tom/thunder
192     prepare_request_with_user "tom", "thunder"
193     resp=403
194     match=/cmd_execution_no_permission/
195     delresp=404
196     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
197     # maintainer
198
199     prepare_request_with_user "hidden_homer", "homer"
200     get "/source/#{tprj}/_meta"
201     assert :success
202     resp=:success
203     delresp=:success
204     match=/>HiddenProject</
205     testflag=/<access>/
206     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
207     # admin
208     prepare_request_with_user "king", "sunflower"
209     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
210   end
211
212   def test_branch_package_sourceaccess_protected_project_new
213     # viewprotected -> open
214     # unauthorized
215     ActionController::IntegrationTest::reset_auth 
216     sprj="SourceprotectedProject" # source project
217     spkg="pack"                   # source package
218     tprj="home:tom"               # target project
219     resp=401                      # response
220     match=/Authentication required/
221     testflag=nil          # test for flag in target meta
222     delresp=401           # delete again
223     debug=false
224     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
225     # tom/thunder
226     prepare_request_with_user "tom", "thunder"
227     resp=403
228     match=/source_access_no_permission/
229     delresp=404
230     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
231     # maintainer
232     prepare_request_with_user "sourceaccess_homer", "homer"
233     tprj="home:sourceaccess_homer"
234     resp=:success
235     match="SourceprotectedProject"
236     testflag=/sourceaccess/
237     delresp=:success
238     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
239     # admin
240     prepare_request_with_user "king", "sunflower"
241     do_branch_package_test(sprj, spkg, tprj, resp, match, testflag, delresp, debug)
242   end
243
244   def do_branch_package_test (sprj, spkg, tprj, resp, match, testflag, delresp, debug)
245     post "/source/#{sprj}/#{spkg}", :cmd => :branch, :target_project => "#{tprj}"
246     puts @response.body if debug
247     assert_response resp if resp
248     assert_match(match, @response.body) if match
249     get "/source/#{tprj}" if debug
250     puts @response.body if debug
251     get "/source/#{tprj}/_meta"
252     puts @response.body if debug
253     # FIXME: implementation is not done, change to assert_tag or assert_select
254     assert_match(testflag, @response.body) if testflag
255     delete "/source/#{tprj}/#{spkg}"
256     puts @response.body if debug
257     assert_response delresp if delresp
258   end
259
260   def do_read_access_project(user, pass, targetproject, response)
261     ActionController::IntegrationTest::reset_auth 
262     prepare_request_with_user user, pass
263     get "/source/#{targetproject}/_meta"
264     assert_response response
265     get "/source/#{targetproject}"
266   end
267
268   def do_read_access_package(user, pass, targetproject, package, response)
269     assert_response response
270     get "/source/#{targetproject}/pack"
271     assert_response response
272     get "/source/#{targetproject}/pack/_meta"
273     assert_response response
274     get "/source/#{targetproject}/pack/my_file"
275     assert_response response
276   end
277   protected :do_read_access_project
278   protected :do_read_access_package
279
280   def do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
281     get "/source/#{destprj}/#{destpkg}/_meta"
282     orig=@response.body
283     post "/source/#{destprj}/#{destpkg}", :cmd => "copy", :oproject => "#{srcprj}", :opackage => "#{srcpkg}"
284     puts @response.body if debug
285     assert_response resp if resp
286     # ret destination package meta
287     get "/source/#{destprj}/#{destpkg}/_meta"
288     puts @response.body if debug
289     # Fixme do assert_tag or assert_select if implementation is fixed
290     assert_match(flag, @response.body) if flag
291     delete "/source/#{destprj}/#{destpkg}"
292     puts @response.body if debug
293     assert_response delresp if delresp
294     get url_for(:controller => :source, :action => :package_meta, :project => "#{destprj}", :package => "#{destpkg}")
295     put "/source/#{destprj}/#{destpkg}/_meta", orig.dup
296   end
297   protected :do_test_copy_package
298
299   def test_copy_hidden_project
300     # invalid
301     ActionController::IntegrationTest::reset_auth 
302     srcprj="HiddenProject"
303     srcpkg="pack"
304     destprj="CopyTest"
305     destpkg="target"
306     resp=401
307     flag=nil
308     delresp=401
309     debug=false
310     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
311     # some user
312     prepare_request_with_user "tom", "thunder"
313     resp=404
314     delresp=200
315     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
316     # maintainer
317     prepare_request_with_user "hidden_homer", "homer"
318     # flag not inherited
319     resp=:success
320     delresp=:success
321     debug=false
322     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
323     # admin has special permission
324     prepare_request_with_user "king", "sunflower"
325     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
326     #
327     # reverse 
328     #
329     # invalid
330     ActionController::IntegrationTest::reset_auth 
331     srcprj="CopyTest"
332     srcpkg="test"
333     destprj="HiddenProject"
334     destpkg="target"
335     resp=401
336     flag=nil
337     delresp=401
338     debug=false
339     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
340     # some user
341     prepare_request_with_user "tom", "thunder"
342     resp=400       # axml store SaveError
343     delresp=404    # unknown prj
344     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
345     # maintainer
346     prepare_request_with_user "hidden_homer", "homer"
347     # flag not inherited - should we inherit in any case to be on the safe side ?
348     resp=:success
349     delresp=:success
350     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
351     # admin
352     prepare_request_with_user "king", "sunflower"
353     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
354   end
355
356   def test_copy_sourceaccess_protected_project
357     # invalid
358     ActionController::IntegrationTest::reset_auth 
359     srcprj="SourceprotectedProject"
360     srcpkg="pack"
361     destprj="CopyTest"
362     destpkg="target"
363     resp=401
364     flag=nil
365     delresp=401
366     debug=false
367     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
368     # some user
369     prepare_request_with_user "tom", "thunder"
370     resp=403
371     delresp=200
372     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
373     # maintainer
374     prepare_request_with_user "sourceaccess_homer", "homer"
375     resp=:success
376     delresp=:success
377     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
378     # admin
379     prepare_request_with_user "king", "sunflower"
380     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
381     #
382     # reverse 
383     #
384     # invalid
385     ActionController::IntegrationTest::reset_auth 
386     srcprj="CopyTest"
387     srcpkg="test"
388     destprj="SourceprotectedProject"
389     destpkg="target"
390     resp=401
391     flag=nil
392     delresp=401
393     debug=false
394     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
395     # some user
396     prepare_request_with_user "tom", "thunder"
397     resp=403
398     delresp=403
399     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
400     # maintainer
401     prepare_request_with_user "sourceaccess_homer", "homer"
402     resp=:success
403     delresp=:success
404     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
405     # maintainer
406     prepare_request_with_user "king", "sunflower"
407     do_test_copy_package(srcprj, srcpkg, destprj, destpkg, resp, flag, delresp, debug)
408   end
409
410   def test_create_links_hidden_project
411     # user without any special roles
412     prepare_request_with_user "adrian", "so_alone"
413     get url_for(:controller => :source, :action => :package_meta, :project => "HiddenProject", :package => "temporary")
414     assert_response 404
415     put url_for(:controller => :source, :action => :package_meta, :project => "HiddenProject", :package => "temporary"), 
416         '<package project="HiddenProject" name="temporary"> <title/> <description/> </package>'
417     assert_response 200
418     assert_tag( :tag => "status", :attributes => { :code => "ok"} )
419
420     url = "/source/HiddenProject/temporary/_link"
421
422     # illegal targets
423     put url, '<link project="notexisting" />'
424     assert_response 404
425     assert_tag :tag => "status", :attributes => { :code => "unknown_project" }
426     put url, '<link project="HiddenProject" package="notexisting" />'
427     assert_response 404
428     assert_tag :tag => "status", :attributes => { :code => "unknown_package" }
429
430     # working local link from hidden package to hidden package
431     put url, '<link project="HiddenProject" package="pack" />'
432     assert_response :success
433
434     get url_for(:controller => :source, :action => :package_meta, :project => "kde4", :package => "temporary2")
435     assert_response 404
436     put url_for(:controller => :source, :action => :package_meta, :project => "kde4", :package => "temporary2"), 
437         '<package project="kde4" name="temporary2"> <title/> <description/> </package>'
438     assert_response 200
439     assert_tag( :tag => "status", :attributes => { :code => "ok"} )
440
441     url = "/source/kde4/temporary2/_link"
442
443     # illegal targets
444     put url, '<link project="notexisting" />'
445     assert_response 404
446     assert_tag :tag => "status", :attributes => { :code => "unknown_project" }
447     put url, '<link project="kde4" package="notexiting" />'
448     assert_response 404
449     assert_tag :tag => "status", :attributes => { :code => "unknown_package" }
450
451     # check this works with remote projects also
452     get url_for(:controller => :source, :action => :package_meta, :project => "HiddenProject", :package => "temporary4")
453     assert_response 404
454     put url_for(:controller => :source, :action => :package_meta, :project => "HiddenProject", :package => "temporary4"), 
455         '<package project="HiddenProject" name="temporary4"> <title/> <description/> </package>'
456     assert_response 200
457     assert_tag( :tag => "status", :attributes => { :code => "ok"} )
458
459     url = "/source/HiddenProject/temporary4/_link"
460
461     # working local link from hidden package to hidden package
462     put url, '<link project="LocalProject" package="remotepackage" />'
463     assert_response :success
464
465     # user without any special roles
466     prepare_request_with_user "fred", "geröllheimer"
467     get url_for(:controller => :source, :action => :package_meta, :project => "kde4", :package => "temporary3")
468     assert_response 404
469     put url_for(:controller => :source, :action => :package_meta, :project => "kde4", :package => "temporary3"), 
470         '<package project="kde4" name="temporary3"> <title/> <description/> </package>'
471     assert_response 200
472     assert_tag( :tag => "status", :attributes => { :code => "ok"} )
473
474     url = "/source/kde4/temporary3/_link"
475
476     # illegal targets
477     put url, '<link project="notexisting" />'
478     assert_response 404
479     assert_tag :tag => "status", :attributes => { :code => "unknown_project" }
480     put url, '<link project="kde4" package="notexiting" />'
481     assert_response 404
482     assert_tag :tag => "status", :attributes => { :code => "unknown_package" }
483
484     # normal user cannot access hidden project
485     put url, '<link project="HiddenProject" package="pack1" />'
486     assert_response 404
487
488     # cleanup
489     delete url
490   end
491
492   def test_alter_source_access_flags
493     # Create public project with protected package
494     prepare_request_with_user "adrian", "so_alone"
495     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:Project"),
496         '<project name="home:adrian:Project"> <title/> <description/> </project>'
497     assert_response :success
498     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:Project"),
499         '<project name="home:adrian:Project"> <title/> <description/> <sourceaccess><disable/></sourceaccess> </project>'
500     assert_response 403
501     assert_tag :tag => "status", :attributes => { :code => "change_project_protection_level" }
502     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:PublicProject"),
503         '<project name="home:adrian:PublicProject"> <title/> <description/> </project>'
504     assert_response :success
505     put url_for(:controller => :source, :action => :package_meta, :project => "home:adrian:PublicProject", :package => "pack"), 
506         '<package name="pack" project="home:adrian:PublicProject"> <title/> <description/> </package>'
507     assert_response :success
508     put url_for(:controller => :source, :action => :package_meta, :project => "home:adrian:PublicProject", :package => "pack"), 
509         '<package name="pack" project="home:adrian:PublicProject"> <title/> <description/>  <sourceaccess><disable/></sourceaccess>  </package>'
510     assert_response 403
511     assert_tag :tag => "status", :attributes => { :code => "change_package_protection_level" }
512     delete "/source/home:adrian:Project"
513     assert_response :success
514     delete "/source/home:adrian:PublicProject"
515     assert_response :success
516   end
517
518   def test_alter_access_flags
519     # Create public project with protected package
520     prepare_request_with_user "adrian", "so_alone"
521     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:Project"),
522         '<project name="home:adrian:Project"> <title/> <description/> </project>'
523     assert_response :success
524     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:Project"),
525         '<project name="home:adrian:Project"> <title/> <description/> <access><disable/></access> </project>'
526     assert_response 403
527     assert_tag :tag => "status", :attributes => { :code => "change_project_protection_level" }
528     delete "/source/home:adrian:Project"
529     assert_response :success
530   end
531
532   def test_project_links_to_sourceaccess_protected_package
533     # Create public project with protected package
534     prepare_request_with_user "adrian", "so_alone"
535     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:PublicProject"),
536         '<project name="home:adrian:PublicProject"> <title/> <description/> </project>'
537     assert_response :success
538     put url_for(:controller => :source, :action => :package_meta, :project => "home:adrian:PublicProject", :package => "ProtectedPackage"), 
539         '<package name="ProtectedPackage" project="home:adrian:PublicProject"> <title/> <description/>  <sourceaccess><disable/></sourceaccess>  </package>'
540     assert_response :success
541     put "/source/home:adrian:PublicProject/ProtectedPackage/dummy_file", "dummy"
542
543     # try to access it directly with a user not permitted
544     prepare_request_with_user "tom", "thunder"
545     get "/source/home:adrian:PublicProject/ProtectedPackage"
546     assert_response 403
547     # try to access it via own project link
548     put url_for(:controller => :source, :action => :project_meta, :project => "home:tom:temp"),
549         '<project name="home:tom:temp"> <title/> <description/> <link project="home:adrian:PublicProject"/> </project>'
550     assert_response :success
551     get "/source/home:tom:temp/ProtectedPackage"
552     assert_response 403
553     [ :branch, :diff, :linkdiff ].each do |c|
554       # would not work, but needs to return with 403 in any case
555       post "/source/home:tom:temp/ProtectedPackage", :cmd => c
556       assert_response 403
557     end
558     post "/source/home:tom:temp/ProtectedPackage", :cmd => :copy, :oproject => "home:tom:temp", :opackage => "ProtectedPackage"
559     assert_response 403
560     get "/source/home:tom:temp/ProtectedPackage/dummy_file"
561     assert_response 403
562     assert_no_match(/<summary>source access denied<\/summary>/, @response.body)  # api is talking
563     get "/source/home:tom:temp/ProtectedPackage/_result"
564     assert_response 403
565     assert_tag :tag => "status", :attributes => { :code => "source_access_no_permission" } # api is talking
566     # public controller
567     get "/public/source/home:tom:temp/ProtectedPackage/dummy_file"
568     assert_response 403
569     get "/public/source/home:tom:temp/ProtectedPackage"
570     assert_response 403
571     # Admin can bypass api
572     prepare_request_with_user "king", "sunflower"
573     get "/source/home:tom:temp/ProtectedPackage"
574     assert_response 403 # FIXME2.2: this is inconsistend, why is the bachend saying a 403 here ?
575     get "/source/home:tom:temp/ProtectedPackage/dummy_file"
576     assert_response :success
577     get "/source/home:tom:temp/ProtectedPackage/non_existing_file"
578     assert_response 404
579
580     # check access to deleted package
581     prepare_request_with_user "adrian", "so_alone"
582     delete "/source/home:adrian:PublicProject/ProtectedPackage"
583     assert_response :success
584     get "/source/home:adrian:PublicProject?deleted=1"
585     assert_response :success
586     assert_tag( :tag => "directory" )
587     assert_tag( :tag => "entry", :attributes => { :name => "ProtectedPackage" } )
588 # regression in 2.1
589 #    get "/source/home:adrian:PublicProject/ProtectedPackage/dummy_file?deleted=1"
590 #    assert_response :success
591     # must not see package content
592     prepare_request_with_user "tom", "thunder"
593     get "/source/home:adrian:PublicProject/ProtectedPackage?deleted=1"
594     assert_response 403
595 # belongs to the regression above
596 #    get "/source/home:adrian:PublicProject/ProtectedPackage/dummy_file?deleted=1"
597 #    assert_response 403
598
599     # cleanup
600     delete "/source/home:tom:temp"
601     assert_response :success
602     prepare_request_with_user "adrian", "so_alone"
603     delete "/source/home:adrian:PublicProject"
604     assert_response :success
605   end
606
607   def test_project_links_to_sourceaccess_protected_project
608     # Create public project with protected package
609     prepare_request_with_user "adrian", "so_alone"
610     get "/source/home:adrian:ProtectedProject"
611     assert_response 404
612     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject"),
613         '<project name="home:adrian:ProtectedProject"> <title/> <description/> <sourceaccess><disable/></sourceaccess>  </project>'
614     assert_response :success
615     put url_for(:controller => :source, :action => :package_meta, :project => "home:adrian:ProtectedProject", :package => "Package"), 
616         '<package name="Package" project="home:adrian:ProtectedProject"> <title/> <description/> </package>'
617     assert_response :success
618
619     # try to access it directly with a user not permitted
620     prepare_request_with_user "tom", "thunder"
621     get "/source/home:adrian:ProtectedProject/Package"
622     assert_response 403
623     # try to access it via own project link
624     put url_for(:controller => :source, :action => :project_meta, :project => "home:tom:temp"),
625         '<project name="home:tom:temp"> <title/> <description/> <link project="home:adrian:ProtectedProject"/> </project>'
626     assert_response :success
627     get "/source/home:tom:temp/Package"
628     assert_response 403
629     get "/source/home:tom:temp/Package/my_file"
630     assert_response 403
631     [ :branch, :diff, :linkdiff, :copy ].each do |c|
632       # would not work, but needs to return with 403 in any case
633       post "/source/home:tom:temp/Package", :cmd => c, :oproject => "home:tom:temp", :opackage => "Package"
634       assert_response 403
635     end
636     # public controller
637     get "/public/source/home:tom:temp/Package"
638     assert_response 403
639     get "/public/source/home:tom:temp/Package/my_file"
640     assert_response 403
641
642     # cleanup
643     prepare_request_with_user "adrian", "so_alone"
644     delete "/source/home:adrian:ProtectedProject"
645     assert_response :success
646   end
647
648   def test_project_links_to_read_access_protected_projects
649     # Create public project with protected package
650     prepare_request_with_user "tom", "thunder"
651
652     # try to link to an access protected hidden project from sourceaccess project
653     put url_for(:controller => :source, :action => :project_meta, :project => "home:tom:ProtectedProject2"),
654         '<project name="home:tom:ProtectedProject2"> <title/> <description/> <link project="HiddenProject"/> </project>'
655     assert_response 404
656     put url_for(:controller => :source, :action => :project_meta, :project => "home:tom:ProtectedProject2"),
657         '<project name="home:tom:ProtectedProject2"> <title/> <description/> <link project="HiddenProject"/> </project>'
658     assert_response 404
659
660
661     prepare_request_with_user "adrian", "so_alone"
662     # try to link to an access protected hidden project from sourceaccess project
663     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject2"),
664         '<project name="home:adrian:ProtectedProject2"> <title/> <description/> <link project="HiddenProject"/> </project>'
665     assert_response 404
666     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject2"),
667         '<project name="home:adrian:ProtectedProject2"> <title/> <description/> <link project="HiddenProject"/> </project>'
668     assert_response 404
669
670     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject2"),
671         '<project name="home:adrian:ProtectedProject2"> <title/> <description/> <sourceaccess><disable/></sourceaccess> </project>'
672     assert_response :success
673     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject1"),
674         '<project name="home:adrian:ProtectedProject1"> <title/> <description/> </project>'
675     assert_response :success
676
677     # Allow linking from not sourceaccess protected project to protected own. src.rpms are not delivered by the backend.
678     #
679     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject1"),
680      '<project name="home:adrian:ProtectedProject1"> <title/> <description/> <link project="home:adrian:ProtectedProject2"/> </project>'
681     assert_response :success
682     # FIXME2.2: add test for source rpm access
683
684     # try to link to an access protected hidden project from access hidden project
685     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject3"),
686         '<project name="home:adrian:ProtectedProject3"> <title/> <description/> <link project="HiddenProject"/> </project>'
687     assert_response 404
688
689     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject3"),
690         '<project name="home:adrian:ProtectedProject3"> <title/> <description/> <access><disable/></access> </project>'
691     assert_response :success
692
693     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject3"),
694         '<project name="home:adrian:ProtectedProject3"> <title/> <description/> <link project="HiddenProject"/> </project>'
695     assert_response 404
696
697     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject4"),
698         '<project name="home:adrian:ProtectedProject4"> <title/> <description/> <access><disable/></access> </project>'
699     assert_response :success
700
701     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject4"),
702         '<project name="home:adrian:ProtectedProject4"> <title/> <description/> <access><disable/></access> <link project="home:adrian:ProtectedProject2"/> </project>'
703     assert_response :success
704
705     # try to access it directly with a user not permitted
706     prepare_request_with_user "tom", "thunder"
707
708     # try to link to an access protected hidden project
709     put url_for(:controller => :source, :action => :project_meta, :project => "home:tom:temp2"),
710         '<project name="home:tom:temp2"> <title/> <description/> <link project="HiddenProject"/> </project>'
711     assert_response 404
712
713     # cleanup
714     prepare_request_with_user "king", "sunflower"
715     delete "/source/home:adrian:ProtectedProject2"
716     assert_response :success
717     delete "/source/home:adrian:ProtectedProject3"
718     assert_response :success
719     delete "/source/home:adrian:ProtectedProject4"
720     assert_response :success
721   end
722
723   def test_compare_error_messages
724     prepare_request_with_user "tom", "thunder"
725     get "/source/home:adrian:ProtectedProject"
726     assert_response 404
727     error_message = @response.body
728     get "/source/home:adrian:ProtectedProject/_meta"
729     assert_response 404
730     error_message2 = @response.body
731     get "/source/home:adrian:ProtectedProject/package/_meta"
732     assert_response 404
733     error_message3 = @response.body
734
735     prepare_request_with_user "adrian", "so_alone"
736     get "/source/home:adrian:ProtectedProject"
737     assert_response 404
738     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject"),
739         '<project name="home:adrian:ProtectedProject"> <title/> <description/> <access><disable/></access> </project>'
740     assert_response :success
741     get "/source/home:adrian:ProtectedProject"
742     assert_response :success
743     put url_for(:controller => :source, :action => :package_meta, :project => "home:adrian:ProtectedProject", :package => "package"),
744         '<package project="home:adrian:ProtectedProject" name="package"> <title/> <description/></package>'
745     assert_response :success
746     get "/source/home:adrian:ProtectedProject/package"
747     assert_response :success
748
749     # now we check if the project creation has changed the error message
750     prepare_request_with_user "tom", "thunder"
751     get "/source/home:adrian:ProtectedProject"
752     assert_response 404
753     assert_match error_message, @response.body
754     get "/source/home:adrian:ProtectedProject/_meta"
755     assert_response 404
756     assert_match error_message2, @response.body
757     get "/source/home:adrian:ProtectedProject/package/_meta"
758     assert_response 404
759     assert_match error_message3, @response.body
760
761     # cleanup
762     prepare_request_with_user "king", "sunflower"
763     delete "/source/home:adrian:ProtectedProject"
764     assert_response :success
765   end
766
767   def test_project_paths_to_download_protected_projects
768     # try to access it with a user not permitted
769     prepare_request_with_user "tom", "thunder"
770
771     # check if unsufficiently permitted users tries to access protected projects
772 if $ENABLE_BROKEN_TEST
773 #FIXME2.2: TBD, the backend is handling this
774     put url_for(:controller => :source, :action => :project_meta, :project => "home:tom:ProtectedProject1"),
775         '<project name="home:tom:ProtectedProject1"> <title/> <description/>  <repository name="BinaryprotectedProjectRepo"> <path repository="nada" project="BinaryprotectedProject"/> <arch>i586</arch> </repository> </project>'
776     assert_response 403
777 end
778
779     # try to access it with a user permitted for binarydownload
780     prepare_request_with_user "binary_homer", "homer"
781
782     # check if sufficiently protected projects can access protected projects
783     put url_for(:controller => :source, :action => :project_meta, :project => "home:binary_homer:ProtectedProject1"),
784         '<project name="home:binary_homer:ProtectedProject1"> <title/> <description/> <binarydownload><disable/></binarydownload> </project>'
785     assert_response 200
786
787     put url_for(:controller => :source, :action => :project_meta, :project => "home:binary_homer:ProtectedProject1"),
788         '<project name="home:binary_homer:ProtectedProject1"> <title/> <description/> <repository name="BinaryprotectedProjectRepo"> <path repository="nada" project="BinaryprotectedProject"/> <arch>i586</arch> </repository> </project>'
789     #STDERR.puts(@response.body)
790     assert_response 200
791
792     # check if sufficiently protected projects can access protected projects
793     put url_for(:controller => :source, :action => :project_meta, :project => "home:binary_homer:ProtectedProject2"),
794         '<project name="home:binary_homer:ProtectedProject2"> <title/> <description/> </project>'
795     assert_response 200
796
797 if $ENABLE_BROKEN_TEST
798 #FIXME2.2: TBD, the backend is handling this
799     put url_for(:controller => :source, :action => :project_meta, :project => "home:binary_homer:ProtectedProject2"),
800         '<project name="home:binary_homer:ProtectedProject2"> <title/> <description/> <repository name="BinaryprotectedProjectRepo"> <path repository="nada" project="BinaryprotectedProject"/> <arch>i586</arch> </repository> </project>'
801     #STDERR.puts(@response.body)
802     assert_response 403
803 end
804   end
805
806   def test_project_paths_to_access_protected_projects
807     # try to access it with a user not permitted
808     prepare_request_with_user "tom", "thunder"
809
810     # check if unsufficiently permitted users tries to access protected projects
811     put url_for(:controller => :source, :action => :project_meta, :project => "home:tom:ProtectedProject2"),
812         '<project name="home:tom:ProtectedProject2"> <title/> <description/>  <repository name="HiddenProjectRepo"> <path repository="nada" project="HiddenProject"/> <arch>i586</arch> </repository> </project>'
813     assert_response 404
814
815     # try to access it with a user permitted for access
816     prepare_request_with_user "adrian", "so_alone"
817
818     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject1"),
819         '<project name="home:adrian:ProtectedProject1"> <title/> <description/> <access><disable/></access> </project>'
820     #STDERR.puts(@response.body)
821     assert_response 200
822
823     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject1"),
824         '<project name="home:adrian:ProtectedProject1"> <title/> <description/> <repository name="HiddenProjectRepo"> <path repository="nada" project="HiddenProject"/> <arch>i586</arch> </repository> </project>'
825     assert_response 404
826
827     # building against
828     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject2"),
829         '<project name="home:adrian:ProtectedProject2"> <title/> <description/> <repository name="HiddenProjectRepo"> <path repository="nada" project="HiddenProject"/> <arch>i586</arch> </repository> </project>'
830     assert_response 404
831
832     # check if download protected project has to access protected project, which reveals Hidden project existence to others and is and error
833     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject2"),
834         '<project name="home:adrian:ProtectedProject2"> <title/> <description/> <binarydownload><disable/></binarydownload> </project>'
835     assert_response 200
836
837     put url_for(:controller => :source, :action => :project_meta, :project => "home:adrian:ProtectedProject2"),
838         '<project name="home:adrian:ProtectedProject2"> <title/> <description/> <repository name="HiddenProjectRepo"> <path repository="nada" project="HiddenProject"/> <arch>i586</arch> </repository> </project>'
839     #STDERR.puts(@response.body)
840     assert_response 404
841
842     # check if access protected project has access binarydownload protected project
843     prepare_request_with_user "binary_homer", "homer"
844     put url_for(:controller => :source, :action => :project_meta, :project => "home:binary_homer:ProtectedProject3"),
845         '<project name="home:binary_homer:ProtectedProject3"> <title/> <description/> <access><disable/></access> </project>'
846     #STDERR.puts(@response.body)
847     assert_response 200
848
849     put url_for(:controller => :source, :action => :project_meta, :project => "home:binary_homer:ProtectedProject3"),
850         '<project name="home:binary_homer:ProtectedProject3"> <title/> <description/> <repository name="BinaryprotectedProjectRepo"> <path repository="nada" project="BinaryprotectedProject"/> <arch>i586</arch> </repository> </project>'
851     #STDERR.puts(@response.body)
852     assert_response 200
853
854   end
855
856   def test_copy_project_of_hidden_project
857     prepare_request_with_user "king", "sunflower"
858     post "/source/CopyOfProject?cmd=copy&oproject=HiddenProject"
859     assert_response :success
860     get "/source/CopyOfProject/_meta"
861     assert_response :success
862     assert_tag( :tag => "disable", :parent => { :tag => "access" } )
863
864     delete "/source/CopyOfProject"
865     assert_response :success
866   end
867
868   def test_copy_project_of_source_protected_project
869     prepare_request_with_user "king", "sunflower"
870     post "/source/CopyOfProject?cmd=copy&oproject=SourceprotectedProject"
871     assert_response :success
872     get "/source/CopyOfProject/_meta"
873     assert_response :success
874     assert_tag( :tag => "disable", :parent => { :tag => "sourceaccess" } )
875
876     delete "/source/CopyOfProject"
877     assert_response :success
878   end
879
880   def test_copy_project_of_source_protected_package
881     prepare_request_with_user "king", "sunflower"
882     put "/source/home:tom/ProtectedPackage/_meta",
883         '<package project="home:tom" name="ProtectedPackage"> <title/> <description/> <sourceaccess><disable/></sourceaccess> </package>'
884     assert_response :success
885     
886     post "/source/CopyOfProject?cmd=copy&oproject=home:tom"
887     assert_response :success
888     get "/source/CopyOfProject/_meta"
889     assert_response :success
890     assert_no_tag( :tag => "disable", :parent => { :tag => "access" } )
891     assert_no_tag( :tag => "disable", :parent => { :tag => "sourceaccess" } )
892     get "/source/CopyOfProject/ProtectedPackage/_meta"
893     assert_response :success
894     assert_tag( :tag => "disable", :parent => { :tag => "sourceaccess" } )
895
896     delete "/source/CopyOfProject"
897     assert_response :success
898     delete "/source/home:tom/ProtectedPackage"
899     assert_response :success
900   end
901
902 end