Commit 8849f0f95ffae506fb0547c93648ca9af53c9d6c
Committed by
Daniela Feitosa
1 parent
00641c73
Exists in
master
and in
28 other branches
Always ask captcha question on comments
(ActionItem2027)
Showing
15 changed files
with
49 additions
and
6 deletions
Show diff stats
app/controllers/public/content_viewer_controller.rb
@@ -76,8 +76,13 @@ class ContentViewerController < ApplicationController | @@ -76,8 +76,13 @@ class ContentViewerController < ApplicationController | ||
76 | 76 | ||
77 | @form_div = params[:form] | 77 | @form_div = params[:form] |
78 | 78 | ||
79 | - if request.post? && params[:comment] && params[self.icaptcha_field].blank? && params[:confirm] == 'true' && @page.accept_comments? | ||
80 | - add_comment | 79 | + if params[:comment] && params[self.icaptcha_field].blank? && params[:confirm] == 'true' |
80 | + @comment = Comment.new(params[:comment]) | ||
81 | + if request.post? && @page.accept_comments? | ||
82 | + add_comment | ||
83 | + end | ||
84 | + else | ||
85 | + @comment = Comment.new | ||
81 | end | 86 | end |
82 | 87 | ||
83 | if request.post? && params[:remove_comment] | 88 | if request.post? && params[:remove_comment] |
@@ -114,7 +119,6 @@ class ContentViewerController < ApplicationController | @@ -114,7 +119,6 @@ class ContentViewerController < ApplicationController | ||
114 | protected | 119 | protected |
115 | 120 | ||
116 | def add_comment | 121 | def add_comment |
117 | - @comment = Comment.new(params[:comment]) | ||
118 | @comment.author = user if logged_in? | 122 | @comment.author = user if logged_in? |
119 | @comment.article = @page | 123 | @comment.article = @page |
120 | if @comment.save | 124 | if @comment.save |
app/models/comment.rb
1 | class Comment < ActiveRecord::Base | 1 | class Comment < ActiveRecord::Base |
2 | 2 | ||
3 | + has_captcha | ||
4 | + | ||
3 | track_actions :leave_comment, :after_create, :keep_params => ["article.title", "article.url", "title", "url", "body"], :custom_target => :action_tracker_target | 5 | track_actions :leave_comment, :after_create, :keep_params => ["article.title", "article.url", "title", "url", "body"], :custom_target => :action_tracker_target |
4 | 6 | ||
5 | validates_presence_of :title, :body | 7 | validates_presence_of :title, :body |
app/views/content_viewer/_comment_form.rhtml
@@ -38,6 +38,10 @@ | @@ -38,6 +38,10 @@ | ||
38 | 38 | ||
39 | <%= required labelled_form_field(_('Title'), text_field(:comment, :title)) %> | 39 | <%= required labelled_form_field(_('Title'), text_field(:comment, :title)) %> |
40 | <%= required labelled_form_field(_('Enter your comment'), text_area(:comment, :body, :rows => 5)) %> | 40 | <%= required labelled_form_field(_('Enter your comment'), text_area(:comment, :body, :rows => 5)) %> |
41 | + | ||
42 | + <%= required labelled_form_field(_("What is the result of '%s = ?'") % @comment.captcha.task, text_field(:comment, :captcha_solution)) %> | ||
43 | + <%= hidden_field(:comment, :captcha_secret) %> | ||
44 | + | ||
41 | <% button_bar do %> | 45 | <% button_bar do %> |
42 | <%= submit_button('add', _('Post comment'), :onclick => "this.form.confirm.value = 'true'; this.disabled = true; this.form.submit(); return true;") %> | 46 | <%= submit_button('add', _('Post comment'), :onclick => "this.form.confirm.value = 'true'; this.disabled = true; this.form.submit(); return true;") %> |
43 | <%= button_to_function :cancel, _('Cancel'), "f=jQuery(this).parents('.post_comment_box'); f.removeClass('opened'); f.addClass('closed'); return false" %> | 47 | <%= button_to_function :cancel, _('Cancel'), "f=jQuery(this).parents('.post_comment_box'); f.removeClass('opened'); f.addClass('closed'); return false" %> |
features/comment.feature
@@ -81,3 +81,16 @@ Feature: comment | @@ -81,3 +81,16 @@ Feature: comment | ||
81 | Then I should see "Enter your comment" within "div#page-comment-form div.post_comment_box.opened" | 81 | Then I should see "Enter your comment" within "div#page-comment-form div.post_comment_box.opened" |
82 | And I should be exactly on /booking/article-with-comment | 82 | And I should be exactly on /booking/article-with-comment |
83 | And I should be moved to anchor "comment_form" | 83 | And I should be moved to anchor "comment_form" |
84 | + | ||
85 | + Scenario: ask captcha question | ||
86 | + Given I am on /booking/article-with-comment | ||
87 | + When I follow "Post a comment" within ".post-comment-button" | ||
88 | + Then I should see "What is the result of " | ||
89 | + | ||
90 | + @selenium | ||
91 | + Scenario: keep comments field filled while trying to do a comment | ||
92 | + Given I am on /booking/article-with-comment | ||
93 | + And I fill in "Name" with "Joey Ramone" | ||
94 | + When I press "Post comment" | ||
95 | + Then the "Name" field should contain "Joey Ramone" | ||
96 | + And I should see "errors prohibited" |
features/comment_reply.feature
@@ -64,9 +64,11 @@ Feature: comment | @@ -64,9 +64,11 @@ Feature: comment | ||
64 | 64 | ||
65 | @selenium | 65 | @selenium |
66 | Scenario: reply a comment | 66 | Scenario: reply a comment |
67 | - Given I am logged in as "booking" | 67 | + Given skip comments captcha |
68 | And I go to /booking/another-article | 68 | And I go to /booking/another-article |
69 | And I follow "Reply" within ".comment-balloon" | 69 | And I follow "Reply" within ".comment-balloon" |
70 | + And I fill in "Name" within "comment-balloon" with "Joey" | ||
71 | + And I fill in "e-mail" within "comment-balloon" with "joey@ramones.com" | ||
70 | And I fill in "Title" within "comment-balloon" with "Hey ho, let's go!" | 72 | And I fill in "Title" within "comment-balloon" with "Hey ho, let's go!" |
71 | And I fill in "Enter your comment" within "comment-balloon" with "Hey ho, let's go!" | 73 | And I fill in "Enter your comment" within "comment-balloon" with "Hey ho, let's go!" |
72 | When I press "Post comment" within ".comment-balloon" | 74 | When I press "Post comment" within ".comment-balloon" |
features/step_definitions/noosfero_steps.rb
@@ -359,6 +359,7 @@ Given /^the articles of "(.+)" are moderated$/ do |organization| | @@ -359,6 +359,7 @@ Given /^the articles of "(.+)" are moderated$/ do |organization| | ||
359 | end | 359 | end |
360 | 360 | ||
361 | Given /^the following comments?$/ do |table| | 361 | Given /^the following comments?$/ do |table| |
362 | + Comment.skip_captcha! | ||
362 | table.hashes.each do |item| | 363 | table.hashes.each do |item| |
363 | data = item.dup | 364 | data = item.dup |
364 | article = Article.find_by_name(data.delete("article")) | 365 | article = Article.find_by_name(data.delete("article")) |
@@ -416,4 +417,6 @@ Given /^the search index is empty$/ do | @@ -416,4 +417,6 @@ Given /^the search index is empty$/ do | ||
416 | ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => '*:*')) | 417 | ActsAsSolr::Post.execute(Solr::Request::Delete.new(:query => '*:*')) |
417 | end | 418 | end |
418 | 419 | ||
419 | - | 420 | +Given /^skip comments captcha$/ do |
421 | + Comment.any_instance.stubs(:skip_captcha?).returns(true) | ||
422 | +end |
test/functional/content_viewer_controller_test.rb
@@ -15,6 +15,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | @@ -15,6 +15,7 @@ class ContentViewerControllerTest < Test::Unit::TestCase | ||
15 | 15 | ||
16 | @profile = create_user('testinguser').person | 16 | @profile = create_user('testinguser').person |
17 | @environment = @profile.environment | 17 | @environment = @profile.environment |
18 | + Comment.skip_captcha! | ||
18 | end | 19 | end |
19 | attr_reader :profile, :environment | 20 | attr_reader :profile, :environment |
20 | 21 |
test/functional/search_controller_test.rb
@@ -18,6 +18,7 @@ class SearchControllerTest < Test::Unit::TestCase | @@ -18,6 +18,7 @@ class SearchControllerTest < Test::Unit::TestCase | ||
18 | domain.save! | 18 | domain.save! |
19 | 19 | ||
20 | @product_category = fast_create(ProductCategory) | 20 | @product_category = fast_create(ProductCategory) |
21 | + Comment.skip_captcha! | ||
21 | end | 22 | end |
22 | 23 | ||
23 | def create_article_with_optional_category(name, profile, category = nil) | 24 | def create_article_with_optional_category(name, profile, category = nil) |
test/unit/article_test.rb
@@ -7,6 +7,7 @@ class ArticleTest < Test::Unit::TestCase | @@ -7,6 +7,7 @@ class ArticleTest < Test::Unit::TestCase | ||
7 | def setup | 7 | def setup |
8 | Test::Unit::TestCase::setup | 8 | Test::Unit::TestCase::setup |
9 | @profile = create_user('testing').person | 9 | @profile = create_user('testing').person |
10 | + Comment.skip_captcha! | ||
10 | end | 11 | end |
11 | attr_reader :profile | 12 | attr_reader :profile |
12 | 13 |
test/unit/category_finder_test.rb
@@ -8,7 +8,8 @@ class CategoryFinderTest < ActiveSupport::TestCase | @@ -8,7 +8,8 @@ class CategoryFinderTest < ActiveSupport::TestCase | ||
8 | @finder = CategoryFinder.new(@category) | 8 | @finder = CategoryFinder.new(@category) |
9 | @product_category = fast_create(ProductCategory, :name => 'Products') | 9 | @product_category = fast_create(ProductCategory, :name => 'Products') |
10 | 10 | ||
11 | - Profile.rebuild_solr_index | 11 | + Profile.rebuild_index |
12 | + Comment.skip_captcha! | ||
12 | end | 13 | end |
13 | 14 | ||
14 | should 'search for articles in a specific category' do | 15 | should 'search for articles in a specific category' do |
test/unit/category_test.rb
@@ -5,6 +5,7 @@ class CategoryTest < Test::Unit::TestCase | @@ -5,6 +5,7 @@ class CategoryTest < Test::Unit::TestCase | ||
5 | 5 | ||
6 | def setup | 6 | def setup |
7 | @env = fast_create(Environment) | 7 | @env = fast_create(Environment) |
8 | + Comment.skip_captcha! | ||
8 | end | 9 | end |
9 | 10 | ||
10 | def test_mandatory_field_name | 11 | def test_mandatory_field_name |
test/unit/comment_notifier_test.rb
@@ -10,6 +10,7 @@ class CommentNotifierTest < Test::Unit::TestCase | @@ -10,6 +10,7 @@ class CommentNotifierTest < Test::Unit::TestCase | ||
10 | ActionMailer::Base.deliveries = [] | 10 | ActionMailer::Base.deliveries = [] |
11 | @profile = create_user('user_comment_test').person | 11 | @profile = create_user('user_comment_test').person |
12 | @article = fast_create(Article, :name => 'Article test', :profile_id => @profile.id, :notify_comments => true) | 12 | @article = fast_create(Article, :name => 'Article test', :profile_id => @profile.id, :notify_comments => true) |
13 | + Comment.skip_captcha! | ||
13 | end | 14 | end |
14 | 15 | ||
15 | should 'deliver mail after make aarticle commment' do | 16 | should 'deliver mail after make aarticle commment' do |
test/unit/comment_test.rb
@@ -327,4 +327,11 @@ class CommentTest < Test::Unit::TestCase | @@ -327,4 +327,11 @@ class CommentTest < Test::Unit::TestCase | ||
327 | assert_nil Comment.new(:email => 'my@email.com').author_url | 327 | assert_nil Comment.new(:email => 'my@email.com').author_url |
328 | end | 328 | end |
329 | 329 | ||
330 | + should 'have the captcha_solution be solved' do | ||
331 | + c = Comment.new | ||
332 | + assert !c.valid? && c.errors.invalid?(:captcha_solution) | ||
333 | + c.skip_captcha! | ||
334 | + assert !c.valid? && !c.errors.invalid?(:captcha_solution) | ||
335 | + end | ||
336 | + | ||
330 | end | 337 | end |
test/unit/community_test.rb
@@ -4,6 +4,7 @@ class CommunityTest < Test::Unit::TestCase | @@ -4,6 +4,7 @@ class CommunityTest < Test::Unit::TestCase | ||
4 | 4 | ||
5 | def setup | 5 | def setup |
6 | @person = fast_create(Person) | 6 | @person = fast_create(Person) |
7 | + Comment.skip_captcha! | ||
7 | end | 8 | end |
8 | 9 | ||
9 | attr_reader :person | 10 | attr_reader :person |
test/unit/forum_helper_test.rb
@@ -12,6 +12,7 @@ class ForumHelperTest < Test::Unit::TestCase | @@ -12,6 +12,7 @@ class ForumHelperTest < Test::Unit::TestCase | ||
12 | @environment = Environment.default | 12 | @environment = Environment.default |
13 | @profile = create_user('forum_helper_test').person | 13 | @profile = create_user('forum_helper_test').person |
14 | @forum = fast_create(Forum, :profile_id => profile.id, :name => 'Forum test') | 14 | @forum = fast_create(Forum, :profile_id => profile.id, :name => 'Forum test') |
15 | + Comment.skip_captcha! | ||
15 | end | 16 | end |
16 | 17 | ||
17 | attr :profile | 18 | attr :profile |