]> source.dussan.org Git - redmine.git/commitdiff
Require sudo mode for actions to delete contents (#33071).
authorGo MAEDA <maeda@farend.jp>
Tue, 10 Mar 2020 03:26:23 +0000 (03:26 +0000)
committerGo MAEDA <maeda@farend.jp>
Tue, 10 Mar 2020 03:26:23 +0000 (03:26 +0000)
Patch by Go MAEDA.

git-svn-id: http://svn.redmine.org/redmine/trunk@19569 e93f8b46-1217-0410-a6f0-8f06a7374b81

14 files changed:
app/controllers/attachments_controller.rb
app/controllers/boards_controller.rb
app/controllers/comments_controller.rb
app/controllers/documents_controller.rb
app/controllers/issues_controller.rb
app/controllers/messages_controller.rb
app/controllers/news_controller.rb
app/controllers/repositories_controller.rb
app/controllers/timelog_controller.rb
app/controllers/versions_controller.rb
app/controllers/wiki_controller.rb
app/controllers/wikis_controller.rb
config/configuration.yml.example
test/integration/sudo_mode_test.rb

index db90b55dafaed164c120cf93f9a5af309cd8ca2d..62b5b58becbf98e7c75b6b8fa572432a83a510cd 100644 (file)
@@ -25,6 +25,8 @@ class AttachmentsController < ApplicationController
   before_action :delete_authorize, :only => :destroy
   before_action :authorize_global, :only => :upload
 
+  require_sudo_mode :destroy
+
   # Disable check for same origin requests for JS files, i.e. attachments with
   # MIME type text/javascript.
   skip_after_action :verify_same_origin_request, :only => :download
index 86eb3d278b917ea340d55396c3aae25f23b20071..7b3931619e92abff8c4ec132ae26c1c1988ee1db 100644 (file)
@@ -22,6 +22,8 @@ class BoardsController < ApplicationController
   before_action :find_project_by_project_id, :find_board_if_available, :authorize
   accept_rss_auth :index, :show
 
+  require_sudo_mode :destroy
+
   helper :sort
   include SortHelper
   helper :watchers
index f0b9a92716ac71f707a1d706c68d52efa8bfecb2..748cb11871680491d701bfdb81c8e5e754e920cc 100644 (file)
@@ -24,6 +24,8 @@ class CommentsController < ApplicationController
   before_action :find_project_from_association
   before_action :authorize
 
+  require_sudo_mode :destroy
+
   def create
     raise Unauthorized unless @news.commentable?
 
index b9e2633ccb6a28d024f4ba1173a215de0c67f774..235a6e5f03ee940ad4cf935821c837e7c7a9d758 100644 (file)
@@ -25,6 +25,8 @@ class DocumentsController < ApplicationController
   before_action :find_project_from_association, :except => [:index, :new, :create]
   before_action :authorize
 
+  require_sudo_mode :destroy
+
   helper :attachments
   helper :custom_fields
 
index 0d1acc95bad3c0862b2f0e1c8e41b9c2d9aacc41..83dee63e5ad3b384856cfb2d1b7c4a149a4142ea 100644 (file)
@@ -28,6 +28,8 @@ class IssuesController < ApplicationController
   accept_rss_auth :index, :show
   accept_api_auth :index, :show, :create, :update, :destroy
 
+  require_sudo_mode :destroy
+
   rescue_from Query::StatementInvalid, :with => :query_statement_invalid
 
   helper :journals
index 69af02066f47bee385fbcb8c661a5b67f55944be..e36c05a952b3a26150f18fd3f00d686ca84c18a1 100644 (file)
@@ -25,6 +25,8 @@ class MessagesController < ApplicationController
   before_action :find_message, :except => [:new, :preview]
   before_action :authorize, :except => [:preview, :edit, :destroy]
 
+  require_sudo_mode :destroy
+
   helper :boards
   helper :watchers
   helper :attachments
index 511f10ddbbbee97d2f2444bf174b9c3aac9396e8..deecca6924ab386ef1adf90fd2bc7155891654cc 100644 (file)
@@ -28,6 +28,8 @@ class NewsController < ApplicationController
   accept_rss_auth :index
   accept_api_auth :index, :show, :create, :update, :destroy
 
+  require_sudo_mode :destroy
+
   helper :watchers
   helper :attachments
 
index 0da25695375213249f1e77e79ca36f4bd12539a7..81fe6c5a74e7da71c820f605deb0c3d23590d2d3 100644 (file)
@@ -36,6 +36,8 @@ class RepositoriesController < ApplicationController
   before_action :authorize
   accept_rss_auth :revisions
 
+  require_sudo_mode :destroy
+
   rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed
 
   def new
index d304fe3b207c4eb03d5f71abd84f6f477b3955cb..709c9aa94be5ac6b45c2f038efec8b5d1ef3eff2 100644 (file)
@@ -33,6 +33,8 @@ class TimelogController < ApplicationController
   accept_rss_auth :index
   accept_api_auth :index, :show, :create, :update, :destroy
 
+  require_sudo_mode :destroy
+
   rescue_from Query::StatementInvalid, :with => :query_statement_invalid
 
   helper :issues
index 16dd35c9927e8ae564b00a7af67423d0c7a8d005..7554014f6b40d9546d7c30bd0d5630ef7e6d11fd 100644 (file)
@@ -27,6 +27,8 @@ class VersionsController < ApplicationController
 
   accept_api_auth :index, :show, :create, :update, :destroy
 
+  require_sudo_mode :destroy
+
   helper :custom_fields
   helper :projects
 
index 527f0b821696804297833796b0ca3652ba513347..a40563790a377ad2cf77b386e6d6a9c34f7b83dd 100644 (file)
@@ -39,6 +39,8 @@ class WikiController < ApplicationController
   before_action :find_attachments, :only => [:preview]
   accept_api_auth :index, :show, :update, :destroy
 
+  require_sudo_mode :destroy, :destroy_version
+
   helper :attachments
   include AttachmentsHelper
   helper :watchers
index edca739c6bb29dcffabda211fc7b5e50e3d3c94e..fd52a09b1f50660755b4fe4240615f5bcb189cef 100644 (file)
@@ -21,6 +21,8 @@ class WikisController < ApplicationController
   menu_item :settings
   before_action :find_project, :authorize
 
+  require_sudo_mode :destroy, only: :post
+
   # Delete a project's wiki
   def destroy
     if request.post? && params[:confirm] && @project.wiki
index a8b6be83c3cab1652922a988b665c4d2b52d47f9..f96f48f87f5889b395aba4c61d6ad800715a2cf0 100644 (file)
@@ -169,7 +169,8 @@ default:
 
   # Requires users to re-enter their password for sensitive actions (editing
   # of account data, project memberships, application settings, user, group,
-  # role, auth source management and project deletion). Disabled by default.
+  # role, auth source management, project deletion and deletion of contents
+  # such as issues, attachments and wiki pages). Disabled by default.
   # Timeout is set in minutes.
   #
   #sudo_mode: true
index a2ff7cd09c679661305cc091fa8fc20e295de5b0..389bc9daf0ea00285599a68117ed787675b279a9 100644 (file)
@@ -3,7 +3,9 @@
 require File.expand_path('../../test_helper', __FILE__)
 
 class SudoModeTest < Redmine::IntegrationTest
-  fixtures :projects, :members, :member_roles, :roles, :users, :email_addresses
+  fixtures :projects, :members, :member_roles, :roles, :users,
+           :email_addresses, :trackers, :projects_trackers, :enabled_modules,
+           :issue_statuses, :issues, :enumerations
 
   def setup
     Redmine::SudoMode.stubs(:enabled?).returns(true)
@@ -192,6 +194,24 @@ class SudoModeTest < Redmine::IntegrationTest
     end
   end
 
+  def test_destroy_issue
+    log_user 'dlopper', 'foo'
+    expire_sudo_mode!
+    delete '/issues/2'
+    assert_response :success
+    assert_select 'h2', 'Confirm your password to continue'
+    assert_select 'form[action="/issues/2"]'
+    assert_select '#flash_error', 0
+
+    delete '/issues/2', :params => {:sudo_password => 'wrong'}
+    assert_response :success
+    assert_select 'h2', 'Confirm your password to continue'
+
+    assert_difference 'Issue.count', -1 do
+      delete '/issues/2', :params => {:sudo_password => 'foo'}
+    end
+  end
+
   private
 
   # sudo mode is active after sign, let it expire by advancing the time