Merge pull request #3498 from evazion/fix-3497

Fix #3497: Invalid DText denial of service attack
This commit is contained in:
Albert Yi
2018-01-15 11:07:43 -08:00
committed by GitHub
29 changed files with 26 additions and 64 deletions

View File

@@ -51,10 +51,12 @@ module ApplicationHelper
def format_text(text, **options) def format_text(text, **options)
raw DTextRagel.parse(text, **options) raw DTextRagel.parse(text, **options)
rescue DTextRagel::Error => e
raw ""
end end
def strip_dtext(text) def strip_dtext(text)
raw(DTextRagel.parse_strip(text)) format_text(text, strip: true)
end end
def error_messages_for(instance_name) def error_messages_for(instance_name)

View File

@@ -9,10 +9,6 @@ class WikiPagePresenter
wiki_page.body wiki_page.body
end end
def blurb
DTextRagel.parse_strip(excerpt.to_s)
end
# Produce a formatted page that shows the difference between two versions of a page. # Produce a formatted page that shows the difference between two versions of a page.
def diff(other_version) def diff(other_version)
pattern = Regexp.new('(?:<.+?>)|(?:[0-9_A-Za-z\x80-\xff]+[\x09\x20]?)|(?:[ \t]+)|(?:\r?\n)|(?:.+?)') pattern = Regexp.new('(?:<.+?>)|(?:[0-9_A-Za-z\x80-\xff]+[\x09\x20]?)|(?:[ \t]+)|(?:\r?\n)|(?:.+?)')

View File

@@ -72,7 +72,7 @@
<%= content_tag :link, nil, rel: "prev", href: prev_page_url %> <%= content_tag :link, nil, rel: "prev", href: prev_page_url %>
<% end %> <% end %>
<% if @post_set.has_wiki? %> <% if @post_set.has_wiki? %>
<meta name="description" content="<%= @post_set.wiki_page.presenter.blurb %>"> <meta name="description" content="<%= strip_dtext(@post_set.wiki_page.presenter.excerpt) %>">
<% else %> <% else %>
<meta name="description" content="<%= Danbooru.config.description %>"> <meta name="description" content="<%= Danbooru.config.description %>">
<% end %> <% end %>

View File

@@ -44,7 +44,7 @@
<% end %> <% end %>
<% content_for(:html_header) do %> <% content_for(:html_header) do %>
<meta name="description" content="<%= @wiki_page.presenter.blurb %>"></meta> <meta name="description" content="<%= strip_dtext(@wiki_page.presenter.excerpt) %>"></meta>
<% end %> <% end %>
<%= render "secondary_links" %> <%= render "secondary_links" %>

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/iqdb_test_helper'
class IqdbQueriesControllerTest < ActionController::TestCase class IqdbQueriesControllerTest < ActionController::TestCase
include IqdbTestHelper
context "The iqdb controller" do context "The iqdb controller" do
setup do setup do
@user = FactoryGirl.create(:user) @user = FactoryGirl.create(:user)

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/pool_archive_test_helper'
class PoolElementsControllerTest < ActionController::TestCase class PoolElementsControllerTest < ActionController::TestCase
include PoolArchiveTestHelper
context "The pools posts controller" do context "The pools posts controller" do
setup do setup do
mock_pool_archive_service! mock_pool_archive_service!

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/pool_archive_test_helper'
class PoolVersionsControllerTest < ActionController::TestCase class PoolVersionsControllerTest < ActionController::TestCase
include PoolArchiveTestHelper
context "The pool versions controller" do context "The pool versions controller" do
setup do setup do
mock_pool_archive_service! mock_pool_archive_service!

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/pool_archive_test_helper'
class PoolsControllerTest < ActionController::TestCase class PoolsControllerTest < ActionController::TestCase
include PoolArchiveTestHelper
context "The pools controller" do context "The pools controller" do
setup do setup do
Timecop.travel(1.month.ago) do Timecop.travel(1.month.ago) do

View File

@@ -1,11 +1,9 @@
require 'test_helper' require 'test_helper'
require 'helpers/post_archive_test_helper'
class PostVersionsControllerTest < ActionController::TestCase class PostVersionsControllerTest < ActionController::TestCase
include PostArchiveTestHelper
def setup def setup
super super
@user = FactoryGirl.create(:user) @user = FactoryGirl.create(:user)
CurrentUser.user = @user CurrentUser.user = @user
CurrentUser.ip_addr = "127.0.0.1" CurrentUser.ip_addr = "127.0.0.1"
@@ -13,6 +11,7 @@ class PostVersionsControllerTest < ActionController::TestCase
def teardown def teardown
super super
CurrentUser.user = nil CurrentUser.user = nil
CurrentUser.ip_addr = nil CurrentUser.ip_addr = nil
end end

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/post_archive_test_helper'
class ReportsControllerTest < ActionController::TestCase class ReportsControllerTest < ActionController::TestCase
include PostArchiveTestHelper
def setup def setup
super super

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/saved_search_test_helper'
class SavedSearchesControllerTest < ActionController::TestCase class SavedSearchesControllerTest < ActionController::TestCase
include SavedSearchTestHelper
context "The saved searches controller" do context "The saved searches controller" do
setup do setup do
@user = FactoryGirl.create(:user) @user = FactoryGirl.create(:user)

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/iqdb_test_helper'
class UploadsControllerTest < ActionController::TestCase class UploadsControllerTest < ActionController::TestCase
include IqdbTestHelper
def setup def setup
super super
mock_iqdb_service! mock_iqdb_service!

View File

@@ -0,0 +1,14 @@
require "test_helper"
class ApplicationHelperTest < ActionView::TestCase
context "The application helper" do
context "format_text method" do
should "not raise an exception for invalid DText" do
dtext = "* a\n" * 513
assert_nothing_raised { format_text(dtext) }
assert_equal("", format_text(dtext))
end
end
end
end

View File

@@ -14,7 +14,7 @@ require 'cache'
require 'webmock/minitest' require 'webmock/minitest'
Dir[File.expand_path(File.dirname(__FILE__) + "/factories/*.rb")].each {|file| require file} Dir[File.expand_path(File.dirname(__FILE__) + "/factories/*.rb")].each {|file| require file}
Dir[File.expand_path(File.dirname(__FILE__) + "/helpers/*.rb")].each {|file| require file} Dir[File.expand_path(File.dirname(__FILE__) + "/test_helpers/*.rb")].each {|file| require file}
Shoulda::Matchers.configure do |config| Shoulda::Matchers.configure do |config|
config.integrate do |with| config.integrate do |with|
@@ -24,8 +24,12 @@ end
class ActiveSupport::TestCase class ActiveSupport::TestCase
include PostArchiveTestHelper include PostArchiveTestHelper
include PoolArchiveTestHelper
include ReportbooruHelper include ReportbooruHelper
include DownloadTestHelper include DownloadTestHelper
include IqdbTestHelper
include SavedSearchTestHelper
include UploadTestHelper
setup do setup do
mock_popular_search_service! mock_popular_search_service!
@@ -40,8 +44,6 @@ class ActiveSupport::TestCase
end end
class ActionController::TestCase class ActionController::TestCase
include PostArchiveTestHelper
def assert_authentication_passes(action, http_method, role, params, session) def assert_authentication_passes(action, http_method, role, params, session)
__send__(http_method, action, params, session.merge(:user_id => @users[role].id)) __send__(http_method, action, params, session.merge(:user_id => @users[role].id))
assert_response :success assert_response :success

View File

@@ -1,10 +1,7 @@
require "test_helper" require "test_helper"
require 'helpers/saved_search_test_helper'
module Moderator module Moderator
class TagBatchChangeTest < ActiveSupport::TestCase class TagBatchChangeTest < ActiveSupport::TestCase
include SavedSearchTestHelper
def setup def setup
super super
mock_saved_search_service! mock_saved_search_service!

View File

@@ -1,11 +1,8 @@
# encoding: utf-8 # encoding: utf-8
require 'test_helper' require 'test_helper'
require 'helpers/pool_archive_test_helper'
class PoolTest < ActiveSupport::TestCase class PoolTest < ActiveSupport::TestCase
include PoolArchiveTestHelper
setup do setup do
Timecop.travel(1.month.ago) do Timecop.travel(1.month.ago) do
@user = FactoryGirl.create(:user) @user = FactoryGirl.create(:user)

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/iqdb_test_helper'
class PostReplacementTest < ActiveSupport::TestCase class PostReplacementTest < ActiveSupport::TestCase
include IqdbTestHelper
def upload_file(path, filename, &block) def upload_file(path, filename, &block)
Tempfile.open do |file| Tempfile.open do |file|
file.write(File.read(path)) file.write(File.read(path))

View File

@@ -1,10 +1,7 @@
require 'test_helper' require 'test_helper'
require 'helpers/pool_archive_test_helper'
module PostSets module PostSets
class PoolTest < ActiveSupport::TestCase class PoolTest < ActiveSupport::TestCase
include PoolArchiveTestHelper
context "In all cases" do context "In all cases" do
setup do setup do
@user = FactoryGirl.create(:user) @user = FactoryGirl.create(:user)

View File

@@ -1,13 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/pool_archive_test_helper'
require 'helpers/saved_search_test_helper'
require 'helpers/iqdb_test_helper'
class PostTest < ActiveSupport::TestCase class PostTest < ActiveSupport::TestCase
include PoolArchiveTestHelper
include SavedSearchTestHelper
include IqdbTestHelper
def assert_tag_match(posts, query) def assert_tag_match(posts, query)
assert_equal(posts.map(&:id), Post.tag_match(query).pluck(:id)) assert_equal(posts.map(&:id), Post.tag_match(query).pluck(:id))
end end

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/saved_search_test_helper'
class SavedSearchTest < ActiveSupport::TestCase class SavedSearchTest < ActiveSupport::TestCase
include SavedSearchTestHelper
def setup def setup
super super
@user = FactoryGirl.create(:user) @user = FactoryGirl.create(:user)

View File

@@ -1,9 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/saved_search_test_helper'
class TagAliasTest < ActiveSupport::TestCase class TagAliasTest < ActiveSupport::TestCase
include SavedSearchTestHelper
context "A tag alias" do context "A tag alias" do
setup do setup do
Timecop.travel(1.month.ago) do Timecop.travel(1.month.ago) do

View File

@@ -1,11 +1,6 @@
require 'test_helper' require 'test_helper'
require 'helpers/iqdb_test_helper'
require 'helpers/upload_test_helper'
class UploadTest < ActiveSupport::TestCase class UploadTest < ActiveSupport::TestCase
include IqdbTestHelper
include UploadTestHelper
def setup def setup
super super