Commit dc74649b6f88e52e7f15b0561181a5c5a60fb173
1 parent
921b88f8
Exists in
master
and in
28 other branches
ActionItem616: made private articles non reachable
made article respond to its private/public status instead of the profile so we can have private folders inside public profiles git-svn-id: https://svn.colivre.coop.br/svn/noosfero/trunk@2397 3f533792-8f58-4932-b0fe-aaf55b0a4547
Showing
3 changed files
with
83 additions
and
56 deletions
Show diff stats
app/models/article.rb
| @@ -137,8 +137,8 @@ class Article < ActiveRecord::Base | @@ -137,8 +137,8 @@ class Article < ActiveRecord::Base | ||
| 137 | end | 137 | end |
| 138 | 138 | ||
| 139 | def display_to?(user) | 139 | def display_to?(user) |
| 140 | - if self.profile.public_content | ||
| 141 | - true | 140 | + if self.public_article |
| 141 | + self.profile.display_info_to?(user) | ||
| 142 | else | 142 | else |
| 143 | if user.nil? | 143 | if user.nil? |
| 144 | false | 144 | false |
test/functional/content_viewer_controller_test.rb
| @@ -22,11 +22,11 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -22,11 +22,11 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 22 | page.save! | 22 | page.save! |
| 23 | assert_local_files_reference :get, :view_page, :profile => profile.identifier, :page => [ 'test' ] | 23 | assert_local_files_reference :get, :view_page, :profile => profile.identifier, :page => [ 'test' ] |
| 24 | end | 24 | end |
| 25 | - | 25 | + |
| 26 | def test_valid_xhtml | 26 | def test_valid_xhtml |
| 27 | assert_valid_xhtml | 27 | assert_valid_xhtml |
| 28 | end | 28 | end |
| 29 | - | 29 | + |
| 30 | def test_should_display_page | 30 | def test_should_display_page |
| 31 | page = profile.articles.build(:name => 'test') | 31 | page = profile.articles.build(:name => 'test') |
| 32 | page.save! | 32 | page.save! |
| @@ -69,7 +69,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -69,7 +69,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 69 | Profile.delete_all | 69 | Profile.delete_all |
| 70 | uses_host 'anhetegua' | 70 | uses_host 'anhetegua' |
| 71 | get :view_page, :profile => 'some_unexisting_profile', :page => [] | 71 | get :view_page, :profile => 'some_unexisting_profile', :page => [] |
| 72 | - assert_response :missing | 72 | + assert_response :missing |
| 73 | end | 73 | end |
| 74 | 74 | ||
| 75 | def test_should_be_able_to_post_comment_while_authenticated | 75 | def test_should_be_able_to_post_comment_while_authenticated |
| @@ -97,7 +97,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -97,7 +97,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 97 | 97 | ||
| 98 | should 'produce a download-like when article is not text/html' do | 98 | should 'produce a download-like when article is not text/html' do |
| 99 | 99 | ||
| 100 | - # for example, RSS feeds | 100 | + # for example, RSS feeds |
| 101 | profile = create_user('someone').person | 101 | profile = create_user('someone').person |
| 102 | page = profile.articles.build(:name => 'myarticle', :body => 'the body of the text') | 102 | page = profile.articles.build(:name => 'myarticle', :body => 'the body of the text') |
| 103 | page.save! | 103 | page.save! |
| @@ -126,38 +126,36 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -126,38 +126,36 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 126 | post :view_page, :profile => profile.identifier, :page => [ 'test' ], :remove_comment => comment.id | 126 | post :view_page, :profile => profile.identifier, :page => [ 'test' ], :remove_comment => comment.id |
| 127 | assert_response :redirect | 127 | assert_response :redirect |
| 128 | end | 128 | end |
| 129 | - | ||
| 130 | end | 129 | end |
| 131 | - | 130 | + |
| 132 | should "not be able to remove other people's comments if not moderator or admin" do | 131 | should "not be able to remove other people's comments if not moderator or admin" do |
| 133 | create_user('normaluser') | 132 | create_user('normaluser') |
| 134 | profile = create_user('testuser').person | 133 | profile = create_user('testuser').person |
| 135 | article = profile.articles.build(:name => 'test') | 134 | article = profile.articles.build(:name => 'test') |
| 136 | article.save! | 135 | article.save! |
| 137 | - | 136 | + |
| 138 | commenter = create_user('otheruser').person | 137 | commenter = create_user('otheruser').person |
| 139 | comment = article.comments.build(:author => commenter, :title => 'a comment', :body => 'lalala') | 138 | comment = article.comments.build(:author => commenter, :title => 'a comment', :body => 'lalala') |
| 140 | comment.save! | 139 | comment.save! |
| 141 | 140 | ||
| 142 | login_as 'normaluser' # normaluser cannot remove other people's comments | 141 | login_as 'normaluser' # normaluser cannot remove other people's comments |
| 143 | - assert_no_difference Comment, :count do | 142 | + assert_no_difference Comment, :count do |
| 144 | post :view_page, :profile => profile.identifier, :page => [ 'test' ], :remove_comment => comment.id | 143 | post :view_page, :profile => profile.identifier, :page => [ 'test' ], :remove_comment => comment.id |
| 145 | assert_response :redirect | 144 | assert_response :redirect |
| 146 | end | 145 | end |
| 147 | - | ||
| 148 | end | 146 | end |
| 149 | 147 | ||
| 150 | should 'be able to remove comments on their articles' do | 148 | should 'be able to remove comments on their articles' do |
| 151 | profile = create_user('testuser').person | 149 | profile = create_user('testuser').person |
| 152 | article = profile.articles.build(:name => 'test') | 150 | article = profile.articles.build(:name => 'test') |
| 153 | article.save! | 151 | article.save! |
| 154 | - | 152 | + |
| 155 | commenter = create_user('otheruser').person | 153 | commenter = create_user('otheruser').person |
| 156 | comment = article.comments.build(:author => commenter, :title => 'a comment', :body => 'lalala') | 154 | comment = article.comments.build(:author => commenter, :title => 'a comment', :body => 'lalala') |
| 157 | comment.save! | 155 | comment.save! |
| 158 | 156 | ||
| 159 | login_as 'testuser' # testuser must be able to remove comments in his articles | 157 | login_as 'testuser' # testuser must be able to remove comments in his articles |
| 160 | - assert_difference Comment, :count, -1 do | 158 | + assert_difference Comment, :count, -1 do |
| 161 | post :view_page, :profile => profile.identifier, :page => [ 'test' ], :remove_comment => comment.id | 159 | post :view_page, :profile => profile.identifier, :page => [ 'test' ], :remove_comment => comment.id |
| 162 | assert_response :redirect | 160 | assert_response :redirect |
| 163 | end | 161 | end |
| @@ -181,7 +179,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -181,7 +179,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 181 | comment = article.comments.create!(:author => commenter, :title => 'a comment', :body => 'lalala') | 179 | comment = article.comments.create!(:author => commenter, :title => 'a comment', :body => 'lalala') |
| 182 | community.add_moderator(profile) | 180 | community.add_moderator(profile) |
| 183 | login_as profile.identifier | 181 | login_as profile.identifier |
| 184 | - assert_difference Comment, :count, -1 do | 182 | + assert_difference Comment, :count, -1 do |
| 185 | post :view_page, :profile => community.identifier, :page => [ 'test' ], :remove_comment => comment.id | 183 | post :view_page, :profile => community.identifier, :page => [ 'test' ], :remove_comment => comment.id |
| 186 | assert_response :redirect | 184 | assert_response :redirect |
| 187 | end | 185 | end |
| @@ -209,7 +207,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -209,7 +207,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 209 | post :view_page, :profile => @profile.identifier, :page => [ 'myarticle' ], :comment => { :title => '', :body => '' } | 207 | post :view_page, :profile => @profile.identifier, :page => [ 'myarticle' ], :comment => { :title => '', :body => '' } |
| 210 | assert_tag :tag => 'div', :attributes => { :class => 'post_comment_box opened' } | 208 | assert_tag :tag => 'div', :attributes => { :class => 'post_comment_box opened' } |
| 211 | end | 209 | end |
| 212 | - | 210 | + |
| 213 | should 'filter html content from body' do | 211 | should 'filter html content from body' do |
| 214 | login_as @profile.identifier | 212 | login_as @profile.identifier |
| 215 | page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') | 213 | page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text') |
| @@ -345,4 +343,34 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -345,4 +343,34 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
| 345 | assert_tag :tag => 'div', :attributes => { :class => /main-block/ }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new?parent_id=#{folder.id}" } } | 343 | assert_tag :tag => 'div', :attributes => { :class => /main-block/ }, :descendant => { :tag => 'a', :attributes => { :href => "/myprofile/testinguser/cms/new?parent_id=#{folder.id}" } } |
| 346 | end | 344 | end |
| 347 | 345 | ||
| 346 | + should 'not give access to private articles if logged off' do | ||
| 347 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
| 348 | + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) | ||
| 349 | + get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] | ||
| 350 | + | ||
| 351 | + assert_template 'access_denied' | ||
| 352 | + end | ||
| 353 | + | ||
| 354 | + should 'not give access to private articles if logged in but not member' do | ||
| 355 | + login_as('testinguser') | ||
| 356 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
| 357 | + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) | ||
| 358 | + get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] | ||
| 359 | + | ||
| 360 | + assert_template 'access_denied' | ||
| 361 | + end | ||
| 362 | + | ||
| 363 | + should 'give access to private articles if logged in and member' do | ||
| 364 | + person = create_user('test_user').person | ||
| 365 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
| 366 | + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) | ||
| 367 | + profile.affiliate(person, Profile::Roles.member) | ||
| 368 | + login_as('test_user') | ||
| 369 | + | ||
| 370 | + get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] | ||
| 371 | + | ||
| 372 | + assert_template 'view_page' | ||
| 373 | + end | ||
| 374 | + | ||
| 375 | + | ||
| 348 | end | 376 | end |
test/unit/article_test.rb
| @@ -230,47 +230,6 @@ class ArticleTest < Test::Unit::TestCase | @@ -230,47 +230,6 @@ class ArticleTest < Test::Unit::TestCase | ||
| 230 | assert_equal true, a.display_to?(person) | 230 | assert_equal true, a.display_to?(person) |
| 231 | end | 231 | end |
| 232 | 232 | ||
| 233 | - should 'not display to other unauthenticated user if private' do | ||
| 234 | - # a person with private contents ... | ||
| 235 | - person = create_user('testuser').person | ||
| 236 | - person.update_attributes!(:public_content => false) | ||
| 237 | - | ||
| 238 | - # ... has an article ... | ||
| 239 | - a1 = person.articles.create!(:name => 'test article') | ||
| 240 | - | ||
| 241 | - # ... which anonymous users cannot view | ||
| 242 | - assert_equal false, a1.display_to?(nil) | ||
| 243 | - end | ||
| 244 | - | ||
| 245 | - should 'not display to another user if private' do | ||
| 246 | - # a person with private contents ... | ||
| 247 | - person = create_user('testuser').person | ||
| 248 | - person.update_attributes!(:public_content => false) | ||
| 249 | - | ||
| 250 | - # ... has an article ... | ||
| 251 | - a1 = person.articles.create!(:name => 'test article') | ||
| 252 | - | ||
| 253 | - # ... which another user cannot see | ||
| 254 | - another_user = create_user('another_user').person | ||
| 255 | - assert_equal false, a1.display_to?(another_user) | ||
| 256 | - end | ||
| 257 | - | ||
| 258 | - should 'display for members of profile' do | ||
| 259 | - # a community with private content ... | ||
| 260 | - community = Community.create!(:name => 'test community') | ||
| 261 | - community.update_attributes!(:public_content => false) | ||
| 262 | - | ||
| 263 | - # ... has an article ... | ||
| 264 | - a1 = community.articles.create!(:name => 'test article') | ||
| 265 | - | ||
| 266 | - # ... and its members ... | ||
| 267 | - member = create_user('testuser').person | ||
| 268 | - community.add_member(member) | ||
| 269 | - | ||
| 270 | - # ... can view that article | ||
| 271 | - assert_equal true, a1.display_to?(member) | ||
| 272 | - end | ||
| 273 | - | ||
| 274 | should 'reindex when comments are changed' do | 233 | should 'reindex when comments are changed' do |
| 275 | a = Article.new | 234 | a = Article.new |
| 276 | a.expects(:ferret_update) | 235 | a.expects(:ferret_update) |
| @@ -365,4 +324,44 @@ class ArticleTest < Test::Unit::TestCase | @@ -365,4 +324,44 @@ class ArticleTest < Test::Unit::TestCase | ||
| 365 | assert !Article.new.accept_category?(ProductCategory.new) | 324 | assert !Article.new.accept_category?(ProductCategory.new) |
| 366 | end | 325 | end |
| 367 | 326 | ||
| 327 | + should 'accept public_article attribute' do | ||
| 328 | + assert_respond_to Article.new, :public_article | ||
| 329 | + assert_respond_to Article.new, :public_article= | ||
| 330 | + end | ||
| 331 | + | ||
| 332 | + should 'say that logged off user cannot see private article' do | ||
| 333 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
| 334 | + article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) | ||
| 335 | + | ||
| 336 | + assert !article.display_to?(nil) | ||
| 337 | + end | ||
| 338 | + | ||
| 339 | + should 'say that not member of profile cannot see private article' do | ||
| 340 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
| 341 | + article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) | ||
| 342 | + person = create_user('test_user').person | ||
| 343 | + | ||
| 344 | + assert !article.display_to?(person) | ||
| 345 | + end | ||
| 346 | + | ||
| 347 | + should 'say that member user can see private article' do | ||
| 348 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') | ||
| 349 | + article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) | ||
| 350 | + person = create_user('test_user').person | ||
| 351 | + profile.affiliate(person, Profile::Roles.member) | ||
| 352 | + | ||
| 353 | + assert article.display_to?(person) | ||
| 354 | + end | ||
| 355 | + | ||
| 356 | + should 'not show article to non member if article public but profile private' do | ||
| 357 | + profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile', :public_profile => false) | ||
| 358 | + article = Article.create!(:name => 'test article', :profile => profile, :public_article => true) | ||
| 359 | + person1 = create_user('test_user1').person | ||
| 360 | + profile.affiliate(person1, Profile::Roles.member) | ||
| 361 | + person2 = create_user('test_user2').person | ||
| 362 | + | ||
| 363 | + assert !article.display_to?(nil) | ||
| 364 | + assert !article.display_to?(person2) | ||
| 365 | + assert article.display_to?(person1) | ||
| 366 | + end | ||
| 368 | end | 367 | end |