forked from e621ng/e621ng
[WikiPages] Prevent renaming wiki pages for help pages (#666)
This commit is contained in:
parent
1425332c0b
commit
80f12710e6
@ -7,6 +7,7 @@ class HelpPage < ApplicationRecord
|
|||||||
validate :wiki_page_exists
|
validate :wiki_page_exists
|
||||||
after_destroy :invalidate_cache
|
after_destroy :invalidate_cache
|
||||||
after_save :invalidate_cache
|
after_save :invalidate_cache
|
||||||
|
belongs_to :wiki, class_name: "WikiPage", foreign_key: "wiki_page", primary_key: "title"
|
||||||
|
|
||||||
def invalidate_cache
|
def invalidate_cache
|
||||||
Cache.delete("help_index")
|
Cache.delete("help_index")
|
||||||
@ -14,7 +15,7 @@ class HelpPage < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def wiki_page_exists
|
def wiki_page_exists
|
||||||
errors.add(:wiki_page, "must exist") if WikiPage.find_by(title: wiki_page).blank?
|
errors.add(:wiki_page, "must exist") if wiki.blank?
|
||||||
end
|
end
|
||||||
|
|
||||||
def pretty_title
|
def pretty_title
|
||||||
|
@ -19,6 +19,7 @@ class WikiPage < ApplicationRecord
|
|||||||
before_destroy :validate_not_used_as_help_page
|
before_destroy :validate_not_used_as_help_page
|
||||||
before_destroy :log_destroy
|
before_destroy :log_destroy
|
||||||
before_save :log_changes
|
before_save :log_changes
|
||||||
|
after_save :update_help_page, if: :saved_change_to_title?
|
||||||
|
|
||||||
attr_accessor :skip_secondary_validations, :edit_reason
|
attr_accessor :skip_secondary_validations, :edit_reason
|
||||||
array_attribute :other_names
|
array_attribute :other_names
|
||||||
@ -27,13 +28,7 @@ class WikiPage < ApplicationRecord
|
|||||||
has_one :tag, foreign_key: "name", primary_key: "title"
|
has_one :tag, foreign_key: "name", primary_key: "title"
|
||||||
has_one :artist, foreign_key: "name", primary_key: "title"
|
has_one :artist, foreign_key: "name", primary_key: "title"
|
||||||
has_many :versions, -> { order("wiki_page_versions.id ASC") }, class_name: "WikiPageVersion", dependent: :destroy
|
has_many :versions, -> { order("wiki_page_versions.id ASC") }, class_name: "WikiPageVersion", dependent: :destroy
|
||||||
|
has_one :help_page, foreign_key: "wiki_page", primary_key: "title"
|
||||||
def validate_not_used_as_help_page
|
|
||||||
if HelpPage.find_by(wiki_page: title).present?
|
|
||||||
errors.add(:wiki_page, "is used by a help page")
|
|
||||||
throw :abort
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def log_destroy
|
def log_destroy
|
||||||
ModAction.log(:wiki_page_delete, {wiki_page: title, wiki_page_id: id})
|
ModAction.log(:wiki_page_delete, {wiki_page: title, wiki_page_id: id})
|
||||||
@ -127,8 +122,22 @@ class WikiPage < ApplicationRecord
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module HelpPageMethods
|
||||||
|
def validate_not_used_as_help_page
|
||||||
|
if help_page.present?
|
||||||
|
errors.add(:wiki_page, "is used by a help page")
|
||||||
|
throw :abort
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_help_page
|
||||||
|
HelpPage.find_by(wiki_page: title_before_last_save)&.update(wiki_page: title)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
extend SearchMethods
|
extend SearchMethods
|
||||||
include ApiMethods
|
include ApiMethods
|
||||||
|
include HelpPageMethods
|
||||||
|
|
||||||
def user_not_limited
|
def user_not_limited
|
||||||
allowed = CurrentUser.can_wiki_edit_with_reason
|
allowed = CurrentUser.can_wiki_edit_with_reason
|
||||||
@ -147,7 +156,12 @@ class WikiPage < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def validate_rename
|
def validate_rename
|
||||||
return if !will_save_change_to_title? || skip_secondary_validations
|
return unless will_save_change_to_title?
|
||||||
|
if !CurrentUser.user.is_admin? && HelpPage.find_by(wiki_page: title_was).present?
|
||||||
|
errors.add(:title, "is used as a help page and cannot be changed")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
return if skip_secondary_validations
|
||||||
|
|
||||||
tag_was = Tag.find_by_name(Tag.normalize_name(title_was))
|
tag_was = Tag.find_by_name(Tag.normalize_name(title_was))
|
||||||
if tag_was.present? && tag_was.post_count > 0
|
if tag_was.present? && tag_was.post_count > 0
|
||||||
|
8
test/factories/help_page.rb
Normal file
8
test/factories/help_page.rb
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
FactoryBot.define do
|
||||||
|
factory(:help_page) do
|
||||||
|
sequence(:name) { |n| "help_page_#{n}" }
|
||||||
|
association :wiki, factory: :wiki_page
|
||||||
|
end
|
||||||
|
end
|
@ -97,5 +97,43 @@ class WikiPageTest < ActiveSupport::TestCase
|
|||||||
assert_not_equal(@wiki_page.creator_id, version.updater_id)
|
assert_not_equal(@wiki_page.creator_id, version.updater_id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "for a help page" do
|
||||||
|
setup do
|
||||||
|
@janitor = create(:janitor_user)
|
||||||
|
@admin = create(:admin_user)
|
||||||
|
as(@admin) do
|
||||||
|
@help = create(:help_page)
|
||||||
|
@wiki = @help.wiki
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not allow the title to be changed by janitors" do
|
||||||
|
as(@janitor) do
|
||||||
|
@title = @wiki.title
|
||||||
|
@wiki.update(title: "new_title")
|
||||||
|
assert_equal(["Title is used as a help page and cannot be changed"], @wiki.errors.full_messages)
|
||||||
|
assert_equal(@title, @wiki.reload.title)
|
||||||
|
assert_equal(@title, @help.reload.wiki_page)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "allow the title to be changed by admins" do
|
||||||
|
as(@admin) do
|
||||||
|
@wiki.update(title: "new_title")
|
||||||
|
assert_equal([], @wiki.errors.full_messages)
|
||||||
|
assert_equal("new_title", @wiki.reload.title)
|
||||||
|
assert_equal("new_title", @help.reload.wiki_page)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
should "not allow deleting the wiki page" do
|
||||||
|
as(@admin) do
|
||||||
|
@wiki.destroy
|
||||||
|
assert_equal(["Wiki page is used by a help page"], @wiki.errors.full_messages)
|
||||||
|
assert_not_nil(WikiPage.find_by(id: @wiki.id))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user