Commit 72691c97acc950c0d00076050d7625a48413dfea

Authored by Antonio Terceiro
2 parents 81c5f0e3 8ecff858

Merge branch 'stable'

app/controllers/public/content_viewer_controller.rb
@@ -26,11 +26,6 @@ class ContentViewerController < ApplicationController @@ -26,11 +26,6 @@ class ContentViewerController < ApplicationController
26 end 26 end
27 end 27 end
28 28
29 - # only show unpublished articles to those who can edit then  
30 - if @page && !@page.published && !@page.allow_post_content?(user)  
31 - @page = nil  
32 - end  
33 -  
34 # page not found, give error 29 # page not found, give error
35 if @page.nil? 30 if @page.nil?
36 render_not_found(@path) 31 render_not_found(@path)
app/helpers/application_helper.rb
@@ -336,7 +336,7 @@ module ApplicationHelper @@ -336,7 +336,7 @@ module ApplicationHelper
336 elsif ENV['RAILS_ENV'] == 'development' && params[:theme] 336 elsif ENV['RAILS_ENV'] == 'development' && params[:theme]
337 params[:theme] 337 params[:theme]
338 else 338 else
339 - if profile 339 + if profile && !profile.theme.nil?
340 profile.theme 340 profile.theme
341 elsif environment 341 elsif environment
342 environment.theme 342 environment.theme
app/helpers/folder_helper.rb
1 module FolderHelper 1 module FolderHelper
2 2
3 - def list_articles(articles, recursive = false)  
4 - content_tag(  
5 - 'table',  
6 - content_tag('tr', content_tag('th', _('Title')) + content_tag('th', _('Last update'))) +  
7 - articles.select { |item| item.public? }.map {|item| display_article_in_listing(item, recursive, 0)}.join('')  
8 - ) 3 + def list_articles(articles, user, recursive = false)
  4 + if !articles.blank?
  5 + content_tag(
  6 + 'table',
  7 + content_tag('tr', content_tag('th', _('Title')) + content_tag('th', _('Last update'))) +
  8 + articles.select { |item| item.display_to?(user)}.map {|item| display_article_in_listing(item, recursive, 0)}.join('')
  9 + )
  10 + else
  11 + content_tag('em', _('(empty folder)'))
  12 + end
9 end 13 end
10 14
11 def display_article_in_listing(article, recursive = false, level = 0) 15 def display_article_in_listing(article, recursive = false, level = 0)
app/models/article.rb
@@ -84,13 +84,6 @@ class Article < ActiveRecord::Base @@ -84,13 +84,6 @@ class Article < ActiveRecord::Base
84 pending_categorizations.clear 84 pending_categorizations.clear
85 end 85 end
86 86
87 - before_save do |article|  
88 - if article.parent  
89 - article.public_article = article.parent.public_article  
90 - end  
91 - true  
92 - end  
93 -  
94 acts_as_taggable 87 acts_as_taggable
95 N_('Tag list') 88 N_('Tag list')
96 89
@@ -123,11 +116,10 @@ class Article < ActiveRecord::Base @@ -123,11 +116,10 @@ class Article < ActiveRecord::Base
123 options = { :limit => limit, 116 options = { :limit => limit,
124 :conditions => [ 117 :conditions => [
125 "advertise = ? AND 118 "advertise = ? AND
126 - public_article = ? AND  
127 published = ? AND 119 published = ? AND
128 profiles.visible = ? AND 120 profiles.visible = ? AND
129 profiles.public_profile = ? AND 121 profiles.public_profile = ? AND
130 - ((articles.type != ? and articles.type != ? and articles.type != ?) OR articles.type is NULL)", true, true, true, true, true, 'UploadedFile', 'RssFeed', 'Blog' 122 + ((articles.type != ? and articles.type != ? and articles.type != ?) OR articles.type is NULL)", true, true, true, true, 'UploadedFile', 'RssFeed', 'Blog'
131 ], 123 ],
132 :include => 'profile', 124 :include => 'profile',
133 :order => 'articles.published_at desc, articles.id desc' 125 :order => 'articles.published_at desc, articles.id desc'
@@ -221,16 +213,32 @@ class Article < ActiveRecord::Base @@ -221,16 +213,32 @@ class Article < ActiveRecord::Base
221 false 213 false
222 end 214 end
223 215
  216 + def published?
  217 + if self.published
  218 + if self.parent && !self.parent.published?
  219 + return false
  220 + end
  221 + true
  222 + else
  223 + false
  224 + end
  225 + end
  226 +
224 named_scope :folders, :conditions => { :type => ['Folder', 'Blog'] } 227 named_scope :folders, :conditions => { :type => ['Folder', 'Blog'] }
225 228
  229 + def display_unpublished_article_to?(user)
  230 + self.author == user || allow_view_private_content?(user) || user == self.profile ||
  231 + user.is_admin?(self.profile.environment) || user.is_admin?(self.profile)
  232 + end
  233 +
226 def display_to?(user) 234 def display_to?(user)
227 - if self.public_article 235 + if self.published?
228 self.profile.display_info_to?(user) 236 self.profile.display_info_to?(user)
229 else 237 else
230 if user.nil? 238 if user.nil?
231 false 239 false
232 else 240 else
233 - (user == self.profile) || user.has_permission?('view_private_content', self.profile) 241 + self.display_unpublished_article_to?(user)
234 end 242 end
235 end 243 end
236 end 244 end
@@ -243,6 +251,10 @@ class Article < ActiveRecord::Base @@ -243,6 +251,10 @@ class Article < ActiveRecord::Base
243 user && user.has_permission?('publish_content', profile) 251 user && user.has_permission?('publish_content', profile)
244 end 252 end
245 253
  254 + def allow_view_private_content?(user = nil)
  255 + user && user.has_permission?('view_private_content', profile)
  256 + end
  257 +
246 def comments_updated 258 def comments_updated
247 ferret_update 259 ferret_update
248 end 260 end
@@ -252,18 +264,31 @@ class Article < ActiveRecord::Base @@ -252,18 +264,31 @@ class Article < ActiveRecord::Base
252 end 264 end
253 265
254 def public? 266 def public?
255 - profile.visible? && profile.public? && public_article 267 + profile.visible? && profile.public? && published?
256 end 268 end
257 269
  270 +
258 def copy(options) 271 def copy(options)
259 - attrs = attributes.reject! { |key, value| article_attr_blacklist.include?(key) } 272 + attrs = attributes.reject! { |key, value| ATTRIBUTES_NOT_COPIED.include?(key.to_sym) }
260 attrs.merge!(options) 273 attrs.merge!(options)
261 self.class.create(attrs) 274 self.class.create(attrs)
262 end 275 end
263 276
264 - def article_attr_blacklist  
265 - ['id', 'profile_id', 'parent_id', 'slug', 'path', 'updated_at', 'created_at', 'last_changed_by_id', 'version', 'lock_version', 'type', 'children_count', 'comments_count', 'hits']  
266 - end 277 + ATTRIBUTES_NOT_COPIED = [
  278 + :id,
  279 + :profile_id,
  280 + :parent_id,
  281 + :path,
  282 + :updated_at,
  283 + :created_at,
  284 + :last_changed_by_id,
  285 + :version,
  286 + :lock_version,
  287 + :type,
  288 + :children_count,
  289 + :comments_count,
  290 + :hits,
  291 + ]
267 292
268 def self.find_by_old_path(old_path) 293 def self.find_by_old_path(old_path)
269 find(:first, :include => :versions, :conditions => ['article_versions.path = ?', old_path], :order => 'article_versions.id desc') 294 find(:first, :include => :versions, :conditions => ['article_versions.path = ?', old_path], :order => 'article_versions.id desc')
app/models/folder.rb
@@ -4,6 +4,8 @@ class Folder < Article @@ -4,6 +4,8 @@ class Folder < Article
4 4
5 settings_items :view_as, :type => :string, :default => 'folder' 5 settings_items :view_as, :type => :string, :default => 'folder'
6 6
  7 + xss_terminate :only => [ :body ], :with => 'white_list'
  8 +
7 def self.select_views 9 def self.select_views
8 [[_('Folder'), 'folder'], [_('Image gallery'), 'image_gallery']] 10 [[_('Folder'), 'folder'], [_('Image gallery'), 'image_gallery']]
9 end 11 end
@@ -39,7 +41,7 @@ class Folder < Article @@ -39,7 +41,7 @@ class Folder < Article
39 end 41 end
40 42
41 def folder 43 def folder
42 - content_tag('div', body) + tag('hr') + (children.empty? ? content_tag('em', _('(empty folder)')) : list_articles(children)) 44 + content_tag('div', body) + tag('hr')
43 end 45 end
44 46
45 def image_gallery 47 def image_gallery
app/models/profile.rb
@@ -448,7 +448,7 @@ private :generate_url, :url_options @@ -448,7 +448,7 @@ private :generate_url, :url_options
448 448
449 # a default private folder if public 449 # a default private folder if public
450 if self.public? 450 if self.public?
451 - folder = Folder.new(:name => _("Intranet"), :public_article => false) 451 + folder = Folder.new(:name => _("Intranet"), :published => false)
452 self.articles << folder 452 self.articles << folder
453 end 453 end
454 end 454 end
@@ -588,10 +588,6 @@ private :generate_url, :url_options @@ -588,10 +588,6 @@ private :generate_url, :url_options
588 end 588 end
589 end 589 end
590 590
591 - def theme  
592 - self[:theme] || environment && environment.theme || 'default'  
593 - end  
594 -  
595 def public? 591 def public?
596 visible && public_profile 592 visible && public_profile
597 end 593 end
@@ -693,7 +689,7 @@ private :generate_url, :url_options @@ -693,7 +689,7 @@ private :generate_url, :url_options
693 if user.nil? 689 if user.nil?
694 false 690 false
695 else 691 else
696 - (user == self) || (user.is_admin?(self.environment)) || (user.memberships.include?(self)) 692 + (user == self) || (user.is_admin?(self.environment)) || user.is_admin?(self) || user.memberships.include?(self)
697 end 693 end
698 end 694 end
699 end 695 end
app/views/content_viewer/view_page.rhtml
@@ -81,6 +81,9 @@ @@ -81,6 +81,9 @@
81 <% cache(@page.cache_key(params, user)) do %> 81 <% cache(@page.cache_key(params, user)) do %>
82 <div class="<%="article-body article-body-" + @page.css_class_name %>"> 82 <div class="<%="article-body article-body-" + @page.css_class_name %>">
83 <%= article_to_html(@page) %> 83 <%= article_to_html(@page) %>
  84 + <% if @page.folder? %>
  85 + <%= list_articles(@page.children, user)%>
  86 + <% end %>
84 <br style="clear:both" /> 87 <br style="clear:both" />
85 </div> <!-- end class="article-body" --> 88 </div> <!-- end class="article-body" -->
86 <% end %> 89 <% end %>
app/views/profile/sitemap.rhtml
1 <h1><%= _("%s: site map") % profile.name %></h1> 1 <h1><%= _("%s: site map") % profile.name %></h1>
2 2
3 -<%= list_articles(@articles, false) %> 3 +<%= list_articles(@articles, user) %>
db/migrate/084_set_public_article_into_published_attribute.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +class SetPublicArticleIntoPublishedAttribute < ActiveRecord::Migration
  2 + def self.up
  3 + execute('update articles set published=(1!=1) where not public_article')
  4 + end
  5 +
  6 + def self.down
  7 + say "this migration can't be reverted"
  8 + end
  9 +end
db/migrate/085_remove_public_article.rb 0 → 100644
@@ -0,0 +1,10 @@ @@ -0,0 +1,10 @@
  1 +class RemovePublicArticle < ActiveRecord::Migration
  2 + def self.up
  3 + remove_column :articles, :public_article
  4 + end
  5 +
  6 + def self.down
  7 + add_column :articles, :public_article, :boolean, :default => true
  8 + execute('update articles set public_article = (1>0)')
  9 + end
  10 +end
db/migrate/20100326171758_clear_default_theme_from_profiles.rb 0 → 100644
@@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
  1 +class ClearDefaultThemeFromProfiles < ActiveRecord::Migration
  2 + def self.up
  3 + execute("update profiles set theme = null where theme = 'default'")
  4 + end
  5 +
  6 + def self.down
  7 + say "WARNING: cannot undo this migration"
  8 + end
  9 +end
db/migrate/renumber.sh
@@ -1,12 +0,0 @@ @@ -1,12 +0,0 @@
1 -ls -1 *.rb | (  
2 - i=1  
3 - while read IN; do  
4 - OUT=$(echo $IN | sed -e "s/^[0-9]\+/$(printf '%03d' $i)/")  
5 - if [ "$IN" != "$OUT" ]; then  
6 - echo mv $IN $OUT  
7 - else  
8 - echo "# $IN stays untouched"  
9 - fi  
10 - i=$[$i + 1]  
11 - done  
12 -)  
@@ -9,7 +9,7 @@ @@ -9,7 +9,7 @@
9 # 9 #
10 # It's strongly recommended to check this file into your version control system. 10 # It's strongly recommended to check this file into your version control system.
11 11
12 -ActiveRecord::Schema.define(:version => 83) do 12 +ActiveRecord::Schema.define(:version => 20100326171758) do
13 13
14 create_table "article_versions", :force => true do |t| 14 create_table "article_versions", :force => true do |t|
15 t.integer "article_id" 15 t.integer "article_id"
@@ -72,7 +72,6 @@ ActiveRecord::Schema.define(:version =&gt; 83) do @@ -72,7 +72,6 @@ ActiveRecord::Schema.define(:version =&gt; 83) do
72 t.date "start_date" 72 t.date "start_date"
73 t.date "end_date" 73 t.date "end_date"
74 t.integer "children_count", :default => 0 74 t.integer "children_count", :default => 0
75 - t.boolean "public_article", :default => true  
76 t.boolean "accept_comments", :default => true 75 t.boolean "accept_comments", :default => true
77 t.integer "reference_article_id" 76 t.integer "reference_article_id"
78 t.text "setting" 77 t.text "setting"
script/apply-template
@@ -8,7 +8,7 @@ env = Environment.default @@ -8,7 +8,7 @@ env = Environment.default
8 8
9 def move_articles_to_blog(profile) 9 def move_articles_to_blog(profile)
10 profile.articles.each { |article| 10 profile.articles.each { |article|
11 - if !article.blog? && !article.is_a?(RssFeed) && article.public_article 11 + if !article.blog? && !article.is_a?(RssFeed) && article.published?
12 puts 'including ' + article.path + ' in the blog' 12 puts 'including ' + article.path + ' in the blog'
13 article.parent = profile.blog 13 article.parent = profile.blog
14 article.save! 14 article.save!
test/functional/cms_controller_test.rb
@@ -624,14 +624,14 @@ class CmsControllerTest &lt; Test::Unit::TestCase @@ -624,14 +624,14 @@ class CmsControllerTest &lt; Test::Unit::TestCase
624 end 624 end
625 625
626 should 'create a private article child of private folder' do 626 should 'create a private article child of private folder' do
627 - folder = Folder.new(:name => 'my intranet', :public_article => false); profile.articles << folder; folder.save! 627 + folder = Folder.new(:name => 'my intranet', :published => false); profile.articles << folder; folder.save!
628 628
629 post :new, :profile => profile.identifier, :type => 'TextileArticle', :parent_id => folder.id, :article => { :name => 'new-private-article'} 629 post :new, :profile => profile.identifier, :type => 'TextileArticle', :parent_id => folder.id, :article => { :name => 'new-private-article'}
630 folder.reload 630 folder.reload
631 631
632 - assert !assigns(:article).public? 632 + assert !assigns(:article).published?
633 assert_equal 'new-private-article', folder.children[0].name 633 assert_equal 'new-private-article', folder.children[0].name
634 - assert !folder.children[0].public? 634 + assert !folder.children[0].published?
635 end 635 end
636 636
637 should 'load communities for that the user belongs' do 637 should 'load communities for that the user belongs' do
test/functional/content_viewer_controller_test.rb
@@ -293,10 +293,10 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -293,10 +293,10 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
293 assert_response 404 293 assert_response 404
294 end 294 end
295 295
296 - should 'show unpublished articles as unexisting' do 296 + should 'show access denied to unpublished articles' do
297 profile.articles.create!(:name => 'test', :published => false) 297 profile.articles.create!(:name => 'test', :published => false)
298 get :view_page, :profile => profile.identifier, :page => [ 'test' ] 298 get :view_page, :profile => profile.identifier, :page => [ 'test' ]
299 - assert_response 404 299 + assert_response 403
300 end 300 end
301 301
302 should 'show unpublished articles to the user himself' do 302 should 'show unpublished articles to the user himself' do
@@ -307,19 +307,9 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -307,19 +307,9 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
307 assert_response :success 307 assert_response :success
308 end 308 end
309 309
310 - should 'show unpublished articles to members' do  
311 - community = Community.create!(:name => 'testcomm')  
312 - community.articles.create!(:name => 'test', :published => false)  
313 - community.add_member(profile)  
314 -  
315 - login_as(profile.identifier)  
316 - get :view_page, :profile => community.identifier, :page => [ 'test' ]  
317 - assert_response :success  
318 - end  
319 -  
320 should 'not show private content to members' do 310 should 'not show private content to members' do
321 community = Community.create!(:name => 'testcomm') 311 community = Community.create!(:name => 'testcomm')
322 - Folder.create!(:name => 'test', :profile => community, :public_article => false) 312 + Folder.create!(:name => 'test', :profile => community, :published => false)
323 community.add_member(profile) 313 community.add_member(profile)
324 314
325 login_as(profile.identifier) 315 login_as(profile.identifier)
@@ -332,7 +322,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -332,7 +322,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
332 322
333 should 'show private content to profile moderators' do 323 should 'show private content to profile moderators' do
334 community = Community.create!(:name => 'testcomm') 324 community = Community.create!(:name => 'testcomm')
335 - community.articles.create!(:name => 'test', :public_article => false) 325 + community.articles.create!(:name => 'test', :published => false)
336 community.add_moderator(profile) 326 community.add_moderator(profile)
337 327
338 login_as(profile.identifier) 328 login_as(profile.identifier)
@@ -344,7 +334,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -344,7 +334,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
344 334
345 should 'show private content to profile admins' do 335 should 'show private content to profile admins' do
346 community = Community.create!(:name => 'testcomm') 336 community = Community.create!(:name => 'testcomm')
347 - community.articles.create!(:name => 'test', :public_article => false) 337 + community.articles.create!(:name => 'test', :published => false)
348 community.add_admin(profile) 338 community.add_admin(profile)
349 339
350 login_as(profile.identifier) 340 login_as(profile.identifier)
@@ -430,7 +420,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -430,7 +420,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
430 420
431 should 'not give access to private articles if logged off' do 421 should 'not give access to private articles if logged off' do
432 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 422 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
433 - intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) 423 + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false)
434 424
435 @request.stubs(:ssl?).returns(true) 425 @request.stubs(:ssl?).returns(true)
436 get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] 426 get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ]
@@ -441,7 +431,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -441,7 +431,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
441 should 'not give access to private articles if logged in but not member' do 431 should 'not give access to private articles if logged in but not member' do
442 login_as('testinguser') 432 login_as('testinguser')
443 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 433 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
444 - intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) 434 + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false)
445 435
446 @request.stubs(:ssl?).returns(true) 436 @request.stubs(:ssl?).returns(true)
447 get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ] 437 get :view_page, :profile => 'test_profile', :page => [ 'my-intranet' ]
@@ -452,7 +442,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -452,7 +442,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
452 should 'not give access to private articles if logged in and only member' do 442 should 'not give access to private articles if logged in and only member' do
453 person = create_user('test_user').person 443 person = create_user('test_user').person
454 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 444 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
455 - intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) 445 + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false)
456 profile.affiliate(person, Profile::Roles.member(profile.environment.id)) 446 profile.affiliate(person, Profile::Roles.member(profile.environment.id))
457 login_as('test_user') 447 login_as('test_user')
458 448
@@ -465,7 +455,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -465,7 +455,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
465 should 'give access to private articles if logged in and moderator' do 455 should 'give access to private articles if logged in and moderator' do
466 person = create_user('test_user').person 456 person = create_user('test_user').person
467 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 457 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
468 - intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) 458 + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false)
469 profile.affiliate(person, Profile::Roles.moderator(profile.environment.id)) 459 profile.affiliate(person, Profile::Roles.moderator(profile.environment.id))
470 login_as('test_user') 460 login_as('test_user')
471 461
@@ -478,7 +468,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -478,7 +468,7 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
478 should 'give access to private articles if logged in and admin' do 468 should 'give access to private articles if logged in and admin' do
479 person = create_user('test_user').person 469 person = create_user('test_user').person
480 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 470 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
481 - intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) 471 + intranet = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false)
482 profile.affiliate(person, Profile::Roles.admin(profile.environment.id)) 472 profile.affiliate(person, Profile::Roles.admin(profile.environment.id))
483 login_as('test_user') 473 login_as('test_user')
484 474
@@ -507,21 +497,21 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase @@ -507,21 +497,21 @@ class ContentViewerControllerTest &lt; Test::Unit::TestCase
507 497
508 should 'require SSL for viewing non-public articles' do 498 should 'require SSL for viewing non-public articles' do
509 Environment.default.update_attribute(:enable_ssl, true) 499 Environment.default.update_attribute(:enable_ssl, true)
510 - page = profile.articles.create!(:name => 'myarticle', :body => 'top secret', :public_article => false) 500 + page = profile.articles.create!(:name => 'myarticle', :body => 'top secret', :published => false)
511 get :view_page, :profile => 'testinguser', :page => [ 'myarticle' ] 501 get :view_page, :profile => 'testinguser', :page => [ 'myarticle' ]
512 assert_redirected_to :protocol => 'https://', :profile => 'testinguser', :page => [ 'myarticle' ] 502 assert_redirected_to :protocol => 'https://', :profile => 'testinguser', :page => [ 'myarticle' ]
513 end 503 end
514 504
515 should 'avoid SSL for viewing public articles' do 505 should 'avoid SSL for viewing public articles' do
516 @request.expects(:ssl?).returns(true).at_least_once 506 @request.expects(:ssl?).returns(true).at_least_once
517 - page = profile.articles.create!(:name => 'myarticle', :body => 'top secret', :public_article => true) 507 + page = profile.articles.create!(:name => 'myarticle', :body => 'top secret', :published => true)
518 get :view_page, :profile => 'testinguser', :page => [ 'myarticle' ] 508 get :view_page, :profile => 'testinguser', :page => [ 'myarticle' ]
519 assert_redirected_to :protocol => 'http://', :profile => 'testinguser', :page => [ 'myarticle' ] 509 assert_redirected_to :protocol => 'http://', :profile => 'testinguser', :page => [ 'myarticle' ]
520 end 510 end
521 511
522 should 'not redirect to SSL if already on SSL' do 512 should 'not redirect to SSL if already on SSL' do
523 @request.expects(:ssl?).returns(true).at_least_once 513 @request.expects(:ssl?).returns(true).at_least_once
524 - page = profile.articles.create!(:name => 'myarticle', :body => 'top secret', :public_article => false) 514 + page = profile.articles.create!(:name => 'myarticle', :body => 'top secret', :published => false)
525 login_as('testinguser') 515 login_as('testinguser')
526 get :view_page, :profile => 'testinguser', :page => [ 'myarticle' ] 516 get :view_page, :profile => 'testinguser', :page => [ 'myarticle' ]
527 assert_response :success 517 assert_response :success
test/unit/application_helper_test.rb
@@ -555,6 +555,12 @@ class ApplicationHelperTest &lt; Test::Unit::TestCase @@ -555,6 +555,12 @@ class ApplicationHelperTest &lt; Test::Unit::TestCase
555 assert_equal 'profile-theme', current_theme 555 assert_equal 'profile-theme', current_theme
556 end 556 end
557 557
  558 + should 'use environment theme if the profile theme is nil' do
  559 + stubs(:environment).returns(fast_create(Environment, :theme => 'new-theme'))
  560 + stubs(:profile).returns(fast_create(Profile))
  561 + assert_equal environment.theme, current_theme
  562 + end
  563 +
558 protected 564 protected
559 565
560 def url_for(args = {}) 566 def url_for(args = {})
test/unit/article_test.rb
@@ -160,8 +160,8 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -160,8 +160,8 @@ class ArticleTest &lt; Test::Unit::TestCase
160 p = create_user('usr1').person 160 p = create_user('usr1').person
161 Article.destroy_all 161 Article.destroy_all
162 162
163 - first = p.articles.build(:name => 'first', :public_article => true); first.save!  
164 - second = p.articles.build(:name => 'second', :public_article => false); second.save! 163 + first = p.articles.build(:name => 'first', :published => true); first.save!
  164 + second = p.articles.build(:name => 'second', :published => false); second.save!
165 165
166 assert_equal [ first ], Article.recent(nil) 166 assert_equal [ first ], Article.recent(nil)
167 end 167 end
@@ -202,8 +202,8 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -202,8 +202,8 @@ class ArticleTest &lt; Test::Unit::TestCase
202 202
203 now = Time.now 203 now = Time.now
204 204
205 - first = p.articles.build(:name => 'first', :public_article => true, :created_at => now, :published_at => now); first.save!  
206 - second = p.articles.build(:name => 'second', :public_article => true, :updated_at => now, :published_at => now + 1.second); second.save! 205 + first = p.articles.build(:name => 'first', :published => true, :created_at => now, :published_at => now); first.save!
  206 + second = p.articles.build(:name => 'second', :published => true, :updated_at => now, :published_at => now + 1.second); second.save!
207 207
208 assert_equal [ second, first ], Article.recent(2) 208 assert_equal [ second, first ], Article.recent(2)
209 209
@@ -443,21 +443,21 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -443,21 +443,21 @@ class ArticleTest &lt; Test::Unit::TestCase
443 assert !Article.new.accept_category?(ProductCategory.new) 443 assert !Article.new.accept_category?(ProductCategory.new)
444 end 444 end
445 445
446 - should 'accept public_article attribute' do  
447 - assert_respond_to Article.new, :public_article  
448 - assert_respond_to Article.new, :public_article= 446 + should 'accept published attribute' do
  447 + assert_respond_to Article.new, :published
  448 + assert_respond_to Article.new, :published=
449 end 449 end
450 450
451 should 'say that logged off user cannot see private article' do 451 should 'say that logged off user cannot see private article' do
452 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 452 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
453 - article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) 453 + article = Article.create!(:name => 'test article', :profile => profile, :published => false)
454 454
455 assert !article.display_to?(nil) 455 assert !article.display_to?(nil)
456 end 456 end
457 457
458 should 'say that not member of profile cannot see private article' do 458 should 'say that not member of profile cannot see private article' do
459 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 459 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
460 - article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) 460 + article = Article.create!(:name => 'test article', :profile => profile, :published => false)
461 person = create_user('test_user').person 461 person = create_user('test_user').person
462 462
463 assert !article.display_to?(person) 463 assert !article.display_to?(person)
@@ -465,7 +465,7 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -465,7 +465,7 @@ class ArticleTest &lt; Test::Unit::TestCase
465 465
466 should 'say that member user can not see private article' do 466 should 'say that member user can not see private article' do
467 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 467 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
468 - article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) 468 + article = Article.create!(:name => 'test article', :profile => profile, :published => false)
469 person = create_user('test_user').person 469 person = create_user('test_user').person
470 profile.affiliate(person, Profile::Roles.member(profile.environment.id)) 470 profile.affiliate(person, Profile::Roles.member(profile.environment.id))
471 471
@@ -474,7 +474,7 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -474,7 +474,7 @@ class ArticleTest &lt; Test::Unit::TestCase
474 474
475 should 'say that profile admin can see private article' do 475 should 'say that profile admin can see private article' do
476 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 476 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
477 - article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) 477 + article = Article.create!(:name => 'test article', :profile => profile, :published => false)
478 person = create_user('test_user').person 478 person = create_user('test_user').person
479 profile.affiliate(person, Profile::Roles.admin(profile.environment.id)) 479 profile.affiliate(person, Profile::Roles.admin(profile.environment.id))
480 480
@@ -483,7 +483,7 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -483,7 +483,7 @@ class ArticleTest &lt; Test::Unit::TestCase
483 483
484 should 'say that profile moderator can see private article' do 484 should 'say that profile moderator can see private article' do
485 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 485 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
486 - article = Article.create!(:name => 'test article', :profile => profile, :public_article => false) 486 + article = Article.create!(:name => 'test article', :profile => profile, :published => false)
487 person = create_user('test_user').person 487 person = create_user('test_user').person
488 profile.affiliate(person, Profile::Roles.moderator(profile.environment.id)) 488 profile.affiliate(person, Profile::Roles.moderator(profile.environment.id))
489 489
@@ -492,7 +492,7 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -492,7 +492,7 @@ class ArticleTest &lt; Test::Unit::TestCase
492 492
493 should 'not show article to non member if article public but profile private' do 493 should 'not show article to non member if article public but profile private' do
494 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile', :public_profile => false) 494 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile', :public_profile => false)
495 - article = Article.create!(:name => 'test article', :profile => profile, :public_article => true) 495 + article = Article.create!(:name => 'test article', :profile => profile, :published => true)
496 person1 = create_user('test_user1').person 496 person1 = create_user('test_user1').person
497 profile.affiliate(person1, Profile::Roles.member(profile.environment.id)) 497 profile.affiliate(person1, Profile::Roles.member(profile.environment.id))
498 person2 = create_user('test_user2').person 498 person2 = create_user('test_user2').person
@@ -504,54 +504,27 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -504,54 +504,27 @@ class ArticleTest &lt; Test::Unit::TestCase
504 504
505 should 'make new article private if created inside a private folder' do 505 should 'make new article private if created inside a private folder' do
506 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 506 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
507 - folder = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) 507 + folder = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false)
508 article = Article.create!(:name => 'my private article', :profile => profile, :parent => folder) 508 article = Article.create!(:name => 'my private article', :profile => profile, :parent => folder)
509 509
510 - assert !article.public_article  
511 - end  
512 -  
513 - should 'respond to public? like public_article if profile is public' do  
514 - p = Profile.create!(:name => 'test profile', :identifier => 'test_profile')  
515 - a1 = Article.create!(:name => 'test public article', :profile => p)  
516 - a2 = Article.create!(:name => 'test private article', :profile => p, :public_article => false)  
517 -  
518 - assert a1.public?  
519 - assert !a2.public?  
520 - end  
521 -  
522 - should 'respond to public? as false if profile is private' do  
523 - p = Profile.create!(:name => 'test profile', :identifier => 'test_profile', :public_profile => false)  
524 - a1 = Article.create!(:name => 'test public article', :profile => p)  
525 - a2 = Article.create!(:name => 'test private article', :profile => p, :public_article => false)  
526 -  
527 - assert !a1.public?  
528 - assert !a2.public?  
529 - end  
530 -  
531 - should 'respond to public? as false if profile is invisible' do  
532 - profile = fast_create(Profile, :visible => false)  
533 - article1 = fast_create(Article, :profile_id => profile.id)  
534 - article2 = fast_create(Article, :profile_id => profile.id, :public_article => false)  
535 -  
536 - assert !article1.public?  
537 - assert !article2.public? 510 + assert !article.published?
538 end 511 end
539 512
540 should 'save as private' do 513 should 'save as private' do
541 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile') 514 profile = Profile.create!(:name => 'test profile', :identifier => 'test_profile')
542 - folder = Folder.create!(:name => 'my_intranet', :profile => profile, :public_article => false) 515 + folder = Folder.create!(:name => 'my_intranet', :profile => profile, :published => false)
543 article = TextileArticle.new(:name => 'my private article') 516 article = TextileArticle.new(:name => 'my private article')
544 article.profile = profile 517 article.profile = profile
545 article.parent = folder 518 article.parent = folder
546 article.save! 519 article.save!
547 article.reload 520 article.reload
548 521
549 - assert !article.public_article 522 + assert !article.published?
550 end 523 end
551 524
552 should 'not allow friends of private person see the article' do 525 should 'not allow friends of private person see the article' do
553 person = create_user('test_user').person 526 person = create_user('test_user').person
554 - article = Article.create!(:name => 'test article', :profile => person, :public_article => false) 527 + article = Article.create!(:name => 'test article', :profile => person, :published => false)
555 friend = create_user('test_friend').person 528 friend = create_user('test_friend').person
556 person.add_friend(friend) 529 person.add_friend(friend)
557 person.save! 530 person.save!
@@ -562,7 +535,7 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -562,7 +535,7 @@ class ArticleTest &lt; Test::Unit::TestCase
562 535
563 should 'display private articles to people who can view private content' do 536 should 'display private articles to people who can view private content' do
564 person = create_user('test_user').person 537 person = create_user('test_user').person
565 - article = Article.create!(:name => 'test article', :profile => person, :public_article => false) 538 + article = Article.create!(:name => 'test article', :profile => person, :published => false)
566 539
567 admin_user = create_user('admin_user').person 540 admin_user = create_user('admin_user').person
568 admin_user.stubs(:has_permission?).with('view_private_content', article.profile).returns('true') 541 admin_user.stubs(:has_permission?).with('view_private_content', article.profile).returns('true')
@@ -598,6 +571,12 @@ class ArticleTest &lt; Test::Unit::TestCase @@ -598,6 +571,12 @@ class ArticleTest &lt; Test::Unit::TestCase
598 assert_kind_of Folder, b 571 assert_kind_of Folder, b
599 end 572 end
600 573
  574 + should 'copy slug' do
  575 + a = fast_create(Article, :slug => 'slug123')
  576 + b = a.copy({})
  577 + assert_equal a.slug, b.slug
  578 + end
  579 +
601 should 'load article under an old path' do 580 should 'load article under an old path' do
602 p = create_user('test_user').person 581 p = create_user('test_user').person
603 a = p.articles.create(:name => 'old-name') 582 a = p.articles.create(:name => 'old-name')
test/unit/folder_helper_test.rb
@@ -15,4 +15,82 @@ class FolderHelperTest &lt; Test::Unit::TestCase @@ -15,4 +15,82 @@ class FolderHelperTest &lt; Test::Unit::TestCase
15 assert_equal 'icons-mime/unknown.png', icon_for_article(art2) 15 assert_equal 'icons-mime/unknown.png', icon_for_article(art2)
16 end 16 end
17 17
  18 + should 'list all the folder\'s children to the owner' do
  19 + profile = create_user('Folder Owner').person
  20 + folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
  21 + sub_folder = fast_create(Folder, {:name => 'Child Folder', :parent_id => folder.id,
  22 + :profile_id => profile.id})
  23 + sub_blog = fast_create(Blog, {:name => 'Child Blog', :parent_id => folder.id,
  24 + :profile_id => profile.id})
  25 + sub_article = fast_create(Article, {:name => 'Not Public Child Article', :parent_id =>
  26 + folder.id, :profile_id => profile.id, :published => false})
  27 +
  28 + result = folder.list_articles(folder.children, profile)
  29 +
  30 + assert_match 'Child Folder', result
  31 + assert_match 'Not Public Child Article', result
  32 + assert_match 'Child Blog', result
  33 + end
  34 +
  35 + should 'list the folder\'s children that are public to the user' do
  36 + profile = create_user('Folder Owner').person
  37 + profile2 = create_user('Folder Viwer').person
  38 + folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
  39 + public_article = fast_create(Article, {:name => 'Public Article', :parent_id =>
  40 + folder.id, :profile_id => profile.id, :published => true})
  41 + not_public_article = fast_create(Article, {:name => 'Not Public Article', :parent_id =>
  42 + folder.id, :profile_id => profile.id, :published => false})
  43 +
  44 + result = folder.list_articles(folder.children, profile2)
  45 +
  46 + assert_match 'Public Article', result
  47 + assert_no_match /Not Public Article/, result
  48 + end
  49 +
  50 + should ' not list the folder\'s children to the user because the owner\'s profile is not public' do
  51 + profile = create_user('folder-owner').person
  52 + profile.public_profile = false
  53 + profile.save!
  54 + profile2 = create_user('Folder Viwer').person
  55 + folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
  56 + article = fast_create(Article, {:name => 'Article', :parent_id => folder.id, :profile_id => profile.id})
  57 +
  58 + result = folder.list_articles(folder.children, profile2)
  59 +
  60 + assert_no_match /Article/, result
  61 + end
  62 +
  63 + should ' not list the folder\'s children to the user because the owner\'s profile is not visible' do
  64 + profile = create_user('folder-owner').person
  65 + profile.visible = false
  66 + profile.save!
  67 + profile2 = create_user('Folder Viwer').person
  68 + folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
  69 + article = fast_create(Article, {:name => 'Article', :parent_id => folder.id, :profile_id => profile.id})
  70 +
  71 + result = folder.list_articles(folder.children, profile2)
  72 +
  73 + assert_no_match /Article/, result
  74 + end
  75 +
  76 + should 'list subitems as HTML content' do
  77 + profile = create_user('folder-owner').person
  78 + folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
  79 + article = fast_create(Article, {:name => 'Article1', :parent_id => folder.id, :profile_id => profile.id})
  80 + article = fast_create(Article, {:name => 'Article2', :parent_id => folder.id, :profile_id => profile.id})
  81 +
  82 + result = folder.list_articles(folder.children, profile)
  83 +
  84 + assert_tag_in_string result, :tag => 'td', :descendant => { :tag => 'a', :attributes => { :href => /.*\/folder-owner\/my-article-[0-9]*(\?|$)/ } }, :content => /Article1/
  85 + assert_tag_in_string result, :tag => 'td', :descendant => { :tag => 'a', :attributes => { :href => /.*\/folder-owner\/my-article-[0-9]*(\?|$)/ } }, :content => /Article2/
  86 + end
  87 +
  88 + should 'explictly advise if empty' do
  89 + profile = create_user('folder-owner').person
  90 + folder = fast_create(Folder, {:name => 'Parent Folder', :profile_id => profile.id})
  91 + result = folder.list_articles(folder.children, profile)
  92 +
  93 + assert_match '(empty folder)', result
  94 + end
  95 +
18 end 96 end
test/unit/folder_test.rb
@@ -18,23 +18,6 @@ class FolderTest &lt; ActiveSupport::TestCase @@ -18,23 +18,6 @@ class FolderTest &lt; ActiveSupport::TestCase
18 assert_not_equal Article.new.icon_name, Folder.new.icon_name 18 assert_not_equal Article.new.icon_name, Folder.new.icon_name
19 end 19 end
20 20
21 - should 'list subitems as HTML content' do  
22 - p = create_user('testuser').person  
23 - f = Folder.create!(:profile => p, :name => 'f')  
24 - f.children.create!(:profile => p, :name => 'onearticle')  
25 - f.children.create!(:profile => p, :name => 'otherarticle')  
26 - f.reload  
27 -  
28 - assert_tag_in_string f.to_html, :tag => 'td', :descendant => { :tag => 'a', :attributes => { :href => /.*\/testuser\/f\/onearticle(\?|$)/ } }, :content => /onearticle/  
29 - assert_tag_in_string f.to_html, :tag => 'td', :descendant => { :tag => 'a', :attributes => { :href => /.*\/testuser\/f\/otherarticle(\?|$)/ } }, :content => /otherarticle/  
30 - end  
31 -  
32 - should 'explictly advise if empty' do  
33 - p = create_user('testuser').person  
34 - f = Folder.create!(:profile => p, :name => 'f')  
35 - assert_tag_in_string f.to_html, :content => '(empty folder)'  
36 - end  
37 -  
38 should 'show text body in HTML content' do 21 should 'show text body in HTML content' do
39 p = create_user('testuser').person 22 p = create_user('testuser').person
40 f = Folder.create!(:name => 'f', :profile => p, :body => 'this-is-the-text') 23 f = Folder.create!(:name => 'f', :profile => p, :body => 'this-is-the-text')
@@ -147,4 +130,19 @@ class FolderTest &lt; ActiveSupport::TestCase @@ -147,4 +130,19 @@ class FolderTest &lt; ActiveSupport::TestCase
147 130
148 assert_includes folder.images(true), pi 131 assert_includes folder.images(true), pi
149 end 132 end
  133 +
  134 + should 'not let pass javascript in the body' do
  135 + owner = create_user('testuser').person
  136 + folder = fast_create(Folder, {:profile_id => owner.id, :body => '<script>alert("Xss Attack!")</script>'})
  137 + folder.save!
  138 + assert_no_match(/<script>/, folder.body)
  139 + end
  140 +
  141 + should 'let pass html in the body' do
  142 + owner = create_user('testuser').person
  143 + folder = fast_create(Folder, {:profile_id => owner.id, :body => '<strong>I am not a Xss Attack!")</strong>'})
  144 + folder.save!
  145 + assert_match(/<strong>/, folder.body)
  146 + end
  147 +
150 end 148 end
test/unit/profile_test.rb
@@ -909,15 +909,6 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -909,15 +909,6 @@ class ProfileTest &lt; Test::Unit::TestCase
909 assert_equal 'my-shiny-theme', p.theme 909 assert_equal 'my-shiny-theme', p.theme
910 end 910 end
911 911
912 - should 'delegate theme selection to environment by default' do  
913 - p = Profile.new  
914 - env = mock  
915 - p.stubs(:environment).returns(env)  
916 - env.expects(:theme).returns('environment-stored-theme')  
917 -  
918 - assert_equal 'environment-stored-theme', p.theme  
919 - end  
920 -  
921 should 'respond to public? as public_profile' do 912 should 'respond to public? as public_profile' do
922 p1 = fast_create(Profile) 913 p1 = fast_create(Profile)
923 p2 = fast_create(Profile, :public_profile => false) 914 p2 = fast_create(Profile, :public_profile => false)
@@ -930,8 +921,8 @@ class ProfileTest &lt; Test::Unit::TestCase @@ -930,8 +921,8 @@ class ProfileTest &lt; Test::Unit::TestCase
930 p1 = create(Profile) 921 p1 = create(Profile)
931 p2 = create(Profile, :public_profile => false) 922 p2 = create(Profile, :public_profile => false)
932 923
933 - assert p1.articles.find(:first, :conditions => {:public_article => false})  
934 - assert !p2.articles.find(:first, :conditions => {:public_article => false}) 924 + assert p1.articles.find(:first, :conditions => {:published => false})
  925 + assert !p2.articles.find(:first, :conditions => {:published => false})
935 end 926 end
936 927
937 should 'remove member with many roles' do 928 should 'remove member with many roles' do