From 2a2b0a2e21a40214bac56d463a58079dc828f462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20G=C3=BCnther?= Date: Fri, 8 Nov 2024 12:41:47 +0100 Subject: [PATCH] Add side panel to OIDC (#17149) * Add side panel to OIDC * Merge documentation --- .../custom-openid-connect-providers/README.md | 144 +--------------- .../authentication/openid-providers/README.md | 159 ++++++++++++++---- .../openid-providers/oidc-index-page.png | Bin 0 -> 102638 bytes .../openid_connect/providers/row_component.rb | 23 +-- .../sections/form_component.html.erb | 3 +- .../side_panel/information_component.html.erb | 24 +++ .../side_panel/information_component.rb | 39 +++++ .../providers/side_panel_component.html.erb | 11 ++ .../providers/side_panel_component.rb | 43 +++++ .../openid_connect/providers_controller.rb | 21 ++- .../openid_connect/providers/edit.html.erb | 22 ++- .../openid_connect/providers/show.html.erb | 38 +++++ modules/openid_connect/config/locales/en.yml | 3 + modules/openid_connect/config/routes.rb | 2 +- 14 files changed, 330 insertions(+), 202 deletions(-) create mode 100644 docs/system-admin-guide/authentication/openid-providers/oidc-index-page.png create mode 100644 modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb create mode 100644 modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.rb create mode 100644 modules/openid_connect/app/components/openid_connect/providers/side_panel_component.html.erb create mode 100644 modules/openid_connect/app/components/openid_connect/providers/side_panel_component.rb create mode 100644 modules/openid_connect/app/views/openid_connect/providers/show.html.erb diff --git a/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md b/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md index e260f337731a..fe442ea23ae3 100644 --- a/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md +++ b/docs/installation-and-operations/misc/custom-openid-connect-providers/README.md @@ -3,147 +3,7 @@ > [!IMPORTANT] > OpenID Connect providers is an Enterprise add-on. If you do not see the button you will have to activate the Enterprise edition first. -Starting in OpenProject 15.0., you can create custom OpenID Connect providers with the user interface [OpenID Providers Authentication Guide](../../../system-admin-guide/authentication/openid-providers/). Please consult this document first for references on all configuration options. Any providers you have created in earlier versions will have been migrated and should be available from the user interface. +Starting in OpenProject 15.0., you can create custom OpenID Connect providers with the user interface [OpenID Providers Authentication Guide](../../../system-admin-guide/authentication/openid-providers/). -However, for some deployment scenarios, it might be desirable to configure a provider through environment variables. - -> [!WARNING] -> Only do this if you know what you are doing. Otherwise this may break your existing OpenID Connect authentication or cause other issues. - -## Environment variables - -The provider entries are defined dynamically based on the environment keys. All variables will start with the prefix -`OPENPROJECT_OPENID__CONNECT_` followed by the provider name. For instance an Okta example would -be defined via environment variables like this: - -```shell -OPENPROJECT_OPENID__CONNECT_OKTA_DISPLAY__NAME="Okta" -OPENPROJECT_OPENID__CONNECT_OKTA_HOST="mypersonal.okta.com" -OPENPROJECT_OPENID__CONNECT_OKTA_IDENTIFIER="" -# etc. -``` - -> [!NOTE] -> Underscores in option names must be escaped by doubling them. So make sure to really do use two consecutive underscores in `DISPLAY__NAME`, `TOKEN__ENDPOINT` and so forth - - - -## Configuration - -Use the following configuration as a template for your configuration. - -> [!NOTE] -> -> Replace `KEYCLOAK` in the environment name with an alphanumeric identifier. This will become the slug in the redirect URI like follows: -> -> `https://openproject.example.com/auth/keycloak/callback` -> -> You can also see the actual redirect URI in the user interface after the provider has been successfully created from these environment variables. - - - -```bash -# The name of the login button in OpenProject, you can freely set this to anything you like -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_DISPLAY__NAME="Keycloak" - -# The Client ID of OpenProject, usually the client host in Keycloak -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_IDENTIFIER="https://" - -# The Client Secret used by OpenProject for your provider -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_SECRET="" - -# The Issuer configuration for your provider -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ISSUER="https://keycloak.example.com/realms/" - -# Endpoints for Authorization, Token, Userinfo -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_AUTHORIZATION__ENDPOINT="/realms//protocol/openid-connect/auth" -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_TOKEN__ENDPOINT="/realms//protocol/openid-connect/token" -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_USERINFO__ENDPOINT="/realms//protocol/openid-connect/userinfo" - -# Optional: endpoint to redirect users for logout -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_END__SESSION__ENDPOINT="http://keycloak.example.com/realms//protocol/openid-connect/logout" - -# Host name of Keycloak, required if endpoint information are not absolute URLs -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_HOST="" - -# Optional: Specify if non-standard port -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_PORT="443" - -# Optional: Specify if not using https (only for development/testing purposes) -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_SCHEME="https" - -# Optional: Where to redirect the user after a completed logout flow -OPENPROJECT_OPENID__CONNECT_LOCALKEYCLOAK_POST__LOGOUT__REDIRECT__URI="http://example.com" - -# Optional: if you have created the client scope mapper as shown above -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ATTRIBUTE__MAP_LOGIN="preferred_username" - -# Optional: Claim mapping using acr_value syntax -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ACR__VALUES="phr phrh Multi_Factor" - -# Optional: Claim mapping using JSON -OPENPROJECT_OPENID__CONNECT_KEYCLOAK_CLAIMS="{\"id_token\":{\"acr\":{\"essential\":true,\"values\":[\"phr\",\"phrh\",\"Multi_Factor\"]}}}" -``` - - - -## Applying the configuration - -To apply the configuration after changes, you need to run the `db:seed` rake task. In all installations, this command is run automatically when you upgrade or install your application. Use the following commands based on your installation method: - -- **Packaged installation**: `sudo openproject run bundle exec rake db:seed` -- **Docker**: `docker exec -it bundle exec rake db:seed`. - -### Claims - -You can also request [claims](https://openid.net/specs/openid-connect-core-1_0-final.html#Claims) for both the id_token and userinfo endpoint. -Mind though that currently only claims requested for the id_token returned with the authorize response are validated. -That is authentication will fail if a requested essential claim is not returned. - -#### Requesting MFA authentication via the ACR claim - -Say for example that you want to request that the user authenticate using MFA (multi-factor authentication). -You can do this by using the ACR (Authentication Context Class Reference) claim. - -This may look different for each identity provider. But if they follow, for instance the [EAP (Extended Authentication Profile)](https://openid.net/specs/openid-connect-eap-acr-values-1_0.html) then the claims would be `phr` (phishing-resistant) and 'phrh' (phishing-resistant hardware-protected). Others may simply have an additional claim called `Multi_Factor`. - -You have to check with your identity provider how these values must be called. - -In the following example we request a list of ACR values. One of which must be satisfied -(i.e. returned in the ID token by the identity provider, meaning that the requested authentication mechanism was used) -for the login in OpenProject to succeed. If none of the requested claims are present, authentication will fail. - -```ruby -options = { ... } - -options["claims"] = { - "id_token": { - "acr": { - "essential": true, - "values": ["phr", "phrh", "Multi_Factor"] - } - } -} -``` - -#### Non-essential claims - -You may also request non-essential claims. In the example above this indicates that users should preferably be authenticated using -those mechanisms but it's not strictly required. The login into OpenProject will then work even if none of the claims -are returned by the identity provider. - -**The acr_values option** - -For non-essential ACR claims you can also use the shorthand form of the option like this: - -```ruby -options = { ... } - -options["acr_values"] = "phr phrh Multi_Factor" -``` - -The option takes a space-separated list of ACR values. This is functionally the same as using the -more complicated `claims` option above but with `"essential": false`. - -For all other claims there is no such shorthand. +Please use this document for references on all configuration options. Any providers you have created in earlier versions will have been migrated and should be available from the user interface. diff --git a/docs/system-admin-guide/authentication/openid-providers/README.md b/docs/system-admin-guide/authentication/openid-providers/README.md index 04d6211e96c5..0c226cb635e5 100644 --- a/docs/system-admin-guide/authentication/openid-providers/README.md +++ b/docs/system-admin-guide/authentication/openid-providers/README.md @@ -172,7 +172,7 @@ Next, you need to create the OpenID Connect provider in OpenProject: Press **Finish setup** to save the client and complete. If you go back to the index page of OpenID connect providers, the new provider should be visible. There you will see the redirect URI on the right side in case you set a custom display name. -![Saved Google authentication provider](azure-provider-index.png) Congratulations, your users can now authenticate using your Microsoft Entra ID provider using the button in the Login form. +![Saved Google authentication provider](./oidc-index-page.png) Congratulations, your users can now authenticate using your Microsoft Entra ID provider using the button in the Login form. ## Custom OpenID Connect Provider @@ -208,7 +208,7 @@ To start creating a custom provider, please follow these steps: - **End session endpoint**, an URL where OpenProject should redirect to terminate a user's session. - **JWKS URI**. This is the URL of the provider's JSON Web Key Set document containing e.g., signing keys and certificates. - A custom icon by using a publicly available URL to fetch the logo from. -- Click **Continue** to validate this form and move to the next step. If there are any errors in this form, they will turn red and inform you about what you need to change. +- Click **Continue** to validate this form and move to the next step. If there are any errors in this form, they will turn red and inform you about what you need to change. ![Custom OpenID provider advanced configuration in OpenProject](custom-provider-advanced-config.png) @@ -233,7 +233,7 @@ For example: Keycloak allows you to map custom properties of the user. This allo You can optionally request [claims](https://openid.net/specs/openid-connect-core-1_0-final.html#Claims) for both the id_token and userinfo endpoint. Keep in mind that currently only claims requested for the id_token returned with the authorize response are validated. That means that the authentication will fail if a requested essential claim is not returned. -If you do not need Claims or are unaware of their use-cases, simply skip this step and click **Finish setup** . +If you do not need Claims or are unaware of their use-cases, simply skip this step and click **Finish setup** . **Requesting MFA authentication via the ACR claim** @@ -276,41 +276,13 @@ options["acr_values"] = "phr phrh Multi_Factor" The option takes a space-separated list of ACR values. This is functionally the same as using the more complicated `claims` option above but with `"essential": false`. For all other claims there is no such shorthand. -After entering Claims information, click **Finish setup** to complete the provider creation form. +After entering Claims information, click **Finish setup** to complete the provider creation form. ![Bildschirmfoto 2024-11-06 um 18.34.28](./custom-provider-claims.png) -## Troubleshooting - -Q: After clicking on a provider badge, I am redirected to a signup form that says a user already exists with that login. - -A: This can happen if you previously created user accounts in OpenProject with the same email than what is stored in the OpenID provider. In this case, if you want to allow existing users to be automatically remapped to the OpenID provider, you should do the following: - -Spawn an interactive console in OpenProject. The following example shows the command for the packaged installation. -See [our process control guide](../../../installation-and-operations/operation/control/) for information on other installation types. - -```shell -sudo openproject run console -# or if using docker: -# docker-compose run --rm web bundle exec rails console -``` - -Once in the console you can then enter the following to enable the setting and leave the console. - -```shell -Setting.oauth_allow_remapping_of_existing_users = true -exit -``` - -Then, existing users should be able to log in using their Azure identity. Note that this works only if the user is using password-based authentication, and is not linked to any other authentication source (e.g. LDAP) or OpenID provider. - -Note that this setting is set to true by default for new installations already. - - - -### Configuration for Okta +### Additional custom configuration instructions for Okta If you use Okta with OpenID Connect, use these configuration properties in the custom provider form: @@ -323,7 +295,7 @@ If you use Okta with OpenID Connect, use these configuration properties in the c -### Configuration for Keycloak +### Additional custom configuration instructions for Keycloak In Keycloak, use the following steps to set up an OIDC integration for OpenProject: @@ -371,3 +343,122 @@ In OpenProject, create a custom provider as shown above using these parameters - **Token endpoint**: `/oauth2/v1/token` - **End session endpoint**: `https://mypersonal.okta.com/oauth2/{authorizationServerId}/v1/logout` - **OpenProject Redirect URI**: `https://openproject.example.com/auth/oidc-keycloak/callback` (Note that this URL depends on the display name above. See the UI for the actual Redirect URI) + + + + + +## Configuration using environment variables + +For some deployment scenarios, it might be desirable to configure a provider through environment variables. + +> [!WARNING] +> Only do this if you know what you are doing. Otherwise this may break your existing OpenID Connect authentication or cause other issues. + +The provider entries are defined dynamically based on the environment keys. All variables will start with the prefix +`OPENPROJECT_OPENID__CONNECT_` followed by the provider name. For instance an Okta example would +be defined via environment variables like this: + +```shell +OPENPROJECT_OPENID__CONNECT_OKTA_DISPLAY__NAME="Okta" +OPENPROJECT_OPENID__CONNECT_OKTA_HOST="mypersonal.okta.com" +OPENPROJECT_OPENID__CONNECT_OKTA_IDENTIFIER="" +# etc. +``` + +Underscores in option names must be escaped by doubling them. So make sure to really do use two consecutive underscores in `DISPLAY__NAME`, `TOKEN__ENDPOINT` and so forth + +Use the following configuration as a template for your configuration. + +> [!NOTE] +> +> Replace `KEYCLOAK` in the environment name with an alphanumeric identifier. This will become the slug in the redirect URI like follows: +> +> `https://openproject.example.com/auth/keycloak/callback` +> +> You can also see the actual redirect URI in the user interface after the provider has been successfully created from these environment variables. + + + +```bash +# The name of the login button in OpenProject, you can freely set this to anything you like +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_DISPLAY__NAME="Keycloak" + +# The Client ID of OpenProject, usually the client host in Keycloak +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_IDENTIFIER="https://" + +# The Client Secret used by OpenProject for your provider +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_SECRET="" + +# The Issuer configuration for your provider +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ISSUER="https://keycloak.example.com/realms/" + +# Endpoints for Authorization, Token, Userinfo +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_AUTHORIZATION__ENDPOINT="/realms//protocol/openid-connect/auth" +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_TOKEN__ENDPOINT="/realms//protocol/openid-connect/token" +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_USERINFO__ENDPOINT="/realms//protocol/openid-connect/userinfo" + +# Optional: endpoint to redirect users for logout +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_END__SESSION__ENDPOINT="http://keycloak.example.com/realms//protocol/openid-connect/logout" + +# Host name of Keycloak, required if endpoint information are not absolute URLs +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_HOST="" + +# Optional: Specify if non-standard port +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_PORT="443" + +# Optional: Specify if not using https (only for development/testing purposes) +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_SCHEME="https" + +# Optional: Where to redirect the user after a completed logout flow +OPENPROJECT_OPENID__CONNECT_LOCALKEYCLOAK_POST__LOGOUT__REDIRECT__URI="http://example.com" + +# Optional: if you have created the client scope mapper as shown above +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ATTRIBUTE__MAP_LOGIN="preferred_username" + +# Optional: Claim mapping using acr_value syntax +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_ACR__VALUES="phr phrh Multi_Factor" + +# Optional: Claim mapping using JSON, see Step 7 above for more information on syntax +OPENPROJECT_OPENID__CONNECT_KEYCLOAK_CLAIMS="{\"id_token\":{\"acr\":{\"essential\":true,\"values\":[\"phr\",\"phrh\",\"Multi_Factor\"]}}}" +``` + + + +### Applying the configuration + +To apply the configuration after changes, you need to run the `db:seed` rake task. In all installations, this command is run automatically when you upgrade or install your application. Use the following commands based on your installation method: + +- **Packaged installation**: `sudo openproject run bundle exec rake db:seed` +- **Docker**: `docker exec -it bundle exec rake db:seed`. + + + +## Troubleshooting + +Q: After clicking on a provider badge, I am redirected to a signup form that says a user already exists with that login. + +A: This can happen if you previously created user accounts in OpenProject with the same email than what is stored in the OpenID provider. In this case, if you want to allow existing users to be automatically remapped to the OpenID provider, you should do the following: + +Spawn an interactive console in OpenProject. The following example shows the command for the packaged installation. See [our process control guide](https://github.com/opf/openproject/blob/dev/docs/installation-and-operations/operation/control) for information on other installation types. + +``` +sudo openproject run console +# or if using docker: +# docker-compose run --rm web bundle exec rails console +``` + + + +Once in the console you can then enter the following to enable the setting and leave the console. + +``` +Setting.oauth_allow_remapping_of_existing_users = true +exit +``` + + + +Then, existing users should be able to log in using their Azure identity. Note that this works only if the user is using password-based authentication, and is not linked to any other authentication source (e.g. LDAP) or OpenID provider. + +Note that this setting is set to true by default for new installations already. diff --git a/docs/system-admin-guide/authentication/openid-providers/oidc-index-page.png b/docs/system-admin-guide/authentication/openid-providers/oidc-index-page.png new file mode 100644 index 0000000000000000000000000000000000000000..09c0e44322117cab2bfef9d8d9450621a89cb7bb GIT binary patch literal 102638 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 %aqo@l>Cb&jPJ-Y}b$vN)P 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 literal 0 HcmV?d00001 diff --git a/modules/openid_connect/app/components/openid_connect/providers/row_component.rb b/modules/openid_connect/app/components/openid_connect/providers/row_component.rb index 297ebb19d2eb..c7e87dc5c26a 100644 --- a/modules/openid_connect/app/components/openid_connect/providers/row_component.rb +++ b/modules/openid_connect/app/components/openid_connect/providers/row_component.rb @@ -21,22 +21,13 @@ def name end def provider_name - render(Primer::OpenProject::FlexLayout.new) do |layout| - layout.with_row do - render( - Primer::Beta::Link.new( - href: url_for(action: :edit, id: provider.id), - font_weight: :bold, - mr: 1 - ) - ) { provider.display_name } - end - layout.with_row do - render(Primer::Beta::Text.new(font_size: :small, color: :subtle)) do - provider.callback_url - end - end - end + render( + Primer::Beta::Link.new( + href: url_for(action: :show, id: provider.id), + font_weight: :bold, + mr: 1 + ) + ) { provider.display_name } end def incomplete_label diff --git a/modules/openid_connect/app/components/openid_connect/providers/sections/form_component.html.erb b/modules/openid_connect/app/components/openid_connect/providers/sections/form_component.html.erb index 5339d40ecdc1..677ed8c0b0fa 100644 --- a/modules/openid_connect/app/components/openid_connect/providers/sections/form_component.html.erb +++ b/modules/openid_connect/app/components/openid_connect/providers/sections/form_component.html.erb @@ -3,8 +3,7 @@ id: "openid-connect-providers-edit-form", model: provider, url:, - method: form_method, - data: { turbo: true, turbo_stream: true } + method: form_method ) do |form| flex_layout do |flex| if @heading diff --git a/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb new file mode 100644 index 000000000000..cc4a09471cab --- /dev/null +++ b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.html.erb @@ -0,0 +1,24 @@ +<%= + render(Primer::OpenProject::SidePanel::Section.new) do |section| + section.with_title { I18n.t("saml.providers.label_openproject_information") } + section.with_description { I18n.t("openid_connect.instructions.redirect_url") } + + component_collection do |collection| + collection.with_component(Primer::Beta::Heading.new(tag: :h5, mb: 1)) do + I18n.t("activemodel.attributes.openid_connect/provider.slug") + end + + collection.with_component( + OpPrimer::CopyToClipboardComponent.new(provider.slug, scheme: :input) + ) + + collection.with_component(Primer::Beta::Heading.new(tag: :h5, mt: 4, mb: 1)) do + I18n.t("activemodel.attributes.openid_connect/provider.redirect_url") + end + + collection.with_component( + OpPrimer::CopyToClipboardComponent.new(provider.callback_url, scheme: :input) + ) + end + end +%> diff --git a/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.rb b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.rb new file mode 100644 index 000000000000..610e01b3e969 --- /dev/null +++ b/modules/openid_connect/app/components/openid_connect/providers/side_panel/information_component.rb @@ -0,0 +1,39 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2024 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module OpenIDConnect::Providers + module SidePanel + class InformationComponent < ApplicationComponent + include ApplicationHelper + include OpTurbo::Streamable + include OpPrimer::ComponentHelpers + + alias_method :provider, :model + end + end +end diff --git a/modules/openid_connect/app/components/openid_connect/providers/side_panel_component.html.erb b/modules/openid_connect/app/components/openid_connect/providers/side_panel_component.html.erb new file mode 100644 index 000000000000..b05772b94cb4 --- /dev/null +++ b/modules/openid_connect/app/components/openid_connect/providers/side_panel_component.html.erb @@ -0,0 +1,11 @@ +<%= + component_wrapper do + render(Primer::OpenProject::SidePanel.new(spacious: true)) do |panel| + [ + OpenIDConnect::Providers::SidePanel::InformationComponent.new(@provider), + ].each do |component| + panel.with_section(component) + end + end + end +%> diff --git a/modules/openid_connect/app/components/openid_connect/providers/side_panel_component.rb b/modules/openid_connect/app/components/openid_connect/providers/side_panel_component.rb new file mode 100644 index 000000000000..5764ea920d5a --- /dev/null +++ b/modules/openid_connect/app/components/openid_connect/providers/side_panel_component.rb @@ -0,0 +1,43 @@ +#-- copyright +# OpenProject is an open source project management software. +# Copyright (C) 2012-2024 the OpenProject GmbH +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License version 3. +# +# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows: +# Copyright (C) 2006-2013 Jean-Philippe Lang +# Copyright (C) 2010-2013 the ChiliProject Team +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# See COPYRIGHT and LICENSE files for more details. +#++ + +module OpenIDConnect + module Providers + class SidePanelComponent < ApplicationComponent + include ApplicationHelper + include OpTurbo::Streamable + include OpPrimer::ComponentHelpers + + def initialize(provider) + super() + + @provider = provider + end + end + end +end diff --git a/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb b/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb index e2477b25b1ef..5433718cd63d 100644 --- a/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb +++ b/modules/openid_connect/app/controllers/openid_connect/providers_controller.rb @@ -7,13 +7,15 @@ class ProvidersController < ::ApplicationController before_action :require_admin before_action :check_ee - before_action :find_provider, only: %i[edit update confirm_destroy destroy] + before_action :find_provider, only: %i[edit show update confirm_destroy destroy] before_action :set_edit_state, only: %i[create edit update] def index @providers = ::OpenIDConnect::Provider.all end + def show; end + def new oidc_provider = case params[:oidc_provider] when "google" @@ -44,7 +46,20 @@ def create end end - def edit; end + def edit + respond_to do |format| + format.turbo_stream do + component = OpenIDConnect::Providers::ViewComponent.new(@provider, + view_mode: :edit, + edit_mode: @edit_mode, + edit_state: @edit_state) + update_via_turbo_stream(component:) + scroll_into_view_via_turbo_stream("openid-connect-providers-edit-form", behavior: :instant) + render turbo_stream: turbo_streams + end + format.html + end + end def update update_params = params @@ -59,7 +74,7 @@ def update successful_save_response else @provider = call.result - failed_save_response(edit) + failed_save_response(:edit) end end diff --git a/modules/openid_connect/app/views/openid_connect/providers/edit.html.erb b/modules/openid_connect/app/views/openid_connect/providers/edit.html.erb index 186c079beb80..bc753198ad44 100644 --- a/modules/openid_connect/app/views/openid_connect/providers/edit.html.erb +++ b/modules/openid_connect/app/views/openid_connect/providers/edit.html.erb @@ -26,7 +26,21 @@ end %> -<%= render(OpenIDConnect::Providers::ViewComponent.new(@provider, - view_mode: :edit, - edit_mode: @edit_mode, - edit_state: @edit_state)) %> +<%= + render(Primer::Alpha::Layout.new(stacking_breakpoint: :md)) do |content| + content.with_main do + render(OpenIDConnect::Providers::ViewComponent.new(@provider, + view_mode: :edit, + edit_mode: @edit_mode, + edit_state: @edit_state)) + end + + if @provider.persisted? + content.with_sidebar(row_placement: :start, col_placement: :end) do + render(OpenIDConnect::Providers::SidePanelComponent.new(@provider)) + end + end + end +%> + +<%= %> diff --git a/modules/openid_connect/app/views/openid_connect/providers/show.html.erb b/modules/openid_connect/app/views/openid_connect/providers/show.html.erb new file mode 100644 index 000000000000..846ccd519fe6 --- /dev/null +++ b/modules/openid_connect/app/views/openid_connect/providers/show.html.erb @@ -0,0 +1,38 @@ +<% html_title(t(:label_administration), t('openid_connect.providers.plural'), @provider.display_name) -%> + +<% html_title(t(:label_administration), page_title) -%> + +<%= + render Primer::OpenProject::PageHeader.new do |header| + header.with_title { @provider.display_name } + header.with_breadcrumbs([{ href: admin_index_path, text: t(:label_administration) }, + { href: admin_settings_authentication_path, text: t(:label_authentication) }, + { href: openid_connect_providers_path, text: t("openid_connect.providers.plural") }, + @provider.display_name]) + header.with_action_button( + tag: :a, + scheme: :danger, + mobile_icon: :trash, + mobile_label: t(:button_delete), + size: :medium, + href: confirm_destroy_openid_connect_provider_path(@provider), + aria: { label: I18n.t(:button_delete) }, + title: I18n.t(:button_delete) + ) do |button| + button.with_leading_visual_icon(icon: :trash) + t(:button_delete) + end + end +%> + +<%= + render(Primer::Alpha::Layout.new(stacking_breakpoint: :md)) do |content| + content.with_main do + render OpenIDConnect::Providers::ViewComponent.new(@provider, view_mode: :show) + end + + content.with_sidebar(row_placement: :start, col_placement: :end) do + render OpenIDConnect::Providers::SidePanelComponent.new(@provider) + end + end +%> diff --git a/modules/openid_connect/config/locales/en.yml b/modules/openid_connect/config/locales/en.yml index 76689750d8c5..d6bafddb14f1 100644 --- a/modules/openid_connect/config/locales/en.yml +++ b/modules/openid_connect/config/locales/en.yml @@ -9,6 +9,7 @@ en: attributes: openid_connect/provider: name: Name + slug: Unique identifier display_name: Display name client_id: Client ID client_secret: Client secret @@ -27,6 +28,7 @@ en: icon: Custom icon claims: Claims acr_values: ACR values + redirect_url: Redirect URL activerecord: errors: models: @@ -55,6 +57,7 @@ en: delete_title: "Delete OpenID Connect provider" instructions: + redirect_url: This is the redirect URL that the OpenID Connect provider should use to redirect back to OpenProject after a successful login. endpoint_url: The endpoint URL given to you by the OpenID Connect provider metadata_none: I don't have this information metadata_url: I have a discovery endpoint URL diff --git a/modules/openid_connect/config/routes.rb b/modules/openid_connect/config/routes.rb index aa31fbcf26f3..110a5b553d6a 100644 --- a/modules/openid_connect/config/routes.rb +++ b/modules/openid_connect/config/routes.rb @@ -3,7 +3,7 @@ scope :admin do namespace :openid_connect do - resources :providers, except: %i[show] do + resources :providers do get :confirm_destroy, on: :member end end