Commit 884e842c59b2088a2d0fe98e65fad3611899c0d3
1 parent
71066d56
Exists in
master
and in
28 other branches
Comment-related hotspots
(ActionItem2316)
Showing
5 changed files
with
83 additions
and
0 deletions
Show diff stats
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
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 < ActiveSupport::TestCase | @@ -330,4 +330,12 @@ class CommentTest < 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 |