Commit 766d3c974e30487eb858e72ede0710e6d4e3d855
1 parent
566724a7
Exists in
master
and in
29 other branches
[work-assignment] Defining download and upload restrictions
Showing
7 changed files
with
178 additions
and
2 deletions
Show diff stats
app/controllers/my_profile/cms_controller.rb
... | ... | @@ -16,7 +16,12 @@ class CmsController < MyProfileController |
16 | 16 | |
17 | 17 | before_filter :login_required, :except => [:suggest_an_article] |
18 | 18 | |
19 | - protect_if :except => [:suggest_an_article, :set_home_page, :edit, :destroy, :publish] do |c, user, profile| | |
19 | + protect_if :only => :upload_files do |c, user, profile| | |
20 | + article_id = c.params[:parent_id] | |
21 | + profile.articles.find(article_id).allow_create?(user) | |
22 | + end | |
23 | + | |
24 | + protect_if :except => [:suggest_an_article, :set_home_page, :edit, :destroy, :publish, :upload_files] do |c, user, profile| | |
20 | 25 | user && (user.has_permission?('post_content', profile) || user.has_permission?('publish_content', profile)) |
21 | 26 | end |
22 | 27 | ... | ... |
plugins/work_assignment/lib/work_assignment_plugin.rb
... | ... | @@ -5,7 +5,16 @@ class WorkAssignmentPlugin < Noosfero::Plugin |
5 | 5 | end |
6 | 6 | |
7 | 7 | def self.plugin_description |
8 | - _("New kind of content for work organization.") | |
8 | + _("New kind of content for organizations.") | |
9 | + end | |
10 | + | |
11 | + def self.can_download_submission?(user, submission) | |
12 | + work_assignment = submission.parent.parent | |
13 | + work_assignment.publish_submissions || (user && (submission.author == user || user.has_permission?('view_private_content', work_assignment.profile))) | |
14 | + end | |
15 | + | |
16 | + def self.is_submission?(content) | |
17 | + content && content.parent && content.parent.parent && content.parent.parent.kind_of?(WorkAssignmentPlugin::WorkAssignment) | |
9 | 18 | end |
10 | 19 | |
11 | 20 | def content_types |
... | ... | @@ -24,4 +33,20 @@ class WorkAssignmentPlugin < Noosfero::Plugin |
24 | 33 | !content.profile.members.include?(context.send(:user)) |
25 | 34 | end |
26 | 35 | |
36 | + def content_viewer_controller_filters | |
37 | + block = lambda do | |
38 | + path = params[:page].join('/') | |
39 | + content = profile.articles.find_by_path(path) | |
40 | + | |
41 | + if WorkAssignmentPlugin.is_submission?(content) && !WorkAssignmentPlugin.can_download_submission?(user, content) | |
42 | + render_access_denied | |
43 | + end | |
44 | + end | |
45 | + | |
46 | + { :type => 'before_filter', | |
47 | + :method_name => 'work_assingment_only_admin_or_owner_download', | |
48 | + :options => {:only => 'view_page'}, | |
49 | + :block => block } | |
50 | + end | |
51 | + | |
27 | 52 | end | ... | ... |
plugins/work_assignment/lib/work_assignment_plugin/work_assignment.rb
plugins/work_assignment/test/functional/cms_controller_test.rb
0 → 100644
... | ... | @@ -0,0 +1,34 @@ |
1 | +require 'test_helper' | |
2 | +require 'cms_controller' | |
3 | + | |
4 | +# Re-raise errors caught by the controller. | |
5 | +class CmsController; def rescue_action(e) raise e end; end | |
6 | + | |
7 | +class CmsControllerTest < ActionController::TestCase | |
8 | + | |
9 | + def setup | |
10 | + @controller = CmsController.new | |
11 | + @request = ActionController::TestRequest.new | |
12 | + @response = ActionController::TestResponse.new | |
13 | + @person = create_user('test_user').person | |
14 | + login_as :test_user | |
15 | + end | |
16 | + | |
17 | + attr_accessor :person | |
18 | + | |
19 | + should 'not allow non-members to upload submissions on work_assignment' do | |
20 | + organization = fast_create(Organization) | |
21 | + work_assignment = WorkAssignmentPlugin::WorkAssignment.create!(:name => 'Work Assignment', :profile => organization) | |
22 | + | |
23 | + get :upload_files, :profile => organization.identifier, :parent_id => work_assignment.id | |
24 | + assert_response :forbidden | |
25 | + assert_template 'access_denied.rhtml' | |
26 | + | |
27 | + organization.add_member(person) | |
28 | + | |
29 | + get :upload_files, :profile => organization.identifier, :parent_id => work_assignment.id | |
30 | + assert_response :success | |
31 | + end | |
32 | + | |
33 | +end | |
34 | + | ... | ... |
plugins/work_assignment/test/functional/content_viewer_controller_test.rb
0 → 100644
... | ... | @@ -0,0 +1,41 @@ |
1 | +require 'test_helper' | |
2 | +require 'content_viewer_controller' | |
3 | + | |
4 | +# Re-raise errors caught by the controller. | |
5 | +class ContentViewerController; def rescue_action(e) raise e end; end | |
6 | + | |
7 | +class ContentViewerControllerTest < ActionController::TestCase | |
8 | + | |
9 | + def setup | |
10 | + @controller = ContentViewerController.new | |
11 | + @request = ActionController::TestRequest.new | |
12 | + @response = ActionController::TestResponse.new | |
13 | + | |
14 | + @organization = fast_create(Organization) | |
15 | + @work_assignment = WorkAssignmentPlugin::WorkAssignment.create!(:name => 'Work Assignment', :profile => @organization) | |
16 | + @person = create_user('test_user').person | |
17 | + @environment = @organization.environment | |
18 | + @environment.enable_plugin(WorkAssignmentPlugin) | |
19 | + @environment.save! | |
20 | + login_as(:test_user) | |
21 | + end | |
22 | + attr_reader :organization, :person, :work_assignment | |
23 | + | |
24 | + should 'can download work_assignment' do | |
25 | + random_member = fast_create(Person) | |
26 | + organization.add_member(random_member) | |
27 | + folder = work_assignment.find_or_create_author_folder(random_member) | |
28 | + submission = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => organization, :parent => folder) | |
29 | + WorkAssignmentPlugin.stubs(:can_download_submission?).returns(false) | |
30 | + | |
31 | + get :view_page, :profile => organization.identifier, :page => submission.explode_path | |
32 | + assert_response :forbidden | |
33 | + assert_template 'access_denied.rhtml' | |
34 | + | |
35 | + WorkAssignmentPlugin.stubs(:can_download_submission?).returns(true) | |
36 | + | |
37 | + get :view_page, :profile => organization.identifier, :page => submission.explode_path | |
38 | + assert_response :success | |
39 | + end | |
40 | + | |
41 | +end | ... | ... |
plugins/work_assignment/test/unit/work_assingment_plugin_test.rb
0 → 100644
... | ... | @@ -0,0 +1,57 @@ |
1 | +require 'test_helper' | |
2 | + | |
3 | +class WorkAssignmentPluginTest < ActiveSupport::TestCase | |
4 | + should 'verify if a content is a work_assignment submission' do | |
5 | + organization = fast_create(Organization) | |
6 | + content = UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => organization) | |
7 | + assert !WorkAssignmentPlugin.is_submission?(content) | |
8 | + | |
9 | + work_assignment = WorkAssignmentPlugin::WorkAssignment.create!(:name => 'Work Assignment', :profile => organization) | |
10 | + content.parent = work_assignment | |
11 | + content.save! | |
12 | + assert !WorkAssignmentPlugin.is_submission?(content) | |
13 | + | |
14 | + author_folder = work_assignment.find_or_create_author_folder(fast_create(Person)) | |
15 | + content.parent = author_folder | |
16 | + content.save! | |
17 | + assert WorkAssignmentPlugin.is_submission?(content) | |
18 | + end | |
19 | + | |
20 | + should 'be able to download submission if work_assignment published submissions' do | |
21 | + submission = create_submission | |
22 | + assert !WorkAssignmentPlugin.can_download_submission?(nil, submission) | |
23 | + | |
24 | + work_assignment = submission.parent.parent | |
25 | + work_assignment.publish_submissions = true | |
26 | + work_assignment.save! | |
27 | + assert WorkAssignmentPlugin.can_download_submission?(nil, submission) | |
28 | + end | |
29 | + | |
30 | + should 'be able to download submission if the user is author of it' do | |
31 | + person = fast_create(Person) | |
32 | + submission = create_submission | |
33 | + assert !WorkAssignmentPlugin.can_download_submission?(person, submission) | |
34 | + | |
35 | + submission.author = person | |
36 | + submission.save! | |
37 | + assert WorkAssignmentPlugin.can_download_submission?(person, submission) | |
38 | + end | |
39 | + | |
40 | + should 'be able to download submission if the user has the view_private_content permission on the profile' do | |
41 | + person = fast_create(Person) | |
42 | + submission = create_submission | |
43 | + assert !WorkAssignmentPlugin.can_download_submission?(person, submission) | |
44 | + | |
45 | + moderator = create_user_with_permission('moderator', 'view_private_content', submission.profile) | |
46 | + assert WorkAssignmentPlugin.can_download_submission?(moderator, submission) | |
47 | + end | |
48 | + | |
49 | + private | |
50 | + | |
51 | + def create_submission | |
52 | + organization = fast_create(Organization) | |
53 | + work_assignment = WorkAssignmentPlugin::WorkAssignment.create!(:name => 'Work Assignment', :profile => organization) | |
54 | + author_folder = work_assignment.find_or_create_author_folder(fast_create(Person)) | |
55 | + UploadedFile.create!(:uploaded_data => fixture_file_upload('/files/rails.png', 'image/png'), :profile => organization, :parent => author_folder) | |
56 | + end | |
57 | +end | ... | ... |
test/functional/cms_controller_test.rb
... | ... | @@ -1566,6 +1566,18 @@ class CmsControllerTest < ActionController::TestCase |
1566 | 1566 | assert_equal profile, a.author |
1567 | 1567 | end |
1568 | 1568 | |
1569 | + should 'not allow user upload files if he can not create on the parent folder' do | |
1570 | + c = Community.create!(:name => 'test_comm', :identifier => 'test_comm') | |
1571 | + u = create_user('test_user') | |
1572 | + a = c.articles.create!(:name => 'test_article') | |
1573 | + a.stubs(:allow_create?).with(u).returns(true) | |
1574 | + login_as :test_user | |
1575 | + | |
1576 | + get :upload_files, :profile => c.identifier, :parent_id => a.id | |
1577 | + assert_response :forbidden | |
1578 | + assert_template 'access_denied.rhtml' | |
1579 | + end | |
1580 | + | |
1569 | 1581 | protected |
1570 | 1582 | |
1571 | 1583 | # FIXME this is to avoid adding an extra dependency for a proper JSON parser. | ... | ... |