From 50133ca5aeef12596d01a8380d9dbaf4c3b47865 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:31:52 +0100 Subject: [PATCH 1/8] Update FC images --- app/packs/images/FCboutons-10.png | Bin 11293 -> 4768 bytes app/packs/images/FCboutons-10@2x.png | Bin 24641 -> 9632 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/packs/images/FCboutons-10.png b/app/packs/images/FCboutons-10.png index bb5adf7bc494b9c1a037772d30a815093a172f84..5a179f870ba2de68ec7d5c0bece248bbadd65464 100644 GIT binary patch literal 4768 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�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 O=t_vnic|~f2mT+GV;&v= diff --git a/app/packs/images/FCboutons-10@2x.png b/app/packs/images/FCboutons-10@2x.png index c7461283c61abf1c1167115ac017a1d51ea9885f..9668728b25679acf4802aa5773078888dfb22a8c 100644 GIT binary patch literal 9632 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 Xt2TnX@@RwKjz2&~MY=-LH2D7j#l%lZ From ea9982bb051dbac3ca788a22f22484d8e51de310 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:33:18 +0100 Subject: [PATCH 2/8] Update partials and views to make the button appear correctly everywhere --- OVERLOADS.md | 4 ++ .../decidim/devise/passwords/new.html.erb | 37 ++++++++++++ .../devise/shared/_omniauth_buttons.html.erb | 25 ++++---- .../decidim/shared/_login_modal.html.erb | 60 +++++++++++++++++++ 4 files changed, 116 insertions(+), 10 deletions(-) create mode 100644 app/views/decidim/devise/passwords/new.html.erb create mode 100644 app/views/decidim/shared/_login_modal.html.erb diff --git a/OVERLOADS.md b/OVERLOADS.md index a64b3b68..27aec3fb 100644 --- a/OVERLOADS.md +++ b/OVERLOADS.md @@ -1,5 +1,9 @@ # Overrides +## Update France Connect with requirements +* `app/views/decidim/devise/passwords/new.html.erb` +* `app/views/decidim/shared/_login_modal.html.erb` + ## Load decidim-awesome assets only if dependencie is present * `app/views/layouts/decidim/_head.html.erb:33` diff --git a/app/views/decidim/devise/passwords/new.html.erb b/app/views/decidim/devise/passwords/new.html.erb new file mode 100644 index 00000000..ebf006d7 --- /dev/null +++ b/app/views/decidim/devise/passwords/new.html.erb @@ -0,0 +1,37 @@ +<% add_decidim_page_title(t("devise.passwords.new.forgot_your_password")) %> + +
+
+
+
+

<%= t("devise.passwords.new.forgot_your_password") %>

+
+
+ +
+
+
+
+ <%= decidim_form_for(resource, namespace: "password", as: resource_name, url: password_path(resource_name), html: { method: :post, class: "register-form new_user" }) do |f| %> +
+ <%= f.email_field :email, autofocus: true %> +
+ + <% if current_organization.enabled_omniauth_providers.keys.any? { |provider| provider.match?("france") } %> +
+

<%= t("decidim.omniauth.france_connect.forgot_password.ok_text") %>

+
+ <% end %> + +
+ <%= f.submit t("devise.passwords.new.send_me_reset_password_instructions"), class: "button expanded" %> +
+ + <% end %> + <%= render "decidim/devise/shared/links" %> +
+
+
+
+
+
\ No newline at end of file diff --git a/app/views/decidim/devise/shared/_omniauth_buttons.html.erb b/app/views/decidim/devise/shared/_omniauth_buttons.html.erb index 53609a89..a181ed6a 100644 --- a/app/views/decidim/devise/shared/_omniauth_buttons.html.erb +++ b/app/views/decidim/devise/shared/_omniauth_buttons.html.erb @@ -1,23 +1,28 @@ <% if Devise.mappings[:user].omniauthable? && current_organization.enabled_omniauth_providers.any? %>
-
+
<%- current_organization.enabled_omniauth_providers.keys.each do |provider| %> <% end %> @@ -28,4 +33,4 @@ <%- end %>
-<% end %> +<% end %> \ No newline at end of file diff --git a/app/views/decidim/shared/_login_modal.html.erb b/app/views/decidim/shared/_login_modal.html.erb new file mode 100644 index 00000000..ddd14236 --- /dev/null +++ b/app/views/decidim/shared/_login_modal.html.erb @@ -0,0 +1,60 @@ + \ No newline at end of file From bfbd27515ea777f189ece15559967cf4b615a803 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:35:17 +0100 Subject: [PATCH 3/8] Normalize locales and add missing ones from FranceConnect --- config/locales/en.yml | 40 +++++++++++++++++++++++++++++++--------- config/locales/fr.yml | 34 ++++++++++++++++++++++++++++------ 2 files changed, 59 insertions(+), 15 deletions(-) diff --git a/config/locales/en.yml b/config/locales/en.yml index 71bf7942..b713c9db 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -9,11 +9,6 @@ en: participatory_process: private_space: Private space decidim: - omniauth: - france_connect: - external: - link: https://franceconnect.gouv.fr/ - text: Qu'est-ce-que FranceConnect ? accessibility: skip_button: Skip button admin: @@ -37,6 +32,10 @@ en: name: Identity Verification Form osp_authorization_workflow: name: Authorization procedure + devise: + sessions: + new: + sign_in_disabled: Sign in disabled events: budgets: pending_order: @@ -57,11 +56,7 @@ en: email_subject: Failed verification attempt against a managed participant notification_title: The participant %{resource_title} has tried to verify themself with the data of the managed participant %{managed_user_name}. newsletter_templates: - mel_template_settings_form: - interpolations_hint: Interpolations hint - body: Body mel_template: - name: Template alt_banner_image: Alt banner image mel_template_settings_form: show: @@ -79,6 +74,17 @@ en: icon: Icon link: Link text: Text + name: Template + mel_template_settings_form: + body: Body + interpolations_hint: Interpolations hint + omniauth: + france_connect: + external: + link: https://franceconnect.gouv.fr/ + text: What is FranceConnect ? + forgot_password: + ok_text: Warning, this password is the one of your local account and in no case the one of the account you use through FranceConnect. It will only be used when you log in with your email address rather than via FranceConnect. proposals: create: error: There was a problem saving @@ -101,6 +107,11 @@ en: withdraw: errors: has_supports: This proposal can not be withdrawn because it already has supports. + shared: + login_modal: + close_modal: Fermer + please_sign_in: Veuillez vous connecter + sign_up: Créer un compte system: organizations: omniauth_settings: @@ -133,6 +144,17 @@ en: actions: osp_authorization_handler: Verify with the identity verification form osp_authorization_workflow: Verify with the identity verification form + devise: + passwords: + new: + forgot_your_password: Forgot your password + send_me_reset_password_instructions: Send me reset password instructions + sessions: + new: + sign_in: Log in + shared: + links: + forgot_your_password: Forgot your password faker: address: country_code: diff --git a/config/locales/fr.yml b/config/locales/fr.yml index e081ee43..a8428761 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -9,11 +9,6 @@ fr: participatory_process: private_space: Espace privé decidim: - omniauth: - france_connect: - external: - link: https://franceconnect.gouv.fr/ - text: Qu'est-ce-que FranceConnect ? accessibility: skip_button: Passer au contenu principal admin: @@ -37,6 +32,10 @@ fr: name: Formulaire de vérification d'identité osp_authorization_workflow: name: Procédure d'autorisation + devise: + sessions: + new: + sign_in_disabled: Vous pouvez accéder avec un compte externe events: budgets: pending_order: @@ -77,6 +76,13 @@ fr: show: body: Contenu principal interpolations_hint: Interpolation + omniauth: + france_connect: + external: + link: https://franceconnect.gouv.fr/ + text: Qu'est-ce-que FranceConnect ? + forgot_password: + ok_text: Warning, this password is the one of your local account and in no case the one of the account you use through FranceConnect. It will only be used when you log in with your email address rather than via FranceConnect. proposals: create: error: Il y a eu des erreurs lors de la sauvegarde de la proposition. @@ -99,15 +105,20 @@ fr: withdraw: errors: has_supports: Cette proposition ne peut pas être retirée car elle dispose déjà de supports. + shared: + login_modal: + close_modal: Close modal + please_sign_in: Please sign in + sign_up: Sign up system: organizations: omniauth_settings: france_connect: client_id: Client ID client_secret: Client secret - scope: Périmètre de données provider: FranceConnect provider_name: FranceConnect + scope: Périmètre de données site_url: Site URL france_connect_profile: button_path: Chemin du bouton @@ -131,6 +142,17 @@ fr: actions: osp_authorization_handler: Vérifier avec le formulaire de vérification de l'identité osp_authorization_workflow: Vérifier avec le formulaire de vérification de l'identité + devise: + passwords: + new: + forgot_your_password: Mot de passe oublié ? + send_me_reset_password_instructions: Envoyez-moi les instructions de réinitialisation du mot de passe + sessions: + new: + sign_in: S'identifier + shared: + links: + forgot_your_password: Mot de passe oublié ? faker: address: country_code: From 9e4ab22ab94092fa38815376e7891d74ce381f26 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:37:06 +0100 Subject: [PATCH 4/8] Update FranceConnect gem version --- Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile.lock b/Gemfile.lock index 9d9bfd0d..fb95fba8 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -15,7 +15,7 @@ GIT GIT remote: https://github.com/OpenSourcePolitics/omniauth-france_connect - revision: 4665875c94d45a71dac163889e0eedd21b2ba41d + revision: 14a53ad31928c8a83742360cfbdb90938d0a057e specs: omniauth-france_connect (0.1.0) omniauth_openid_connect (~> 0.4.0) From ea176de5e1b44718e1b5265ef21cbcbd0e18e90b Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:55:18 +0100 Subject: [PATCH 5/8] Extend this new file to disconnect from FC while deleting account from platform --- config/initializers/extends.rb | 1 + .../devise/account_controller_extends.rb | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 lib/extends/controllers/decidim/devise/account_controller_extends.rb diff --git a/config/initializers/extends.rb b/config/initializers/extends.rb index 01c10eab..eb1d5bc1 100644 --- a/config/initializers/extends.rb +++ b/config/initializers/extends.rb @@ -2,3 +2,4 @@ require "extends/controllers/decidim/devise/sessions_controller_extends" require "extends/queries/decidim/participatory_processes/group_participatory_processes_extends" +require "extends/controllers/decidim/devise/account_controller_extends" diff --git a/lib/extends/controllers/decidim/devise/account_controller_extends.rb b/lib/extends/controllers/decidim/devise/account_controller_extends.rb new file mode 100644 index 00000000..45eb375b --- /dev/null +++ b/lib/extends/controllers/decidim/devise/account_controller_extends.rb @@ -0,0 +1,41 @@ +# frozen_string_literal: true + +module AccountControllerExtends + def destroy + enforce_permission_to :delete, :user, current_user: current_user + @form = form(Decidim::DeleteAccountForm).from_params(params) + + Decidim::DestroyAccount.call(current_user, @form) do + on(:ok) do + sign_out(current_user) + if active_france_connect_session? + destroy_france_connect_session(session["omniauth.france_connect.end_session_uri"]) + else + redirect_to decidim.root_path + end + flash[:notice] = t("account.destroy.success", scope: "decidim") + end + + on(:invalid) do + flash[:alert] = t("account.destroy.error", scope: "decidim") + redirect_to decidim.root_path + end + end + end + + private + + def destroy_france_connect_session(fc_logout_path) + session.delete("omniauth.france_connect.end_session_uri") + + redirect_to fc_logout_path + end + + def active_france_connect_session? + current_organization.enabled_omniauth_providers.include?(:france_connect) && session["omniauth.france_connect.end_session_uri"].present? + end +end + +Decidim::AccountController.class_eval do + prepend(AccountControllerExtends) +end \ No newline at end of file From 69d82c2d8787dc0a640a69356e51f12182abc6ee Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:55:46 +0100 Subject: [PATCH 6/8] Same but for the logout --- .../devise/sessions_controller_extends.rb | 23 ++++++++++ spec/controllers/sessions_controller_spec.rb | 42 ++++++++++++++++++- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb b/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb index 38166b22..9f80b7f4 100644 --- a/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb +++ b/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb @@ -1,6 +1,16 @@ # frozen_string_literal: true module SessionControllerExtends + def destroy + current_user.invalidate_all_sessions! + if active_france_connect_session? + destroy_france_connect_session(session["omniauth.france_connect.end_session_uri"]) + elsif params[:translation_suffix].present? + super { set_flash_message! :notice, params[:translation_suffix], { scope: "decidim.devise.sessions" } } + else + super + end + end def after_sign_in_path_for(user) return super if user.is_a? Decidim::System::Admin @@ -19,6 +29,19 @@ def after_sign_in_path_for(user) def skip_authorization_handler? ENV["SKIP_FIRST_LOGIN_AUTHORIZATION"] ? ActiveRecord::Type::Boolean.new.cast(ENV["SKIP_FIRST_LOGIN_AUTHORIZATION"]) : true end + def destroy_france_connect_session(fc_logout_path) + signed_out = (::Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)) + if signed_out + set_flash_message! :notice, :signed_out + session.delete("omniauth.france_connect.end_session_uri") + end + + redirect_to fc_logout_path + end + + def active_france_connect_session? + current_organization.enabled_omniauth_providers.include?(:france_connect) && session["omniauth.france_connect.end_session_uri"].present? + end end Devise::SessionsController.class_eval do diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index 9f34bc3d..4da6dc37 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -97,10 +97,11 @@ module Devise end describe "DELETE destroy" do - let(:user) { create(:user, :confirmed) } + let(:organization) { create(:organization) } + let(:user) { create(:user, :confirmed, organization: organization) } before do - request.env["decidim.current_organization"] = user.organization + request.env["decidim.current_organization"] = organization request.env["devise.mapping"] = ::Devise.mappings[:user] sign_in user @@ -111,6 +112,43 @@ module Devise expect(controller.current_user).to be_nil end + + context "when France Connect is enabled" do + let(:organization) { create(:organization, omniauth_settings: omniauth_settings) } + let(:omniauth_settings) do + { "omniauth_settings_france_connect_enabled": true } + end + + before do + stub_request(:get, /test-france-connect.fr/) + .with(headers: { "Accept" => "*/*", "User-Agent" => "Ruby" }) + .to_return(status: 200, body: "", headers: {}) + + request.env["decidim.current_organization"] = user.organization + request.env["devise.mapping"] = ::Devise.mappings[:user] + + sign_in user + end + + it "logout user from France Connect" do + delete :destroy, session: { "omniauth.france_connect.end_session_uri" => "http://test-france-connect.fr/" } + + expect(controller.current_user).to be_nil + expect(controller).to redirect_to("http://test-france-connect.fr/") + expect(session["flash"]["flashes"]["notice"]).to eq("Signed out successfully.") + end + + context "and France Connect logout session is not present" do + it "logout user from application" do + delete :destroy + + expect(controller.current_user).to be_nil + expect(controller).not_to redirect_to("http://test-france-connect.fr/") + expect(controller).to redirect_to("http://test.host/") + expect(session["flash"]["flashes"]["notice"]).to eq("Signed out successfully.") + end + end + end end end end From 1fdb71f98bcd8d4c2cca5d24882f9edb0db24aa6 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:56:05 +0100 Subject: [PATCH 7/8] Modify initializer of FranceConnect --- .../initializers/omniauth_france_connect.rb | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/config/initializers/omniauth_france_connect.rb b/config/initializers/omniauth_france_connect.rb index f0caf0a4..357c2988 100644 --- a/config/initializers/omniauth_france_connect.rb +++ b/config/initializers/omniauth_france_connect.rb @@ -1,18 +1,16 @@ # frozen_string_literal: true -if Rails.application.secrets.dig(:omniauth, :france_connect).present? - Rails.application.config.middleware.use OmniAuth::Builder do - provider( - :france_connect, - setup: lambda { |env| - request = Rack::Request.new(env) - organization = Decidim::Organization.find_by(host: request.host) - provider_config = organization.enabled_omniauth_providers[:france_connect] - env["omniauth.strategy"].options[:client_id] = provider_config[:client_id] - env["omniauth.strategy"].options[:client_secret] = provider_config[:client_secret] - env["omniauth.strategy"].options[:site] = provider_config[:site_url] - env["omniauth.strategy"].options[:scope] = provider_config[:scope]&.split(" ") - } - ) - end -end +Rails.application.config.middleware.use OmniAuth::Builder do + provider( + :france_connect, + setup: lambda { |env| + request = Rack::Request.new(env) + organization = env["decidim.current_organization"].presence || Decidim::Organization.find_by(host: request.host) + provider_config = organization.enabled_omniauth_providers[:france_connect] + env["omniauth.strategy"].options[:client_id] = provider_config[:client_id] + env["omniauth.strategy"].options[:client_secret] = provider_config[:client_secret] + env["omniauth.strategy"].options[:site] = provider_config[:site_url] + env["omniauth.strategy"].options[:scope] = provider_config[:scope]&.split(" ") + } + ) +end \ No newline at end of file From 806a50afb5905cf0da1947f866834f8e1a50ac07 Mon Sep 17 00:00:00 2001 From: AyakorK Date: Tue, 7 Mar 2023 11:56:43 +0100 Subject: [PATCH 8/8] Rubocop Changes --- config/initializers/omniauth_france_connect.rb | 2 +- .../controllers/decidim/devise/account_controller_extends.rb | 2 +- .../controllers/decidim/devise/sessions_controller_extends.rb | 2 ++ 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/config/initializers/omniauth_france_connect.rb b/config/initializers/omniauth_france_connect.rb index 357c2988..f450eb37 100644 --- a/config/initializers/omniauth_france_connect.rb +++ b/config/initializers/omniauth_france_connect.rb @@ -13,4 +13,4 @@ env["omniauth.strategy"].options[:scope] = provider_config[:scope]&.split(" ") } ) -end \ No newline at end of file +end diff --git a/lib/extends/controllers/decidim/devise/account_controller_extends.rb b/lib/extends/controllers/decidim/devise/account_controller_extends.rb index 45eb375b..de4a8d98 100644 --- a/lib/extends/controllers/decidim/devise/account_controller_extends.rb +++ b/lib/extends/controllers/decidim/devise/account_controller_extends.rb @@ -38,4 +38,4 @@ def active_france_connect_session? Decidim::AccountController.class_eval do prepend(AccountControllerExtends) -end \ No newline at end of file +end diff --git a/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb b/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb index 9f80b7f4..deaa01dd 100644 --- a/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb +++ b/lib/extends/controllers/decidim/devise/sessions_controller_extends.rb @@ -11,6 +11,7 @@ def destroy super end end + def after_sign_in_path_for(user) return super if user.is_a? Decidim::System::Admin @@ -29,6 +30,7 @@ def after_sign_in_path_for(user) def skip_authorization_handler? ENV["SKIP_FIRST_LOGIN_AUTHORIZATION"] ? ActiveRecord::Type::Boolean.new.cast(ENV["SKIP_FIRST_LOGIN_AUTHORIZATION"]) : true end + def destroy_france_connect_session(fc_logout_path) signed_out = (::Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)) if signed_out