Merge pull request #10004 from mfo/add_missing_acl_on_instructeurs_self_management_enabled

secu(instructeurs/groupes_instructeurs): s'assure que seul les instructeurs d'une demarche ayant la gestion activé puisse acceder aux ecrans
This commit is contained in:
mfo 2024-02-16 06:37:45 +00:00 committed by GitHub
commit 3e9abd73e4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 53 additions and 7 deletions

View file

@ -3,6 +3,8 @@ module Instructeurs
include UninterlacePngConcern include UninterlacePngConcern
include GroupeInstructeursSignatureConcern include GroupeInstructeursSignatureConcern
before_action :ensure_allowed!
ITEMS_PER_PAGE = 25 ITEMS_PER_PAGE = 25
def index def index
@ -98,5 +100,15 @@ module Instructeurs
def instructeur_id def instructeur_id
params[:instructeur][:id] params[:instructeur][:id]
end end
def ensure_allowed!
if !(current_administrateur&.owns?(procedure) || procedure.instructeurs_self_management_enabled?)
flash[:alert] = "Vous navez 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 navez pas accès à cette démarche"
redirect_to root_path
end
end end
end end

View file

@ -1,8 +1,8 @@
describe Instructeurs::GroupeInstructeursController, type: :controller do describe Instructeurs::GroupeInstructeursController, type: :controller do
render_views render_views
let(:administrateurs) { [create(:administrateur, user: instructeur.user)] }
let(:instructeur) { create(:instructeur) } 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_1) { procedure.defaut_groupe_instructeur }
let!(:gi_1_2) { create(:groupe_instructeur, label: 'groupe instructeur 2', procedure: procedure) } let!(:gi_1_2) { create(:groupe_instructeur, label: 'groupe instructeur 2', procedure: procedure) }
@ -14,11 +14,26 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
sign_in(instructeur.user) sign_in(instructeur.user)
end end
describe '#index' do describe "before_action: ensure_allowed!" do
context 'of a procedure I own' do it "is present" do
before do before_actions = Instructeurs::GroupeInstructeursController
get :index, params: { procedure_id: procedure.id } ._process_action_callbacks
end .filter { |process_action_callbacks| process_action_callbacks.kind == :before }
.map(&:filter)
expect(before_actions).to include(:ensure_allowed!)
end
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 context 'when a procedure has multiple groups' do
it { expect(response).to have_http_status(:ok) } it { expect(response).to have_http_status(:ok) }
@ -27,6 +42,25 @@ describe Instructeurs::GroupeInstructeursController, type: :controller do
it { expect(response.body).not_to include(gi_2_2.label) } it { expect(response.body).not_to include(gi_2_2.label) }
end end
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 navez 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 navez pas accès à cette démarche") }
end
end end
describe '#show' do describe '#show' do