From b6c2742cda2d376672ed8d65101065d77ef027c6 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 15 Feb 2024 16:47:16 +0100 Subject: [PATCH 1/2] bug(instructeurs/groupes_instructeurs#*): any ACL here ? --- .../instructeurs/groupe_instructeurs_controller.rb | 9 +++++++++ .../groupe_instructeurs_controller_spec.rb | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/app/controllers/instructeurs/groupe_instructeurs_controller.rb b/app/controllers/instructeurs/groupe_instructeurs_controller.rb index 3a6b52fee..0800e8010 100644 --- a/app/controllers/instructeurs/groupe_instructeurs_controller.rb +++ b/app/controllers/instructeurs/groupe_instructeurs_controller.rb @@ -3,6 +3,8 @@ module Instructeurs include UninterlacePngConcern include GroupeInstructeursSignatureConcern + before_action :ensure_allowed! + ITEMS_PER_PAGE = 25 def index @@ -98,5 +100,12 @@ module Instructeurs def instructeur_id params[:instructeur][:id] end + + def ensure_allowed! + if !(current_administrateur&.owns?(procedure) || procedure.instructeurs_self_management_enabled?) + flash[:alert] = "Vous n’avez pas le droit de gérer les instructeurs de cette démarche" + redirect_to instructeur_procedure_path(procedure) + end + end end end diff --git a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb index fe0a1e2d4..989594716 100644 --- a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb @@ -14,6 +14,17 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do sign_in(instructeur.user) end + describe "before_action: ensure_allowed!" do + it "is present" do + before_actions = Instructeurs::GroupeInstructeursController + ._process_action_callbacks + .filter { |process_action_callbacks| process_action_callbacks.kind == :before } + .map(&:filter) + + expect(before_actions).to include(:ensure_allowed!) + end + end + describe '#index' do context 'of a procedure I own' do before do From a2746297193d80a2dccba489683b477e343f1d07 Mon Sep 17 00:00:00 2001 From: Martin Date: Thu, 15 Feb 2024 17:10:11 +0100 Subject: [PATCH 2/2] fix(instructeurs/groupes_instructeurs#*): add some ACL here --- .../groupe_instructeurs_controller.rb | 3 ++ .../groupe_instructeurs_controller_spec.rb | 37 +++++++++++++++---- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/app/controllers/instructeurs/groupe_instructeurs_controller.rb b/app/controllers/instructeurs/groupe_instructeurs_controller.rb index 0800e8010..0a75ff309 100644 --- a/app/controllers/instructeurs/groupe_instructeurs_controller.rb +++ b/app/controllers/instructeurs/groupe_instructeurs_controller.rb @@ -106,6 +106,9 @@ module Instructeurs flash[:alert] = "Vous n’avez pas le droit de gérer les instructeurs de cette démarche" redirect_to instructeur_procedure_path(procedure) end + rescue ActiveRecord::RecordNotFound + flash[:alert] = "Vous n’avez pas accès à cette démarche" + redirect_to root_path end end end diff --git a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb index 989594716..77d09117a 100644 --- a/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb +++ b/spec/controllers/instructeurs/groupe_instructeurs_controller_spec.rb @@ -1,8 +1,8 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do render_views - + let(:administrateurs) { [create(:administrateur, user: instructeur.user)] } let(:instructeur) { create(:instructeur) } - let(:procedure) { create(:procedure, :published) } + let(:procedure) { create(:procedure, :published, administrateurs:) } let!(:gi_1_1) { procedure.defaut_groupe_instructeur } let!(:gi_1_2) { create(:groupe_instructeur, label: 'groupe instructeur 2', procedure: procedure) } @@ -25,11 +25,15 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do end end - describe '#index' do - context 'of a procedure I own' do - before do - get :index, params: { procedure_id: procedure.id } - end + describe '#index (plus, ensure_allowed!)' do + context 'when i own the procedure' do + before { get :index, params: { procedure_id: procedure.id } } + it { expect(response).to have_http_status(:ok) } + end + + context 'when i am an instructeur of the procedure and instructeurs_self_management_enabled is true' do + let(:procedure) { create(:procedure, :published, administrateurs: [create(:administrateur)], instructeurs_self_management_enabled: true) } + before { get :index, params: { procedure_id: procedure.id } } context 'when a procedure has multiple groups' do it { expect(response).to have_http_status(:ok) } @@ -38,6 +42,25 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do it { expect(response.body).not_to include(gi_2_2.label) } end end + + context 'when i am an instructor of the procedure, and instructeurs_self_management_enabled is false' do + let(:procedure) { create(:procedure, :published, administrateurs: [create(:administrateur)], instructeurs_self_management_enabled: false) } + before { get :index, params: { procedure_id: procedure.id } } + + it { expect(response).to have_http_status(:redirect) } + it { expect(flash.alert).to eq("Vous n’avez pas le droit de gérer les instructeurs de cette démarche") } + end + + context 'i am an instructor, not on the procedure' do + let(:procedure) { create(:procedure, :published, administrateurs: [create(:administrateur)], instructeurs_self_management_enabled: true) } + before do + sign_in(create(:instructeur).user) + get :index, params: { procedure_id: procedure.id } + end + + it { expect(response).to have_http_status(:redirect) } + it { expect(flash.alert).to eq("Vous n’avez pas accès à cette démarche") } + end end describe '#show' do