Skip to content

Commit

Permalink
Fixes #5002 - Core Workflow: Removing groups with re-adding some disc…
Browse files Browse the repository at this point in the history
…ards all permissions the user has.

Co-authored-by: Florian Liebe <fl@zammad.com>
  • Loading branch information
rolfschmidt and fliebe92 committed Jan 15, 2024
1 parent 83e5cdf commit 8ff6521
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 4 deletions.
14 changes: 12 additions & 2 deletions app/models/core_workflow/result.rb
Expand Up @@ -3,7 +3,9 @@
class CoreWorkflow::Result
include ::Mixin::HasBackends

attr_accessor :payload, :payload_backup, :user, :assets, :assets_in_result, :result, :rerun, :form_updater, :restricted_fields
MAX_RERUN = 25

attr_accessor :payload, :payload_backup, :user, :assets, :assets_in_result, :result, :rerun, :rerun_history, :form_updater, :restricted_fields

def initialize(payload:, user:, assets: {}, assets_in_result: true, result: {}, form_updater: false)
if payload.respond_to?(:permit!)
Expand All @@ -22,6 +24,7 @@ def initialize(payload:, user:, assets: {}, assets_in_result: true, result: {},
@result = result
@form_updater = form_updater
@rerun = false
@rerun_history = []
end

def attributes
Expand Down Expand Up @@ -193,8 +196,15 @@ def filter_restrict_values
end
end

def rerun_loop?
return false if rerun_history.size < 3

rerun_history.last(3).uniq.size != 3
end

def consider_rerun
if @rerun && @result[:rerun_count] < 25
@rerun_history << Marshal.load(Marshal.dump(@result.except(:rerun_count)))
if @rerun && @result[:rerun_count] < MAX_RERUN && !rerun_loop?
@result[:rerun_count] += 1
return run
end
Expand Down
4 changes: 2 additions & 2 deletions app/models/core_workflow/result/base_option.rb
Expand Up @@ -58,7 +58,7 @@ def new_value_rerun(field, new_value)
end

def restore_array
new_value = @result_object.payload_backup['params'][field] & @result_object.result[:restrict_values][field]
new_value = @result_object.payload_backup['params'][field].map(&:to_s) & @result_object.result[:restrict_values][field]

new_value_rerun(field, new_value)

Expand All @@ -67,7 +67,7 @@ def restore_array

def restore_string
new_value = @result_object.payload_backup['params'][field]
return if @result_object.result[:restrict_values][field].exclude?(new_value)
return if excluded_by_restrict_values?(new_value)

new_value_rerun(field, new_value)

Expand Down
46 changes: 46 additions & 0 deletions spec/models/core_workflow_spec.rb
Expand Up @@ -312,4 +312,50 @@
expect(result[:fill_in]['body']).to be_blank
end
end

describe 'Core-Workflows: Removing groups with re-adding some discards all permissions the user has #5002' do
let(:payload) do
base_payload.merge('params' => { 'group_id' => Group.first.id })
end
let!(:workflow1) do
create(:core_workflow,
object: 'Ticket',
perform: {
'ticket.group_id': {
operator: 'remove_option',
remove_option: Group.all.map { |x| x.id.to_s },
},
})
end
let!(:workflow2) do
create(:core_workflow,
object: 'Ticket',
perform: {
'ticket.group_id': {
operator: 'add_option',
add_option: [Group.first.id.to_s],
},
})
end

before do
action_user.group_names_access_map = {
Group.first.name => %w[full],
}
workflow1
workflow2
end

it 'does readd the group' do
expect(result[:restrict_values]['group_id']).to eq(['', Group.first.id.to_s])
end

it 'does keep owners' do
expect(result[:restrict_values]['owner_id']).to include(action_user.id.to_s)
end

it 'does not endless loop because of removing and adding the same element' do
expect(result[:rerun_count]).to be < CoreWorkflow::Result::MAX_RERUN
end
end
end

0 comments on commit 8ff6521

Please sign in to comment.