Commit 884e842c59b2088a2d0fe98e65fad3611899c0d3

Authored by Antonio Terceiro
1 parent 71066d56

Comment-related hotspots

(ActionItem2316)
app/controllers/public/content_viewer_controller.rb
@@ -112,7 +112,10 @@ class ContentViewerController < ApplicationController @@ -112,7 +112,10 @@ class ContentViewerController < ApplicationController
112 @comment.author = user if logged_in? 112 @comment.author = user if logged_in?
113 @comment.article = @page 113 @comment.article = @page
114 @comment.ip_address = request.remote_ip 114 @comment.ip_address = request.remote_ip
  115 + plugins_filter_comment(@comment)
  116 + return if @comment.rejected?
115 if (pass_without_comment_captcha? || verify_recaptcha(:model => @comment, :message => _('Please type the words correctly'))) && @comment.save 117 if (pass_without_comment_captcha? || verify_recaptcha(:model => @comment, :message => _('Please type the words correctly'))) && @comment.save
  118 + plugins_comment_saved(@comment)
116 @page.touch 119 @page.touch
117 @comment = nil # clear the comment form 120 @comment = nil # clear the comment form
118 redirect_to :action => 'view_page', :profile => params[:profile], :page => @page.explode_path, :view => params[:view] 121 redirect_to :action => 'view_page', :profile => params[:profile], :page => @page.explode_path, :view => params[:view]
@@ -121,6 +124,18 @@ class ContentViewerController < ApplicationController @@ -121,6 +124,18 @@ class ContentViewerController < ApplicationController
121 end 124 end
122 end 125 end
123 126
  127 + def plugins_filter_comment(comment)
  128 + @plugins.each do |plugin|
  129 + plugin.filter_comment(comment)
  130 + end
  131 + end
  132 +
  133 + def plugins_comment_saved(comment)
  134 + @plugins.each do |plugin|
  135 + plugin.comment_saved(comment)
  136 + end
  137 + end
  138 +
124 def pass_without_comment_captcha? 139 def pass_without_comment_captcha?
125 logged_in? && !environment.enabled?('captcha_for_logged_users') 140 logged_in? && !environment.enabled?('captcha_for_logged_users')
126 end 141 end
app/models/comment.rb
@@ -126,4 +126,12 @@ class Comment < ActiveRecord::Base @@ -126,4 +126,12 @@ class Comment < ActiveRecord::Base
126 end 126 end
127 end 127 end
128 128
  129 + def rejected?
  130 + @rejected
  131 + end
  132 +
  133 + def reject!
  134 + @rejected = true
  135 + end
  136 +
129 end 137 end
lib/noosfero/plugin.rb
@@ -218,4 +218,24 @@ class Noosfero::Plugin @@ -218,4 +218,24 @@ class Noosfero::Plugin
218 end 218 end
219 end 219 end
220 220
  221 + # This method will be called just before a comment in saved to the database.
  222 + #
  223 + # It can modify the comment in several ways. In special, a plugin can call
  224 + # reject! on the comment and that will cause the comment to not be saved.
  225 + #
  226 + # example:
  227 + #
  228 + # def filter_comment(comment)
  229 + # comment.reject! if anti_spam_service.is_spam?(comment)
  230 + # end
  231 + #
  232 + def filter_comment(comment)
  233 + end
  234 +
  235 + # This method will be called just after a comment has been saved to the
  236 + # database, so that a plugin can perform some action on it.
  237 + #
  238 + def comment_saved(comment)
  239 + end
  240 +
221 end 241 end
test/functional/content_viewer_controller_test.rb
@@ -1379,4 +1379,36 @@ class ContentViewerControllerTest < ActionController::TestCase @@ -1379,4 +1379,36 @@ class ContentViewerControllerTest < ActionController::TestCase
1379 assert_equal '33.44.55.66', comment.ip_address 1379 assert_equal '33.44.55.66', comment.ip_address
1380 end 1380 end
1381 1381
  1382 + should 'not save a comment if a plugin rejects it' do
  1383 + class TestFilterPlugin < Noosfero::Plugin
  1384 + def filter_comment(c)
  1385 + c.reject!
  1386 + end
  1387 + end
  1388 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([TestFilterPlugin.new])
  1389 + page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text')
  1390 + assert_no_difference Comment, :count do
  1391 + post :view_page, :profile => profile.identifier, :page => [ 'myarticle' ], :comment => { :title => 'title', :body => 'body', :name => "Spammer", :email => 'damn@spammer.com' }, :confirm => 'true'
  1392 + end
  1393 + end
  1394 +
  1395 + should 'notify plugins after a comment is saved' do
  1396 + class TestNotifyCommentPlugin < Noosfero::Plugin
  1397 + def comment_saved(c)
  1398 + @__saved = c.id
  1399 + @__title = c.title
  1400 + end
  1401 + attr_reader :__title
  1402 + attr_reader :__saved
  1403 + end
  1404 + plugin = TestNotifyCommentPlugin.new
  1405 + Noosfero::Plugin::Manager.any_instance.stubs(:enabled_plugins).returns([plugin])
  1406 + page = profile.articles.create!(:name => 'myarticle', :body => 'the body of the text')
  1407 + post :view_page, :profile => profile.identifier, :page => [ 'myarticle' ], :comment => { :title => 'the title of the comment', :body => 'body', :name => "Spammer", :email => 'damn@spammer.com' }, :confirm => 'true'
  1408 +
  1409 + assert_equal 'the title of the comment', plugin.__title
  1410 + assert plugin.__saved
  1411 +
  1412 + end
  1413 +
1382 end 1414 end
test/unit/comment_test.rb
@@ -330,4 +330,12 @@ class CommentTest &lt; ActiveSupport::TestCase @@ -330,4 +330,12 @@ class CommentTest &lt; ActiveSupport::TestCase
330 assert_nil Comment.new(:email => 'my@email.com').author_url 330 assert_nil Comment.new(:email => 'my@email.com').author_url
331 end 331 end
332 332
  333 + should 'be able to reject a comment' do
  334 + c = Comment.new
  335 + assert !c.rejected?
  336 +
  337 + c.reject!
  338 + assert c.rejected?
  339 + end
  340 +
333 end 341 end