Patch #39110 ยป 0001-use-ActiveSupport-CurrentAttributes-instead-of-Reque.patch
Gemfile | ||
---|---|---|
4 | 4 | |
5 | 5 |
gem 'rails', '6.1.7.6' |
6 | 6 |
gem 'rouge', '~> 4.1.0' |
7 |
gem 'request_store', '~> 1.5.0' |
|
8 | 7 |
gem 'mini_mime', '~> 1.1.0' |
9 | 8 |
gem "actionpack-xml_parser" |
10 | 9 |
gem 'roadie-rails', '~> 3.0.0' |
app/jobs/application_job.rb | ||
---|---|---|
1 | 1 |
# frozen_string_literal: true |
2 | 2 | |
3 | 3 |
class ApplicationJob < ActiveJob::Base |
4 |
include Redmine::JobWrapper |
|
5 | ||
6 |
around_enqueue :keep_current_user |
|
4 | 7 |
end |
app/models/mailer.rb | ||
---|---|---|
28 | 28 |
include Redmine::I18n |
29 | 29 |
include Roadie::Rails::Automatic |
30 | 30 | |
31 |
class DeliveryJob < ActionMailer::MailDeliveryJob |
|
32 |
include Redmine::JobWrapper |
|
33 | ||
34 |
around_enqueue :keep_current_user |
|
35 |
end |
|
36 | ||
37 |
self.delivery_job = DeliveryJob |
|
38 | ||
31 | 39 |
# Overrides ActionMailer::Base#process in order to set the recipient as the current user |
32 | 40 |
# and his language as the default locale. |
33 | 41 |
# The first argument of all actions of this Mailer must be a User (the recipient), |
app/models/user.rb | ||
---|---|---|
853 | 853 |
self.pref.notify_about_high_priority_issues |
854 | 854 |
end |
855 | 855 | |
856 |
class CurrentUser < ActiveSupport::CurrentAttributes |
|
857 |
attribute :user |
|
858 |
end |
|
859 | ||
856 | 860 |
def self.current=(user) |
857 |
RequestStore.store[:current_user] = user
|
|
861 |
CurrentUser.user = user
|
|
858 | 862 |
end |
859 | 863 | |
860 | 864 |
def self.current |
861 |
RequestStore.store[:current_user] ||= User.anonymous
|
|
865 |
CurrentUser.user ||= User.anonymous
|
|
862 | 866 |
end |
863 | 867 | |
864 | 868 |
# Returns the anonymous user. If the anonymous user does not exist, it is created. There can be only |
lib/redmine/job_wrapper.rb | ||
---|---|---|
1 |
# frozen_string_literal: true |
|
2 | ||
3 |
# Redmine - project management software |
|
4 |
# Copyright (C) 2006-2023 Jean-Philippe Lang |
|
5 |
# |
|
6 |
# This program is free software; you can redistribute it and/or |
|
7 |
# modify it under the terms of the GNU General Public License |
|
8 |
# as published by the Free Software Foundation; either version 2 |
|
9 |
# of the License, or (at your option) any later version. |
|
10 |
# |
|
11 |
# This program is distributed in the hope that it will be useful, |
|
12 |
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
13 |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
14 |
# GNU General Public License for more details. |
|
15 |
# |
|
16 |
# You should have received a copy of the GNU General Public License |
|
17 |
# along with this program; if not, write to the Free Software |
|
18 |
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
19 | ||
20 |
module Redmine |
|
21 |
module JobWrapper |
|
22 |
def keep_current_user |
|
23 |
current_user = User.current |
|
24 |
yield |
|
25 |
User.current = current_user |
|
26 |
end |
|
27 |
end |
|
28 |
end |
lib/redmine/sudo_mode.rb | ||
---|---|---|
170 | 170 |
end |
171 | 171 |
end |
172 | 172 | |
173 |
class CurrentSudoMode < ActiveSupport::CurrentAttributes |
|
174 |
attribute :was_used, :active, :disabled |
|
175 |
end |
|
176 | ||
173 | 177 |
# true if the sudo mode state was queried during this request |
174 | 178 |
def self.was_used? |
175 |
!!RequestStore.store[:sudo_mode_was_used]
|
|
179 |
!!CurrentSudoMode.was_used
|
|
176 | 180 |
end |
177 | 181 | |
178 | 182 |
# true if sudo mode is currently active. |
... | ... | |
184 | 188 |
# If you do it wrong, timeout of the sudo mode will happen too late or not at |
185 | 189 |
# all. |
186 | 190 |
def self.active? |
187 |
if !!RequestStore.store[:sudo_mode]
|
|
188 |
RequestStore.store[:sudo_mode_was_used] = true
|
|
191 |
if !!CurrentSudoMode.active
|
|
192 |
CurrentSudoMode.was_used = true
|
|
189 | 193 |
end |
190 | 194 |
end |
191 | 195 | |
192 | 196 |
def self.active! |
193 |
RequestStore.store[:sudo_mode] = true
|
|
197 |
CurrentSudoMode.active = true
|
|
194 | 198 |
end |
195 | 199 | |
196 | 200 |
def self.possible? |
... | ... | |
199 | 203 | |
200 | 204 |
# Turn off sudo mode (never require password entry). |
201 | 205 |
def self.disable! |
202 |
RequestStore.store[:sudo_mode_disabled] = true
|
|
206 |
CurrentSudoMode.disabled = true
|
|
203 | 207 |
end |
204 | 208 | |
205 | 209 |
# Turn sudo mode back on |
206 | 210 |
def self.enable! |
207 |
RequestStore.store[:sudo_mode_disabled] = nil
|
|
211 |
CurrentSUdoMode.disabled = nil
|
|
208 | 212 |
end |
209 | 213 | |
210 | 214 |
def self.enabled? |
211 |
Redmine::Configuration['sudo_mode'] && !RequestStore.store[:sudo_mode_disabled]
|
|
215 |
Redmine::Configuration['sudo_mode'] && !CurrentSudoMode.disabled
|
|
212 | 216 |
end |
213 | 217 | |
214 | 218 |
# Timespan after which sudo mode expires when unused. |
test/unit/jobs/destroy_project_job_test.rb | ||
---|---|---|
58 | 58 |
assert_match /deleted successfully/, m.text_part.to_s |
59 | 59 |
else |
60 | 60 |
assert_enqueued_with( |
61 |
job: ActionMailer::MailDeliveryJob,
|
|
61 |
job: Mailer::DeliveryJob,
|
|
62 | 62 |
args: ->(job_args){ |
63 | 63 |
job_args[1] == 'security_notification' && |
64 | 64 |
job_args[3].to_s.include?("mail_destroy_project_with_subprojects_successful") |
test/unit/jobs/destroy_projects_job_test.rb | ||
---|---|---|
58 | 58 |
assert_match /deleted successfully/, m.text_part.to_s |
59 | 59 |
else |
60 | 60 |
assert_enqueued_with( |
61 |
job: ActionMailer::MailDeliveryJob,
|
|
61 |
job: Mailer::DeliveryJob,
|
|
62 | 62 |
args: ->(job_args){ |
63 | 63 |
job_args[1] == 'security_notification' && |
64 | 64 |
job_args[3].to_s.include?("mail_destroy_project_with_subprojects_successful") |