From 4d49e2839d7b8266e3b9488c983d38d9ace58b31 Mon Sep 17 00:00:00 2001 From: Jens Kraemer Date: Fri, 10 May 2019 12:37:02 +0800 Subject: [PATCH] do not lose submitted content when attempting to update a wiki page that has been renamed in the meantime --- app/controllers/wiki_controller.rb | 4 ++- test/integration/wiki_test.rb | 56 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 test/integration/wiki_test.rb diff --git a/app/controllers/wiki_controller.rb b/app/controllers/wiki_controller.rb index 995a40cc4..ae2447763 100644 --- a/app/controllers/wiki_controller.rb +++ b/app/controllers/wiki_controller.rb @@ -34,7 +34,7 @@ class WikiController < ApplicationController default_search_scope :wiki_pages before_action :find_wiki, :authorize - before_action :find_existing_or_new_page, :only => [:show, :edit, :update] + before_action :find_existing_or_new_page, :only => [:show, :edit] before_action :find_existing_page, :only => [:rename, :protect, :history, :diff, :annotate, :add_attachment, :destroy, :destroy_version] before_action :find_attachments, :only => [:preview] accept_api_auth :index, :show, :update, :destroy @@ -152,6 +152,8 @@ class WikiController < ApplicationController # Creates a new page or updates an existing one def update + @page = @wiki.find_or_new_page(params[:id]) + return render_403 unless editable? was_new_page = @page.new_record? @page.safe_attributes = params[:wiki_page] diff --git a/test/integration/wiki_test.rb b/test/integration/wiki_test.rb new file mode 100644 index 000000000..082a54dd0 --- /dev/null +++ b/test/integration/wiki_test.rb @@ -0,0 +1,56 @@ +require File.expand_path('../../test_helper', __FILE__) + +class WikiTest < Redmine::IntegrationTest + fixtures :projects, + :users, :email_addresses, + :roles, + :members, + :member_roles, + :trackers, + :projects_trackers, + :enabled_modules, + :wikis, + :wiki_pages, + :wiki_contents + + def test_updating_a_renamed_page + log_user('jsmith', 'jsmith') + + get '/projects/ecookbook/wiki' + assert_response :success + + get '/projects/ecookbook/wiki/Wiki/edit' + assert_response :success + + # this update should not end up with a loss of content + put '/projects/ecookbook/wiki/Wiki', params: { + content: { + text: "# Wiki\r\n\r\ncontent", comments:"" + }, + wiki_page: { parent_id: "" } + } + assert_redirected_to "/projects/ecookbook/wiki/Wiki" + follow_redirect! + assert_select 'div', /content/ + assert content = WikiContent.last + + # Let's assume somebody else, or the same user in another tab, renames the + # page while it is being edited. + post '/projects/ecookbook/wiki/Wiki/rename', params: { wiki_page: { title: "NewTitle" } } + assert_redirected_to "/projects/ecookbook/wiki/NewTitle" + + # this update should not end up with a loss of content + put '/projects/ecookbook/wiki/Wiki', params: { + content: { + version: content.version, text: "# Wiki\r\n\r\nnew content", comments:"" + }, + wiki_page: { parent_id: "" } + } + + assert_redirected_to "/projects/ecookbook/wiki/NewTitle" + follow_redirect! + assert_select 'div', /new content/ + end + +end + -- 2.11.0