From 09b64b0ea6c32d4e71f3e93599770c3d08040d36 Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Mon, 26 Feb 2024 16:21:27 +0000 Subject: [PATCH 01/24] Add client status component Based on the active status of client, disable and restore button will toggle the status --- .../webapp/WEB-INF/views/iam/dashboard.jsp | 2 +- .../clients/client/client.component.html | 179 +++++++++--------- .../status/client.status.component.html | 36 ++++ .../client/status/client.status.component.js | 107 +++++++++++ 4 files changed, 234 insertions(+), 90 deletions(-) create mode 100644 iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html create mode 100644 iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js diff --git a/iam-login-service/src/main/webapp/WEB-INF/views/iam/dashboard.jsp b/iam-login-service/src/main/webapp/WEB-INF/views/iam/dashboard.jsp index 57ef2e3e1..1ef1459d3 100644 --- a/iam-login-service/src/main/webapp/WEB-INF/views/iam/dashboard.jsp +++ b/iam-login-service/src/main/webapp/WEB-INF/views/iam/dashboard.jsp @@ -199,7 +199,7 @@ - + diff --git a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/client.component.html b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/client.component.html index 84bd1a220..8e5861533 100644 --- a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/client.component.html +++ b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/client.component.html @@ -1,90 +1,91 @@ - -
-
-

-    {{$ctrl.clientVal.client_name}} - Create a new client -

- -
- -
-
-
-
- - - Main - - - - - Credentials - - - - - - Scopes - - - - - Grant types - - - - - Tokens - - - - - Crypto - - - - - Other info - - - - - Owners - - - -
-
- - - - -
-
-
-
- - + +
+
+

+    {{$ctrl.clientVal.client_name}} + Create a new client +

+ +
+ +
+
+
+
+ + + Main + + + + + Credentials + + + + + + Scopes + + + + + Grant types + + + + + Tokens + + + + + Crypto + + + + + Other info + + + + + Owners + + + +
+
+ + + + + +
+
+
+
+ +
\ No newline at end of file diff --git a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html new file mode 100644 index 000000000..ab5c12f95 --- /dev/null +++ b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html @@ -0,0 +1,36 @@ + + + +
Active: {{$ctrl.client.active}}
+
Client name: {{$ctrl.client.client_name}}
+ + + \ No newline at end of file diff --git a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js new file mode 100644 index 000000000..b3602aca8 --- /dev/null +++ b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js @@ -0,0 +1,107 @@ +/* + * Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2016-2021 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function() { + 'use strict'; + + function ClientStatusController(toaster, ModalService, ClientsService) { + var self = this; + + self.$onInit = function() { + self.enabled = true; + }; + + self.handleError = function(error) { + self.clientCtrl.handleError(error); + self.enabled = true; + }; + + self.handleSuccess = function() { + self.enabled = true; + self.clientCtrl.loadClient().then(function(client) { + if (client.active) { + toaster.pop({ + type: 'success', + body: + `Client '${client.client_name}' has been restored successfully.` + }); + } else { + toaster.pop({ + type: 'success', + body: `Client '${client.client_name}' is now disabled.` + }); + } + }); + }; + + self.enableClient = function() { + return ClientsService.setClientActiveStatus(self.client.client_id, true) + .then(self.handleSuccess) + .catch(self.handleError); + }; + + self.disableClient = function() { + return ClientsService.setClientActiveStatus(self.client.client_id, false) + .then(self.handleSuccess) + .catch(self.handleError); + }; + + + self.openDialog = function() { + + var modalOptions = null; + var updateStatusFunc = null; + + if (self.client.active) { + modalOptions = { + closeButtonText: 'Cancel', + actionButtonText: 'Disable client', + headerText: 'Disable ' + self.client.client_name, + bodyText: + `Are you sure you want to disable client '${self.client.client_name}'?` + }; + updateStatusFunc = self.disableClient; + + } else { + modalOptions = { + closeButtonText: 'Cancel', + actionButtonText: 'Restore client', + headerText: 'Restore ' + self.client.client_name, + bodyText: + `Are you sure you want to restore client '${self.client.client_name}'?` + }; + updateStatusFunc = self.enableClient; + } + + self.enable = false; + ModalService.showModal({}, modalOptions) + .then(function() { updateStatusFunc(); }) + .catch(function() { + + }); + }; + } + + angular.module('dashboardApp').component('clientStatus', { + require: {clientCtrl: '^client'}, + bindings: {client: '='}, + templateUrl: + '/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html', + controller: [ + 'toaster', 'ModalService', 'ClientsService', ClientStatusController + ] + }); + +})(); \ No newline at end of file From ba1ca19a803582a10279208c4a95ec8484b43102 Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Thu, 29 Feb 2024 16:41:55 +0000 Subject: [PATCH 02/24] Remove debug code --- .../clients/client/status/client.status.component.html | 2 -- 1 file changed, 2 deletions(-) diff --git a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html index ab5c12f95..9b0619b02 100644 --- a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html +++ b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html @@ -23,8 +23,6 @@ Disable Client -
Active: {{$ctrl.client.active}}
-
Client name: {{$ctrl.client.client_name}}
- +
From 5881a8fedcc62f3e502d8e5c27f497128d92bffe Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Wed, 13 Mar 2024 14:15:09 +0000 Subject: [PATCH 10/24] Rename file to avoid duplicate name and set test data --- ..._add_active_and_status_changed_on_to_client_details.sql} | 0 .../resources/db/migration/test/V100000___test_data.sql | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename iam-persistence/src/main/resources/db/migration/h2/{V100__add_active_and_status_changed_on_to_client_details.sql => V102__add_active_and_status_changed_on_to_client_details.sql} (100%) diff --git a/iam-persistence/src/main/resources/db/migration/h2/V100__add_active_and_status_changed_on_to_client_details.sql b/iam-persistence/src/main/resources/db/migration/h2/V102__add_active_and_status_changed_on_to_client_details.sql similarity index 100% rename from iam-persistence/src/main/resources/db/migration/h2/V100__add_active_and_status_changed_on_to_client_details.sql rename to iam-persistence/src/main/resources/db/migration/h2/V102__add_active_and_status_changed_on_to_client_details.sql diff --git a/iam-persistence/src/main/resources/db/migration/test/V100000___test_data.sql b/iam-persistence/src/main/resources/db/migration/test/V100000___test_data.sql index 96e3a1631..79e43f734 100644 --- a/iam-persistence/src/main/resources/db/migration/test/V100000___test_data.sql +++ b/iam-persistence/src/main/resources/db/migration/test/V100000___test_data.sql @@ -21,12 +21,12 @@ INSERT INTO client_details (id, client_id, client_secret, client_name, dynamical INSERT INTO client_details (id, client_id, client_secret, client_name, dynamically_registered, refresh_token_validity_seconds, access_token_validity_seconds, id_token_validity_seconds, allow_introspection, - token_endpoint_auth_method, require_auth_time, token_endpoint_auth_signing_alg, jwks) VALUES + token_endpoint_auth_method, require_auth_time, token_endpoint_auth_signing_alg, jwks, active) VALUES (15, 'jwt-auth-client_secret_jwt', 'c8e9eed0-e6e4-4a66-b16e-6f37096356a7', 'JWT Bearer Auth Client (client_secret_jwt)', - false, null, 3600, 600, true, 'SECRET_JWT', false, 'HS256', null), + false, null, 3600, 600, true, 'SECRET_JWT', false, 'HS256', null, true), (16, 'jwt-auth-private_key_jwt', 'secret', 'JWT Bearer Auth Client (private_key_jwt)', false, null, 3600, 600, true,'PRIVATE_KEY', false, 'RS256', - '{"keys":[{"kty":"RSA","e":"AQAB","kid":"rsa1","n":"1y1CP181zqPNPlV1JDM7Xv0QnGswhSTHe8_XPZHxDTJkykpk_1BmgA3ovP62QRE2ORgsv5oSBI_Z_RaOc4Zx2FonjEJF2oBHtBjsAiF-pxGkM5ZPjFNgFTGp1yUUBjFDcEeIGCwPEyYSt93sQIP_0DRbViMUnpyn3xgM_a1dO5brEWR2n1Uqff1yA5NXfLS03qpl2dpH4HFY5-Zs4bvtJykpAOhoHuIQbz-hmxb9MZ3uTAwsx2HiyEJtz-suyTBHO3BM2o8UcCeyfa34ShPB8i86-sf78fOk2KeRIW1Bju3ANmdV3sxL0j29cesxKCZ06u2ZiGR3Srbft8EdLPzf-w"}]}'); + '{"keys":[{"kty":"RSA","e":"AQAB","kid":"rsa1","n":"1y1CP181zqPNPlV1JDM7Xv0QnGswhSTHe8_XPZHxDTJkykpk_1BmgA3ovP62QRE2ORgsv5oSBI_Z_RaOc4Zx2FonjEJF2oBHtBjsAiF-pxGkM5ZPjFNgFTGp1yUUBjFDcEeIGCwPEyYSt93sQIP_0DRbViMUnpyn3xgM_a1dO5brEWR2n1Uqff1yA5NXfLS03qpl2dpH4HFY5-Zs4bvtJykpAOhoHuIQbz-hmxb9MZ3uTAwsx2HiyEJtz-suyTBHO3BM2o8UcCeyfa34ShPB8i86-sf78fOk2KeRIW1Bju3ANmdV3sxL0j29cesxKCZ06u2ZiGR3Srbft8EdLPzf-w"}]}', true); INSERT INTO client_scope (owner_id, scope) VALUES (1, 'openid'), From b18c51caf2d1e47c236e30884f7db0dcb1a66965 Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Thu, 14 Mar 2024 14:40:20 +0000 Subject: [PATCH 11/24] Update mitreid version --- pom.xml | 848 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 424 insertions(+), 424 deletions(-) diff --git a/pom.xml b/pom.xml index a3fe54065..6ecb01764 100644 --- a/pom.xml +++ b/pom.xml @@ -1,424 +1,424 @@ - - - 4.0.0 - - - org.springframework.boot - spring-boot-starter-parent - - 2.6.15 - - - - - it.infn.mw.iam-parent - iam-parent - 1.8.4 - pom - - INDIGO Identity and Access Manager (IAM) - Parent POM - - - iam-common - iam-persistence - iam-voms-aa - iam-login-service - iam-test-client - - - - - cnaf-releases - CNAF releases - https://repo.cloud.cnaf.infn.it/repository/cnaf-releases/ - - - - cnaf-snapshots - CNAF snapshots - https://repo.cloud.cnaf.infn.it/repository/cnaf-snapshots/ - - - - - ${project.version}-${git.commit.id.abbrev} - - UTF-8 - UTF-8 - - 17 - - 1.16.2 - - 1.3.6.cnaf-20240119 - 2.5.2.RELEASE - - 3.3.2 - 1.0.10.RELEASE - - - 2.6.15 - - 1.6.1 - 2.5.6 - 1.0.20 - 0.19.8 - 1.3.11 - 4.7.0 - 3.6.0 - 3.4.1 - 1.13.2 - - 4.4.0 - 2.9.0 - - 7.15.0 - - 3.0 - 0.8.7 - 3.1.4 - - - 1.0 - 2.3.2 - 2.3.2 - - 1.58 - - @ - - -Xmx2500m - iam-persistence/**/*,iam-test-client/**/*,iam-test-protected-resource/**/*,iam-common/** - - - - - - - org.testcontainers - testcontainers - ${testcontainers.version} - test - - - - org.testcontainers - junit-jupiter - ${testcontainers.version} - test - - - - org.testcontainers - mysql - ${testcontainers.version} - runtime - - - - org.testcontainers - mariadb - ${testcontainers.version} - runtime - - - - org.springframework.security.oauth - spring-security-oauth2 - ${spring-security-oauth2.version} - - - - org.webjars - angularjs - ${angularjs.version} - - - - org.webjars.npm - angular-ui-bootstrap - ${angular-ui-bootstrap.version} - - - - org.webjars - angular-ui-router - ${angular-ui-router.version} - - - - org.webjars - angular-sanitize - ${angular-sanitize.version} - - - - org.webjars - angular-ui-select - ${angular-ui-select.version} - - - - org.webjars - jquery - ${jquery.version} - - - - org.webjars - jquery-ui - ${jquery-ui.version} - - - - org.webjars - bootstrap - ${bootstrap.version} - - - - org.webjars - font-awesome - ${font-awesome.version} - - - - org.italiangrid - voms-api-java - ${voms.version} - - - - org.italiangrid - voms-clients - ${voms.version} - - - - - org.mitre - openid-connect-common - ${mitreid.version} - - - - org.mitre - openid-connect-server - ${mitreid.version} - - - - org.mitre - openid-connect-client - ${mitreid.version} - - - - - - org.bouncycastle - bcpkix-jdk15on - ${bouncycastle.version} - - - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - - - - com.jayway.jsonpath - json-path - ${json-path.version} - - - - io.rest-assured - rest-assured - ${rest-assured.version} - - - - org.springframework.security.extensions - spring-security-saml2-core - ${spring-security-saml.version} - - - - org.flywaydb - flyway-core - ${flyway.version} - - - - - javax.annotation - jsr250-api - ${jsr250-api.version} - - - - jakarta.xml.bind - jakarta.xml.bind-api - ${jakarta.xml.bind-api.version} - - - - org.glassfish.jaxb - jaxb-runtime - ${jaxb-runtime.version} - - - - - - - - - infn-cnaf - https://repo.cloud.cnaf.infn.it/repository/maven-public/ - - true - - - - - - - - - com.mycila - license-maven-plugin - ${license-maven-plugin.version} - - - com.google.cloud.tools - jib-maven-plugin - ${jib-maven-plugin.version} - - - - - - org.apache.maven.plugins - maven-enforcer-plugin - - - enforce-maven - - enforce - - - - - 17 - - - 3.6.0 - - - - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar-no-fork - - - - - - - org.apache.maven.plugins - maven-eclipse-plugin - 2.9 - - false - true - true - - - - - - org.apache.maven.plugins - maven-war-plugin - - false - - - true - true - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - alphabetical - false - - **/*Tests.java - - - **/Abstract*.java - - - file:/dev/./urandom - true - - ${jvm.test.args} - - - - - pl.project13.maven - git-commit-id-plugin - - - - revision - - - - - false - false - yyyy-MM-dd'T'HH:mm:ssZ - true - ${project.build.outputDirectory}/git.properties - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco-plugin.version} - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - - + + + 4.0.0 + + + org.springframework.boot + spring-boot-starter-parent + + 2.6.15 + + + + + it.infn.mw.iam-parent + iam-parent + 1.8.4 + pom + + INDIGO Identity and Access Manager (IAM) - Parent POM + + + iam-common + iam-persistence + iam-voms-aa + iam-login-service + iam-test-client + + + + + cnaf-releases + CNAF releases + https://repo.cloud.cnaf.infn.it/repository/cnaf-releases/ + + + + cnaf-snapshots + CNAF snapshots + https://repo.cloud.cnaf.infn.it/repository/cnaf-snapshots/ + + + + + ${project.version}-${git.commit.id.abbrev} + + UTF-8 + UTF-8 + + 17 + + 1.16.2 + + 1.3.6.cnaf-20240314 + 2.5.2.RELEASE + + 3.3.2 + 1.0.10.RELEASE + + + 2.6.15 + + 1.6.1 + 2.5.6 + 1.0.20 + 0.19.8 + 1.3.11 + 4.7.0 + 3.6.0 + 3.4.1 + 1.13.2 + + 4.4.0 + 2.9.0 + + 7.15.0 + + 3.0 + 0.8.7 + 3.1.4 + + + 1.0 + 2.3.2 + 2.3.2 + + 1.58 + + @ + + -Xmx2500m + iam-persistence/**/*,iam-test-client/**/*,iam-test-protected-resource/**/*,iam-common/** + + + + + + + org.testcontainers + testcontainers + ${testcontainers.version} + test + + + + org.testcontainers + junit-jupiter + ${testcontainers.version} + test + + + + org.testcontainers + mysql + ${testcontainers.version} + runtime + + + + org.testcontainers + mariadb + ${testcontainers.version} + runtime + + + + org.springframework.security.oauth + spring-security-oauth2 + ${spring-security-oauth2.version} + + + + org.webjars + angularjs + ${angularjs.version} + + + + org.webjars.npm + angular-ui-bootstrap + ${angular-ui-bootstrap.version} + + + + org.webjars + angular-ui-router + ${angular-ui-router.version} + + + + org.webjars + angular-sanitize + ${angular-sanitize.version} + + + + org.webjars + angular-ui-select + ${angular-ui-select.version} + + + + org.webjars + jquery + ${jquery.version} + + + + org.webjars + jquery-ui + ${jquery-ui.version} + + + + org.webjars + bootstrap + ${bootstrap.version} + + + + org.webjars + font-awesome + ${font-awesome.version} + + + + org.italiangrid + voms-api-java + ${voms.version} + + + + org.italiangrid + voms-clients + ${voms.version} + + + + + org.mitre + openid-connect-common + ${mitreid.version} + + + + org.mitre + openid-connect-server + ${mitreid.version} + + + + org.mitre + openid-connect-client + ${mitreid.version} + + + + + + org.bouncycastle + bcpkix-jdk15on + ${bouncycastle.version} + + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + + com.jayway.jsonpath + json-path + ${json-path.version} + + + + io.rest-assured + rest-assured + ${rest-assured.version} + + + + org.springframework.security.extensions + spring-security-saml2-core + ${spring-security-saml.version} + + + + org.flywaydb + flyway-core + ${flyway.version} + + + + + javax.annotation + jsr250-api + ${jsr250-api.version} + + + + jakarta.xml.bind + jakarta.xml.bind-api + ${jakarta.xml.bind-api.version} + + + + org.glassfish.jaxb + jaxb-runtime + ${jaxb-runtime.version} + + + + + + + + + infn-cnaf + https://repo.cloud.cnaf.infn.it/repository/maven-public/ + + true + + + + + + + + + com.mycila + license-maven-plugin + ${license-maven-plugin.version} + + + com.google.cloud.tools + jib-maven-plugin + ${jib-maven-plugin.version} + + + + + + org.apache.maven.plugins + maven-enforcer-plugin + + + enforce-maven + + enforce + + + + + 17 + + + 3.6.0 + + + + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar-no-fork + + + + + + + org.apache.maven.plugins + maven-eclipse-plugin + 2.9 + + false + true + true + + + + + + org.apache.maven.plugins + maven-war-plugin + + false + + + true + true + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + alphabetical + false + + **/*Tests.java + + + **/Abstract*.java + + + file:/dev/./urandom + true + + ${jvm.test.args} + + + + + pl.project13.maven + git-commit-id-plugin + + + + revision + + + + + false + false + yyyy-MM-dd'T'HH:mm:ssZ + true + ${project.build.outputDirectory}/git.properties + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco-plugin.version} + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + + From 50308e4ee9ced2571dcbbc5815207d0bd6cc01ec Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Fri, 15 Mar 2024 09:27:56 +0000 Subject: [PATCH 12/24] Alter client details table --- .../V102__add_active_and_status_changed_on_to_client_details.sql | 1 + 1 file changed, 1 insertion(+) create mode 100644 iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql diff --git a/iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql b/iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql new file mode 100644 index 000000000..4da68b3d9 --- /dev/null +++ b/iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql @@ -0,0 +1 @@ +ALTER TABLE client_details ADD COLUMN (active BOOLEAN, status_changed_on TIMESTAMP); \ No newline at end of file From 7bae731aec9e65c31a4d6556cea0184b8c00c930 Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Fri, 15 Mar 2024 10:06:14 +0000 Subject: [PATCH 13/24] Add default date to status changed on --- ...V102__add_active_and_status_changed_on_to_client_details.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql b/iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql index 4da68b3d9..2dc186a36 100644 --- a/iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql +++ b/iam-persistence/src/main/resources/db/migration/mysql/V102__add_active_and_status_changed_on_to_client_details.sql @@ -1 +1 @@ -ALTER TABLE client_details ADD COLUMN (active BOOLEAN, status_changed_on TIMESTAMP); \ No newline at end of file +ALTER TABLE client_details ADD COLUMN (active BOOLEAN, status_changed_on TIMESTAMP DEFAULT '1970-01-01 00:00:01'); \ No newline at end of file From 1739c0cafdead994aa2649b133475a206f82f65c Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Wed, 20 Mar 2024 16:58:21 +0000 Subject: [PATCH 14/24] Fix JavaScript function undefined error --- .../api/client/service/DefaultClientService.java | 2 +- .../client/status/client.status.component.js | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java index 98cec3a5b..21b519190 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java @@ -108,7 +108,7 @@ public ClientDetailsEntity updateClient(ClientDetailsEntity client) { } @Override - @CacheEvict(cacheNames = DefaultScopeMatcherRegistry.SCOPE_CACHE_KEY, key = "{#clientId}") + @CacheEvict(cacheNames = DefaultScopeMatcherRegistry.SCOPE_CACHE_KEY, key = "{#client?.id}") public ClientDetailsEntity updateClientStatus(ClientDetailsEntity client, boolean status) { client.setActive(status); client.setStatusChangedOn(Date.from(clock.instant())); diff --git a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js index b3602aca8..64baf40a0 100644 --- a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js +++ b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.js @@ -24,13 +24,16 @@ }; self.handleError = function(error) { - self.clientCtrl.handleError(error); + console.error(error); self.enabled = true; }; self.handleSuccess = function() { self.enabled = true; - self.clientCtrl.loadClient().then(function(client) { + ClientsService.retrieveClient(self.client.client_id).then(function (client) { + console.debug("Loaded client", client); + self.client = client; + self.clientVal = angular.copy(self.client); if (client.active) { toaster.pop({ type: 'success', @@ -43,6 +46,12 @@ body: `Client '${client.client_name}' is now disabled.` }); } + }).catch(function (res) { + console.debug("Error retrieving client!", res); + toaster.pop({ + type: 'error', + body: 'Error retrieving client!' + }); }); }; From 0b32b6d7fe8466162e403b9314c9d0db106bb994 Mon Sep 17 00:00:00 2001 From: Manoj Garai Date: Tue, 2 Apr 2024 16:28:19 +0100 Subject: [PATCH 15/24] Save client status changed by value --- .../client/management/ClientManagementAPIController.java | 9 +++++++-- .../management/service/ClientManagementService.java | 2 +- .../service/DefaultClientManagementService.java | 8 +++++--- .../it/infn/mw/iam/api/client/service/ClientService.java | 2 +- .../mw/iam/api/client/service/DefaultClientService.java | 4 ++-- .../mw/iam/api/common/client/RegisteredClientDTO.java | 9 +++++++++ .../clients/client/status/client.status.component.html | 4 ++-- .../clients/client/status/client.status.component.js | 9 +++++---- .../iam/apps/dashboard-app/services/clients.service.js | 4 ++-- 9 files changed, 34 insertions(+), 17 deletions(-) diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/ClientManagementAPIController.java b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/ClientManagementAPIController.java index 935205f6d..2c377ef43 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/ClientManagementAPIController.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/ClientManagementAPIController.java @@ -44,6 +44,8 @@ import org.springframework.web.bind.annotation.RestController; import com.fasterxml.jackson.annotation.JsonView; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import it.infn.mw.iam.api.client.error.InvalidPaginationRequest; import it.infn.mw.iam.api.client.error.NoSuchClient; @@ -144,8 +146,11 @@ public RegisteredClientDTO updateClient(@PathVariable String clientId, @PatchMapping("/{clientId}/status") @PreAuthorize("#iam.hasScope('iam:admin.write') or #iam.hasDashboardRole('ROLE_ADMIN')") public void updateClientStatus(@PathVariable String clientId, - @RequestBody boolean status) { - managementService.updateClientStatus(clientId, status); + @RequestBody String body) { + JsonObject jsonObject = JsonParser.parseString(body).getAsJsonObject(); + boolean status = jsonObject.get("status").getAsBoolean(); + String userId = jsonObject.get("userId").getAsString(); + managementService.updateClientStatus(clientId, status, userId); } @PostMapping("/{clientId}/secret") diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/ClientManagementService.java b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/ClientManagementService.java index bacfbd6a7..ccfa02d64 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/ClientManagementService.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/ClientManagementService.java @@ -50,7 +50,7 @@ RegisteredClientDTO updateClient(@NotBlank String clientId, void deleteClientByClientId(@NotBlank String clientId); - void updateClientStatus(String clientId, boolean status); + void updateClientStatus(String clientId, boolean status, String userId); ListResponseDTO getClientOwners(@NotBlank String clientId, @NotNull Pageable pageable); diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/DefaultClientManagementService.java b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/DefaultClientManagementService.java index 7b7cacd62..25c12c870 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/DefaultClientManagementService.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/service/DefaultClientManagementService.java @@ -52,6 +52,7 @@ import it.infn.mw.iam.audit.events.client.ClientRegistrationAccessTokenRotatedEvent; import it.infn.mw.iam.audit.events.client.ClientRemovedEvent; import it.infn.mw.iam.audit.events.client.ClientSecretUpdatedEvent; +import it.infn.mw.iam.audit.events.client.ClientStatusChangedEvent; import it.infn.mw.iam.audit.events.client.ClientUpdatedEvent; import it.infn.mw.iam.core.IamTokenService; import it.infn.mw.iam.persistence.model.IamAccount; @@ -135,12 +136,13 @@ public void deleteClientByClientId(String clientId) { } @Override - public void updateClientStatus(String clientId, boolean status) { + public void updateClientStatus(String clientId, boolean status, String userId) { ClientDetailsEntity client = clientService.findClientByClientId(clientId) .orElseThrow(ClientSuppliers.clientNotFound(clientId)); - client = clientService.updateClientStatus(client, status); - eventPublisher.publishEvent(new ClientUpdatedEvent(this, client)); + client = clientService.updateClientStatus(client, status, userId); + String message = "Client " + (status?"enabled":"disabled"); + eventPublisher.publishEvent(new ClientStatusChangedEvent(this, client, message)); } @Validated(OnClientUpdate.class) diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/ClientService.java b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/ClientService.java index a7bd770b5..d6bb5db61 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/ClientService.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/ClientService.java @@ -45,7 +45,7 @@ Optional findClientByClientIdAndAccount(String clientId, ClientDetailsEntity updateClient(ClientDetailsEntity client); - ClientDetailsEntity updateClientStatus(ClientDetailsEntity client, boolean status); + ClientDetailsEntity updateClientStatus(ClientDetailsEntity client, boolean status, String userId); void deleteClient(ClientDetailsEntity client); diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java index 21b519190..1f6383cb0 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/api/client/service/DefaultClientService.java @@ -108,9 +108,9 @@ public ClientDetailsEntity updateClient(ClientDetailsEntity client) { } @Override - @CacheEvict(cacheNames = DefaultScopeMatcherRegistry.SCOPE_CACHE_KEY, key = "{#client?.id}") - public ClientDetailsEntity updateClientStatus(ClientDetailsEntity client, boolean status) { + public ClientDetailsEntity updateClientStatus(ClientDetailsEntity client, boolean status, String userId) { client.setActive(status); + client.setStatusChangedBy(userId); client.setStatusChangedOn(Date.from(clock.instant())); return clientRepo.save(client); } diff --git a/iam-login-service/src/main/java/it/infn/mw/iam/api/common/client/RegisteredClientDTO.java b/iam-login-service/src/main/java/it/infn/mw/iam/api/common/client/RegisteredClientDTO.java index 0e671ca14..8f09fac89 100644 --- a/iam-login-service/src/main/java/it/infn/mw/iam/api/common/client/RegisteredClientDTO.java +++ b/iam-login-service/src/main/java/it/infn/mw/iam/api/common/client/RegisteredClientDTO.java @@ -248,6 +248,7 @@ public class RegisteredClientDTO { private String codeChallengeMethod; private boolean active; private Date statusChangedOn; + private String statusChangedBy; public String getClientId() { return clientId; @@ -514,4 +515,12 @@ public void setStatusChangedOn(Date statusChangedOn) { this.statusChangedOn = statusChangedOn; } + public void setStatusChangedBy(String statusChangedBy) { + this.statusChangedBy = statusChangedBy; + } + + public String getStatusChangedBy() { + return statusChangedBy; + } + } diff --git a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html index 9b0619b02..f74d56e6d 100644 --- a/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html +++ b/iam-login-service/src/main/webapp/resources/iam/apps/dashboard-app/components/clients/client/status/client.status.component.html @@ -18,7 +18,7 @@ +