From 19adf92a39ea7434f8062f14afe8152a106c219e Mon Sep 17 00:00:00 2001 From: evazion Date: Thu, 3 Dec 2020 14:34:43 -0600 Subject: [PATCH] BURs: impose a maximum size limit on BURs. Enforce a maximum size limit of 100 lines per BUR. Larger BURs should be split into smaller chunks. --- app/logical/bulk_update_request_processor.rb | 8 ++++++++ test/unit/bulk_update_request_test.rb | 9 +++++++++ 2 files changed, 17 insertions(+) diff --git a/app/logical/bulk_update_request_processor.rb b/app/logical/bulk_update_request_processor.rb index 332155f95..25b96918e 100644 --- a/app/logical/bulk_update_request_processor.rb +++ b/app/logical/bulk_update_request_processor.rb @@ -1,5 +1,6 @@ class BulkUpdateRequestProcessor MAXIMUM_RENAME_COUNT = 200 + MAXIMUM_SCRIPT_LENGTH = 100 include ActiveModel::Validations @@ -8,6 +9,7 @@ class BulkUpdateRequestProcessor attr_reader :bulk_update_request delegate :script, :forum_topic, to: :bulk_update_request validate :validate_script + validate :validate_script_length def initialize(bulk_update_request) @bulk_update_request = bulk_update_request @@ -109,6 +111,12 @@ class BulkUpdateRequestProcessor end end + def validate_script_length + if commands.size > MAXIMUM_SCRIPT_LENGTH + errors[:base] << "Bulk update request is too long (maximum size: #{MAXIMUM_SCRIPT_LENGTH} lines). Split your request into smaller chunks and try again." + end + end + def process!(approver) ActiveRecord::Base.transaction do commands.map do |command, *args| diff --git a/test/unit/bulk_update_request_test.rb b/test/unit/bulk_update_request_test.rb index bbba6aae0..7e35ca6bf 100644 --- a/test/unit/bulk_update_request_test.rb +++ b/test/unit/bulk_update_request_test.rb @@ -373,6 +373,15 @@ class BulkUpdateRequestTest < ActiveSupport::TestCase assert_equal(["Can't create implication a -> b ('a' must have a wiki page; 'b' must have a wiki page)"], @bur.errors.full_messages) end end + + context "a bulk update request that is too long" do + should "fail" do + @bur = build(:bulk_update_request, script: "nuke touhou\n" * 200) + + assert_equal(false, @bur.valid?) + assert_equal(["Bulk update request is too long (maximum size: 100 lines). Split your request into smaller chunks and try again."], @bur.errors.full_messages) + end + end end context "when the script is updated" do