From 365a0848e14bf0b9c65389c97f3046eb9efcd290 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Wed, 23 Apr 2025 12:11:58 +0530 Subject: [PATCH 01/58] 1.3.2 to 1.3.3 version update (#107) Signed-off-by: Sachin Rana --- mock-plugin/pom.xml | 6 +++--- mosip-identity-plugin/pom.xml | 6 +++--- sunbird-rc-plugin/pom.xml | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index 4f5d59f8..10791103 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -5,7 +5,7 @@ io.mosip.esignet mock-plugin - 1.3.2-SNAPSHOT + 1.3.3-SNAPSHOT mock-plugin jar Mockup of a wrapper implementation that is used to showcase the integration with e-Signet @@ -86,8 +86,8 @@ 2.3.6.RELEASE 1.2.1.0 - 1.6.0-SNAPSHOT - 1.2.0-SNAPSHOT + 1.6.1-SNAPSHOT + 1.2.1-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 9df27253..7255b596 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet - 1.3.2-SNAPSHOT + 1.3.3-SNAPSHOT mosip-identity-plugin mosip-identity-plugin e-Signet Integration Implementation for MOSIP ID system @@ -86,8 +86,8 @@ 2.3.6.RELEASE 1.2.1.0 - 1.6.0-SNAPSHOT - 1.2.0-SNAPSHOT + 1.6.1-SNAPSHOT + 1.2.1-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index f1dcf25b..2a229b73 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet.plugin.sunbirdrc sunbird-rc-plugin - 1.3.2-SNAPSHOT + 1.3.3-SNAPSHOT jar sunbird-rc-plugin @@ -47,7 +47,7 @@ 3.0.1 0.8.5 3.3.1 - 1.6.0-SNAPSHOT + 1.6.1-SNAPSHOT From 520f8510ee3e1346844145e7d49bdd0ff329709d Mon Sep 17 00:00:00 2001 From: ase-101 Date: Wed, 21 May 2025 13:13:22 +0530 Subject: [PATCH 02/58] ES-2325 Updated readme and deleted duplicate dependency block (#114) * ES-842 Signed-off-by: ase-101 * ES-842 Signed-off-by: ase-101 * ES-2325 Signed-off-by: ase-101 * ES-2325 Signed-off-by: ase-101 --------- Signed-off-by: ase-101 --- README.md | 20 ++ mock-plugin/pom.xml | 848 ++++++++++++++++++++++---------------------- 2 files changed, 444 insertions(+), 424 deletions(-) diff --git a/README.md b/README.md index 15718bfb..47337203 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,25 @@ # esignet-plugins Repository hosting source code for esignet and esignet-signup java runtime dependencies plugins. +## eSignet/esignet-signup service image bundled with plugins +We release esignet service and esignet-signup service images with the latest published plugin jars +available at the time of the esignet and esignet-signup service release. + +**Note**: We publish two flavors of esignet docker images: +1. esignet docker image—This is the base esignet image. +2. esignet-with-plugins docker image—This image is built using esignet base image bundled with all default plugins available in this repository. + +Any bug fixes or changes in the plugins will be made available in the esignet service or +esignet-signup service in their immediate next releases. + +### How to use the plugin with fixes where the eSignet is not yet released? +One can use the esignet base image to test the new fixes in the plugin. There are two ways: + +1. Pass URL to download the plugin zip/jar in the "plugin_url_env" environment variable of the container. +2. Mount the external directory with the plugin onto "/home/mosip/plugins" directory in the container. + +Either of the above 2 steps should be followed and finally set the "plugin_name_env" environment variable. With this setup, eSignet +service should get started with the configured plugin. + ## License This project is licensed under the terms of [Mozilla Public License 2.0](LICENSE). diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index 10791103..36b133ba 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -1,424 +1,424 @@ - - 4.0.0 - - io.mosip.esignet - mock-plugin - 1.3.3-SNAPSHOT - mock-plugin - jar - Mockup of a wrapper implementation that is used to showcase the integration with e-Signet - https://github.com/mosip/esignet-plugins - - - - MPL 2.0 - https://www.mozilla.org/en-US/MPL/2.0/ - - - - - scm:git:git://github.com/mosip/esignet-plugins.git - scm:git:ssh://github.com:mosip/esignet-plugins.git - https://github.com/mosip/esignet-plugins - HEAD - - - - - Mosip - mosip.emailnotifier@gmail.com - io.mosip - https://github.com/mosip/esignet-plugins - - - - - - ossrh - CentralRepository - https://oss.sonatype.org/content/repositories/snapshots - default - - true - - - - central - MavenCentral - default - https://repo1.maven.org/maven2 - - false - - - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - - - - UTF-8 - 11 - 11 - 11 - 3.3.0 - 2.4 - 2.22.0 - 1.5 - 2.2.1 - 1.6.7 - 3.0.1 - 0.8.5 - 3.3.1 - 2.3 - - Hoxton.SR8 - 2.3.6.RELEASE - - 1.2.1.0 - 1.6.1-SNAPSHOT - 1.2.1-SNAPSHOT - - **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** - **/dto/**,**/entity/**,**/config/** - - - - - junit - junit - 4.13.1 - test - - - commons-beanutils - commons-beanutils - 1.9.4 - - - - - org.projectlombok - lombok - 1.18.22 - compile - - - - io.mosip.esignet - esignet-core - ${esignet.version} - provided - - - - io.mosip.esignet - esignet-integration-api - ${esignet.version} - provided - - - - io.mosip.kernel - kernel-keymanager-service - ${kernel-keymanager-service.version} - provided - lib - - - org.springframework.cloud - spring-cloud-starter-sleuth - - - org.springframework.security - spring-security-test - - - - - org.slf4j - slf4j-api - 1.7.30 - provided - - - - io.mosip.signup - signup-integration-api - ${esignet-signup.version} - provided - - - - - - sonar - - . - src/main/java/**,src/main/resources/** - ${sonar.coverage.exclusions} - https://sonarcloud.io - - - false - - - - - org.sonarsource.scanner.maven - sonar-maven-plugin - ${maven.sonar.plugin.version} - - - verify - - sonar - - - - - - - - - - openapi-doc-generate-profile - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring.boot.version} - - true - ZIP - - - - pre-integration-test - - start - - - - src/test/resources - - - openapi-profile - - - --server.port=8090 - --server.servlet.path=/app/generic - - - - - - post-integration-test - - stop - - - - - build-info - repackage - - - - - - org.springdoc - springdoc-openapi-maven-plugin - 0.2 - - - integration-test - - generate - - - - - http://localhost:8090/app/generic/v3/api-docs - openapi.json - ${project.build.directory} - false - - - - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - ${skipTests} - false - - ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED - --illegal-access=permit - - - - - org.jacoco - jacoco-maven-plugin - ${maven.jacoco.version} - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - true - - - ${project.name} - ${project.version} - - - - - - org.apache.maven.plugins - maven-war-plugin - - - - true - true - - - ${project.name} - ${project.version} - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - none - - - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - true - - ossrh - https://oss.sonatype.org/ - false - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - --pinentry-mode - loopback - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${maven.compiler.source} - ${maven.compiler.target} - - - - pl.project13.maven - git-commit-id-plugin - - - get-the-git-infos - - revision - - validate - - - - true - ${project.build.outputDirectory}/git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - ${project.basedir}/.git - json - - - - - - + + 4.0.0 + + io.mosip.esignet + mock-plugin + 1.3.3-SNAPSHOT + mock-plugin + jar + Mockup of a wrapper implementation that is used to showcase the integration with e-Signet + https://github.com/mosip/esignet-plugins + + + + MPL 2.0 + https://www.mozilla.org/en-US/MPL/2.0/ + + + + + scm:git:git://github.com/mosip/esignet-plugins.git + scm:git:ssh://github.com:mosip/esignet-plugins.git + https://github.com/mosip/esignet-plugins + HEAD + + + + + Mosip + mosip.emailnotifier@gmail.com + io.mosip + https://github.com/mosip/esignet-plugins + + + + + + ossrh + CentralRepository + https://oss.sonatype.org/content/repositories/snapshots + default + + true + + + + central + MavenCentral + default + https://repo1.maven.org/maven2 + + false + + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + + UTF-8 + 11 + 11 + 11 + 3.3.0 + 2.4 + 2.22.0 + 1.5 + 2.2.1 + 1.6.7 + 3.0.1 + 0.8.5 + 3.3.1 + 2.3 + + Hoxton.SR8 + 2.3.6.RELEASE + + 1.2.1.0 + 1.6.1-SNAPSHOT + 1.2.1-SNAPSHOT + + **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** + **/dto/**,**/entity/**,**/config/** + + + + + junit + junit + 4.13.1 + test + + + commons-beanutils + commons-beanutils + 1.9.4 + + + + + org.projectlombok + lombok + 1.18.22 + compile + + + + io.mosip.esignet + esignet-core + ${esignet.version} + provided + + + + io.mosip.esignet + esignet-integration-api + ${esignet.version} + provided + + + + io.mosip.kernel + kernel-keymanager-service + ${kernel-keymanager-service.version} + provided + lib + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.security + spring-security-test + + + + + org.slf4j + slf4j-api + 1.7.30 + provided + + + + io.mosip.signup + signup-integration-api + ${esignet-signup.version} + provided + + + + + + sonar + + . + src/main/java/**,src/main/resources/** + ${sonar.coverage.exclusions} + https://sonarcloud.io + + + false + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${maven.sonar.plugin.version} + + + verify + + sonar + + + + + + + + + + openapi-doc-generate-profile + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + true + ZIP + + + + pre-integration-test + + start + + + + src/test/resources + + + openapi-profile + + + --server.port=8090 + --server.servlet.path=/app/generic + + + + + + post-integration-test + + stop + + + + + build-info + repackage + + + + + + org.springdoc + springdoc-openapi-maven-plugin + 0.2 + + + integration-test + + generate + + + + + http://localhost:8090/app/generic/v3/api-docs + openapi.json + ${project.build.directory} + false + + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipTests} + false + + ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED + --illegal-access=permit + + + + + org.jacoco + jacoco-maven-plugin + ${maven.jacoco.version} + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + true + + + ${project.name} + ${project.version} + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + true + true + + + ${project.name} + ${project.version} + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + none + + + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + true + + ossrh + https://oss.sonatype.org/ + false + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + pl.project13.maven + git-commit-id-plugin + + + get-the-git-infos + + revision + + validate + + + + true + ${project.build.outputDirectory}/git.properties + + ^git.build.(time|version)$ + ^git.commit.id.(abbrev|full)$ + + full + ${project.basedir}/.git + json + + + + + + From b310f98cb74aab19932701779ad7066628cac5a0 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Thu, 12 Jun 2025 14:12:55 +0530 Subject: [PATCH 03/58] ES-2175 Integration with API in mosip-identity-plugin and ES-2338 Profile registry plugin update (#116) * ES-2175 Signed-off-by: Md-Humair-KK * fixed peer review comments Signed-off-by: Md-Humair-KK * review comments fixed Signed-off-by: Md-Humair-KK * review fixed Signed-off-by: Md-Humair-KK * [ES-2371] Added test cases Signed-off-by: pvsaidurga * [ES-2175] Updated review comments Signed-off-by: pvsaidurga * [ES-2175] Updated review comments Signed-off-by: pvsaidurga * [ES-2175] Updated review comments Signed-off-by: pvsaidurga --------- Signed-off-by: Md-Humair-KK Signed-off-by: pvsaidurga Co-authored-by: pvsaidurga --- .../MockIdentityVerifierPluginImpl.java | 2 +- .../MockKeyBindingWrapperServiceTest.java | 6 +- .../MockIdentityVerifierPluginImplTest.java | 1 + .../MockProfileRegistryPluginImplTest.java | 4 +- .../mosipid/dto/IdaKycExchangeRequest.java | 17 ++++ .../mosipid/service/IdaAuthenticatorImpl.java | 79 ++++++++++++++++- .../plugin/mosipid/dto/IdentityRequest.java | 4 +- .../mosipid/dto/VerificationMetadata.java | 39 +++++++++ .../IdrepoProfileRegistryPluginImpl.java | 43 ++++++++-- .../src/main/resources/application.properties | 4 +- .../service/IdaAuthenticatorImplTest.java | 85 ++++++++++++++++++- 11 files changed, 267 insertions(+), 17 deletions(-) rename mock-plugin/src/main/java/io/mosip/signup/plugin/mock/{service => verifier}/MockIdentityVerifierPluginImpl.java (99%) create mode 100644 mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/VerificationMetadata.java diff --git a/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImpl.java b/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/verifier/MockIdentityVerifierPluginImpl.java similarity index 99% rename from mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImpl.java rename to mock-plugin/src/main/java/io/mosip/signup/plugin/mock/verifier/MockIdentityVerifierPluginImpl.java index 224546a8..8a92423a 100644 --- a/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImpl.java +++ b/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/verifier/MockIdentityVerifierPluginImpl.java @@ -3,7 +3,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -package io.mosip.signup.plugin.mock.service; +package io.mosip.signup.plugin.mock.verifier; import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.signup.api.dto.*; diff --git a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperServiceTest.java b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperServiceTest.java index 47af8a77..7826696e 100644 --- a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperServiceTest.java +++ b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperServiceTest.java @@ -103,7 +103,7 @@ public void sendBindingOtp_withInValidDetails_thenFail() throws SendOtpException public void doKeyBinding_withValidDetails_thenPass() throws Exception { ReflectionTestUtils.setField(mockKeyBindingWrapperService, "supportedBindAuthFactorTypes", List.of("WLA")) ; ReflectionTestUtils.setField(mockKeyBindingWrapperService, "expireInDays", 10) ; - ReflectionTestUtils.setField(mockKeyBindingWrapperService,"getIdentityEndpoint","http://localhost:8080"); ; + ReflectionTestUtils.setField(mockKeyBindingWrapperService,"getIdentityEndpoint","http://localhost:8080/"); ; KycAuthResult kycAuthResult = new KycAuthResult(); kycAuthResult.setKycToken("testKycToken"); @@ -167,7 +167,7 @@ public void doKeyBinding_withUnSupportedBindAuthFactor_thenFail() throws Excepti public void doKeyBinding_withInValidKycAuthResult_thenFail() throws Exception { ReflectionTestUtils.setField(mockKeyBindingWrapperService, "supportedBindAuthFactorTypes", List.of("WLA")) ; ReflectionTestUtils.setField(mockKeyBindingWrapperService, "expireInDays", 10) ; - ReflectionTestUtils.setField(mockKeyBindingWrapperService,"getIdentityEndpoint","http://localhost:8080"); ; + ReflectionTestUtils.setField(mockKeyBindingWrapperService,"getIdentityEndpoint","http://localhost:8080/"); ; Mockito.when(mockHelperService.doKycAuthMock(Mockito.anyString(),Mockito.anyString(),Mockito.any(),Mockito.anyBoolean())) .thenReturn(null); @@ -183,7 +183,7 @@ public void doKeyBinding_withInValidKycAuthResult_thenFail() throws Exception { public void doKeyBinding_withInValidDetails_thenFail() throws Exception { ReflectionTestUtils.setField(mockKeyBindingWrapperService, "supportedBindAuthFactorTypes", List.of("WLA")) ; ReflectionTestUtils.setField(mockKeyBindingWrapperService, "expireInDays", 10) ; - ReflectionTestUtils.setField(mockKeyBindingWrapperService,"getIdentityEndpoint","http://localhost:8080"); ; + ReflectionTestUtils.setField(mockKeyBindingWrapperService,"getIdentityEndpoint","http://localhost:8080/"); ; KycAuthResult kycAuthResult = new KycAuthResult(); kycAuthResult.setKycToken("testKycToken"); diff --git a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java index a7c71392..47c4c940 100644 --- a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java +++ b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java @@ -6,6 +6,7 @@ import io.mosip.signup.api.dto.*; import io.mosip.signup.api.exception.IdentityVerifierException; import io.mosip.signup.api.util.VerificationStatus; +import io.mosip.signup.plugin.mock.verifier.MockIdentityVerifierPluginImpl; import org.junit.Assert; import org.junit.Before; import org.junit.Test; diff --git a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java index ccdcec8d..069cf1a6 100644 --- a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java +++ b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java @@ -21,11 +21,11 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; @@ -34,7 +34,7 @@ import java.util.List; import java.util.Map; -@RunWith(SpringRunner.class) +@RunWith(MockitoJUnitRunner.class) public class MockProfileRegistryPluginImplTest { diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycExchangeRequest.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycExchangeRequest.java index 62649a2e..406effef 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycExchangeRequest.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycExchangeRequest.java @@ -6,10 +6,13 @@ package io.mosip.esignet.plugin.mosipid.dto; import java.util.List; +import java.util.Map; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; @Data +@JsonInclude(JsonInclude.Include.NON_NULL) public class IdaKycExchangeRequest { private String id; @@ -21,4 +24,18 @@ public class IdaKycExchangeRequest { private List locales; private String respType; private String individualId; + + /** + * claims metadata - Not set/un used for now from IDA + */ + private Map metadata; + /** + * User consented verified claims list. + */ + List> verifiedConsentedClaims; + /** + * User consented unverified claims list. + */ + Map unVerifiedConsentedClaims; + } diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java index d5d53c47..a7841fd8 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import io.mosip.esignet.api.dto.*; import io.mosip.esignet.api.exception.KycAuthException; import io.mosip.esignet.api.exception.KycExchangeException; @@ -33,8 +34,11 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import java.io.IOException; import java.util.*; +import static io.mosip.esignet.core.constants.Constants.VERIFIED_CLAIMS; + @ConditionalOnProperty(value = "mosip.esignet.integration.authenticator", havingValue = "IdaAuthenticatorImpl") @Component @@ -123,6 +127,11 @@ public KycExchangeResult doKycExchange(String relyingPartyId, String clientId, K idaKycExchangeRequest.setRespType(kycExchangeDto.getUserInfoResponseType()); //may be either JWT or JWE idaKycExchangeRequest.setIndividualId(kycExchangeDto.getIndividualId()); + if(kycExchangeDto instanceof VerifiedKycExchangeDto){ + setClaims((VerifiedKycExchangeDto) kycExchangeDto, idaKycExchangeRequest); + } + + //set signature header, body and invoke kyc exchange endpoint String requestBody = objectMapper.writeValueAsString(idaKycExchangeRequest); RequestEntity requestEntity = RequestEntity @@ -152,6 +161,28 @@ public KycExchangeResult doKycExchange(String relyingPartyId, String clientId, K throw new KycExchangeException(); } + /** + * Set the verfied and unVerified consented claims to {@link IdaKycExchangeRequest} object + * @param kycExchangeDto {@link KycExchangeDto} + * @param idaKycExchangeRequest {@link IdaKycExchangeRequest} + */ + private void setClaims(VerifiedKycExchangeDto kycExchangeDto, IdaKycExchangeRequest idaKycExchangeRequest) { + if(kycExchangeDto != null){ + Map acceptedClaimDetails = kycExchangeDto.getAcceptedClaimDetails(); + if(acceptedClaimDetails!=null && acceptedClaimDetails.get(VERIFIED_CLAIMS)!=null){ + List> verifiedClaimsList = objectMapper.convertValue(kycExchangeDto.getAcceptedClaimDetails() + .get(VERIFIED_CLAIMS), new TypeReference<>() {}); + idaKycExchangeRequest.setVerifiedConsentedClaims(verifiedClaimsList); + } + + Map unVerifiedConsentedClaims = getUnVerifiedConsentedClaims(acceptedClaimDetails); + if(!CollectionUtils.isEmpty(unVerifiedConsentedClaims)){ + Map unVerifiedConsentedClaim = objectMapper.convertValue(unVerifiedConsentedClaims, new TypeReference<>() {}); + idaKycExchangeRequest.setUnVerifiedConsentedClaims(unVerifiedConsentedClaim); + } + } + } + @Override public SendOtpResult sendOtp(String relyingPartyId, String clientId, SendOtpDto sendOtpDto) throws SendOtpException { log.info("Started to build send-otp request with transactionId : {} && clientId : {}", @@ -268,17 +299,39 @@ private KycAuthResult doKycAuthentication(String relyingPartyId, String clientId throw new KycAuthException(ErrorConstants.AUTH_FAILED); } - @SuppressWarnings("unchecked") + + /** + * Method to build VerifiedClaimsMetadata from the string of VerifiedClaimsMetadata from IDA response + * @param verifiedClaimsMetadata string of claims metadata + * @return Map> claimsMetadata + */ private Map> buildVerifiedClaimsMetadata(String verifiedClaimsMetadata) { Map> claimsMetadata = new LinkedHashMap<>(); try { - claimsMetadata = objectMapper.readValue(verifiedClaimsMetadata, Map.class); + JsonNode jsonNode = objectMapper.readTree(verifiedClaimsMetadata); + replaceNullStrings((ObjectNode) jsonNode); + claimsMetadata = objectMapper.convertValue(jsonNode, new TypeReference<>() {}); + } catch (Exception e) { log.error("Unable to read claims meta data values", e); } return claimsMetadata; } + /** + * Replace null strings with java null + * @param node {@link ObjectNode} + */ + private void replaceNullStrings(ObjectNode node) { + Iterator> fields = node.fields(); + while (fields.hasNext()) { + Map.Entry entry = fields.next(); + if (entry.getValue().isTextual() && "null".equals(entry.getValue().asText())) { + node.set(entry.getKey(), null); + } + } + } + /** * Method to create {@link IdaKycAuthRequest} object required in the kyc-auth flow @@ -306,6 +359,26 @@ private IdaKycAuthRequest getIdaKycAuthRequest(KycAuthDto kycAuthDto, boolean cl @Override public KycExchangeResult doVerifiedKycExchange(String relyingPartyId, String clientId, VerifiedKycExchangeDto kycExchangeDto) throws KycExchangeException { - return doKycExchange(relyingPartyId, clientId, kycExchangeDto); //TODO + return doKycExchange(relyingPartyId, clientId, kycExchangeDto); + } + + /** + * Method to return un verified consented claims + * @param acceptedClaimDetails Accepted claims Map + * @return un verified consented claims + */ + @NotNull // This is added to not return null either return un verified claims map or empty map + private Map getUnVerifiedConsentedClaims(Map acceptedClaimDetails) { + Map unVerifiedConsentedClaims = new HashMap<>(); + if(!CollectionUtils.isEmpty(acceptedClaimDetails)) { + for(Map.Entry entry : acceptedClaimDetails.entrySet()) { + String key = entry.getKey(); + JsonNode value = entry.getValue(); + if(!key.equals(VERIFIED_CLAIMS)){ + unVerifiedConsentedClaims.put(key,value); + } + } + } + return unVerifiedConsentedClaims; } } diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java index 64742206..2d9bea30 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java @@ -8,10 +8,12 @@ import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; +import java.util.List; + @Data public class IdentityRequest { private String registrationId; private JsonNode identity; - private JsonNode verifiedAttributes; + private List verifiedAttributes; } diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/VerificationMetadata.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/VerificationMetadata.java new file mode 100644 index 00000000..6f10b636 --- /dev/null +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/VerificationMetadata.java @@ -0,0 +1,39 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ +package io.mosip.signup.plugin.mosipid.dto; + +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * Class to hold verification metadata details to be updated to ID Repo from signup. + */ +@Data +public class VerificationMetadata { + /** + trust framework verifying the claims + */ + private String trustFramework; + + /** + verification process used for the verification + */ + private String verificationProcess; + + /** + * list of verified claims + */ + private List claims; + + /** + * verified claims metadata which hold information + * like trust_framework, verification_process, time etc + */ + private Map metadata; + +} diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index e0e33937..db5cd0d4 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -11,6 +11,8 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import io.micrometer.core.annotation.Timed; +import io.mosip.esignet.core.util.IdentityProviderUtil; +import io.mosip.signup.plugin.mosipid.dto.VerificationMetadata; import io.mosip.signup.plugin.mosipid.dto.*; import io.mosip.signup.plugin.mosipid.util.ErrorConstants; import io.mosip.signup.plugin.mosipid.util.ProfileCacheService; @@ -196,10 +198,6 @@ public ProfileResult updateProfile(String requestId, ProfileDto profileDto) thro //((ObjectNode) inputJson).set("UIN", objectMapper.valueToTree(profileDto.getUniqueUserId())); ((ObjectNode) inputJson).set(UIN, objectMapper.valueToTree(profileDto.getIndividualId())); - if(!inputJson.has(SELECTED_HANDLES_FIELD_ID) && !CollectionUtils.isEmpty(defaultSelectedHandles)){ - ((ObjectNode) inputJson).set(SELECTED_HANDLES_FIELD_ID, objectMapper.valueToTree(defaultSelectedHandles)); - } - //Build identity request IdentityRequest identityRequest = buildIdentityRequest(inputJson, true); identityRequest.setRegistrationId(requestId); @@ -355,6 +353,9 @@ private IdentityResponse updateIdentity(IdentityRequest identityRequest) throws restRequest.setVersion(identityRequestVersion); restRequest.setRequesttime(getUTCDateTime()); restRequest.setRequest(identityRequest); + + log.debug("update request {} with request ID {}", restRequest, updateIdentityRequestID); + ResponseWrapper responseWrapper = request(identityEndpoint, HttpMethod.PATCH, restRequest, new ParameterizedTypeReference>() {}); return responseWrapper.getResponse(); @@ -432,7 +433,7 @@ private IdentityRequest buildIdentityRequest(JsonNode inputJson, boolean isUpdat //if verified claims exists then pass it in the request as "verifiedAttributes" if(inputJson.has("verified_claims")) { - identityRequest.setVerifiedAttributes(inputJson.get("verified_claims")); + identityRequest.setVerifiedAttributes(buildVerifiedClaims(inputJson.get("verified_claims"))); ((ObjectNode) inputJson).remove("verified_claims"); } @@ -440,6 +441,38 @@ private IdentityRequest buildIdentityRequest(JsonNode inputJson, boolean isUpdat return identityRequest; } + /** + * Method to build List from the verified claims + * @param verifiedClaims {@link JsonNode} + * @return List verifiedAttributes + */ + private List buildVerifiedClaims(JsonNode verifiedClaims) { + List verifiedAttributes = new ArrayList<>(); + + for (Iterator> it = verifiedClaims.fields(); it.hasNext(); ) { + Map.Entry entry = it.next(); + String claim = entry.getKey(); + JsonNode value = entry.getValue(); + + VerificationMetadata metadata = new VerificationMetadata(); + metadata.setTrustFramework(value.get("trust_framework").asText()); + metadata.setVerificationProcess(value.get("verification_process").asText()); + metadata.setClaims(Collections.singletonList(claim)); + + Map metaMap = new HashMap<>(); + + // Add fields to metadata + value.fields().forEachRemaining(field -> metaMap.put(field.getKey(), field.getValue())); + + metaMap.put("time", IdentityProviderUtil.getUTCDateTime()); + metadata.setMetadata(metaMap); + + verifiedAttributes.add(metadata); + } + + return verifiedAttributes; + } + private String getUTCDateTime() { return ZonedDateTime .now(ZoneOffset.UTC) diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 98315630..298734ac 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -15,7 +15,7 @@ mosip.esignet.authenticator.ida-domainUri=${mosip.esignet.domain.url} mosip.esignet.authenticator.ida.cert-url=http://mosip-file-server.mosip-file-server/mosip-certs/ida-partner.cer mosip.esignet.authenticator.ida.kyc-auth-url=http://ida-auth.ida/idauthentication/v1/kyc-auth/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.kyc-auth-url-v2=http://ida-auth.ida/idauthentication/v1/kyc-auth/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-exchange-url=http://ida-auth.ida/idauthentication/v1/kyc-exchange/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-exchange-url=http://ida-auth.ida/idauthentication/v1/kyc-exchange/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.send-otp-url=http://ida-otp.ida/idauthentication/v1/otp/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.binder.ida.key-binding-url=http://ida-auth.ida/idauthentication/v1/identity-key-binding/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.get-certificates-url=http://ida-internal.ida/idauthentication/v1/internal/getAllCertificates @@ -46,3 +46,5 @@ mosip.signup.idrepo.idvid-postfix= ## This is required for id-repo backward compatibility mosip.signup.idrepo.get-identity-method=GET mosip.signup.idrepo.get-identity-fallback-path=%s?type=demo&idType=HANDLE + + diff --git a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java index 544c93cd..c2e6bd28 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java @@ -7,7 +7,6 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.node.ObjectNode; import io.mosip.esignet.api.dto.*; import io.mosip.esignet.api.exception.KycAuthException; import io.mosip.esignet.api.exception.KycExchangeException; @@ -393,6 +392,90 @@ public void doKycExchange_withValidDetailsEmptyAcceptedClaims_thenPass() throws Assert.assertEquals(idaKycExchangeResponse.getEncryptedKyc(), kycExchangeResult.getEncryptedKyc()); } + @Test + public void doKycExchange_withConsentedVerifiedClaims_thenPass() throws Exception { + VerifiedKycExchangeDto verifiedDto = new VerifiedKycExchangeDto(); + verifiedDto.setIndividualId("IND1234"); + verifiedDto.setKycToken("KYCT123"); + verifiedDto.setTransactionId("TRAN123"); + verifiedDto.setAcceptedClaims(List.of( "name", "dob","email")); + verifiedDto.setClaimsLocales(new String[]{"en"}); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode verifiedClaimsNode = mapper.readTree("[{\"email\":\"test@gmail.com\"}]"); + + JsonNode nameNode = mapper.readTree("\"John Doe\""); + JsonNode dobNode = mapper.readTree("\"1990-01-01\""); + + Map claimDetails = new HashMap<>(); + claimDetails.put("verified_claims", verifiedClaimsNode); + claimDetails.put("name", nameNode); + claimDetails.put("dob", dobNode); + + verifiedDto.setAcceptedClaimDetails(claimDetails); + + IdaKycExchangeResponse idaKycExchangeResponse = new IdaKycExchangeResponse(); + idaKycExchangeResponse.setEncryptedKyc("encryptedKyc"); + + IdaResponseWrapper idaResponseWrapper = new IdaResponseWrapper<>(); + idaResponseWrapper.setResponse(idaKycExchangeResponse); + idaResponseWrapper.setTransactionID("TRAN123"); + idaResponseWrapper.setVersion("VER2"); + + ResponseEntity> responseEntity = + new ResponseEntity<>(idaResponseWrapper, HttpStatus.OK); + + Mockito.when(restTemplate.exchange(Mockito.>any(), + Mockito.>>any())) + .thenReturn(responseEntity); + + KycExchangeResult result = idaAuthenticatorImpl.doKycExchange("relyingPartyId", "clientId", verifiedDto); + + Assert.assertEquals("encryptedKyc", result.getEncryptedKyc()); + } + + @Test + public void doKycExchange_withConsentedUnVerifiedClaims_thenPass() throws Exception { + VerifiedKycExchangeDto verifiedDto = new VerifiedKycExchangeDto(); + verifiedDto.setIndividualId("IND1234"); + verifiedDto.setKycToken("KYCT123"); + verifiedDto.setTransactionId("TRAN123"); + verifiedDto.setAcceptedClaims(List.of( "gender")); + verifiedDto.setClaimsLocales(new String[]{"en"}); + + ObjectMapper mapper = new ObjectMapper(); + JsonNode verifiedClaimsNode = mapper.readTree("[{\"email\":\"test@gmail.com\"}]"); + + JsonNode nameNode = mapper.readTree("\"John Doe\""); + JsonNode genderNode = mapper.readTree("\"Male\""); + + Map claimDetails = new HashMap<>(); + claimDetails.put("verified_claims", verifiedClaimsNode); + claimDetails.put("name", nameNode); + claimDetails.put("dob", genderNode); + + verifiedDto.setAcceptedClaimDetails(claimDetails); + + IdaKycExchangeResponse idaKycExchangeResponse = new IdaKycExchangeResponse(); + idaKycExchangeResponse.setEncryptedKyc("encryptedKyc"); + + IdaResponseWrapper idaResponseWrapper = new IdaResponseWrapper<>(); + idaResponseWrapper.setResponse(idaKycExchangeResponse); + idaResponseWrapper.setTransactionID("TRAN123"); + idaResponseWrapper.setVersion("VER2"); + + ResponseEntity> responseEntity = + new ResponseEntity<>(idaResponseWrapper, HttpStatus.OK); + + Mockito.when(restTemplate.exchange(Mockito.>any(), + Mockito.>>any())) + .thenReturn(responseEntity); + + KycExchangeResult result = idaAuthenticatorImpl.doKycExchange("relyingPartyId", "clientId", verifiedDto); + + Assert.assertEquals("encryptedKyc", result.getEncryptedKyc()); + } + @Test public void doKycExchange_withInvalidDetails_thenFail() throws Exception { KycExchangeDto kycExchangeDto = new KycExchangeDto(); From a0afb5fa4c09ee406ad65f3b4d599d3a9c06c292 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Thu, 19 Jun 2025 13:48:13 +0530 Subject: [PATCH 04/58] [ES-2175] Added null check (#119) * [ES-2175] Added null check Signed-off-by: pvsaidurga * [ES-2175] Added null check Signed-off-by: pvsaidurga * [ES-2175] Added null check Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga --- .../mosipid/service/IdaAuthenticatorImpl.java | 14 ++++++++++++-- .../src/main/resources/application.properties | 3 ++- .../mosipid/service/IdaAuthenticatorImplTest.java | 2 ++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java index a7841fd8..2be1e958 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java @@ -73,6 +73,9 @@ public class IdaAuthenticatorImpl implements Authenticator { @Value("${mosip.esignet.authenticator.ida.kyc-exchange-url}") private String kycExchangeUrl; + @Value("${mosip.esignet.authenticator.ida.kyc-exchange-url-v2}") + private String kycExchangeUrlV2; + @Value("${mosip.esignet.authenticator.ida.otp-channels}") private List otpChannels; @@ -118,7 +121,7 @@ public KycExchangeResult doKycExchange(String relyingPartyId, String clientId, K idaKycExchangeRequest.setRequestTime(HelperService.getUTCDateTime()); idaKycExchangeRequest.setTransactionID(kycExchangeDto.getTransactionId()); idaKycExchangeRequest.setKycToken(kycExchangeDto.getKycToken()); - if (!CollectionUtils.isEmpty(kycExchangeDto.getAcceptedClaims())) { + if (!CollectionUtils.isEmpty(kycExchangeDto.getAcceptedClaims())) { idaKycExchangeRequest.setConsentObtained(kycExchangeDto.getAcceptedClaims()); } else { idaKycExchangeRequest.setConsentObtained(List.of("sub")); @@ -131,11 +134,13 @@ public KycExchangeResult doKycExchange(String relyingPartyId, String clientId, K setClaims((VerifiedKycExchangeDto) kycExchangeDto, idaKycExchangeRequest); } + log.info("Sending the kyc exchange request : {}", idaKycExchangeRequest); //set signature header, body and invoke kyc exchange endpoint String requestBody = objectMapper.writeValueAsString(idaKycExchangeRequest); RequestEntity requestEntity = RequestEntity - .post(UriComponentsBuilder.fromUriString(kycExchangeUrl).pathSegment(relyingPartyId, + .post(UriComponentsBuilder.fromUriString((kycExchangeDto instanceof VerifiedKycExchangeDto) ? + kycExchangeUrlV2 : kycExchangeUrl).pathSegment(relyingPartyId, clientId).build().toUri()) .contentType(MediaType.APPLICATION_JSON_UTF8) .header(SIGNATURE_HEADER_NAME, helperService.getRequestSignature(requestBody)) @@ -307,6 +312,11 @@ private KycAuthResult doKycAuthentication(String relyingPartyId, String clientId */ private Map> buildVerifiedClaimsMetadata(String verifiedClaimsMetadata) { Map> claimsMetadata = new LinkedHashMap<>(); + if(verifiedClaimsMetadata==null || verifiedClaimsMetadata.isEmpty()) + { + log.info("Null or Empty claimsMetadata is found"); + return claimsMetadata; + } try { JsonNode jsonNode = objectMapper.readTree(verifiedClaimsMetadata); replaceNullStrings((ObjectNode) jsonNode); diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 298734ac..2ca16ac0 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -15,7 +15,8 @@ mosip.esignet.authenticator.ida-domainUri=${mosip.esignet.domain.url} mosip.esignet.authenticator.ida.cert-url=http://mosip-file-server.mosip-file-server/mosip-certs/ida-partner.cer mosip.esignet.authenticator.ida.kyc-auth-url=http://ida-auth.ida/idauthentication/v1/kyc-auth/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.kyc-auth-url-v2=http://ida-auth.ida/idauthentication/v1/kyc-auth/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-exchange-url=http://ida-auth.ida/idauthentication/v1/kyc-exchange/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-exchange-url=http://ida-auth.ida/idauthentication/v1/kyc-exchange/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-exchange-url-v2=http://ida-auth.ida/idauthentication/v1/kyc-exchange/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.send-otp-url=http://ida-otp.ida/idauthentication/v1/otp/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.binder.ida.key-binding-url=http://ida-auth.ida/idauthentication/v1/identity-key-binding/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.get-certificates-url=http://ida-internal.ida/idauthentication/v1/internal/getAllCertificates diff --git a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java index c2e6bd28..9d3e7f13 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java @@ -74,6 +74,7 @@ public void setUp() { ReflectionTestUtils.setField(idaAuthenticatorImpl, "otpChannels", Arrays.asList("otp", "pin", "bio")); ReflectionTestUtils.setField(idaAuthenticatorImpl, "objectMapper", mapper); ReflectionTestUtils.setField(idaAuthenticatorImpl, "kycAuthUrlV2", "https://testkycAuthUrl"); + ReflectionTestUtils.setField(idaAuthenticatorImpl, "kycExchangeUrlV2", "https://testkycExchangeUrl"); } @Test @@ -394,6 +395,7 @@ public void doKycExchange_withValidDetailsEmptyAcceptedClaims_thenPass() throws @Test public void doKycExchange_withConsentedVerifiedClaims_thenPass() throws Exception { + VerifiedKycExchangeDto verifiedDto = new VerifiedKycExchangeDto(); verifiedDto.setIndividualId("IND1234"); verifiedDto.setKycToken("KYCT123"); From 9be1aecaf01ba67f614eca84f1ca0f004b5f3c1e Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Thu, 19 Jun 2025 23:30:56 +0530 Subject: [PATCH 05/58] key manager version update (#117) Signed-off-by: Md-Humair-KK --- mock-plugin/pom.xml | 2 +- mosip-identity-plugin/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index 36b133ba..1a2efc7d 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -85,7 +85,7 @@ Hoxton.SR8 2.3.6.RELEASE - 1.2.1.0 + 1.2.2.0-SNAPSHOT 1.6.1-SNAPSHOT 1.2.1-SNAPSHOT diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 7255b596..800d8b3f 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -85,7 +85,7 @@ Hoxton.SR8 2.3.6.RELEASE - 1.2.1.0 + 1.2.2.0-SNAPSHOT 1.6.1-SNAPSHOT 1.2.1-SNAPSHOT From 2ddcc22a1ba9148c113c60fde2f2e1df95098cea Mon Sep 17 00:00:00 2001 From: ase-101 Date: Sun, 22 Jun 2025 18:56:54 +0530 Subject: [PATCH 06/58] Updated the snapshot repository Signed-off-by: ase-101 --- sunbird-rc-plugin/pom.xml | 84 ++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 50 deletions(-) diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index 2a229b73..7ff28255 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -31,6 +31,39 @@ https://github.com/mosip/esignet-plugins + + + + ossrh-central + MavenCentralRepository + https://central.sonatype.com/repository/maven-snapshots + default + + true + + + + central + MavenCentral + default + https://repo1.maven.org/maven2 + + false + + + + + + + ossrh + https://central.sonatype.com/repository/maven-snapshots/ + + + ossrh + https://central.sonatype.com/api/v1/publisher + + + UTF-8 11 @@ -93,17 +126,6 @@ - - info.weboftrust - ld-signatures-java - 1.0.0 - - - com.nimbusds - nimbus-jose-jwt - - - org.slf4j slf4j-api @@ -135,45 +157,7 @@ provided - - - ossrh - CentralRepository - https://oss.sonatype.org/content/repositories/snapshots - default - - true - - - - central - MavenCentral - default - https://repo1.maven.org/maven2 - - false - - - - danubetech - DanubetechCentral - default - https://repo.danubetech.com/repository/maven-releases/ - - false - - - - - - ossrh - https://oss.sonatype.org/content/repositories/snapshots - - - ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ - - + From f3a3ad943210822d811400caa4da9569ddd23801 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Sun, 22 Jun 2025 19:30:31 +0530 Subject: [PATCH 07/58] Updated snapshot publish plugin Signed-off-by: ase-101 --- mock-plugin/pom.xml | 53 +++++++++++++---------------------- mosip-identity-plugin/pom.xml | 23 ++++++++------- sunbird-rc-plugin/pom.xml | 20 ++++--------- 3 files changed, 36 insertions(+), 60 deletions(-) diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index 1a2efc7d..bbdb24af 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -36,9 +36,9 @@ - ossrh - CentralRepository - https://oss.sonatype.org/content/repositories/snapshots + ossrh-central + MavenCentralRepository + https://central.sonatype.com/repository/maven-snapshots default true @@ -58,28 +58,28 @@ ossrh - https://oss.sonatype.org/content/repositories/snapshots + https://central.sonatype.com/repository/maven-snapshots/ ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + https://central.sonatype.com/api/v1/publisher - UTF-8 11 + UTF-8 + + 11 11 - 3.3.0 - 2.4 - 2.22.0 - 1.5 - 2.2.1 - 1.6.7 - 3.0.1 + 3.8.0 + 3.0.2 + 3.1.0 + 2.22.0 0.8.5 - 3.3.1 + 3.7.0.1746 + 3.2.0 2.3 Hoxton.SR8 @@ -92,20 +92,14 @@ **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** - + junit junit 4.13.1 test - - commons-beanutils - commons-beanutils - 1.9.4 - - org.projectlombok @@ -145,12 +139,6 @@ - - org.slf4j - slf4j-api - 1.7.30 - provided - io.mosip.signup @@ -343,14 +331,13 @@ - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 + org.sonatype.central + central-publishing-maven-plugin + 0.7.0 true - ossrh - https://oss.sonatype.org/ - false + ossrh + false diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 800d8b3f..44e1ecc0 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -36,9 +36,9 @@ - ossrh - CentralRepository - https://oss.sonatype.org/content/repositories/snapshots + ossrh-central + MavenCentralRepository + https://central.sonatype.com/repository/maven-snapshots default true @@ -58,11 +58,11 @@ ossrh - https://oss.sonatype.org/content/repositories/snapshots + https://central.sonatype.com/repository/maven-snapshots/ ossrh - https://oss.sonatype.org/service/local/staging/deploy/maven2/ + https://central.sonatype.com/api/v1/publisher @@ -114,7 +114,7 @@ ${esignet.version} provided - + io.mosip.esignet esignet-integration-api @@ -332,14 +332,13 @@ - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 + org.sonatype.central + central-publishing-maven-plugin + 0.7.0 true - ossrh - https://oss.sonatype.org/ - false + ossrh + false diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index 7ff28255..839e1723 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -212,23 +212,13 @@ - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 + org.sonatype.central + central-publishing-maven-plugin + 0.7.0 true - - - default-deploy - deploy - - deploy - - - - ossrh - https://oss.sonatype.org/ - false + ossrh + false From 5acac5f843bd2c17c24df9e3792ccb9d85cc9e04 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Tue, 24 Jun 2025 17:45:59 +0530 Subject: [PATCH 08/58] Updated the OSSRH url Signed-off-by: ase-101 --- .github/workflows/push-trigger.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/push-trigger.yml b/.github/workflows/push-trigger.yml index 64b8d9d3..57258325 100644 --- a/.github/workflows/push-trigger.yml +++ b/.github/workflows/push-trigger.yml @@ -43,7 +43,7 @@ jobs: secrets: OSSRH_USER: ${{ secrets.OSSRH_USER }} OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} - OSSRH_URL: ${{ secrets.OSSRH_SNAPSHOT_URL }} + OSSRH_URL: ${{ secrets.OSSRH_CENTRAL_URL }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} GPG_SECRET: ${{ secrets.GPG_SECRET }} SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} @@ -84,7 +84,7 @@ jobs: secrets: OSSRH_USER: ${{ secrets.OSSRH_USER }} OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} - OSSRH_URL: ${{ secrets.OSSRH_SNAPSHOT_URL }} + OSSRH_URL: ${{ secrets.OSSRH_CENTRAL_URL }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} GPG_SECRET: ${{ secrets.GPG_SECRET }} SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} @@ -125,7 +125,7 @@ jobs: secrets: OSSRH_USER: ${{ secrets.OSSRH_USER }} OSSRH_SECRET: ${{ secrets.OSSRH_SECRET }} - OSSRH_URL: ${{ secrets.OSSRH_SNAPSHOT_URL }} + OSSRH_URL: ${{ secrets.OSSRH_CENTRAL_URL }} OSSRH_TOKEN: ${{ secrets.OSSRH_TOKEN }} GPG_SECRET: ${{ secrets.GPG_SECRET }} SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} From d341bbfac22f3b739c7d5ae70370a6f1780300fb Mon Sep 17 00:00:00 2001 From: ase-101 Date: Sat, 28 Jun 2025 13:41:42 +0530 Subject: [PATCH 09/58] Added debug logs (#122) Signed-off-by: ase-101 --- .../mosipid/service/IdaAuthenticatorImpl.java | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java index 2be1e958..a39ae16d 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java @@ -260,8 +260,8 @@ public KycAuthResult doKycAuth(String relyingPartyId, String clientId, boolean c */ private KycAuthResult doKycAuthentication(String relyingPartyId, String clientId, KycAuthDto kycAuthDto, boolean claimsMetadataRequired) throws KycAuthException { - log.info("Started to build kyc-auth request with transactionId : {} && clientId : {}", - kycAuthDto.getTransactionId(), clientId); + log.info("Started to build kyc-auth request with transactionId : {} && clientId : {} with claimsMetadataRequired: {}", + kycAuthDto.getTransactionId(), clientId, claimsMetadataRequired); try { IdaKycAuthRequest idaKycAuthRequest = getIdaKycAuthRequest(kycAuthDto, claimsMetadataRequired); helperService.setAuthRequest(kycAuthDto.getChallengeList(), idaKycAuthRequest); @@ -283,11 +283,10 @@ private KycAuthResult doKycAuthentication(String relyingPartyId, String clientId IdaResponseWrapper responseWrapper = responseEntity.getBody(); if(responseWrapper!=null && responseWrapper.getResponse() != null && responseWrapper.getResponse().isKycStatus() && responseWrapper.getResponse().getKycToken() != null) { - return claimsMetadataRequired ? (new KycAuthResult(responseWrapper.getResponse().getKycToken(), + log.debug("Claims metadata in the response : {}", responseWrapper.getResponse().getVerifiedClaimsMetadata()); + return new KycAuthResult(responseWrapper.getResponse().getKycToken(), responseWrapper.getResponse().getAuthToken(), - buildVerifiedClaimsMetadata(responseWrapper.getResponse().getVerifiedClaimsMetadata()))) - : (new KycAuthResult(responseWrapper.getResponse().getKycToken(), - responseWrapper.getResponse().getAuthToken())); + buildVerifiedClaimsMetadata(responseWrapper.getResponse().getVerifiedClaimsMetadata())); } assert Objects.requireNonNull(responseWrapper).getResponse() != null; log.error("Error response received from IDA KycStatus : {} && Errors: {}", @@ -360,7 +359,7 @@ private IdaKycAuthRequest getIdaKycAuthRequest(KycAuthDto kycAuthDto, boolean cl idaKycAuthRequest.setConsentObtained(true); idaKycAuthRequest.setIndividualId(kycAuthDto.getIndividualId()); idaKycAuthRequest.setTransactionID(kycAuthDto.getTransactionId()); - if(claimsMetadataRequired){ + if(claimsMetadataRequired){ //if false, will be set to NULL, making it compatible with v1 kyc-auth idaKycAuthRequest.setClaimMetadataRequired(true); } return idaKycAuthRequest; From c28844bb3599787f3e193a628b8872de488628a9 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Sun, 29 Jun 2025 15:16:49 +0530 Subject: [PATCH 10/58] Fixed the field name error (#123) Signed-off-by: ase-101 --- .../io/mosip/esignet/plugin/mosipid/dto/IdaKycAuthRequest.java | 2 +- .../esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycAuthRequest.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycAuthRequest.java index 9821db66..0b720888 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycAuthRequest.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/dto/IdaKycAuthRequest.java @@ -31,7 +31,7 @@ public class IdaKycAuthRequest { private String requestSessionKey; private Map metadata; private List allowedKycAttributes; - private Boolean claimMetadataRequired; + private Boolean claimsMetadataRequired; @Data public static class AuthRequest { diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java index a39ae16d..c81dd7d2 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java @@ -34,7 +34,6 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.io.IOException; import java.util.*; import static io.mosip.esignet.core.constants.Constants.VERIFIED_CLAIMS; @@ -360,7 +359,7 @@ private IdaKycAuthRequest getIdaKycAuthRequest(KycAuthDto kycAuthDto, boolean cl idaKycAuthRequest.setIndividualId(kycAuthDto.getIndividualId()); idaKycAuthRequest.setTransactionID(kycAuthDto.getTransactionId()); if(claimsMetadataRequired){ //if false, will be set to NULL, making it compatible with v1 kyc-auth - idaKycAuthRequest.setClaimMetadataRequired(true); + idaKycAuthRequest.setClaimsMetadataRequired(true); } return idaKycAuthRequest; } From 2f07ecaa7b9647a4ec7dbb86487b882b3833d38d Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Fri, 11 Jul 2025 23:09:50 +0530 Subject: [PATCH 11/58] [ES-2396] added ui-spec implementation in mosipid plugin (#124) * added ui-spec feature in mosipid plugin Signed-off-by: Sachin Rana * updates Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- .../IdrepoProfileRegistryPluginImpl.java | 17 +++++++++++++++++ .../src/main/resources/application.properties | 5 ++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index db5cd0d4..c9d7a7af 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -37,6 +37,7 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import javax.annotation.PostConstruct; import javax.validation.constraints.NotNull; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; @@ -124,6 +125,17 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Autowired private ProfileCacheService profileCacheService; + @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") + private String uiSpecUrl; + + private JsonNode uiSpec; + + @PostConstruct + public void init() { + this.uiSpec = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() {}) + .getResponse(); + } + @Override public void validate(String action, ProfileDto profileDto) throws InvalidProfileException { @@ -286,6 +298,11 @@ public boolean isMatch(@NotNull JsonNode identity, @NotNull JsonNode inputChalle return !inputChallenge.isEmpty() && matchCount >= inputChallenge.size(); } + @Override + public JsonNode getUISpecification() { + return this.uiSpec; + } + private SchemaResponse getSchemaJson(double version) throws ProfileException { if(schemaMap.containsKey(version)) return schemaMap.get(version); diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 2ca16ac0..04cce18c 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -37,6 +37,10 @@ mosip.signup.idrepo.identity.endpoint=http://identity.idrepo/idrepository/v1/ide mosip.signup.idrepo.generate-hash.endpoint=http://keymanager.keymanager/v1/keymanager/generateArgon2Hash mosip.signup.idrepo.get-uin.endpoint=http://idgenerator.kernel/v1/idgenerator/uin mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/credentialrequest/get/ + +# This is the url to fetch ui-spec from masterdata - 'esignet-signup' in the url should match with domain name of the schema in the masterdata. +mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?version=0.1&type=schema&identitySchemaVersion=0.1 + mosip.signup.idrepo.add-identity.request.id=mosip.id.create mosip.signup.idrepo.update-identity.request.id=mosip.id.update mosip.signup.idrepo.identity.request.version=v1 @@ -48,4 +52,3 @@ mosip.signup.idrepo.idvid-postfix= mosip.signup.idrepo.get-identity-method=GET mosip.signup.idrepo.get-identity-fallback-path=%s?type=demo&idType=HANDLE - From 57fcdda1eb583f6c29ecafcf6a7450b6d435399c Mon Sep 17 00:00:00 2001 From: ase-101 Date: Mon, 14 Jul 2025 12:22:54 +0530 Subject: [PATCH 12/58] ES-2409 (#129) * ES-2409 Signed-off-by: ase-101 * ES-2409 Signed-off-by: ase-101 --------- Signed-off-by: ase-101 --- .../MockIdentityVerifierPluginImpl.java | 154 ++++++++++++++++++ .../src/main/resources/application.properties | 6 + .../main/resources/mock-idv-user-story.json | 14 ++ 3 files changed, 174 insertions(+) create mode 100644 mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImpl.java create mode 100644 mosip-identity-plugin/src/main/resources/mock-idv-user-story.json diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImpl.java new file mode 100644 index 00000000..c8455fd7 --- /dev/null +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImpl.java @@ -0,0 +1,154 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + */ +package io.mosip.signup.plugin.mosipid.service; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.signup.api.dto.*; +import io.mosip.signup.api.exception.IdentityVerifierException; +import io.mosip.signup.api.spi.IdentityVerifierPlugin; +import io.mosip.signup.api.util.ProcessType; +import io.mosip.signup.api.util.VerificationStatus; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Component; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Objects; +import java.util.Optional; +import java.util.stream.Collectors; + +import static io.mosip.signup.api.util.ProcessType.VIDEO; + +@Data +class MockScene { + private int frameNumber; + private String stepCode; + private IDVProcessStepDetail step; + private IDVProcessFeedback feedback; +} + +@Data +class MockUserStory { + private List scenes; + private JsonNode verificationResult; +} + + + +@Slf4j +@Component +public class MockIdentityVerifierPluginImpl extends IdentityVerifierPlugin { + + @Value("${mosip.signup.mock.identity-verification.story-name}") + private String storyName; + + @Value("${mosip.signup.mock.config-server-url}") + private String configServerUrl; + + @Autowired + private ResourceLoader resourceLoader; + + @Autowired + private ObjectMapper objectMapper; + + @Override + public String getVerifierId() { + return "mock-identity-verifier"; + } + + @Override + public List getSupportedProcessTypes() { + return List.of(VIDEO); + } + + @Override + public void initialize(String transactionId, IdentityVerificationInitDto identityVerificationInitDto) { + log.info("Transaction is initialized for transactionId : {} and disabilityType: {}", + transactionId, identityVerificationInitDto.getDisabilityType()); + log.info("**** Nothing to initialize as its mock identity verification plugin ****"); + } + + @Override + public void verify(String transactionId, IdentityVerificationDto identityVerificationDto) throws IdentityVerifierException { + MockUserStory mockUserStory = getResource(configServerUrl+storyName, MockUserStory.class); + log.info("Loaded user story : {} for transaction: {}", storyName, transactionId); + + IdentityVerificationResult identityVerificationResult = new IdentityVerificationResult(); + identityVerificationResult.setId(transactionId); + identityVerificationResult.setVerifierId(getVerifierId()); + + log.info("input message step code : {} for transaction: {}", identityVerificationDto.getStepCode(), transactionId); + if(isStartStep(identityVerificationDto.getStepCode())) { + Optional result = Objects.requireNonNull(mockUserStory).getScenes().stream() + .filter(scene -> scene.getFrameNumber() == 0 && scene.getStepCode().equals(identityVerificationDto.getStepCode())) + .findFirst(); + + if(result.isPresent()) { + identityVerificationResult.setStep(result.get().getStep()); + identityVerificationResult.setFeedback(result.get().getFeedback()); + publishAnalysisResult(identityVerificationResult); + } + } + + if(identityVerificationDto.getFrames() == null || identityVerificationDto.getFrames().isEmpty()) { + log.info("No Frames found in the request {}, nothing to do", transactionId); + return; + } + + for(FrameDetail frameDetail : identityVerificationDto.getFrames()) { + Optional matchedScene = Objects.requireNonNull(mockUserStory).getScenes().stream() + .filter(scene -> scene.getFrameNumber() == frameDetail.getOrder() && + scene.getStepCode().equals(identityVerificationDto.getStepCode())) + .findFirst(); + log.info("{} Search match for current frame {} in the story for transaction: {}", identityVerificationDto.getStepCode(), + frameDetail.getOrder(), transactionId); + if(matchedScene.isPresent()) { + log.info("Match found in the story : {} for transaction: {}", matchedScene.get(), transactionId); + identityVerificationResult.setStep(matchedScene.get().getStep()); + identityVerificationResult.setFeedback(matchedScene.get().getFeedback()); + publishAnalysisResult(identityVerificationResult); + } + } + } + + @Override + public VerificationResult getVerificationResult(String transactionId) throws IdentityVerifierException { + MockUserStory mockUserStory = getResource(configServerUrl+storyName, MockUserStory.class); + if(mockUserStory != null && mockUserStory.getVerificationResult() != null) { + try { + return objectMapper.treeToValue(mockUserStory.getVerificationResult(), VerificationResult.class); + } catch (Exception e) { + log.error("Failed to parse verified attributes in the mock user story: {}", storyName, e); + } + } + VerificationResult verificationResult = new VerificationResult(); + verificationResult.setStatus(VerificationStatus.FAILED); + verificationResult.setErrorCode("mock_verification_failed"); + return verificationResult; + } + + private T getResource(String url, Class clazz) { + Resource resource = resourceLoader.getResource(url); + try (BufferedReader reader = new BufferedReader( + new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8))) { + String content = reader.lines().collect(Collectors.joining("\n")); + return objectMapper.readValue(content, clazz); + } catch (IOException e) { + log.error("Failed to parse data: {}", url, e); + } + throw new IdentityVerifierException("invalid_configuration"); + } + +} \ No newline at end of file diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 04cce18c..d6e0fcc5 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -52,3 +52,9 @@ mosip.signup.idrepo.idvid-postfix= mosip.signup.idrepo.get-identity-method=GET mosip.signup.idrepo.get-identity-fallback-path=%s?type=demo&idType=HANDLE +## Name of the json file which defines the identity verification process. Refer `mock-idv-user-story.json` for the structure. +mosip.signup.mock.identity-verification.story-name=mock-idv-user-story.json + +## File defined in the property `mosip.signup.mock.identity-verification.story-name` is loaded with below defined URL +mosip.signup.mock.config-server-url=classpath: + diff --git a/mosip-identity-plugin/src/main/resources/mock-idv-user-story.json b/mosip-identity-plugin/src/main/resources/mock-idv-user-story.json new file mode 100644 index 00000000..b414c633 --- /dev/null +++ b/mosip-identity-plugin/src/main/resources/mock-idv-user-story.json @@ -0,0 +1,14 @@ +{ + "scenes":[ + {"frameNumber" : 0, "stepCode" : "START", "step" : { "code" : "liveness_check", "framesPerSecond" : 1, "durationInSeconds" : 100, "startupDelayInSeconds" : 2, "retryOnTimeout" : false, "retryableErrorCodes" : [] }, "feedback" : null }, + {"frameNumber" : 1, "stepCode" : "liveness_check", "step" : null, "feedback" : {"type" : "MESSAGE", "code" : "turn_left" } }, + {"frameNumber" : 2, "stepCode" : "liveness_check", "step" : null, "feedback" : {"type" : "MESSAGE", "code" : "turn_right" } }, + {"frameNumber" : 5, "stepCode" : "liveness_check", "step" : { "code" : "END", "framesPerSecond" : 0, "durationInSeconds" : 0, "startupDelayInSeconds" : 0, "retryOnTimeout" : false, "retryableErrorCodes" : [] }, "feedback" : null } + ], + "verificationResult": { + "status": "COMPLETED", + "verifiedClaims" : { "fullName" : { "trust_framework":"eidas", "verification_process":"manual_verification", "assurance_level": "Gold" }, + "phone" : { "trust_framework":"eidas", "verification_process":"manual_verification", "assurance_level": "Silver" }}, + "errorCode": null + } +} \ No newline at end of file From e38d202f11f0c9aa2a91f8d4e43d519adbd3bdc3 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Mon, 14 Jul 2025 20:02:42 +0530 Subject: [PATCH 13/58] [ES-2409] Added the log to debug status issue (#133) * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga --- .../plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index c9d7a7af..2379ec0c 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -215,6 +215,7 @@ public ProfileResult updateProfile(String requestId, ProfileDto profileDto) thro identityRequest.setRegistrationId(requestId); IdentityResponse identityResponse = updateIdentity(identityRequest); + log.info("Received IdentityResponse for requestId {}: {}", requestId, identityResponse); profileCacheService.setHandleRequestIds(requestId, Arrays.asList(requestId)); ProfileResult profileResult = new ProfileResult(); @@ -382,6 +383,7 @@ private IdentityResponse updateIdentity(IdentityRequest identityRequest) throws private ProfileCreateUpdateStatus getRequestStatusFromServer(String applicationId) { ResponseWrapper responseWrapper = request(getStatusEndpoint+applicationId, HttpMethod.GET, null, new ParameterizedTypeReference>() {}); + log.info("Received registration status response for applicationId {}: {}", applicationId, responseWrapper); if (responseWrapper != null && responseWrapper.getResponse() != null && !StringUtils.isEmpty(responseWrapper.getResponse().getStatusCode())) { switch (responseWrapper.getResponse().getStatusCode()) { From 8f34adaaaa8e0e96d8ad22bceac44851d10c47e0 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Mon, 14 Jul 2025 21:01:44 +0530 Subject: [PATCH 14/58] handle uin and handles in update/get profile (#131) Signed-off-by: Sachin Rana --- .../IdrepoProfileRegistryPluginImpl.java | 19 ++++++++++--------- .../src/main/resources/application.properties | 3 +-- .../IdrepoProfileRegistryPluginImplTest.java | 13 ++++++------- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 2379ec0c..56b870ae 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -60,6 +60,7 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { private static final String UTC_DATETIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; private final Map schemaMap = new HashMap<>(); private static final List ACTIONS = Arrays.asList("CREATE", "UPDATE"); + private final String HANDLE_SEPARATOR = "@"; @Value("#{'${mosip.signup.idrepo.default.selected-handles:phone}'.split(',')}") private List defaultSelectedHandles; @@ -106,9 +107,6 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("#{'${mosip.signup.idrepo.optional-language:}'.split(',')}") private List optionalLanguages; - @Value("${mosip.signup.idrepo.idvid-postfix}") - private String postfix; - @Value("${mosip.signup.idrepo.get-identity-method:POST}") private String getIdentityEndpointMethod; @@ -206,9 +204,12 @@ public ProfileResult createProfile(String requestId, ProfileDto profileDto) thro @Override public ProfileResult updateProfile(String requestId, ProfileDto profileDto) throws ProfileException { JsonNode inputJson = profileDto.getIdentity(); - //set UIN - //((ObjectNode) inputJson).set("UIN", objectMapper.valueToTree(profileDto.getUniqueUserId())); - ((ObjectNode) inputJson).set(UIN, objectMapper.valueToTree(profileDto.getIndividualId())); + + if(profileDto.getIndividualId().contains(HANDLE_SEPARATOR)) { + ((ObjectNode) inputJson).set(UIN, objectMapper.valueToTree(getProfile(profileDto.getIndividualId()).getIndividualId())); + } else { + ((ObjectNode) inputJson).set(UIN, objectMapper.valueToTree(profileDto.getIndividualId())); + } //Build identity request IdentityRequest identityRequest = buildIdentityRequest(inputJson, true); @@ -237,8 +238,7 @@ public ProfileCreateUpdateStatus getProfileCreateUpdateStatus(String requestId) @Override public ProfileDto getProfile(String individualId) throws ProfileException { try { - individualId = StringUtils.isEmpty(postfix) ? individualId : individualId.concat(postfix); - + boolean isHandle = individualId.contains(HANDLE_SEPARATOR); ResponseWrapper responseWrapper = null; switch (getIdentityEndpointMethod.toLowerCase()) { case "post" : @@ -246,7 +246,7 @@ public ProfileDto getProfile(String individualId) throws ProfileException { RequestWrapper idDTORequestWrapper=new RequestWrapper<>(); requestByIdDTO.setId(individualId); requestByIdDTO.setType("demo"); - requestByIdDTO.setIdType("HANDLE"); + if(isHandle) requestByIdDTO.setIdType("HANDLE"); idDTORequestWrapper.setRequest(requestByIdDTO); idDTORequestWrapper.setRequesttime(getUTCDateTime()); responseWrapper = request(getIdentityEndpoint, HttpMethod.POST, idDTORequestWrapper, @@ -254,6 +254,7 @@ public ProfileDto getProfile(String individualId) throws ProfileException { break; case "get": String path = String.format(getIdentityEndpointFallbackPath, individualId); + if(isHandle) path += "&idType=HANDLE"; responseWrapper = request(getIdentityEndpoint+path, HttpMethod.GET, null, new ParameterizedTypeReference>() {}); break; diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index d6e0fcc5..d9ec511a 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -46,11 +46,10 @@ mosip.signup.idrepo.update-identity.request.id=mosip.id.update mosip.signup.idrepo.identity.request.version=v1 mosip.signup.idrepo.mandatory-language=eng mosip.signup.idrepo.optional-language=eng -mosip.signup.idrepo.idvid-postfix= ## This is required for id-repo backward compatibility mosip.signup.idrepo.get-identity-method=GET -mosip.signup.idrepo.get-identity-fallback-path=%s?type=demo&idType=HANDLE +mosip.signup.idrepo.get-identity-fallback-path=%s?type=demo ## Name of the json file which defines the identity verification process. Refer `mock-idv-user-story.json` for the structure. mosip.signup.mock.identity-verification.story-name=mock-idv-user-story.json diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 8490c2e3..0244d03c 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -338,7 +338,7 @@ public void getProfile_withValidDetails_thenPass() { Map identityData = new HashMap<>(); identityData.put("email","123@email.com"); identityData.put("password","123456"); - identityData.put("UIN","1234567890"); + identityData.put("UIN",individualId); JsonNode mockIdentity = objectMapper.valueToTree(identityData); @@ -359,20 +359,19 @@ public void getProfile_withValidDetails_thenPass() { }))).thenReturn(responseEntity); ProfileDto profileDto= idrepoProfileRegistryPlugin.getProfile(individualId); Assert.assertNotNull(profileDto); - Assert.assertEquals(profileDto.getIndividualId(),"1234567890"); + Assert.assertEquals(profileDto.getIndividualId(),individualId); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getIdentityEndpointMethod", "GET"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getIdentityEndpointFallbackPath", "%s?type=demo&idType=HANDLE"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "postfix", "@someid"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getIdentityEndpointFallbackPath", "%s?type=demo"); Mockito.when(restTemplate.exchange( - "http://localhost:8080/identity/v1/identity/1234567890@someid?type=demo&idType=HANDLE", + "http://localhost:8080/identity/v1/identity/" + individualId + "@phone?type=demo&idType=HANDLE", HttpMethod.GET, null, new ParameterizedTypeReference>() {})).thenReturn(responseEntity); - profileDto= idrepoProfileRegistryPlugin.getProfile(individualId); + profileDto= idrepoProfileRegistryPlugin.getProfile(individualId+"@phone"); Assert.assertNotNull(profileDto); - Assert.assertEquals(profileDto.getIndividualId(),"1234567890"); + Assert.assertEquals(profileDto.getIndividualId(),individualId); } @Test From ac74b2e74d6270eb2c64a3894907530223c08bd9 Mon Sep 17 00:00:00 2001 From: Gk <76690271+gk-XL7@users.noreply.github.com> Date: Thu, 17 Jul 2025 07:51:36 +0530 Subject: [PATCH 15/58] Versions updated. (#136) * Version updated from 1.3.3-SNAPSHOT to 1.3.4-SNAPSHOT Signed-off-by: GurukiranP * Versions updated. Signed-off-by: GurukiranP --------- Signed-off-by: GurukiranP --- mock-plugin/pom.xml | 6 +++--- mosip-identity-plugin/pom.xml | 6 +++--- sunbird-rc-plugin/pom.xml | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index bbdb24af..1c5b20be 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -5,7 +5,7 @@ io.mosip.esignet mock-plugin - 1.3.3-SNAPSHOT + 1.3.4-SNAPSHOT mock-plugin jar Mockup of a wrapper implementation that is used to showcase the integration with e-Signet @@ -86,8 +86,8 @@ 2.3.6.RELEASE 1.2.2.0-SNAPSHOT - 1.6.1-SNAPSHOT - 1.2.1-SNAPSHOT + 1.7.0-SNAPSHOT + 1.2.2-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 44e1ecc0..21d44852 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet - 1.3.3-SNAPSHOT + 1.3.4-SNAPSHOT mosip-identity-plugin mosip-identity-plugin e-Signet Integration Implementation for MOSIP ID system @@ -86,8 +86,8 @@ 2.3.6.RELEASE 1.2.2.0-SNAPSHOT - 1.6.1-SNAPSHOT - 1.2.1-SNAPSHOT + 1.7.0-SNAPSHOT + 1.2.2-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index 839e1723..3ff0e2c8 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet.plugin.sunbirdrc sunbird-rc-plugin - 1.3.3-SNAPSHOT + 1.3.4-SNAPSHOT jar sunbird-rc-plugin @@ -80,7 +80,7 @@ 3.0.1 0.8.5 3.3.1 - 1.6.1-SNAPSHOT + 1.7.0-SNAPSHOT From cd2a198616d04abdb6eaa56487881c004da5b671 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Wed, 30 Jul 2025 10:53:37 +0530 Subject: [PATCH 16/58] [ES-2203] creating face BIR from base64 jpeg image (#118) * creating face BIR from base64 jpeg image Signed-off-by: Sachin Rana * refactoring code Signed-off-by: Sachin Rana * review comments Signed-off-by: Sachin Rana * moved the cbeff schema to the plugin Signed-off-by: Sachin Rana * removed duplicate check Signed-off-by: Sachin Rana * update Signed-off-by: Sachin Rana * updates Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- mock-plugin/pom.xml | 2 +- .../MockIdentityVerifierPluginImplTest.java | 2 +- mosip-identity-plugin/pom.xml | 68 ++++++- .../plugin/mosipid/dto/IdentityRequest.java | 1 + .../IdrepoProfileRegistryPluginImpl.java | 37 ++++ .../plugin/mosipid/util/BiometricUtil.java | 80 ++++++++ .../plugin/mosipid/util/ErrorConstants.java | 1 + .../src/main/resources/application.properties | 4 +- .../src/main/resources/mosip-cbeff.xsd | 191 ++++++++++++++++++ 9 files changed, 382 insertions(+), 4 deletions(-) create mode 100644 mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java create mode 100644 mosip-identity-plugin/src/main/resources/mosip-cbeff.xsd diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index 1c5b20be..cee04b73 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -87,7 +87,7 @@ 1.2.2.0-SNAPSHOT 1.7.0-SNAPSHOT - 1.2.2-SNAPSHOT + 1.3.0-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** diff --git a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java index 47c4c940..019c4591 100644 --- a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java +++ b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java @@ -68,7 +68,7 @@ public void verify_withValidIdentityVerificationDto_thenPass() throws IdentityVe KafkaTemplate kafkaTemplate = Mockito.mock(KafkaTemplate.class); ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "kafkaTemplate", kafkaTemplate); - + ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "resultTopic", "ANALYZE_FRAMES_RESULT"); mockIdentityVerifierPlugin.verify(transactionId, identityVerificationDto); diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 21d44852..2a5b0724 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -87,13 +87,57 @@ 1.2.2.0-SNAPSHOT 1.7.0-SNAPSHOT - 1.2.2-SNAPSHOT + 1.3.0-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** + + + io.mosip.biometric.util + biometrics-util + 1.2.0.3 + + + com.fasterxml.jackson.core + * + + + com.fasterxml.jackson.dataformat + * + + + com.fasterxml.jackson.module + * + + + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + 2.11.3 + + + + io.mosip.kernel + kernel-biometrics-api + 1.2.0.3 + + + org.slf4j + slf4j-api + + + + + io.mosip.kernel + kernel-cbeffutil-api + 1.2.0.3 + + junit junit @@ -253,6 +297,27 @@ + + + maven-assembly-plugin + 3.7.1 + + + jar-with-dependencies + + false + + + + make-assembly + package + + single + + + + + org.apache.maven.plugins maven-surefire-plugin @@ -329,6 +394,7 @@ none + src/main/java diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java index 2d9bea30..81399bd4 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityRequest.java @@ -16,4 +16,5 @@ public class IdentityRequest { private String registrationId; private JsonNode identity; private List verifiedAttributes; + private JsonNode documents; } diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 56b870ae..a431282d 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -8,12 +8,14 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import io.micrometer.core.annotation.Timed; import io.mosip.esignet.core.util.IdentityProviderUtil; import io.mosip.signup.plugin.mosipid.dto.VerificationMetadata; import io.mosip.signup.plugin.mosipid.dto.*; +import io.mosip.signup.plugin.mosipid.util.BiometricUtil; import io.mosip.signup.plugin.mosipid.util.ErrorConstants; import io.mosip.signup.plugin.mosipid.util.ProfileCacheService; import io.mosip.kernel.core.util.HMACUtils2; @@ -47,6 +49,7 @@ import java.util.*; import static io.mosip.signup.api.util.ErrorConstants.SERVER_UNREACHABLE; +import static io.mosip.signup.plugin.mosipid.util.ErrorConstants.INVALID_INDIVIDUAL_BIOMETRICS; import static io.mosip.signup.plugin.mosipid.util.ErrorConstants.REQUEST_FAILED; @Slf4j @@ -113,6 +116,12 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.idrepo.get-identity-fallback-path}") private String getIdentityEndpointFallbackPath; + @Value("${mosip.signup.idrepo.biometric.field-name:individualBiometrics}") + private String biometricDataFieldName; + + @Value("${mosip.signup.idrepo.biometric.compression-ratio:1000}") + private int faceImageCompressionRatio; + @Autowired @Qualifier("selfTokenRestTemplate") private RestTemplate restTemplate; @@ -457,6 +466,8 @@ private IdentityRequest buildIdentityRequest(JsonNode inputJson, boolean isUpdat ((ObjectNode) inputJson).remove("verified_claims"); } + identityRequest.setDocuments(buildDocuments(inputJson)); + identityRequest.setIdentity(inputJson); return identityRequest; } @@ -558,4 +569,30 @@ private void validateLanguage(String language) { if(!mandatoryLanguages.contains(language) && (optionalLanguages != null && !optionalLanguages.contains(language))) throw new InvalidProfileException(ErrorConstants.INVALID_LANGUAGE); } + + private ArrayNode buildDocuments(JsonNode inputJson) { + ArrayNode documents = objectMapper.createArrayNode(); + if (!inputJson.path(biometricDataFieldName).path("value").isMissingNode()) { + String base64FaceImage = inputJson.path(biometricDataFieldName).path("value").textValue(); + String base64BirXmlEncoded = null; + try { + base64BirXmlEncoded = BiometricUtil.convertBase64JpegToBase64BirXML(base64FaceImage, faceImageCompressionRatio); + } catch (Exception e) { + log.error("Failed to create cbeff from face image: ", e); + throw new ProfileException(INVALID_INDIVIDUAL_BIOMETRICS); + } + ((ObjectNode) inputJson).set(biometricDataFieldName, objectMapper.valueToTree(Map.ofEntries( + Map.entry("format", "cbeff"), + Map.entry("version", 1), + Map.entry("value", "fileReferenceID") + ))); + documents.add(objectMapper.createObjectNode() + .put("category", biometricDataFieldName) + .put("value", base64BirXmlEncoded) + ); + } + if(documents.isEmpty()) return null; + return documents; + } + } diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java new file mode 100644 index 00000000..12fee4cd --- /dev/null +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java @@ -0,0 +1,80 @@ +package io.mosip.signup.plugin.mosipid.util; + +import io.mosip.biometrics.util.ConvertRequestDto; +import io.mosip.biometrics.util.face.FaceEncoder; +import io.mosip.kernel.biometrics.constant.BiometricType; +import io.mosip.kernel.biometrics.constant.ProcessedLevelType; +import io.mosip.kernel.biometrics.constant.PurposeType; +import io.mosip.kernel.biometrics.constant.QualityType; +import io.mosip.kernel.biometrics.entities.*; +import org.springframework.oxm.jaxb.Jaxb2Marshaller; +import org.springframework.util.Base64Utils; + +import javax.xml.transform.stream.StreamResult; +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.ZoneOffset; +import java.util.List; + +import static io.mosip.biometrics.util.CommonUtil.convertJPEGToJP2UsingOpenCV; + +public class BiometricUtil { + + private static final Jaxb2Marshaller marshaller; + + static { + marshaller = new Jaxb2Marshaller(); + marshaller.setClassesToBeBound(BIR.class); + } + + public static String convertBase64JpegToBase64BirXML(String base64Jpeg, int imageCompressionRatio) throws Exception { + byte[] jpegImage = Base64Utils.decodeFromString(base64Jpeg); + byte[] jp2Image = convertJPEGToJP2UsingOpenCV(jpegImage, imageCompressionRatio); + + ConvertRequestDto convertRequest = new ConvertRequestDto(); + convertRequest.setVersion("ISO19794_5_2011"); + convertRequest.setPurpose("Registration"); + convertRequest.setImageType(0); + convertRequest.setInputBytes(jp2Image); + convertRequest.setModality("Face"); + convertRequest.setCompressionRatio(imageCompressionRatio); + + byte[] isoImage = FaceEncoder.convertFaceImageToISO(convertRequest); + + BIR bir = createBIRFromISO(isoImage); + + StringWriter sw = new StringWriter(); + StreamResult result = new StreamResult(sw); + marshaller.marshal(bir, result); + String birXml = sw.toString(); + + return Base64Utils.encodeToUrlSafeString(birXml.getBytes(StandardCharsets.UTF_8)); + } + + public static BIR createBIRFromISO(byte[] isoImage) { + BIRInfo birInfo = new BIRInfo.BIRInfoBuilder().withIntegrity(false).build(); + BDBInfo bdbInfo = new BDBInfo.BDBInfoBuilder() + .withCreationDate(LocalDateTime.now(ZoneOffset.UTC)) + .withType(List.of(BiometricType.FACE)) + .withPurpose(PurposeType.ENROLL) + .withLevel(ProcessedLevelType.RAW) + .withFormat(new RegistryIDType("Mosip", "8")) + .withQuality(new QualityType(new RegistryIDType("HMAC", "SHA-256"), 0L, null)) + .build(); + BIR faceBir = new BIR.BIRBuilder() + .withVersion(new VersionType(1, 1)) + .withCbeffversion(new VersionType(1, 1)) + .withBirInfo(birInfo) + .withBdb(isoImage) + .withBdbInfo(bdbInfo) + .withOthers(null) + .build(); + + BIR bir = new BIR.BIRBuilder() + .withBirInfo(birInfo) + .build(); + bir.setBirs(List.of(faceBir)); + return bir; + } +} diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/ErrorConstants.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/ErrorConstants.java index 4e6cebaf..40507d44 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/ErrorConstants.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/ErrorConstants.java @@ -18,5 +18,6 @@ public class ErrorConstants { public static final String MANDATORY_LANGUAGE_MISSING = "mandatory_language_missing"; public static final String IDENTIFIER_MISMATCH = "identifier_mismatch"; public static final String INVALID_PREFERRED_LANGUAGE = "invalid_preferred_language"; + public static final String INVALID_INDIVIDUAL_BIOMETRICS = "invalid_individual_biometrics"; } \ No newline at end of file diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index d9ec511a..864d865e 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -29,7 +29,9 @@ mosip.esignet.authenticator.ida-env=${IDA_AUTHENTICATOR_ENV:Staging} mosip.esignet.authenticator.ida.otp-channels=email,phone ## Signup plugin configuration -mosip.signup.integration.impl.basepackage=io.mosip.signup.plugin.mosipid +mosip.signup.integration.impl.basepackage=io.mosip.signup.plugin.mosipid,io.mosip.kernel.cbeffutil.impl +mosip.kernel.xsdstorage-uri=classpath: +mosip.kernel.xsdfile=mosip-cbeff.xsd mosip.signup.integration.profile-registry-plugin=MOSIPProfileRegistryPluginImpl mosip.signup.idrepo.schema-url=http://masterdata.kernel/v1/masterdata/idschema/latest?schemaVersion= mosip.signup.idrepo.get-identity.endpoint=http://identity.idrepo/idrepository/v1/identity/idvid/ diff --git a/mosip-identity-plugin/src/main/resources/mosip-cbeff.xsd b/mosip-identity-plugin/src/main/resources/mosip-cbeff.xsd new file mode 100644 index 00000000..1bede505 --- /dev/null +++ b/mosip-identity-plugin/src/main/resources/mosip-cbeff.xsd @@ -0,0 +1,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 2794bd7c72bd48bdaab917ca1ad1762f1c0a8041 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Wed, 30 Jul 2025 12:54:21 +0530 Subject: [PATCH 17/58] Update application.properties (#138) (#139) Signed-off-by: Sachin Rana --- mosip-identity-plugin/src/main/resources/application.properties | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 864d865e..3323d6f2 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -59,3 +59,5 @@ mosip.signup.mock.identity-verification.story-name=mock-idv-user-story.json ## File defined in the property `mosip.signup.mock.identity-verification.story-name` is loaded with below defined URL mosip.signup.mock.config-server-url=classpath: +## This property needs to removed in next release 1.7.0. Postfix needs to be added in the ui not backend +mosip.signup.individualid.postfix=@phone From 82388092b5a9013e9242131279d4c0aa355c34ee Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Wed, 30 Jul 2025 14:34:58 +0530 Subject: [PATCH 18/58] [ES-2396] change in ui-spec response (#137) * change in ui-spec response Signed-off-by: Sachin Rana * updated with jsonspec Signed-off-by: Sachin Rana * kept dependency in plugin Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- mosip-identity-plugin/pom.xml | 6 +++++ .../IdrepoProfileRegistryPluginImpl.java | 22 +++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 2a5b0724..21c99d04 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -95,6 +95,12 @@ + + com.jayway.jsonpath + json-path + 2.9.0 + + io.mosip.biometric.util biometrics-util diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index a431282d..f86d78ae 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; +import com.jayway.jsonpath.JsonPath; import io.micrometer.core.annotation.Timed; import io.mosip.esignet.core.util.IdentityProviderUtil; import io.mosip.signup.plugin.mosipid.dto.VerificationMetadata; @@ -135,12 +136,29 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") private String uiSpecUrl; + @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.schema}") + private String schemaJsonpath; + + @Value("${mosip.signup.mosipid.uispec.errors-jsonpath:$[0].jsonSpec[0].spec.errors}") + private String errorsJsonpath; + private JsonNode uiSpec; @PostConstruct public void init() { - this.uiSpec = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() {}) - .getResponse(); + String responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { + }) + .getResponse() + .toString(); + Object schema = JsonPath.read(responseJson, schemaJsonpath); + Object errors = JsonPath.read(responseJson, errorsJsonpath); + this.uiSpec = objectMapper.valueToTree( + Map.ofEntries( + Map.entry("schema", schema), + Map.entry("errors", errors), + Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)) + ) + ); } From 2b2f0c41fb0d1cd24bbb0638d949d98c497696b2 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Thu, 31 Jul 2025 12:18:53 +0530 Subject: [PATCH 19/58] [ES-2396] Resolved dependency conflict (#140) * [ES-2396] Resolved dependency conflict Signed-off-by: pvsaidurga * [ES-2396] Resolved dependency conflict Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga --- mosip-identity-plugin/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 21c99d04..28c65fe8 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -99,6 +99,12 @@ com.jayway.jsonpath json-path 2.9.0 + + + org.slf4j + slf4j-api + + From 6f77f6b47b74ec5a6a73cfa1600b453b9f7e0210 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Fri, 1 Aug 2025 14:02:12 +0530 Subject: [PATCH 20/58] [ES-2203] excluded unnecessary dependencies (#142) * excluded unnecessary dependencies Signed-off-by: Sachin Rana * excluded more Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- mosip-identity-plugin/pom.xml | 46 +++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 28c65fe8..34a3d9ba 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -95,6 +95,12 @@ + + org.json + json + 20240303 + + com.jayway.jsonpath json-path @@ -124,6 +130,10 @@ com.fasterxml.jackson.module * + + org.slf4j + slf4j-api + @@ -142,8 +152,44 @@ org.slf4j slf4j-api + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-test + + + org.springframework.cloud + spring-cloud-starter-config + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.data + spring-data-jpa + + + org.springframework.boot + spring-boot-starter-security + + + + org.springframework.boot + spring-boot-starter-test + 2.3.6.RELEASE + test + + io.mosip.kernel kernel-cbeffutil-api From 17cdaeb322428967c13e6723cbc64c5d3346d908 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Mon, 11 Aug 2025 23:41:17 +0530 Subject: [PATCH 21/58] [ES-2203] more exclusions (#144) * more exclusions Signed-off-by: Sachin Rana * final fix Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- mosip-identity-plugin/pom.xml | 24 +++++++++++++++++-- .../IdrepoProfileRegistryPluginImpl.java | 3 +-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 34a3d9ba..8aae748b 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -134,6 +134,10 @@ org.slf4j slf4j-api + + org.hibernate.validator + hibernate-validator + @@ -180,6 +184,22 @@ org.springframework.boot spring-boot-starter-security + + org.apache.tomcat.embed + tomcat-embed-core + + + javax.validation + validation-api + + + io.micrometer + micrometer-core + + + io.micrometer + micrometer-registry-prometheus + @@ -367,8 +387,8 @@ - make-assembly - package + make-assembly + package single diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index f86d78ae..86266e4f 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -41,7 +41,6 @@ import org.springframework.web.client.RestTemplate; import javax.annotation.PostConstruct; -import javax.validation.constraints.NotNull; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.time.ZoneOffset; @@ -306,7 +305,7 @@ public ProfileDto getProfile(String individualId) throws ProfileException { } @Override - public boolean isMatch(@NotNull JsonNode identity, @NotNull JsonNode inputChallenge) { + public boolean isMatch(JsonNode identity, JsonNode inputChallenge) { int matchCount = 0; Iterator itr = inputChallenge.fieldNames(); while(itr.hasNext()) { From b3592d188a91f8a5b051dd1ecec600c9d66f54e8 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Mon, 18 Aug 2025 15:33:12 +0530 Subject: [PATCH 22/58] [ES-2479] Fixed nullpointer (#149) * [ES-2175] Fixed nullpointer Signed-off-by: pvsaidurga * Fix to avoid NPE in IDA when unverifiedConsentedClaims is not present Signed-off-by: ase-101 --------- Signed-off-by: pvsaidurga Signed-off-by: ase-101 Co-authored-by: ase-101 --- .../mosipid/service/IdaAuthenticatorImpl.java | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java index c81dd7d2..e179db0a 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java @@ -111,6 +111,11 @@ public KycAuthResult doKycAuth(String relyingPartyId, String clientId, KycAuthDt @Override public KycExchangeResult doKycExchange(String relyingPartyId, String clientId, KycExchangeDto kycExchangeDto) throws KycExchangeException { + return kycExchange(relyingPartyId,clientId,kycExchangeDto,false); + } + + private KycExchangeResult kycExchange(String relyingPartyId, String clientId, KycExchangeDto kycExchangeDto,boolean isV2) + throws KycExchangeException { log.info("Started to build kyc-exchange request with transactionId : {} && clientId : {}", kycExchangeDto.getTransactionId(), clientId); try { @@ -129,7 +134,7 @@ public KycExchangeResult doKycExchange(String relyingPartyId, String clientId, K idaKycExchangeRequest.setRespType(kycExchangeDto.getUserInfoResponseType()); //may be either JWT or JWE idaKycExchangeRequest.setIndividualId(kycExchangeDto.getIndividualId()); - if(kycExchangeDto instanceof VerifiedKycExchangeDto){ + if(isV2){ setClaims((VerifiedKycExchangeDto) kycExchangeDto, idaKycExchangeRequest); } @@ -138,7 +143,7 @@ public KycExchangeResult doKycExchange(String relyingPartyId, String clientId, K //set signature header, body and invoke kyc exchange endpoint String requestBody = objectMapper.writeValueAsString(idaKycExchangeRequest); RequestEntity requestEntity = RequestEntity - .post(UriComponentsBuilder.fromUriString((kycExchangeDto instanceof VerifiedKycExchangeDto) ? + .post(UriComponentsBuilder.fromUriString((isV2) ? kycExchangeUrlV2 : kycExchangeUrl).pathSegment(relyingPartyId, clientId).build().toUri()) .contentType(MediaType.APPLICATION_JSON_UTF8) @@ -179,11 +184,7 @@ private void setClaims(VerifiedKycExchangeDto kycExchangeDto, IdaKycExchangeRequ idaKycExchangeRequest.setVerifiedConsentedClaims(verifiedClaimsList); } - Map unVerifiedConsentedClaims = getUnVerifiedConsentedClaims(acceptedClaimDetails); - if(!CollectionUtils.isEmpty(unVerifiedConsentedClaims)){ - Map unVerifiedConsentedClaim = objectMapper.convertValue(unVerifiedConsentedClaims, new TypeReference<>() {}); - idaKycExchangeRequest.setUnVerifiedConsentedClaims(unVerifiedConsentedClaim); - } + idaKycExchangeRequest.setUnVerifiedConsentedClaims(getUnVerifiedConsentedClaims(acceptedClaimDetails)); } } @@ -367,7 +368,7 @@ private IdaKycAuthRequest getIdaKycAuthRequest(KycAuthDto kycAuthDto, boolean cl @Override public KycExchangeResult doVerifiedKycExchange(String relyingPartyId, String clientId, VerifiedKycExchangeDto kycExchangeDto) throws KycExchangeException { - return doKycExchange(relyingPartyId, clientId, kycExchangeDto); + return kycExchange(relyingPartyId, clientId, kycExchangeDto,true); } /** @@ -376,7 +377,7 @@ public KycExchangeResult doVerifiedKycExchange(String relyingPartyId, String cli * @return un verified consented claims */ @NotNull // This is added to not return null either return un verified claims map or empty map - private Map getUnVerifiedConsentedClaims(Map acceptedClaimDetails) { + private Map getUnVerifiedConsentedClaims(Map acceptedClaimDetails) { Map unVerifiedConsentedClaims = new HashMap<>(); if(!CollectionUtils.isEmpty(acceptedClaimDetails)) { for(Map.Entry entry : acceptedClaimDetails.entrySet()) { @@ -387,6 +388,6 @@ private Map getUnVerifiedConsentedClaims(Map } } } - return unVerifiedConsentedClaims; + return objectMapper.convertValue(unVerifiedConsentedClaims, new TypeReference<>() {}); } } From cf44910c186936fe2af8753220c8a590d8ac25a9 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Wed, 20 Aug 2025 00:02:59 +0530 Subject: [PATCH 23/58] [ES-2396] configuring errors in uispec (#150) * configuring errors in uispec Signed-off-by: Sachin Rana * adding default uispec errors Signed-off-by: Sachin Rana * corrected non-english text Signed-off-by: Sachin Rana * removed non-english text Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- .../service/IdrepoProfileRegistryPluginImpl.java | 11 ++++++++++- .../src/main/resources/application.properties | 1 + 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 86266e4f..be9e6881 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -12,6 +12,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import com.jayway.jsonpath.JsonPath; +import com.jayway.jsonpath.PathNotFoundException; import io.micrometer.core.annotation.Timed; import io.mosip.esignet.core.util.IdentityProviderUtil; import io.mosip.signup.plugin.mosipid.dto.VerificationMetadata; @@ -141,6 +142,9 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.mosipid.uispec.errors-jsonpath:$[0].jsonSpec[0].spec.errors}") private String errorsJsonpath; + @Value("#{${mosip.signup.mosipid.uispec.errors:null}}") + private Map errorsFromConfig = new HashMap<>(); + private JsonNode uiSpec; @PostConstruct @@ -150,7 +154,12 @@ public void init() { .getResponse() .toString(); Object schema = JsonPath.read(responseJson, schemaJsonpath); - Object errors = JsonPath.read(responseJson, errorsJsonpath); + Object errors; + try { + errors = JsonPath.read(responseJson, errorsJsonpath); + } catch (PathNotFoundException e) { + errors = errorsFromConfig; + } this.uiSpec = objectMapper.valueToTree( Map.ofEntries( Map.entry("schema", schema), diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 3323d6f2..0f599b38 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -42,6 +42,7 @@ mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/crede # This is the url to fetch ui-spec from masterdata - 'esignet-signup' in the url should match with domain name of the schema in the masterdata. mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?version=0.1&type=schema&identitySchemaVersion=0.1 +mosip.signup.mosipid.uispec.errors={required:{en:"This field is required"},passwordMismatch:{en:"Passwords is not matching please check your password"}} mosip.signup.idrepo.add-identity.request.id=mosip.id.create mosip.signup.idrepo.update-identity.request.id=mosip.id.update From f3c21e52d525b82cea174f7f6e1880be324304d8 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Mon, 1 Sep 2025 13:13:05 +0530 Subject: [PATCH 24/58] ES-2484 Cherry picked one commit and added a common url for idrepo (#151) * Version correction and removed unused config and fields (#141) * Version correction and removed unused config and fields Signed-off-by: ase-101 * Version correction and removed unused config and fields Signed-off-by: ase-101 --------- Signed-off-by: ase-101 * [ES-2484] Signed-off-by: pvsaidurga * [ES-2484] Updated review comments Signed-off-by: pvsaidurga --------- Signed-off-by: ase-101 Signed-off-by: pvsaidurga Co-authored-by: ase-101 --- .../src/main/resources/application.properties | 5 ++-- .../MockIdentityVerifierPluginImplTest.java | 1 + .../plugin/mosipid/dto/IdentityResponse.java | 6 +++-- .../src/main/resources/application.properties | 24 ++++++++++++------- .../main/resources/mock-idv-user-story.json | 6 +++-- .../IdrepoProfileRegistryPluginImplTest.java | 5 ---- sunbird-rc-plugin/pom.xml | 2 -- .../src/main/resources/application.properties | 2 ++ 8 files changed, 28 insertions(+), 23 deletions(-) diff --git a/mock-plugin/src/main/resources/application.properties b/mock-plugin/src/main/resources/application.properties index 3799519c..27686686 100644 --- a/mock-plugin/src/main/resources/application.properties +++ b/mock-plugin/src/main/resources/application.properties @@ -26,10 +26,9 @@ mosip.signup.mock.identity-verification.story-name=mock-idv-user-story.json mosip.signup.mock.config-server-url=classpath: mosip.signup.mock.get-schema.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity/ui-spec -mosip.signup.mock.mandatory-attributes.CREATE=fullName,phone,email,gender,password,preferredLang +mosip.signup.mock.mandatory-attributes.CREATE=fullName,phone,password,preferredLang mosip.signup.mock.mandatory-attributes.UPDATE= -mosip.signup.mock.lang-based-attributes=fullName -mosip.signup.mock.username.field=individualId +mosip.signup.mock.username.field=phone mosip.signup.mock.identity.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity mosip.signup.mock.get-identity.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity/ diff --git a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java index 019c4591..e4c9025f 100644 --- a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java +++ b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockIdentityVerifierPluginImplTest.java @@ -45,6 +45,7 @@ public class MockIdentityVerifierPluginImplTest { public void before(){ objectMapper = new ObjectMapper(); ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "objectMapper",objectMapper); + ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "resultTopic","ANALYZE_FRAMES_RESULT"); } diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityResponse.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityResponse.java index 904c282f..b3cdac8a 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityResponse.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/IdentityResponse.java @@ -5,16 +5,18 @@ */ package io.mosip.signup.plugin.mosipid.dto; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.databind.JsonNode; import lombok.Data; import java.util.List; @Data +@JsonIgnoreProperties(ignoreUnknown = true) public class IdentityResponse { private String status; private JsonNode identity; - private List documents; - private List verifiedAttributes; + //private List documents; + //private List verifiedAttributes; } diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 0f599b38..319dd124 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -12,14 +12,17 @@ mosip.esignet.authenticator.ida-send-otp-id=mosip.identity.otp mosip.esignet.authenticator.ida-version=1.0 mosip.esignet.authenticator.ida.misp-license-key=${mosip.esignet.misp.key} mosip.esignet.authenticator.ida-domainUri=${mosip.esignet.domain.url} +mosip.esignet.ida.auth.url=${IDA_AUTH_URL:http://ida-auth.ida} +mosip.esignet.ida.otp.url=${IDA_OTP_URL:http://ida-otp.ida} +mosip.esignet.ida.internal.url=${IDA_INTERNAL_URL:http://ida-internal.ida} mosip.esignet.authenticator.ida.cert-url=http://mosip-file-server.mosip-file-server/mosip-certs/ida-partner.cer -mosip.esignet.authenticator.ida.kyc-auth-url=http://ida-auth.ida/idauthentication/v1/kyc-auth/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-auth-url-v2=http://ida-auth.ida/idauthentication/v1/kyc-auth/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-exchange-url=http://ida-auth.ida/idauthentication/v1/kyc-exchange/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-exchange-url-v2=http://ida-auth.ida/idauthentication/v1/kyc-exchange/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.send-otp-url=http://ida-otp.ida/idauthentication/v1/otp/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.binder.ida.key-binding-url=http://ida-auth.ida/idauthentication/v1/identity-key-binding/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.get-certificates-url=http://ida-internal.ida/idauthentication/v1/internal/getAllCertificates +mosip.esignet.authenticator.ida.kyc-auth-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-auth/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-auth-url-v2=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-auth/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-exchange-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-exchange/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-exchange-url-v2=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-exchange/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.send-otp-url=${mosip.esignet.ida.otp.url}/idauthentication/v1/otp/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.binder.ida.key-binding-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/identity-key-binding/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.get-certificates-url=${mosip.esignet.ida.internal.url}/idauthentication/v1/internal/getAllCertificates mosip.esignet.authenticator.ida.auth-token-url=http://authmanager.kernel/v1/authmanager/authenticate/clientidsecretkey mosip.esignet.authenticator.ida.audit-manager-url=http://auditmanager.kernel/v1/auditmanager/audits mosip.esignet.authenticator.ida.client-id=mosip-ida-client @@ -34,8 +37,11 @@ mosip.kernel.xsdstorage-uri=classpath: mosip.kernel.xsdfile=mosip-cbeff.xsd mosip.signup.integration.profile-registry-plugin=MOSIPProfileRegistryPluginImpl mosip.signup.idrepo.schema-url=http://masterdata.kernel/v1/masterdata/idschema/latest?schemaVersion= -mosip.signup.idrepo.get-identity.endpoint=http://identity.idrepo/idrepository/v1/identity/idvid/ -mosip.signup.idrepo.identity.endpoint=http://identity.idrepo/idrepository/v1/identity/v2/ + +mosip.signup.idrepo.url=${IDREPO_IDENTITY_URL:http://identity.idrepo} + +mosip.signup.idrepo.get-identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/idvid/ +mosip.signup.idrepo.identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/v2/ mosip.signup.idrepo.generate-hash.endpoint=http://keymanager.keymanager/v1/keymanager/generateArgon2Hash mosip.signup.idrepo.get-uin.endpoint=http://idgenerator.kernel/v1/idgenerator/uin mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/credentialrequest/get/ diff --git a/mosip-identity-plugin/src/main/resources/mock-idv-user-story.json b/mosip-identity-plugin/src/main/resources/mock-idv-user-story.json index b414c633..69e7e1f2 100644 --- a/mosip-identity-plugin/src/main/resources/mock-idv-user-story.json +++ b/mosip-identity-plugin/src/main/resources/mock-idv-user-story.json @@ -7,8 +7,10 @@ ], "verificationResult": { "status": "COMPLETED", - "verifiedClaims" : { "fullName" : { "trust_framework":"eidas", "verification_process":"manual_verification", "assurance_level": "Gold" }, - "phone" : { "trust_framework":"eidas", "verification_process":"manual_verification", "assurance_level": "Silver" }}, + "verifiedClaims" : { + "fullName" : { "trust_framework":"eidas", "verification_process":"manual_verification", "assurance_level": "Gold" }, + "phone" : { "trust_framework":"eidas", "verification_process":"manual_verification", "assurance_level": "Silver" } + }, "errorCode": null } } \ No newline at end of file diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 0244d03c..8b96e4b9 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -195,7 +195,6 @@ public void createProfile_withValidProfileDetails_thenPass() { ResponseWrapper responseWrapper3 = new ResponseWrapper<>(); IdentityResponse identityResponse = new IdentityResponse(); identityResponse.setStatus("SUCCESS"); - identityResponse.setDocuments(List.of("Document1")); responseWrapper3.setResponse(identityResponse); ResponseEntity> responseEntity3=new ResponseEntity<>(responseWrapper3, HttpStatus.OK); @@ -251,7 +250,6 @@ public void createProfile_withInValidProfileDetails_thenFail() { ResponseWrapper responseWrapper3 = new ResponseWrapper<>(); IdentityResponse identityResponse = new IdentityResponse(); identityResponse.setStatus("SUCCESS"); - identityResponse.setDocuments(List.of("Document1")); responseWrapper3.setResponse(identityResponse); ResponseEntity> responseEntity3=new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); @@ -316,7 +314,6 @@ public void updateProfile_withValidProfileDetails_thenPass() { ResponseWrapper responseWrapper3 = new ResponseWrapper<>(); IdentityResponse identityResponse = new IdentityResponse(); identityResponse.setStatus("SUCCESS"); - identityResponse.setDocuments(List.of("Document1")); responseWrapper3.setResponse(identityResponse); ResponseEntity> responseEntity3=new ResponseEntity<>(responseWrapper3, HttpStatus.OK); @@ -345,7 +342,6 @@ public void getProfile_withValidDetails_thenPass() { ResponseWrapper responseWrapper = new ResponseWrapper<>(); IdentityResponse identityResponse = new IdentityResponse(); identityResponse.setStatus("SUCCESS"); - identityResponse.setDocuments(List.of("Document1")); identityResponse.setIdentity(mockIdentity); responseWrapper.setResponse(identityResponse); @@ -382,7 +378,6 @@ public void getProfile_withErrorCodeAsIdentityFail_thenFail() { ResponseWrapper responseWrapper = new ResponseWrapper<>(); IdentityResponse identityResponse = new IdentityResponse(); identityResponse.setStatus("SUCCESS"); - identityResponse.setDocuments(List.of("Document1")); identityResponse.setIdentity(mockIdentity); responseWrapper.setResponse(null); diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index 3ff0e2c8..c8bf4eec 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -157,7 +157,6 @@ provided - @@ -221,7 +220,6 @@ false - org.apache.maven.plugins maven-source-plugin diff --git a/sunbird-rc-plugin/src/main/resources/application.properties b/sunbird-rc-plugin/src/main/resources/application.properties index 194f8204..d6f82cba 100644 --- a/sunbird-rc-plugin/src/main/resources/application.properties +++ b/sunbird-rc-plugin/src/main/resources/application.properties @@ -1,6 +1,8 @@ ## eSignet sunbird plugin configuration mosip.esignet.integration.scan-base-package=io.mosip.esignet.plugin.sunbirdrc mosip.esignet.integration.authenticator=SunbirdRCAuthenticationService +mosip.esignet.integration.audit-plugin=LoggerAuditService +mosip.esignet.integration.key-binder=NoOpKeyBinder ##---------------------------------Sunbird-RC Plugin Configurations------------------------------------------------------ From 0a898d6c604d6555ab08039a027ec2de9602331a Mon Sep 17 00:00:00 2001 From: Zeeshan Mehboob <82993262+zesu22@users.noreply.github.com> Date: Wed, 3 Sep 2025 16:08:52 +0530 Subject: [PATCH 25/58] Merge/1.3.x to develop (#155) * [ES-1325] Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * updated esignet mock-plugin Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * removed .project file Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * updated password hashing Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * updated profile registry plugin Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * added check for trustFrameworkCriteria not null Signed-off-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * added test cases for coverage Signed-off-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * review changes Signed-off-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * review changes Signed-off-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * review changes and replace concreate restcontroler wiht Dependency Injection Signed-off-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * updated profile registry plugin impl Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * ES-1376 Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Reset pwd failure temp fix Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-1456 Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-1456 Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-1456 Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1580] Updated the call to idvid from get to post Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * updated a property key Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * [ES-1580] Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * [ES-1580] Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * ES-842 review fixes Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * fix: fix idvid postfix Signed-off-by: bunsy-0900 Signed-off-by: Zeeshan Mehboob * Review changes and updated incomplete mock implementation Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Update README.md Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-1638 ES-1639 (#31) * Removed VCI related classes and added application.properties Signed-off-by: ase-101 * Removed VCI related dependency Signed-off-by: ase-101 --------- Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-593] added authTransactionId in the log description (#33) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * Made changes to use Resource instead of Resttemplate to support classpath, http protocol (#34) Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-1638 (#35) Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1148] updated the error mesaage and property (#36) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * ES-842 Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-842 updated the pwd and kbi format Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-842] modified the validate method (#38) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * [ES-842] modified framesPerSecond (#39) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * [ES=1148] modified the error message (#40) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * updated readme and config comments Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1613] added test case for coverage (#27) * added test case for coverage Signed-off-by: Mohd Kaif Siddique * remvoed null pointer bug Signed-off-by: Mohd Kaif Siddique * removed bug Signed-off-by: Mohd Kaif Siddique * review comment changes Signed-off-by: Mohd Kaif Siddique * review changes Signed-off-by: Mohd Kaif Siddique * review changes Signed-off-by: Mohd Kaif Siddique * review changes Signed-off-by: Mohd Kaif Siddique * reivew changes Signed-off-by: Mohd Kaif Siddique --------- Signed-off-by: Mohd Kaif Siddique Co-authored-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * Updated readme and updated version Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * updated the version form 1.3.0 to 1.3.1 (#48) * update the version form 1.3.0 to 1.3.1 Signed-off-by: Mohd Kaif Siddique * version update Signed-off-by: Mohd Kaif Siddique --------- Signed-off-by: Mohd Kaif Siddique Co-authored-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * [ES-1613] (#50) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * Removed VCI related classes (#53) Signed-off-by: ase-101 Co-authored-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-1690 adding sunbird authentication plugin (#47) * ES-1690 adding sunbird authentication plugin Signed-off-by: Sachin Rana * addressed review comments Signed-off-by: Sachin Rana * property 'kba' changed to 'kbi' Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * Feature ES-1100 Integration with API - v2 kyc-auth endpoint to give out claim verification details (#49) * ES-1100 API integration kyc-auth v2 Signed-off-by: Md-Humair-KK * cherry-pick Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK * removed commented code Signed-off-by: Md-Humair-KK * fixed test case Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob * corrected import statement (#61) Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * added extra test cases to cover uncover conditions (#55) Signed-off-by: Mohd Kaif Siddique Co-authored-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * [ES-1966] merge code from release to develop (#65) * ES-1638 ES-1639 (#31) * Removed VCI related classes and added application.properties Signed-off-by: ase-101 * Removed VCI related dependency Signed-off-by: ase-101 --------- Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-593] added authTransactionId in the log description (#33) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * Made changes to use Resource instead of Resttemplate to support classpath, http protocol (#34) Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-1638 (#35) Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1148] updated the error mesaage and property (#36) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * ES-842 Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-842 updated the pwd and kbi format Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-842] modified the validate method (#38) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * [ES-842] modified framesPerSecond (#39) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * [ES=1148] modified the error message (#40) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * updated readme and config comments Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1613] added test case for coverage (#27) * added test case for coverage Signed-off-by: Mohd Kaif Siddique * remvoed null pointer bug Signed-off-by: Mohd Kaif Siddique * removed bug Signed-off-by: Mohd Kaif Siddique * review comment changes Signed-off-by: Mohd Kaif Siddique * review changes Signed-off-by: Mohd Kaif Siddique * review changes Signed-off-by: Mohd Kaif Siddique * review changes Signed-off-by: Mohd Kaif Siddique * reivew changes Signed-off-by: Mohd Kaif Siddique --------- Signed-off-by: Mohd Kaif Siddique Co-authored-by: Mohd Kaif Siddique Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Updated readme and updated version Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Removed VCI related classes Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Corrected get-identity endpoint url Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1613] Added test cases for coverage (#51) * [ES-1613] Signed-off-by: Venkata Saidurga Polamraju * [ES-1613] Reviewed comments Signed-off-by: Venkata Saidurga Polamraju * [ES-1613] Added test cases Signed-off-by: Venkata Saidurga Polamraju * reviewed comments[ES-1618] Signed-off-by: Venkata Saidurga Polamraju --------- Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * Added extra loggers Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Added test cases Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Added test cases Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Updated readme document Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Added idrepo get-identity endpoint support Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Added idrepo get-identity endpoint support Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * updated the version form 1.3.0 to 1.3.1 (#48) * update the version form 1.3.0 to 1.3.1 Signed-off-by: Mohd Kaif Siddique * version update Signed-off-by: Mohd Kaif Siddique --------- Signed-off-by: Mohd Kaif Siddique Co-authored-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob * [ES-1613] (#50) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * ES-1690 adding sunbird authentication plugin (#47) * ES-1690 adding sunbird authentication plugin Signed-off-by: Sachin Rana * addressed review comments Signed-off-by: Sachin Rana * property 'kba' changed to 'kbi' Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * Feature ES-1100 Integration with API - v2 kyc-auth endpoint to give out claim verification details (#49) * ES-1100 API integration kyc-auth v2 Signed-off-by: Md-Humair-KK * cherry-pick Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK * removed commented code Signed-off-by: Md-Humair-KK * fixed test case Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob * corrected import statement (#61) Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * added extra test cases to cover uncover conditions (#55) Signed-off-by: Mohd Kaif Siddique Co-authored-by: Mohd Kaif Siddique Signed-off-by: Zeeshan Mehboob --------- Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Mohd Kaif Siddique Signed-off-by: Sachin Rana Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob <82993262+zesu22@users.noreply.github.com> Co-authored-by: ase-101 Co-authored-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> Co-authored-by: Kaif Siddique <74772315+kaifk468@users.noreply.github.com> Co-authored-by: Mohd Kaif Siddique Co-authored-by: sacrana0 Co-authored-by: Md Humair Kankudti <163233654+Md-Humair-KK@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * [ES-1966] modified test cases for build failure issue (#66) * [MODIFIED] test cases issue resolved Signed-off-by: Zeeshan Mehboob * [RENAMED] KBA to KBI, and error msg to challenge_format Signed-off-by: Zeeshan Mehboob --------- Signed-off-by: Zeeshan Mehboob Signed-off-by: Zeeshan Mehboob <82993262+zesu22@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * fix: mock-plugin/pom.xml to reduce vulnerabilities (#69) The following vulnerabilities are fixed with an upgrade: - https://snyk.io/vuln/SNYK-JAVA-COMMONSBEANUTILS-460111 Signed-off-by: rajapandi.m Co-authored-by: snyk-bot Signed-off-by: Zeeshan Mehboob * [ES-1806] Implemented kyc exchange method (#59) * [ES-1806] Implemented kyc exchange method Signed-off-by: Venkata Saidurga Polamraju * [ES-1806] Updated review comments Signed-off-by: Venkata Saidurga Polamraju * [ES-1806] Updated the mapping of claims Signed-off-by: Venkata Saidurga Polamraju * Updated review comments Signed-off-by: Venkata Saidurga Polamraju * Update application.properties [ES-1806] Signed-off-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> * Update application.properties Signed-off-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> * Update application.properties Signed-off-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> * Update SunbirdRCAuthenticationService.java Signed-off-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> --------- Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * Updated pom version of sunird-rc-plugin[ES-1806] (#72) Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [ES-1806] added sunbird-rc-plugin build to workflows (#73) Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * kyc auth v2 url changes and data mapping changes (#67) * kyc auth v2 url changes and data mapping changes Signed-off-by: Md-Humair-KK * removed commented code Signed-off-by: Md-Humair-KK * changed the deserialization Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob * [ES-1899] converted two-letter language codes to their corresponding ISO 639-2/T language codes (#74) Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [ES-1806] Added sub claim and updated pom (#78) Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [ES-2158] Fixed bugs reported in sonar (#81) (#83) * [ES-2158] Fixed bugs reported in sonar * [ES-2158] Update rwview comments * [ES-2158] Update rwview comments * [ES-2158] Update rwview comments * [ES-2158] Update rwview comments --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [UPDATE] version to 1.3.2 (#84) Signed-off-by: Zeeshan Mehboob * ES 1.3.1 temp to dev (#82) * [ES-2156] Four bugs are reported in the mosip-identity plugin (#80) * sonar fixes Signed-off-by: Md-Humair-KK * sonar review fixes Signed-off-by: Md-Humair-KK * sonar review fixes Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK * merge 1.3.1 temp to dev Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob * [ES-2157] Added test cases (#86) * [ES-2157] Added test cases Signed-off-by: pvsaidurga * [ES-2157] Added test cases Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * Create codeql.yml Signed-off-by: rajapandi1234 <138785181+rajapandi1234@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * updated review comments (#90) * updated review comments Signed-off-by: pvsaidurga * Updated the claim mapping Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * Removed the conflicting dependency (#96) * Removed conflicting nimbus dependency Signed-off-by: ase-101 * Updated nimbus as provided library Signed-off-by: ase-101 --------- Signed-off-by: ase-101 Co-authored-by: ase-101 Signed-off-by: Zeeshan Mehboob * esignet and signup dependency version update (#92) Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * Added support for user info response type [ES-2164] (#88) * [ES-2164] Added support for userInfoResponseType Signed-off-by: pvsaidurga * [ES-2164] Added support for userInfoResponseType Signed-off-by: pvsaidurga * [ES-2164] Updated the review comments Signed-off-by: pvsaidurga * [ES-2164] Updated review comments Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [ES-2280] Added Ui spec json (#97) * [ES-2280] Added Ui spec json Signed-off-by: pvsaidurga * [ES-2280] Updated review comments Signed-off-by: pvsaidurga * [ES-2280] Updated review comments Signed-off-by: pvsaidurga * [ES-2280] Updated review comments Signed-off-by: pvsaidurga * [ES-2280] Updated review comments Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * ES- Release version POM updates (#99) * Release version update Signed-off-by: Md-Humair-KK * property file changes Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob * 1.3.2 to 1.3.3 version update (#107) Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * ES-2325 Updated readme and deleted duplicate dependency block (#114) * ES-842 Signed-off-by: ase-101 * ES-842 Signed-off-by: ase-101 * ES-2325 Signed-off-by: ase-101 * ES-2325 Signed-off-by: ase-101 --------- Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * ES-2175 Integration with API in mosip-identity-plugin and ES-2338 Profile registry plugin update (#116) * ES-2175 Signed-off-by: Md-Humair-KK * fixed peer review comments Signed-off-by: Md-Humair-KK * review comments fixed Signed-off-by: Md-Humair-KK * review fixed Signed-off-by: Md-Humair-KK * [ES-2371] Added test cases Signed-off-by: pvsaidurga * [ES-2175] Updated review comments Signed-off-by: pvsaidurga * [ES-2175] Updated review comments Signed-off-by: pvsaidurga * [ES-2175] Updated review comments Signed-off-by: pvsaidurga --------- Signed-off-by: Md-Humair-KK Signed-off-by: pvsaidurga Co-authored-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [ES-2175] Added null check (#119) * [ES-2175] Added null check Signed-off-by: pvsaidurga * [ES-2175] Added null check Signed-off-by: pvsaidurga * [ES-2175] Added null check Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * key manager version update (#117) Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob * Updated the snapshot repository Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Updated snapshot publish plugin Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Updated the OSSRH url Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Added debug logs (#122) Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Fixed the field name error (#123) Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-2396] added ui-spec implementation in mosipid plugin (#124) * added ui-spec feature in mosipid plugin Signed-off-by: Sachin Rana * updates Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * ES-2409 (#129) * ES-2409 Signed-off-by: ase-101 * ES-2409 Signed-off-by: ase-101 --------- Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-2409] Added the log to debug status issue (#133) * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * handle uin and handles in update/get profile (#131) Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * Versions updated. (#136) * Version updated from 1.3.3-SNAPSHOT to 1.3.4-SNAPSHOT Signed-off-by: GurukiranP * Versions updated. Signed-off-by: GurukiranP --------- Signed-off-by: GurukiranP Signed-off-by: Zeeshan Mehboob * [ES-2203] creating face BIR from base64 jpeg image (#118) * creating face BIR from base64 jpeg image Signed-off-by: Sachin Rana * refactoring code Signed-off-by: Sachin Rana * review comments Signed-off-by: Sachin Rana * moved the cbeff schema to the plugin Signed-off-by: Sachin Rana * removed duplicate check Signed-off-by: Sachin Rana * update Signed-off-by: Sachin Rana * updates Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * Update application.properties (#138) (#139) Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * [ES-2396] change in ui-spec response (#137) * change in ui-spec response Signed-off-by: Sachin Rana * updated with jsonspec Signed-off-by: Sachin Rana * kept dependency in plugin Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * [ES-2396] Resolved dependency conflict (#140) * [ES-2396] Resolved dependency conflict Signed-off-by: pvsaidurga * [ES-2396] Resolved dependency conflict Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [ES-2203] excluded unnecessary dependencies (#142) * excluded unnecessary dependencies Signed-off-by: Sachin Rana * excluded more Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * [ES-2203] more exclusions (#144) * more exclusions Signed-off-by: Sachin Rana * final fix Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * [ES-2479] Fixed nullpointer (#149) * [ES-2175] Fixed nullpointer Signed-off-by: pvsaidurga * Fix to avoid NPE in IDA when unverifiedConsentedClaims is not present Signed-off-by: ase-101 --------- Signed-off-by: pvsaidurga Signed-off-by: ase-101 Co-authored-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-2396] configuring errors in uispec (#150) * configuring errors in uispec Signed-off-by: Sachin Rana * adding default uispec errors Signed-off-by: Sachin Rana * corrected non-english text Signed-off-by: Sachin Rana * removed non-english text Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * ES-2484 Cherry picked one commit and added a common url for idrepo (#151) * Version correction and removed unused config and fields (#141) * Version correction and removed unused config and fields Signed-off-by: ase-101 * Version correction and removed unused config and fields Signed-off-by: ase-101 --------- Signed-off-by: ase-101 * [ES-2484] Signed-off-by: pvsaidurga * [ES-2484] Updated review comments Signed-off-by: pvsaidurga --------- Signed-off-by: ase-101 Signed-off-by: pvsaidurga Co-authored-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1613] Added test cases for coverage (#51) * [ES-1613] Signed-off-by: Venkata Saidurga Polamraju * [ES-1613] Reviewed comments Signed-off-by: Venkata Saidurga Polamraju * [ES-1613] Added test cases Signed-off-by: Venkata Saidurga Polamraju * reviewed comments[ES-1618] Signed-off-by: Venkata Saidurga Polamraju --------- Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * Added idrepo get-identity endpoint support Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * Added idrepo get-identity endpoint support Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ES-1899] converted two-letter language codes to their corresponding ISO 639-2/T language codes (#74) Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * ES-1690 adding sunbird authentication plugin (#47) * ES-1690 adding sunbird authentication plugin Signed-off-by: Sachin Rana * addressed review comments Signed-off-by: Sachin Rana * property 'kba' changed to 'kbi' Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana Signed-off-by: Zeeshan Mehboob * [ES-1966] modified test cases for build failure issue (#66) * [MODIFIED] test cases issue resolved Signed-off-by: Zeeshan Mehboob * [RENAMED] KBA to KBI, and error msg to challenge_format Signed-off-by: Zeeshan Mehboob --------- Signed-off-by: Zeeshan Mehboob Signed-off-by: Zeeshan Mehboob <82993262+zesu22@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob * [ES-1806] Added sub claim and updated pom (#78) Signed-off-by: pvsaidurga Signed-off-by: Zeeshan Mehboob * [DSD-6947] esignet 1.5.0 release changes Signed-off-by: techno-467 Signed-off-by: Zeeshan Mehboob * [DSD-6947] esignet 1.5.0 release changes Signed-off-by: Praful Rakhade Signed-off-by: Zeeshan Mehboob * [ES-1613] Added test cases for coverage (#51) * [ES-1613] Signed-off-by: Venkata Saidurga Polamraju * [ES-1613] Reviewed comments Signed-off-by: Venkata Saidurga Polamraju * [ES-1613] Added test cases Signed-off-by: Venkata Saidurga Polamraju * reviewed comments[ES-1618] Signed-off-by: Venkata Saidurga Polamraju --------- Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: Zeeshan Mehboob * Added idrepo get-identity endpoint support Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [DSD-6947] esignet 1.5.0 release changes Signed-off-by: techno-467 Signed-off-by: Zeeshan Mehboob * [DSD-6947] esignet 1.5.0 release changes Signed-off-by: Praful Rakhade Signed-off-by: Zeeshan Mehboob * Test case failures fixed Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [DSD-7282] eSignet 1.5.1 post release changes (#95) Signed-off-by: Praful Rakhade Signed-off-by: Zeeshan Mehboob * [DSD-8264] eSignet 1.6.0 release changes (#132) Signed-off-by: Prafulrakhade Co-authored-by: Prafulrakhade Signed-off-by: Zeeshan Mehboob * Version correction and removed unused config and fields (#141) * Version correction and removed unused config and fields Signed-off-by: ase-101 * Version correction and removed unused config and fields Signed-off-by: ase-101 --------- Signed-off-by: ase-101 Signed-off-by: Zeeshan Mehboob * [ADDED] kernel keymanager service version 1.2.1.0 Signed-off-by: Zeeshan Mehboob * [MODIFIED] test cases issue resolved Signed-off-by: Zeeshan Mehboob * removed duplicate fields Signed-off-by: Sachin Rana --------- Signed-off-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Signed-off-by: Zeeshan Mehboob Signed-off-by: Mohd Kaif Siddique Signed-off-by: ase-101 Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: bunsy-0900 Signed-off-by: Sachin Rana Signed-off-by: Md-Humair-KK Signed-off-by: Zeeshan Mehboob <82993262+zesu22@users.noreply.github.com> Signed-off-by: rajapandi.m Signed-off-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> Signed-off-by: pvsaidurga Signed-off-by: rajapandi1234 <138785181+rajapandi1234@users.noreply.github.com> Signed-off-by: GurukiranP Signed-off-by: techno-467 Signed-off-by: Praful Rakhade Signed-off-by: Prafulrakhade Co-authored-by: Balaji <74903654+balaji-alluru@users.noreply.github.com> Co-authored-by: Mohd Kaif Siddique Co-authored-by: ase-101 Co-authored-by: Venkata Saidurga Polamraju Co-authored-by: bunsy-0900 Co-authored-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> Co-authored-by: Kaif Siddique <74772315+kaifk468@users.noreply.github.com> Co-authored-by: sacrana0 Co-authored-by: Md Humair Kankudti <163233654+Md-Humair-KK@users.noreply.github.com> Co-authored-by: rajapandi1234 <138785181+rajapandi1234@users.noreply.github.com> Co-authored-by: snyk-bot Co-authored-by: Md Humair Kankudti Co-authored-by: Gk <76690271+gk-XL7@users.noreply.github.com> Co-authored-by: Prafulrakhade Co-authored-by: Praful Rakhade --- mock-plugin/pom.xml | 822 +++++++++--------- .../MockAuthenticationServiceTest.java | 3 +- .../mock/service/MockHelperServiceTest.java | 2 +- mosip-identity-plugin/pom.xml | 1 - sunbird-rc-plugin/pom.xml | 5 +- .../test/resources/InsuranceCredential.json | 30 + 6 files changed, 446 insertions(+), 417 deletions(-) create mode 100644 sunbird-rc-plugin/src/test/resources/InsuranceCredential.json diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index cee04b73..feef11ce 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -1,411 +1,411 @@ - - 4.0.0 - - io.mosip.esignet - mock-plugin - 1.3.4-SNAPSHOT - mock-plugin - jar - Mockup of a wrapper implementation that is used to showcase the integration with e-Signet - https://github.com/mosip/esignet-plugins - - - - MPL 2.0 - https://www.mozilla.org/en-US/MPL/2.0/ - - - - - scm:git:git://github.com/mosip/esignet-plugins.git - scm:git:ssh://github.com:mosip/esignet-plugins.git - https://github.com/mosip/esignet-plugins - HEAD - - - - - Mosip - mosip.emailnotifier@gmail.com - io.mosip - https://github.com/mosip/esignet-plugins - - - - - - ossrh-central - MavenCentralRepository - https://central.sonatype.com/repository/maven-snapshots - default - - true - - - - central - MavenCentral - default - https://repo1.maven.org/maven2 - - false - - - - - - - ossrh - https://central.sonatype.com/repository/maven-snapshots/ - - - ossrh - https://central.sonatype.com/api/v1/publisher - - - - - 11 - UTF-8 - - - 11 - 11 - 3.8.0 - 3.0.2 - 3.1.0 - 2.22.0 - 0.8.5 - 3.7.0.1746 - 3.2.0 - 2.3 - - Hoxton.SR8 - 2.3.6.RELEASE - - 1.2.2.0-SNAPSHOT - 1.7.0-SNAPSHOT - 1.3.0-SNAPSHOT - - **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** - **/dto/**,**/entity/**,**/config/** - - - - - junit - junit - 4.13.1 - test - - - - org.projectlombok - lombok - 1.18.22 - compile - - - - io.mosip.esignet - esignet-core - ${esignet.version} - provided - - - - io.mosip.esignet - esignet-integration-api - ${esignet.version} - provided - - - - io.mosip.kernel - kernel-keymanager-service - ${kernel-keymanager-service.version} - provided - lib - - - org.springframework.cloud - spring-cloud-starter-sleuth - - - org.springframework.security - spring-security-test - - - - - - io.mosip.signup - signup-integration-api - ${esignet-signup.version} - provided - - - - - - sonar - - . - src/main/java/**,src/main/resources/** - ${sonar.coverage.exclusions} - https://sonarcloud.io - - - false - - - - - org.sonarsource.scanner.maven - sonar-maven-plugin - ${maven.sonar.plugin.version} - - - verify - - sonar - - - - - - - - - - openapi-doc-generate-profile - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring.boot.version} - - true - ZIP - - - - pre-integration-test - - start - - - - src/test/resources - - - openapi-profile - - - --server.port=8090 - --server.servlet.path=/app/generic - - - - - - post-integration-test - - stop - - - - - build-info - repackage - - - - - - org.springdoc - springdoc-openapi-maven-plugin - 0.2 - - - integration-test - - generate - - - - - http://localhost:8090/app/generic/v3/api-docs - openapi.json - ${project.build.directory} - false - - - - - - - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - ${skipTests} - false - - ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED - --illegal-access=permit - - - - - org.jacoco - jacoco-maven-plugin - ${maven.jacoco.version} - - - - prepare-agent - - - - report - prepare-package - - report - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - true - true - - - ${project.name} - ${project.version} - - - - - - org.apache.maven.plugins - maven-war-plugin - - - - true - true - - - ${project.name} - ${project.version} - - - - - - org.apache.maven.plugins - maven-javadoc-plugin - - - attach-javadocs - - jar - - - - - none - - - - org.sonatype.central - central-publishing-maven-plugin - 0.7.0 - true - - ossrh - false - - - - - org.apache.maven.plugins - maven-source-plugin - - - attach-sources - - jar-no-fork - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.5 - - - sign-artifacts - verify - - sign - - - - --pinentry-mode - loopback - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - ${maven.compiler.source} - ${maven.compiler.target} - - - - pl.project13.maven - git-commit-id-plugin - - - get-the-git-infos - - revision - - validate - - - - true - ${project.build.outputDirectory}/git.properties - - ^git.build.(time|version)$ - ^git.commit.id.(abbrev|full)$ - - full - ${project.basedir}/.git - json - - - - - - + + 4.0.0 + + io.mosip.esignet + mock-plugin + 1.3.4-SNAPSHOT + mock-plugin + jar + Mockup of a wrapper implementation that is used to showcase the integration with e-Signet + https://github.com/mosip/esignet-plugins + + + + MPL 2.0 + https://www.mozilla.org/en-US/MPL/2.0/ + + + + + scm:git:git://github.com/mosip/esignet-plugins.git + scm:git:ssh://github.com:mosip/esignet-plugins.git + https://github.com/mosip/esignet-plugins + HEAD + + + + + Mosip + mosip.emailnotifier@gmail.com + io.mosip + https://github.com/mosip/esignet-plugins + + + + + + ossrh-central + MavenCentralRepository + https://central.sonatype.com/repository/maven-snapshots + default + + true + + + + central + MavenCentral + default + https://repo1.maven.org/maven2 + + false + + + + + + + ossrh + https://central.sonatype.com/repository/maven-snapshots/ + + + ossrh + https://central.sonatype.com/api/v1/publisher + + + + + 11 + UTF-8 + + + 11 + 11 + 3.8.0 + 3.0.2 + 3.1.0 + 2.22.0 + 0.8.5 + 3.7.0.1746 + 3.2.0 + 2.3 + + Hoxton.SR8 + 2.3.6.RELEASE + + 1.2.2.0-SNAPSHOT + 1.7.0-SNAPSHOT + 1.3.0-SNAPSHOT + + **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** + **/dto/**,**/entity/**,**/config/** + + + + + junit + junit + 4.13.1 + test + + + + org.projectlombok + lombok + 1.18.22 + compile + + + + io.mosip.esignet + esignet-core + ${esignet.version} + provided + + + + io.mosip.esignet + esignet-integration-api + ${esignet.version} + provided + + + + io.mosip.kernel + kernel-keymanager-service + ${kernel-keymanager-service.version} + provided + lib + + + org.springframework.cloud + spring-cloud-starter-sleuth + + + org.springframework.security + spring-security-test + + + + + + io.mosip.signup + signup-integration-api + ${esignet-signup.version} + provided + + + + + + sonar + + . + src/main/java/**,src/main/resources/** + ${sonar.coverage.exclusions} + https://sonarcloud.io + + + false + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${maven.sonar.plugin.version} + + + verify + + sonar + + + + + + + + + + openapi-doc-generate-profile + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring.boot.version} + + true + ZIP + + + + pre-integration-test + + start + + + + src/test/resources + + + openapi-profile + + + --server.port=8090 + --server.servlet.path=/app/generic + + + + + + post-integration-test + + stop + + + + + build-info + repackage + + + + + + org.springdoc + springdoc-openapi-maven-plugin + 0.2 + + + integration-test + + generate + + + + + http://localhost:8090/app/generic/v3/api-docs + openapi.json + ${project.build.directory} + false + + + + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + ${skipTests} + false + + ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED + --illegal-access=permit + + + + + org.jacoco + jacoco-maven-plugin + ${maven.jacoco.version} + + + + prepare-agent + + + + report + prepare-package + + report + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + true + true + + + ${project.name} + ${project.version} + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + true + true + + + ${project.name} + ${project.version} + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + none + + + + org.sonatype.central + central-publishing-maven-plugin + 0.7.0 + true + + ossrh + false + + + + + org.apache.maven.plugins + maven-source-plugin + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-gpg-plugin + 1.5 + + + sign-artifacts + verify + + sign + + + + --pinentry-mode + loopback + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${maven.compiler.source} + ${maven.compiler.target} + + + + pl.project13.maven + git-commit-id-plugin + + + get-the-git-infos + + revision + + validate + + + + true + ${project.build.outputDirectory}/git.properties + + ^git.build.(time|version)$ + ^git.commit.id.(abbrev|full)$ + + full + ${project.basedir}/.git + json + + + + + + \ No newline at end of file diff --git a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java index 86e5787b..6ab13e0a 100644 --- a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java +++ b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java @@ -272,6 +272,5 @@ public void convertLangCodesToISO3LanguageCodes_withValidInput_thenPass() { Assert.assertEquals(langCodes.get(0), "eng"); Assert.assertEquals(langCodes.get(1), "khm"); } -} - +} diff --git a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java index a41e6a17..577ca1b9 100644 --- a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java +++ b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java @@ -502,4 +502,4 @@ public void isSupportedOtpChannelWithUnSupportedChannel_thenFail(){ boolean isSupported= mockHelperService.isSupportedOtpChannel("phone"); Assert.assertFalse(isSupported); } -} \ No newline at end of file +} diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 8aae748b..8b492519 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -485,7 +485,6 @@ false - org.apache.maven.plugins maven-source-plugin diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index c8bf4eec..24b05d66 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -76,11 +76,12 @@ 2.22.0 1.5 2.2.1 - 1.6.7 + 0.7.0 3.0.1 0.8.5 3.3.1 1.7.0-SNAPSHOT + 1.2.1.0 @@ -108,7 +109,7 @@ io.mosip.kernel kernel-keymanager-service - 1.2.1.0 + ${kernel-keymanager-service.version} provided lib diff --git a/sunbird-rc-plugin/src/test/resources/InsuranceCredential.json b/sunbird-rc-plugin/src/test/resources/InsuranceCredential.json new file mode 100644 index 00000000..df4001a2 --- /dev/null +++ b/sunbird-rc-plugin/src/test/resources/InsuranceCredential.json @@ -0,0 +1,30 @@ +##Here we are injecting DateTool instance from java velocity library to set the expiry date +#set( $defaultLocale = $date.getLocale() ) +#set( $calenderNow = $date.getCalendar() ) +#set( $ISO8601DateTimeWithMillisUTC = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" ) +## Adding no. of Days we want to set as expiry,here '5' represent Day and '30' represent no. of days +#set( $expiry =$calenderNow.add(5,30)) +{ +"@context": [ +"https://www.w3.org/2018/credentials/v1", +"https://holashchand.github.io/test_project/insurance-context.json" +], +"type": [ +"VerifiableCredential", +"InsuranceCredential" +], +"issuer": "${issuerId}", +"expirationDate": "${date.format($ISO8601DateTimeWithMillisUTC, $calenderNow, $defaultLocale)}", +"credentialSubject": { +"dob": "${dob}", +"gender": "${gender}", +"mobile": "${mobile}", +"benefits": #if($benefits)$benefits#else#set($benefits = '"[]"') $benefits#end, +"fullName": "${fullName}", +"email": "${email}", +"policyIssuedOn": "${policyIssuedOn}", +"policyExpiresOn": "${policyExpiresOn}", +"policyName": "${policyName}", +"policyNumber": "${policyNumber}" +} +} \ No newline at end of file From 677146051df3829c4e17048b3cee10c4947dd25f Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Tue, 9 Sep 2025 22:16:39 +0530 Subject: [PATCH 26/58] [ES-2456] Pull Dynamic Field, doc-category & doc-type data from master data service (#145) * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * ES-2456 Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK * review comments fixed Signed-off-by: Md-Humair-KK * review comments solved Signed-off-by: Md-Humair-KK * resolved review comments Signed-off-by: Md-Humair-KK --------- Signed-off-by: pvsaidurga Signed-off-by: Md-Humair-KK Co-authored-by: pvsaidurga --- .../IdrepoProfileRegistryPluginImpl.java | 142 ++++++++++++++++- .../src/main/resources/application.properties | 5 + .../IdrepoProfileRegistryPluginImplTest.java | 145 +++++++++++++++++- 3 files changed, 284 insertions(+), 8 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index be9e6881..30ac0ebc 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -15,11 +15,6 @@ import com.jayway.jsonpath.PathNotFoundException; import io.micrometer.core.annotation.Timed; import io.mosip.esignet.core.util.IdentityProviderUtil; -import io.mosip.signup.plugin.mosipid.dto.VerificationMetadata; -import io.mosip.signup.plugin.mosipid.dto.*; -import io.mosip.signup.plugin.mosipid.util.BiometricUtil; -import io.mosip.signup.plugin.mosipid.util.ErrorConstants; -import io.mosip.signup.plugin.mosipid.util.ProfileCacheService; import io.mosip.kernel.core.util.HMACUtils2; import io.mosip.signup.api.dto.ProfileDto; import io.mosip.signup.api.dto.ProfileResult; @@ -27,6 +22,10 @@ import io.mosip.signup.api.exception.ProfileException; import io.mosip.signup.api.spi.ProfileRegistryPlugin; import io.mosip.signup.api.util.ProfileCreateUpdateStatus; +import io.mosip.signup.plugin.mosipid.dto.*; +import io.mosip.signup.plugin.mosipid.util.BiometricUtil; +import io.mosip.signup.plugin.mosipid.util.ErrorConstants; +import io.mosip.signup.plugin.mosipid.util.ProfileCacheService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -35,6 +34,7 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -42,6 +42,7 @@ import org.springframework.web.client.RestTemplate; import javax.annotation.PostConstruct; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.time.ZoneOffset; @@ -145,6 +146,13 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("#{${mosip.signup.mosipid.uispec.errors:null}}") private Map errorsFromConfig = new HashMap<>(); + @Value("${mosip.signup.mosipid.dynamic-fields.endpoint}") + private String dynamicFieldsBaseUrl; + + @Value("${mosip.signup.mosipid.doc-types-category.endpoint}") + private String docTypesAndCategoryBaseUrl; + + private JsonNode uiSpec; @PostConstruct @@ -160,16 +168,138 @@ public void init() { } catch (PathNotFoundException e) { errors = errorsFromConfig; } + JsonNode allowedValues = generateAllowedValues(); + this.uiSpec = objectMapper.valueToTree( Map.ofEntries( Map.entry("schema", schema), Map.entry("errors", errors), - Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)) + Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)), + Map.entry("allowedValues", allowedValues) ) ); } + /** + * Generate combined JsonNode from List dynamicFields and List documentCategories + * @return JsonNode containing the allowed values. + */ + public JsonNode generateAllowedValues() { + ObjectNode result = objectMapper.createObjectNode(); + fetchAndProcessDynamicFields(result); + fetchAndProcessDocTypesAndCategories(result); + return result; + } + + private String buildDynamicFieldsUrl(int pageNumber, int pageSize) { + return String.format(dynamicFieldsBaseUrl, pageNumber, pageSize); + } + + /** + * Fetch and process document types and categories + */ + private void fetchAndProcessDocTypesAndCategories(ObjectNode result) { + ResponseEntity response = restTemplate.getForEntity(docTypesAndCategoryBaseUrl, JsonNode.class); + JsonNode responseBody = response.getBody(); + + if (responseBody != null && responseBody.has("response")) { + JsonNode data = responseBody.get("response").get("documentCategories"); + if (data != null && data.isArray()) { + for (JsonNode item : data) { + if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; + + String categoryCode = item.hasNonNull("code") ? item.get("code").asText() : null; + String langCode = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; + JsonNode documentTypes = item.get("documentTypes"); + + if (categoryCode == null || langCode == null || documentTypes == null || !documentTypes.isArray()) + continue; + + ObjectNode docTypeMap = (ObjectNode) result.get(categoryCode); + if (docTypeMap == null) { + docTypeMap = objectMapper.createObjectNode(); + result.set(categoryCode, docTypeMap); + } + + for (JsonNode docType : documentTypes) { + String docTypeCode = docType.hasNonNull("code") ? docType.get("code").asText() : null; + String docTypeName = docType.hasNonNull("name") ? docType.get("name").asText() : null; + if (docTypeCode == null || docTypeName == null) continue; + + ObjectNode langMap = (ObjectNode) docTypeMap.get(docTypeCode); + if (langMap == null) { + langMap = objectMapper.createObjectNode(); + docTypeMap.set(docTypeCode, langMap); + } + langMap.put(langCode, docTypeName); + } + } + } + } + } + + /** + * Fetch and processes the dynamic fields JSON list and adds their structured data into the provided ObjectNode. + * @param result The ObjectNode where data is accumulated + */ + private void fetchAndProcessDynamicFields(ObjectNode result) { + int pageNumber = 0; + int pageSize = 10; + int totalPages = 1; + int totalItems = 0; + + while (pageNumber < totalPages) { + String url = buildDynamicFieldsUrl(pageNumber, pageSize); + ResponseEntity response = restTemplate.getForEntity(url, JsonNode.class); + JsonNode responseBody = response.getBody(); + if (responseBody != null && responseBody.has("response")) { + JsonNode responseNode = responseBody.get("response"); + if (pageNumber == 0) { + totalPages = objectMapper.convertValue(responseNode.get("totalPages"), Integer.class); + totalItems = objectMapper.convertValue(responseNode.get("totalItems"), Integer.class); + } + JsonNode data = responseNode.get("data"); + if (data != null && data.isArray()) { + for (JsonNode item : data) { + if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; + + String name = item.hasNonNull("name") ? item.get("name").asText() : null; + String lang = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; + JsonNode fieldValues = item.get("fieldVal"); + + if (name == null || lang == null || fieldValues == null || !fieldValues.isArray()) continue; + + ObjectNode nameNode = (ObjectNode) result.get(name); + if (nameNode == null) { + nameNode = objectMapper.createObjectNode(); + result.set(name, nameNode); + } + + for (JsonNode fv : fieldValues) { + String code = fv.hasNonNull("code") ? fv.get("code").asText() : null; + String value = fv.hasNonNull("value") ? fv.get("value").asText() : null; + if (code == null || value == null) continue; + + ObjectNode langMap = (ObjectNode) nameNode.get(code); + if (langMap == null) { + langMap = objectMapper.createObjectNode(); + nameNode.set(code, langMap); + } + langMap.put(lang, value); + } + } + } + } + pageNumber++; + int remainingItems = totalItems - (pageNumber * pageSize); + if (remainingItems < pageSize) { + pageSize = remainingItems; + } + } + } + + @Override public void validate(String action, ProfileDto profileDto) throws InvalidProfileException { if (!ACTIONS.contains(action)) { diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 319dd124..fa257b79 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -50,6 +50,11 @@ mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/crede mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?version=0.1&type=schema&identitySchemaVersion=0.1 mosip.signup.mosipid.uispec.errors={required:{en:"This field is required"},passwordMismatch:{en:"Passwords is not matching please check your password"}} +mosip.signup.mosipid.dynamic-fields.endpoint=http://masterdata.kernel/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d" + +# for multiple languages scenario, the languages should be appended followed by ampersand as ?languages=eng&languages=fra&languages=khm +mosip.signup.mosipid.doc-types-category.endpoint=http://masterdata.kernel/v1/masterdata/applicanttype/000/languages?languages=eng + mosip.signup.idrepo.add-identity.request.id=mosip.id.create mosip.signup.idrepo.update-identity.request.id=mosip.id.update mosip.signup.idrepo.identity.request.version=v1 diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 8b96e4b9..5994503d 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -2,6 +2,8 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import io.mosip.signup.api.dto.ProfileDto; import io.mosip.signup.api.dto.ProfileResult; @@ -58,9 +60,12 @@ public void beforeEach(){ ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "identityEndpoint","http://localhost:8080/identity/v1/identity/"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "generateHashEndpoint","http://localhost:8080/identity/v1/identity/genereateHash/"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getIdentityEndpoint","http://localhost:8080/identity/v1/identity/"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "mandatoryLanguages",List.of("eng")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getIdentityEndpointMethod", "POST"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getStatusEndpoint","http://localhost:8080/identity/v1/identity/"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "dynamicFieldsBaseUrl","http://mock/api/dynamicFields"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "docTypesAndCategoryBaseUrl", "http://mock/api/docTypes"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "mandatoryLanguages", List.of("en")); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "optionalLanguages", List.of("fr","ar")); } @Test @@ -99,7 +104,7 @@ public void validate_withValidProfileContainingArrayDataType_thenPass() { Map identityData = new HashMap<>(); SimpleType [] simpleTypesArray=new SimpleType[1]; SimpleType simpleType=new SimpleType(); - simpleType.setLanguage("eng"); + simpleType.setLanguage("en"); simpleType.setValue("John Doe"); simpleTypesArray[0]=simpleType; identityData.put("phone","+91841987567"); @@ -533,4 +538,140 @@ private JsonNode createIdentity() { identityData.put("phone","+91841987567"); return objectMapper.valueToTree(identityData); } + + @Test + public void generateAllowedValues_withValidDetails_thenPass() { + ObjectNode dynamicItem = objectMapper.createObjectNode(); + dynamicItem.put("isActive", true); + dynamicItem.put("name", "fieldName"); + dynamicItem.put("langCode", "eng"); + + ArrayNode fieldValArray = objectMapper.createArrayNode(); + ObjectNode fieldVal = objectMapper.createObjectNode(); + fieldVal.put("code", "code1"); + fieldVal.put("value", "value1"); + fieldValArray.add(fieldVal); + dynamicItem.set("fieldVal", fieldValArray); + ArrayNode dynamicDataArray = objectMapper.createArrayNode(); + dynamicDataArray.add(dynamicItem); + + ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); + dynamicResponseNode.put("totalPages", 1); + dynamicResponseNode.put("totalItems", 1); + dynamicResponseNode.set("data", dynamicDataArray); + ObjectNode dynamicWrapper = objectMapper.createObjectNode(); + dynamicWrapper.set("response", dynamicResponseNode); + + ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + + ObjectNode categoryItem = objectMapper.createObjectNode(); + categoryItem.put("isActive", true); + categoryItem.put("code", "cat1"); + categoryItem.put("langCode", "eng"); + + ArrayNode docTypesArray = objectMapper.createArrayNode(); + ObjectNode docType = objectMapper.createObjectNode(); + docType.put("code", "doc1"); + docType.put("name", "Document Name"); + docTypesArray.add(docType); + + categoryItem.set("documentTypes", docTypesArray); + + ArrayNode docCategoriesArray = objectMapper.createArrayNode(); + docCategoriesArray.add(categoryItem); + ObjectNode docResponseNode = objectMapper.createObjectNode(); + docResponseNode.set("documentCategories", docCategoriesArray); + ObjectNode docWrapper = objectMapper.createObjectNode(); + docWrapper.set("response", docResponseNode); + + ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + + JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + + Assert.assertNotNull(result); + Assert.assertTrue(result.has("fieldName")); + Assert.assertTrue(result.get("fieldName").has("code1")); + Assert.assertEquals("value1", result.get("fieldName").get("code1").get("eng").asText()); + + Assert.assertTrue(result.has("cat1")); + Assert.assertTrue(result.get("cat1").has("doc1")); + Assert.assertEquals("Document Name", result.get("cat1").get("doc1").get("eng").asText()); + } + + @Test + public void generateAllowedValues_withInactiveDynamicField_thenFail() { + ObjectNode dynamicItem = objectMapper.createObjectNode(); + dynamicItem.put("isActive", false); + + ArrayNode dynamicDataArray = objectMapper.createArrayNode(); + dynamicDataArray.add(dynamicItem); + ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); + dynamicResponseNode.put("totalPages", 1); + dynamicResponseNode.put("totalItems", 1); + dynamicResponseNode.set("data", dynamicDataArray); + ObjectNode dynamicWrapper = objectMapper.createObjectNode(); + dynamicWrapper.set("response", dynamicResponseNode); + + ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + ObjectNode docWrapper = objectMapper.createObjectNode(); + docWrapper.set("response", objectMapper.createObjectNode().set("documentCategories", objectMapper.createArrayNode())); + ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + + JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + Assert.assertNotNull(result); + Assert.assertEquals(0, result.size()); + } + + @Test + public void generateAllowedValues_withInactiveDocumentTypesAndCategories_thenFail() { + ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); + dynamicResponseNode.put("totalPages", 1); + dynamicResponseNode.put("totalItems", 0); + dynamicResponseNode.set("data", objectMapper.createArrayNode()); + + ObjectNode dynamicWrapper = objectMapper.createObjectNode(); + dynamicWrapper.set("response", dynamicResponseNode); + + ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + + ObjectNode inactiveCategory = objectMapper.createObjectNode(); + inactiveCategory.put("isActive", false); // should be skipped + inactiveCategory.put("code", "cat1"); + inactiveCategory.put("langCode", "eng"); + + ObjectNode activeCategoryWithInactiveDocType = objectMapper.createObjectNode(); + activeCategoryWithInactiveDocType.put("isActive", false); + activeCategoryWithInactiveDocType.put("code", "cat2"); + activeCategoryWithInactiveDocType.put("langCode", "eng"); + + ArrayNode docTypesArray = objectMapper.createArrayNode(); + ObjectNode inactiveDocType = objectMapper.createObjectNode(); + inactiveDocType.put("code", "doc1"); + docTypesArray.add(inactiveDocType); + activeCategoryWithInactiveDocType.set("documentTypes", docTypesArray); + + ArrayNode docCategoriesArray = objectMapper.createArrayNode(); + docCategoriesArray.add(inactiveCategory); + docCategoriesArray.add(activeCategoryWithInactiveDocType); + + ObjectNode docResponseNode = objectMapper.createObjectNode(); + docResponseNode.set("documentCategories", docCategoriesArray); + + ObjectNode docWrapper = objectMapper.createObjectNode(); + docWrapper.set("response", docResponseNode); + + ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); + Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + + JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + + Assert.assertNotNull(result); + Assert.assertEquals(0, result.size()); + } + } From b26a4e63f546f53b9cc7bb0b6c12f1ee7bb6469e Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Tue, 9 Sep 2025 22:22:36 +0530 Subject: [PATCH 27/58] [ES-2396] removed version from uispec url (#156) * removed version from uispec url Signed-off-by: Sachin Rana * removed idSchemaVersion from uispec url Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- mosip-identity-plugin/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index fa257b79..01fd0cfa 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -47,7 +47,7 @@ mosip.signup.idrepo.get-uin.endpoint=http://idgenerator.kernel/v1/idgenerator/ui mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/credentialrequest/get/ # This is the url to fetch ui-spec from masterdata - 'esignet-signup' in the url should match with domain name of the schema in the masterdata. -mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?version=0.1&type=schema&identitySchemaVersion=0.1 +mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?type=schema mosip.signup.mosipid.uispec.errors={required:{en:"This field is required"},passwordMismatch:{en:"Passwords is not matching please check your password"}} mosip.signup.mosipid.dynamic-fields.endpoint=http://masterdata.kernel/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d" From 130a2bf6f17e6b2555ebdbc5d94602fb7882da7b Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Mon, 15 Sep 2025 01:20:08 +0530 Subject: [PATCH 28/58] Using kernel-cbeff-util to create bir to xml (#157) Signed-off-by: Sachin Rana --- mosip-identity-plugin/pom.xml | 2 +- .../IdrepoProfileRegistryPluginImpl.java | 8 ++-- .../plugin/mosipid/util/BiometricUtil.java | 39 +++++++------------ 3 files changed, 20 insertions(+), 29 deletions(-) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 8b492519..735d7da1 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -149,7 +149,7 @@ io.mosip.kernel - kernel-biometrics-api + kernel-cbeffutil-api 1.2.0.3 diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 30ac0ebc..631bd818 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -121,9 +121,6 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.idrepo.biometric.field-name:individualBiometrics}") private String biometricDataFieldName; - @Value("${mosip.signup.idrepo.biometric.compression-ratio:1000}") - private int faceImageCompressionRatio; - @Autowired @Qualifier("selfTokenRestTemplate") private RestTemplate restTemplate; @@ -134,6 +131,9 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Autowired private ProfileCacheService profileCacheService; + @Autowired + private BiometricUtil biometricUtil; + @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") private String uiSpecUrl; @@ -732,7 +732,7 @@ private ArrayNode buildDocuments(JsonNode inputJson) { String base64FaceImage = inputJson.path(biometricDataFieldName).path("value").textValue(); String base64BirXmlEncoded = null; try { - base64BirXmlEncoded = BiometricUtil.convertBase64JpegToBase64BirXML(base64FaceImage, faceImageCompressionRatio); + base64BirXmlEncoded = biometricUtil.convertBase64JpegToBase64BirXML(base64FaceImage); } catch (Exception e) { log.error("Failed to create cbeff from face image: ", e); throw new ProfileException(INVALID_INDIVIDUAL_BIOMETRICS); diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java index 12fee4cd..f632139b 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java @@ -7,30 +7,30 @@ import io.mosip.kernel.biometrics.constant.PurposeType; import io.mosip.kernel.biometrics.constant.QualityType; import io.mosip.kernel.biometrics.entities.*; -import org.springframework.oxm.jaxb.Jaxb2Marshaller; +import io.mosip.kernel.biometrics.spi.CbeffUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; import org.springframework.util.Base64Utils; -import javax.xml.transform.stream.StreamResult; -import java.io.StringWriter; -import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.List; import static io.mosip.biometrics.util.CommonUtil.convertJPEGToJP2UsingOpenCV; +@Component public class BiometricUtil { - private static final Jaxb2Marshaller marshaller; + @Autowired + private CbeffUtil cbeffUtil; - static { - marshaller = new Jaxb2Marshaller(); - marshaller.setClassesToBeBound(BIR.class); - } + @Value("${mosip.signup.idrepo.biometric.compression-ratio:1000}") + private int faceImageCompressionRatio; - public static String convertBase64JpegToBase64BirXML(String base64Jpeg, int imageCompressionRatio) throws Exception { + public String convertBase64JpegToBase64BirXML(String base64Jpeg) throws Exception { byte[] jpegImage = Base64Utils.decodeFromString(base64Jpeg); - byte[] jp2Image = convertJPEGToJP2UsingOpenCV(jpegImage, imageCompressionRatio); + byte[] jp2Image = convertJPEGToJP2UsingOpenCV(jpegImage, faceImageCompressionRatio); ConvertRequestDto convertRequest = new ConvertRequestDto(); convertRequest.setVersion("ISO19794_5_2011"); @@ -38,21 +38,16 @@ public static String convertBase64JpegToBase64BirXML(String base64Jpeg, int imag convertRequest.setImageType(0); convertRequest.setInputBytes(jp2Image); convertRequest.setModality("Face"); - convertRequest.setCompressionRatio(imageCompressionRatio); + convertRequest.setCompressionRatio(faceImageCompressionRatio); byte[] isoImage = FaceEncoder.convertFaceImageToISO(convertRequest); BIR bir = createBIRFromISO(isoImage); - StringWriter sw = new StringWriter(); - StreamResult result = new StreamResult(sw); - marshaller.marshal(bir, result); - String birXml = sw.toString(); - - return Base64Utils.encodeToUrlSafeString(birXml.getBytes(StandardCharsets.UTF_8)); + return Base64Utils.encodeToUrlSafeString(cbeffUtil.createXML(List.of(bir))); } - public static BIR createBIRFromISO(byte[] isoImage) { + public BIR createBIRFromISO(byte[] isoImage) { BIRInfo birInfo = new BIRInfo.BIRInfoBuilder().withIntegrity(false).build(); BDBInfo bdbInfo = new BDBInfo.BDBInfoBuilder() .withCreationDate(LocalDateTime.now(ZoneOffset.UTC)) @@ -62,7 +57,7 @@ public static BIR createBIRFromISO(byte[] isoImage) { .withFormat(new RegistryIDType("Mosip", "8")) .withQuality(new QualityType(new RegistryIDType("HMAC", "SHA-256"), 0L, null)) .build(); - BIR faceBir = new BIR.BIRBuilder() + BIR bir = new BIR.BIRBuilder() .withVersion(new VersionType(1, 1)) .withCbeffversion(new VersionType(1, 1)) .withBirInfo(birInfo) @@ -71,10 +66,6 @@ public static BIR createBIRFromISO(byte[] isoImage) { .withOthers(null) .build(); - BIR bir = new BIR.BIRBuilder() - .withBirInfo(birInfo) - .build(); - bir.setBirs(List.of(faceBir)); return bir; } } From 3372f5c1658159cc98c499e7848dcbfa4a4a7e92 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Tue, 16 Sep 2025 13:53:13 +0530 Subject: [PATCH 29/58] resolved failure of jpeg to bir conversion (#159) Signed-off-by: Sachin Rana --- mosip-identity-plugin/pom.xml | 6 ------ .../mosipid/service/IdrepoProfileRegistryPluginImpl.java | 5 ++++- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 735d7da1..ff6afea3 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -210,12 +210,6 @@ test - - io.mosip.kernel - kernel-cbeffutil-api - 1.2.0.3 - - junit junit diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 631bd818..2d738ea5 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; +import com.github.jaiimageio.jpeg2000.impl.J2KImageReaderSpi; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.PathNotFoundException; import io.micrometer.core.annotation.Timed; @@ -42,7 +43,7 @@ import org.springframework.web.client.RestTemplate; import javax.annotation.PostConstruct; -import java.net.URLEncoder; +import javax.imageio.spi.IIORegistry; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; import java.time.ZoneOffset; @@ -178,6 +179,8 @@ public void init() { Map.entry("allowedValues", allowedValues) ) ); + IIORegistry registry = IIORegistry.getDefaultInstance(); + registry.registerServiceProvider(new J2KImageReaderSpi()); } From bc0593d4489d14187f3ae4976ced9d2f3da8d8bd Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 19 Sep 2025 22:43:27 +0530 Subject: [PATCH 30/58] MOSIP-42548 Signed-off-by: ase-101 --- .gitignore | 3 +++ mosip-identity-plugin/pom.xml | 6 +++--- mosip-identity-plugin/src/assembly.xml | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 mosip-identity-plugin/src/assembly.xml diff --git a/.gitignore b/.gitignore index 9a36a0ca..6f6af796 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,6 @@ target/ .project/ helm/*/Chart.lock helm/*/charts/ + +.DS_Store +Thumbs.db diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index ff6afea3..40d8c04a 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -374,9 +374,9 @@ maven-assembly-plugin 3.7.1 - - jar-with-dependencies - + + src/assembly.xml + false diff --git a/mosip-identity-plugin/src/assembly.xml b/mosip-identity-plugin/src/assembly.xml new file mode 100644 index 00000000..959ef587 --- /dev/null +++ b/mosip-identity-plugin/src/assembly.xml @@ -0,0 +1,18 @@ + + jar-with-dependencies + + jar + + false + + + + true + false + runtime + + + From 6efb4cf05d4ac0884c7c96a09fbd276020fd1c45 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Sun, 21 Sep 2025 11:51:17 +0530 Subject: [PATCH 31/58] ES-2540 (#161) Signed-off-by: ase-101 --- mosip-identity-plugin/src/assembly.xml | 34 +++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/mosip-identity-plugin/src/assembly.xml b/mosip-identity-plugin/src/assembly.xml index 959ef587..9f75fdf9 100644 --- a/mosip-identity-plugin/src/assembly.xml +++ b/mosip-identity-plugin/src/assembly.xml @@ -2,17 +2,43 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 https://maven.apache.org/xsd/assembly-1.1.3.xsd"> - jar-with-dependencies + + + jar-with-runtime-deps + jar + + false + + + + ${project.build.outputDirectory} + / + + **/* + + + + + + ${project.basedir} + META-INF/maven/${project.groupId}/${project.artifactId} + + pom.xml + + + + + - true - false - runtime + false + true + runtime From de3ea594cef79d42d848383c816413d668c04d29 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Sun, 21 Sep 2025 13:46:54 +0530 Subject: [PATCH 32/58] ES-2556 MOSIP-42548 (#162) Signed-off-by: ase-101 --- mosip-identity-plugin/pom.xml | 2 +- .../esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 40d8c04a..5188f241 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -144,7 +144,7 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml - 2.11.3 + 2.15.0 diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java index e179db0a..ac96d3f6 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImpl.java @@ -81,10 +81,10 @@ public class IdaAuthenticatorImpl implements Authenticator { @Value("${mosip.esignet.authenticator.ida.get-certificates-url}") private String getCertsUrl; - @Value("${mosip.esignet.authenticator.ida.application-id:IDA}") + @Value("${mosip.esignet.authenticator.ida.application-id:IDA_KYC_EXCHANGE}") private String applicationId; - @Value("${mosip.esignet.authenticator.ida.reference-id:SIGN}") + @Value("${mosip.esignet.authenticator.ida.reference-id: }") private String referenceId; @Value("${mosip.esignet.authenticator.ida.client-id}") From 797c96ebe852c4b4b659f8bdd84d3495b1780545 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Mon, 22 Sep 2025 20:41:05 +0530 Subject: [PATCH 33/58] ES 2537 Add i18nValues property instead of errors property, take allowedValues from uiSpec and append (#158) * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * ES-2456 Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK * review comments fixed Signed-off-by: Md-Humair-KK * review comments solved Signed-off-by: Md-Humair-KK * resolved review comments Signed-off-by: Md-Humair-KK * ES-2537 Signed-off-by: Md-Humair-KK * changes done for allowedvalues and errors Signed-off-by: Md-Humair-KK * ES-2537 Signed-off-by: Md-Humair-KK * ES-2537 Signed-off-by: Md-Humair-KK --------- Signed-off-by: pvsaidurga Signed-off-by: Md-Humair-KK Co-authored-by: pvsaidurga --- .../IdrepoProfileRegistryPluginImpl.java | 77 +++++++++++++++++-- 1 file changed, 69 insertions(+), 8 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 2d738ea5..0faeb226 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -141,6 +141,18 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.schema}") private String schemaJsonpath; + @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.allowedValues}") + private String allowedValuesJsonpath; + + @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.i18nValues}") + private String i18nValuesJsonpath; + + @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.i18nValues.errors}") + private String i18nValuesErrorJsonpath; + + @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.maxUploadFileSize}") + private String maxUploadFileSizeJsonpath; + @Value("${mosip.signup.mosipid.uispec.errors-jsonpath:$[0].jsonSpec[0].spec.errors}") private String errorsJsonpath; @@ -163,26 +175,75 @@ public void init() { .getResponse() .toString(); Object schema = JsonPath.read(responseJson, schemaJsonpath); - Object errors; - try { - errors = JsonPath.read(responseJson, errorsJsonpath); - } catch (PathNotFoundException e) { - errors = errorsFromConfig; - } - JsonNode allowedValues = generateAllowedValues(); + Object errors = readErrors(responseJson, errorsJsonpath); + ObjectNode i18nValues = readI18nValues(responseJson); + JsonNode allowedValues = readAllowedValues(responseJson); + Object maxUploadFileSize = JsonPath.read(responseJson, maxUploadFileSizeJsonpath); this.uiSpec = objectMapper.valueToTree( Map.ofEntries( Map.entry("schema", schema), Map.entry("errors", errors), + Map.entry("i18nValues", i18nValues), Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)), - Map.entry("allowedValues", allowedValues) + Map.entry("allowedValues", allowedValues), + Map.entry("maxUploadFileSize", maxUploadFileSize) ) ); IIORegistry registry = IIORegistry.getDefaultInstance(); registry.registerServiceProvider(new J2KImageReaderSpi()); } + /** + * Read the i18nValues from the UI-spec schema + * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} + * @return i18nValues + */ + private ObjectNode readI18nValues(String responseJson) { + Object i18nValueResponse; + ObjectNode i18nValues; + try { + i18nValueResponse = JsonPath.read(responseJson, i18nValuesJsonpath); + i18nValues = objectMapper.convertValue(i18nValueResponse, ObjectNode.class); + i18nValues.set("errors", objectMapper.valueToTree(readErrors(responseJson, i18nValuesErrorJsonpath))); + } catch (PathNotFoundException e) { + log.error("i18nValues not found in schema"); + i18nValues = objectMapper.createObjectNode(); + } + return i18nValues; + } + + /** + * Read the allowed values from master UI-spec and if not found read it from master data. + * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} + * @return allowedValues + */ + private JsonNode readAllowedValues(String responseJson) { + JsonNode allowedValues; + ObjectNode allowedValuesFromSpec = objectMapper.convertValue(JsonPath.read(responseJson, allowedValuesJsonpath), ObjectNode.class); + if (allowedValuesFromSpec != null && !allowedValuesFromSpec.isEmpty()) { + allowedValues = allowedValuesFromSpec; //allowed values from UI-Spec + } else { + allowedValues = generateAllowedValues(); //allowed values from master-data + } + return allowedValues; + } + + /** + * Read the errors from UI-spec if not present, from config + * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} + * @param jsonpath errors path inside schema + * @return errors + */ + private Object readErrors(String responseJson, String jsonpath) { + Object errors; + try { + errors = JsonPath.read(responseJson, jsonpath); + } catch (PathNotFoundException e) { + errors = errorsFromConfig; + } + return errors; + } /** * Generate combined JsonNode from List dynamicFields and List documentCategories From 1f878150f4c6b6d4d4b25f7f28144edc7d840a89 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 26 Sep 2025 15:08:38 +0530 Subject: [PATCH 34/58] ES-2556 (#165) Signed-off-by: ase-101 --- .../service/MockAuthenticationService.java | 25 +++++++++++++------ .../src/main/resources/application.properties | 1 + .../MockAuthenticationServiceTest.java | 25 ++++++++++++++++++- 3 files changed, 43 insertions(+), 8 deletions(-) diff --git a/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationService.java b/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationService.java index 559bbfe7..5dd1e695 100644 --- a/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationService.java +++ b/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationService.java @@ -58,6 +58,9 @@ public class MockAuthenticationService implements Authenticator { @Value("${mosip.esignet.mock.authenticator.kyc-exchange-v3-url}") private String kycExchangeV3Url; + @Value("${mosip.esignet.mock.authenticator.signing-keys-url}") + private String signingKeysUrl; + @Autowired private ObjectMapper objectMapper; @@ -140,14 +143,22 @@ public boolean isSupportedOtpChannel(String channel) { @Override public List getAllKycSigningCertificates() { - List certs = new ArrayList<>(); - AllCertificatesDataResponseDto allCertificatesDataResponseDto = keymanagerService.getAllCertificates(APPLICATION_ID, - Optional.empty()); - for (CertificateDataResponseDto dto : allCertificatesDataResponseDto.getAllCertificates()) { - certs.add(new KycSigningCertificateData(dto.getKeyId(), dto.getCertificateData(), - dto.getExpiryAt(), dto.getIssuedAt())); + RequestEntity requestEntity = RequestEntity + .get(UriComponentsBuilder.fromUriString(signingKeysUrl).build().toUri()).build(); + ResponseEntity> responseEntity = restTemplate.exchange(requestEntity, + new ParameterizedTypeReference<>() {}); + + if( responseEntity.getStatusCode().is2xxSuccessful() && responseEntity.getBody() != null + && responseEntity.getBody().getResponse() != null ) { + AllCertificatesDataResponseDto allCertificatesDataResponseDto = responseEntity.getBody().getResponse(); + return Arrays.stream(allCertificatesDataResponseDto.getAllCertificates()) + .map(certData -> new KycSigningCertificateData(certData.getKeyId(), + certData.getCertificateData(), certData.getExpiryAt(), certData.getIssuedAt())) + .collect(Collectors.toList()); } - return certs; + log.error("Error response received from mock-identity-system while fetching signing keys with status and body : {} {}", + responseEntity.getStatusCode(), requestEntity.getBody()); + return List.of(); } @Override diff --git a/mock-plugin/src/main/resources/application.properties b/mock-plugin/src/main/resources/application.properties index 27686686..504822c5 100644 --- a/mock-plugin/src/main/resources/application.properties +++ b/mock-plugin/src/main/resources/application.properties @@ -13,6 +13,7 @@ mosip.esignet.mock.authenticator.send-otp=${mosip.esignet.mock.domain.url}/v1/mo mosip.esignet.mock.authenticator.kyc-auth-url=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/v2/kyc-auth mosip.esignet.mock.authenticator.ida.otp-channels=email,phone mosip.esignet.mock.supported.bind-auth-factor-types={'WLA'} +mosip.esignet.mock.authenticator.signing-keys-url=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/keys.json ## Signup mock plugin configuration diff --git a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java index 6ab13e0a..c84f0012 100644 --- a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java +++ b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockAuthenticationServiceTest.java @@ -174,12 +174,35 @@ public void getAllKycSigningCertificates_withValidDetails_thenPass() { certificateDataResponseDto1.setKeyId("keyId1"); allCertificatesDataResponseDto.getAllCertificates()[1]= certificateDataResponseDto1; - Mockito.when(keymanagerService.getAllCertificates(Mockito.anyString(),Mockito.any())).thenReturn(allCertificatesDataResponseDto); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(allCertificatesDataResponseDto); + ResponseEntity> responseEntity = + new ResponseEntity<>(responseWrapper, HttpStatus.OK); + ReflectionTestUtils.setField(mockAuthenticationService, "signingKeysUrl", "http://localhost:8080/mock-identity-system/keys.json"); + Mockito.when(restTemplate.exchange( + any(RequestEntity.class), + any(ParameterizedTypeReference.class)) + ).thenReturn(responseEntity); + List allKycSigningCertificates = mockAuthenticationService.getAllKycSigningCertificates(); Assert.assertNotNull(allKycSigningCertificates); Assert.assertEquals(allKycSigningCertificates.size(), 2); } + @Test + public void getAllKycSigningCertificates_ThrowError_thenReturnEmpty() { + ResponseEntity> responseEntity = new ResponseEntity<>(HttpStatus.BAD_REQUEST); + ReflectionTestUtils.setField(mockAuthenticationService, "signingKeysUrl", "http://localhost:8080/mock-identity-system/keys.json"); + Mockito.when(restTemplate.exchange( + any(RequestEntity.class), + any(ParameterizedTypeReference.class)) + ).thenReturn(responseEntity); + + List allKycSigningCertificates = mockAuthenticationService.getAllKycSigningCertificates(); + Assert.assertNotNull(allKycSigningCertificates); + Assert.assertEquals(allKycSigningCertificates.size(), 0); + } + @Test public void doKycAuth_withValidDetails_thenPass() throws KycAuthException { String relyingPartyId = "testRelyingPartyId"; From 85bc5fbaf6de26e0cd1a8228dc43262bd3a876e6 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Mon, 29 Sep 2025 15:11:41 +0530 Subject: [PATCH 35/58] [ES-2504] Added support for VID (#163) * [ES-2504] ADded support for VID Signed-off-by: pvsaidurga * [ES-2504] Updated getProfile Signed-off-by: pvsaidurga * [ES-2504] Updated getProfile Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga --- .../mosipid/service/IdrepoProfileRegistryPluginImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 0faeb226..c3c1ade0 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -62,6 +62,7 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { private static final String ID_SCHEMA_VERSION_FIELD_ID = "IDSchemaVersion"; private static final String UIN = "UIN"; + private static final String VID = "VID"; private static final String SELECTED_HANDLES_FIELD_ID = "selectedHandles"; private static final String UTC_DATETIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; private final Map schemaMap = new HashMap<>(); @@ -475,7 +476,11 @@ public ProfileDto getProfile(String individualId) throws ProfileException { RequestWrapper idDTORequestWrapper=new RequestWrapper<>(); requestByIdDTO.setId(individualId); requestByIdDTO.setType("demo"); - if(isHandle) requestByIdDTO.setIdType("HANDLE"); + if (isHandle) { + requestByIdDTO.setIdType("HANDLE"); + } else { + requestByIdDTO.setIdType(individualId.length() > 10 ? VID : UIN); + } idDTORequestWrapper.setRequest(requestByIdDTO); idDTORequestWrapper.setRequesttime(getUTCDateTime()); responseWrapper = request(getIdentityEndpoint, HttpMethod.POST, idDTORequestWrapper, From ad39cbeda0eea29b1161093fa152d1b77822d719 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Tue, 30 Sep 2025 01:00:18 +0530 Subject: [PATCH 36/58] [ES-2537] Renamed the schema properties (#166) * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * ES-2456 Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK * review comments fixed Signed-off-by: Md-Humair-KK * review comments solved Signed-off-by: Md-Humair-KK * resolved review comments Signed-off-by: Md-Humair-KK * ES-2537 Signed-off-by: Md-Humair-KK * changes done for allowedvalues and errors Signed-off-by: Md-Humair-KK * ES-2537 Signed-off-by: Md-Humair-KK * ES-2537 Signed-off-by: Md-Humair-KK * renamed the schema properties Signed-off-by: Md-Humair-KK * renamed the schema properties Signed-off-by: Md-Humair-KK --------- Signed-off-by: pvsaidurga Signed-off-by: Md-Humair-KK Co-authored-by: pvsaidurga --- .../mosipid/service/IdrepoProfileRegistryPluginImpl.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index c3c1ade0..578ff094 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -142,16 +142,16 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.schema}") private String schemaJsonpath; - @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.allowedValues}") + @Value("${mosip.signup.mosipid.uispec.allowedvalues-jsonpath:$[0].jsonSpec[0].spec.allowedValues}") private String allowedValuesJsonpath; - @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.i18nValues}") + @Value("${mosip.signup.mosipid.uispec.i18values-jsonpath:$[0].jsonSpec[0].spec.i18nValues}") private String i18nValuesJsonpath; - @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.i18nValues.errors}") + @Value("${mosip.signup.mosipid.uispec.i18values-errors-jsonpath:$[0].jsonSpec[0].spec.i18nValues.errors}") private String i18nValuesErrorJsonpath; - @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.maxUploadFileSize}") + @Value("${mosip.signup.mosipid.uispec.maxuploadfilesize-jsonpath:$[0].jsonSpec[0].spec.maxUploadFileSize}") private String maxUploadFileSizeJsonpath; @Value("${mosip.signup.mosipid.uispec.errors-jsonpath:$[0].jsonSpec[0].spec.errors}") From 4a3012a43059c6f6634ac6f3cdc72073860c991f Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Tue, 30 Sep 2025 14:10:58 +0530 Subject: [PATCH 37/58] [ES 2525] Code coverage mosip identity plugin (#164) * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * [ES-2409] Added the log to debug status issue Signed-off-by: pvsaidurga * code coverage Signed-off-by: Md-Humair-KK * code coverage Signed-off-by: Md-Humair-KK * resolved review comments Signed-off-by: Md-Humair-KK * review comments fixed Signed-off-by: Md-Humair-KK * resolve review comments Signed-off-by: Md-Humair-KK * resolved review comments Signed-off-by: Md-Humair-KK * addressed review comments Signed-off-by: Md-Humair-KK --------- Signed-off-by: pvsaidurga Signed-off-by: Md-Humair-KK Co-authored-by: pvsaidurga --- .../service/IdaAuthenticatorImplTest.java | 114 ++++++++++++++++ .../mosipid/service/IdaKeyBinderImplTest.java | 83 ++++++++++++ .../IdrepoProfileRegistryPluginImplTest.java | 11 +- .../MockIdentityVerifierPluginImplTest.java | 123 ++++++++++++++++++ 4 files changed, 330 insertions(+), 1 deletion(-) create mode 100644 mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java diff --git a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java index 9d3e7f13..41de71ec 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaAuthenticatorImplTest.java @@ -5,6 +5,7 @@ */ package io.mosip.esignet.plugin.mosipid.service; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.esignet.api.dto.*; @@ -656,4 +657,117 @@ public void getAllKycSigningCertificates_withInvalidToken_thenFail() throws Exce () -> idaAuthenticatorImpl.getAllKycSigningCertificates()); } + @Test + public void getAllKycSigningCertificates_whenNon2xxStatus_thenThrowException() throws Exception { + Mockito.when(authTransactionHelper.getAuthToken()).thenReturn("tokenX"); + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setResponse(null); + wrapper.setErrors(null); + ResponseEntity> responseEntity = new ResponseEntity<>(wrapper, HttpStatus.INTERNAL_SERVER_ERROR); + Mockito.when(restTemplate.exchange(any(RequestEntity.class), any(ParameterizedTypeReference.class))).thenReturn(responseEntity); + Assert.assertThrows(KycSigningCertificateException.class, + () -> idaAuthenticatorImpl.getAllKycSigningCertificates()); + } + + @Test + public void doKycExchange_whenResponseHasNoEncryptedKyc_thenFail(){ + KycExchangeDto kycExchangeDto = new KycExchangeDto(); + kycExchangeDto.setIndividualId("IND123"); + kycExchangeDto.setTransactionId("TRANS"); + kycExchangeDto.setKycToken("TOKEN123"); + kycExchangeDto.setAcceptedClaims(List.of("claim1")); + kycExchangeDto.setClaimsLocales(new String[]{"en"}); + IdaKycExchangeResponse resp = new IdaKycExchangeResponse(); + resp.setEncryptedKyc(null); + IdaResponseWrapper wrapper = new IdaResponseWrapper<>(); + wrapper.setResponse(resp); + wrapper.setErrors(List.of()); // no errors + ResponseEntity> responseEntity = + new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange(any(RequestEntity.class), any(ParameterizedTypeReference.class))) + .thenReturn(responseEntity); + KycExchangeException ex = Assert.assertThrows(KycExchangeException.class, () -> { + idaAuthenticatorImpl.doKycExchange("rp", "client", kycExchangeDto); + }); + Assert.assertEquals(ErrorConstants.DATA_EXCHANGE_FAILED, ex.getErrorCode()); + } + + @Test + public void doKycAuth_whenResponseKycStatusFalse_thenFail(){ + KycAuthDto dto = new KycAuthDto(); + dto.setIndividualId("ID1"); + dto.setTransactionId("T1"); + AuthChallenge ac = new AuthChallenge(); + ac.setAuthFactorType("OTP"); + ac.setChallenge("1234"); + dto.setChallengeList(List.of(ac)); + IdaKycAuthResponse resp = new IdaKycAuthResponse(); + resp.setKycStatus(false); + resp.setKycToken(null); + IdaResponseWrapper wrapper = new IdaResponseWrapper<>(); + wrapper.setResponse(resp); + wrapper.setErrors(List.of()); // empty list + ResponseEntity> responseEntity = new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange(any(RequestEntity.class), any(ParameterizedTypeReference.class))).thenReturn(responseEntity); + KycAuthException ex = Assert.assertThrows(KycAuthException.class, () -> { + idaAuthenticatorImpl.doKycAuth("rp", "client", dto); + }); + Assert.assertEquals(ErrorConstants.AUTH_FAILED, ex.getErrorCode()); + } + + @Test + public void doKycExchange_whenVerifiedClaimsNodeNull_thenPass() throws Exception { + VerifiedKycExchangeDto dto = new VerifiedKycExchangeDto(); + dto.setIndividualId("ID2"); + dto.setKycToken("TK2"); + dto.setTransactionId("TX2"); + dto.setClaimsLocales(new String[] {"en"}); + dto.setAcceptedClaims(List.of("A")); + ObjectMapper m = new ObjectMapper(); + Map details = new HashMap<>(); + details.put("verified_claims", null); + details.put("name", m.readTree("\"NameVal\"")); + dto.setAcceptedClaimDetails(details); + IdaKycExchangeResponse resp = new IdaKycExchangeResponse(); + resp.setEncryptedKyc("ENC2"); + IdaResponseWrapper wrapper = new IdaResponseWrapper<>(); + wrapper.setResponse(resp); + ResponseEntity> responseEntity = new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange(any(RequestEntity.class), any(ParameterizedTypeReference.class))).thenReturn(responseEntity); + KycExchangeResult result = idaAuthenticatorImpl.doKycExchange("rp", "client", dto); + Assert.assertEquals("ENC2", result.getEncryptedKyc()); + } + + @Test + public void kycExchangeV2_withClaims_thenPass() throws Exception { + VerifiedKycExchangeDto verifiedDto = getVerifiedKycExchangeDto(); + IdaKycExchangeResponse idaResponse = new IdaKycExchangeResponse(); + IdaResponseWrapper responseWrapper = new IdaResponseWrapper<>(); + responseWrapper.setResponse(idaResponse); + idaResponse.setEncryptedKyc("encrypted-kyc-data"); + ResponseEntity> responseEntity = + new ResponseEntity<>(responseWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.any(), + Mockito.>>any()) + ).thenReturn(responseEntity); + KycExchangeResult result = idaAuthenticatorImpl.doVerifiedKycExchange( + "rpId", "clientId", verifiedDto); + Assert.assertNotNull(result); + Assert.assertEquals("encrypted-kyc-data", result.getEncryptedKyc()); + } + + private VerifiedKycExchangeDto getVerifiedKycExchangeDto() throws JsonProcessingException { + VerifiedKycExchangeDto verifiedDto = new VerifiedKycExchangeDto(); + verifiedDto.setTransactionId("txn-1000"); + verifiedDto.setKycToken("kyc-token-123"); + verifiedDto.setIndividualId("ind-1000"); + Map acceptedClaimDetails = new HashMap<>(); + ObjectMapper mapper = new ObjectMapper(); + JsonNode verifiedClaimsNode = mapper.readTree("[{\"claim\":\"value\"}]"); + acceptedClaimDetails.put("verified_claims", verifiedClaimsNode); + verifiedDto.setAcceptedClaimDetails(acceptedClaimDetails); + return verifiedDto; + } + } diff --git a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaKeyBinderImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaKeyBinderImplTest.java index 5d92276b..0dcf90c3 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaKeyBinderImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/esignet/plugin/mosipid/service/IdaKeyBinderImplTest.java @@ -186,4 +186,87 @@ public void doKeyBinding_withEmptyHeaders_thenFail() { Assert.assertEquals(IdaKeyBinderImpl.REQUIRED_HEADERS_MISSING, e.getErrorCode()); } } + + @Test + public void sendBindingOtp_withSendOtpException_thenFail() { + Map headers = new HashMap<>(); + headers.put(PARTNER_ID_HEADER, PARTNER_ID_HEADER); + headers.put(PARTNER_API_KEY_HEADER, PARTNER_API_KEY_HEADER); + Mockito.when(helperService.getTransactionId(Mockito.anyString())) + .thenThrow(new RuntimeException("unexpected")); + try { + idaKeyBinderImpl.sendBindingOtp("individualId", List.of("email"), headers); + Assert.fail(); + } catch (SendOtpException e) { + Assert.assertEquals(ErrorConstants.SEND_OTP_FAILED,e.getErrorCode()); + } + } + + @Test + public void doKeyBinding_withInvalidStatusResponse_thenFail() { + ResponseEntity> responseEntity = + new ResponseEntity<>(HttpStatus.BAD_REQUEST); + Mockito.when(restTemplate.exchange(Mockito.>any(), + Mockito.>>any())) + .thenReturn(responseEntity); + Map headers = new HashMap<>(); + headers.put(PARTNER_ID_HEADER, PARTNER_ID_HEADER); + headers.put(PARTNER_API_KEY_HEADER, PARTNER_API_KEY_HEADER); + try { + idaKeyBinderImpl.doKeyBinding("individualId", new ArrayList<>(), new HashMap<>(), + "WLA", headers); + Assert.fail(); + } catch (KeyBindingException e) { + Assert.assertEquals(ErrorConstants.KEY_BINDING_FAILED, e.getErrorCode()); + } + } + + @Test + public void doKeyBinding_withNullResponse_thenFail() { + ResponseEntity> responseEntity = + new ResponseEntity<>(null, HttpStatus.OK); + Mockito.when(restTemplate.exchange(Mockito.>any(), + Mockito.>>any())) + .thenReturn(responseEntity); + Map headers = new HashMap<>(); + headers.put(PARTNER_ID_HEADER, PARTNER_ID_HEADER); + headers.put(PARTNER_API_KEY_HEADER, PARTNER_API_KEY_HEADER); + try { + idaKeyBinderImpl.doKeyBinding("individualId", new ArrayList<>(), new HashMap<>(), + "WLA", headers); + Assert.fail(); + } catch (KeyBindingException e) { + Assert.assertEquals(ErrorConstants.KEY_BINDING_FAILED, e.getErrorCode()); + } + } + + @Test + public void doKeyBinding_withExceptionDuringExchange_thenFail() { + Mockito.when(restTemplate.exchange(Mockito.>any(), + Mockito.>>any())) + .thenThrow(new RuntimeException("unexpected failure")); + Map headers = new HashMap<>(); + headers.put(PARTNER_ID_HEADER, PARTNER_ID_HEADER); + headers.put(PARTNER_API_KEY_HEADER, PARTNER_API_KEY_HEADER); + try { + idaKeyBinderImpl.doKeyBinding("individualId", new ArrayList<>(), new HashMap<>(), + "WLA", headers); + Assert.fail(); + } catch (KeyBindingException e) { + Assert.assertEquals(ErrorConstants.KEY_BINDING_FAILED, e.getErrorCode()); + } + } + + @Test + public void getSupportedChallengeFormats_withKnownTypes_thenPass() { + Assert.assertEquals(List.of("alpha-numeric"), idaKeyBinderImpl.getSupportedChallengeFormats("OTP")); + Assert.assertEquals(List.of("number"), idaKeyBinderImpl.getSupportedChallengeFormats("PIN")); + Assert.assertEquals(List.of("encoded-json"), idaKeyBinderImpl.getSupportedChallengeFormats("BIO")); + Assert.assertEquals(List.of("jwt"), idaKeyBinderImpl.getSupportedChallengeFormats("WLA")); + } + + @Test + public void getSupportedChallengeFormats_withUnknownType_thenFail() { + Assert.assertTrue(idaKeyBinderImpl.getSupportedChallengeFormats("UNKNOWN").isEmpty()); + } } diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 5994503d..c60d615c 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -23,7 +23,10 @@ import org.mockito.Mockito; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; @@ -536,6 +539,12 @@ private JsonNode createIdentity() { Map identityData = new HashMap<>(); identityData.put("email","123@email.com"); identityData.put("phone","+91841987567"); + ObjectNode claimNode = objectMapper.createObjectNode(); + ObjectNode verifiedClaims = objectMapper.createObjectNode(); + claimNode.put("trust_framework", "QWE_RT"); + claimNode.put("verification_process", "ver_proc"); + verifiedClaims.set("name", claimNode); + identityData.put("verified_claims", verifiedClaims); return objectMapper.valueToTree(identityData); } diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java new file mode 100644 index 00000000..65a8c62f --- /dev/null +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java @@ -0,0 +1,123 @@ +package io.mosip.signup.plugin.mosipid.service; + + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.mosip.signup.api.dto.*; +import io.mosip.signup.api.exception.IdentityVerifierException; +import io.mosip.signup.api.util.VerificationStatus; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.test.util.ReflectionTestUtils; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + +@RunWith(MockitoJUnitRunner.class) +public class MockIdentityVerifierPluginImplTest { + + @InjectMocks + private MockIdentityVerifierPluginImpl mockIdentityVerifierPlugin; + + @Mock + ResourceLoader resourceLoader; + + + ObjectMapper objectMapper = new ObjectMapper();; + + @Before + public void before(){ + ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "objectMapper",objectMapper); + ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "resultTopic","ANALYZE_FRAMES_RESULT"); + } + + + @Test + public void verify_withValidIdentityVerificationDto_thenPass() throws IdentityVerifierException, IOException { + + String transactionId = "transactionId123"; + IdentityVerificationDto identityVerificationDto = new IdentityVerificationDto(); + identityVerificationDto.setStepCode("START"); + List frameDetails= new ArrayList<>(); + FrameDetail frameDetail = new FrameDetail(); + frameDetail.setFrame("frame"); + frameDetail.setOrder(0); + frameDetails.add(frameDetail); + identityVerificationDto.setFrames(frameDetails); + + String jsonContent = "{\"scenes\":[{\"frameNumber\":0,\"stepCode\":\"START\",\"step\":{\"code\":\"liveness_check\",\"framesPerSecond\":3,\"durationInSeconds\":100,\"startupDelayInSeconds\":2,\"retryOnTimeout\":false,\"retryableErrorCodes\":[]},\"feedback\":null}],\"verificationResult\":{\"status\":\"COMPLETED\",\"verifiedClaims\":{\"fullName\":{\"trust_framework\":\"XYZ TF\",\"verification_process\":\"EKYC\",\"assurance_level\":\"Gold\",\"time\":\"34232432\"}},\"errorCode\":null}}"; + Resource resource = Mockito.mock(Resource.class); + Mockito.when(resourceLoader.getResource(Mockito.anyString())).thenReturn(resource); + Mockito.when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(jsonContent.getBytes())); + + KafkaTemplate kafkaTemplate = Mockito.mock(KafkaTemplate.class); + ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "kafkaTemplate", kafkaTemplate); + //ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "resultTopic", "ANALYZE_FRAMES_RESULT"); + + mockIdentityVerifierPlugin.verify(transactionId, identityVerificationDto); + + Mockito.verify(resourceLoader).getResource(Mockito.anyString()); + ArgumentCaptor resultCaptor = ArgumentCaptor.forClass(IdentityVerificationResult.class); + Mockito.verify(kafkaTemplate, Mockito.times(2)).send( + Mockito.eq("ANALYZE_FRAMES_RESULT"), + resultCaptor.capture() + ); + } + + + @Test + public void getVerifiedResult_withValidTransactionId_thenPass() throws IdentityVerifierException, IOException { + + String transactionId = "transactionId123"; + VerificationResult verifiedResult = new VerificationResult(); + Map fullNameMap = new HashMap<>(); + fullNameMap.put("trust_framework","XYZ TF"); + fullNameMap.put("verification_process","EKYC"); + fullNameMap.put("assurance_level","Gold"); + fullNameMap.put("time","34232432"); + + Map verifiedClaims = new HashMap<>(); + verifiedClaims.put("fullName",objectMapper.convertValue(fullNameMap,JsonNode.class)); + verifiedResult.setVerifiedClaims(verifiedClaims); + verifiedResult.setStatus(VerificationStatus.COMPLETED); + + String jsonContent = "{\"scenes\":[{\"frameNumber\":0,\"stepCode\":\"START\",\"step\":{\"code\":\"liveness_check\",\"framesPerSecond\":3,\"durationInSeconds\":100,\"startupDelayInSeconds\":2,\"retryOnTimeout\":false,\"retryableErrorCodes\":[]},\"feedback\":null}],\"verificationResult\":{\"status\":\"COMPLETED\",\"verifiedClaims\":{\"fullName\":{\"trust_framework\":\"XYZ TF\",\"verification_process\":\"EKYC\",\"assurance_level\":\"Gold\",\"time\":\"34232432\"}},\"errorCode\":null}}"; + Resource resource = Mockito.mock(Resource.class); + + Mockito.when(resourceLoader.getResource(Mockito.anyString())).thenReturn(resource); + Mockito.when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(jsonContent.getBytes())); + VerificationResult actualVerifiedResult = mockIdentityVerifierPlugin.getVerificationResult(transactionId); + + Assert.assertEquals(verifiedResult.getStatus(), actualVerifiedResult.getStatus()); + Assert.assertEquals(verifiedResult.getVerifiedClaims(), actualVerifiedResult.getVerifiedClaims()); + } + + + @Test + public void getVerifiedResult_withInvalidTransactionId_thenFail() throws IdentityVerifierException, IOException { + + String transactionId = "transactionId123"; + String jsonContent = "{}"; + Resource resource = Mockito.mock(Resource.class); + Mockito.when(resourceLoader.getResource(Mockito.anyString())).thenReturn(resource); + Mockito.when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(jsonContent.getBytes())); + VerificationResult verificationResult = mockIdentityVerifierPlugin.getVerificationResult(transactionId); + Assert.assertEquals(verificationResult.getErrorCode(),"mock_verification_failed"); + Assert.assertEquals(verificationResult.getStatus(),VerificationStatus.FAILED); + } +} From e2315ae8b66b0e7deb86db3aa3dc81e69c9023b6 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Wed, 8 Oct 2025 20:52:05 +0530 Subject: [PATCH 38/58] [ES-2504] Added VID check (#168) * [ES-2504] Added VID check Signed-off-by: pvsaidurga * [ES-2504] Updated review comments Signed-off-by: pvsaidurga --------- Signed-off-by: pvsaidurga --- .../mosipid/service/IdrepoProfileRegistryPluginImpl.java | 7 +++++-- .../src/main/resources/application.properties | 1 + .../service/IdrepoProfileRegistryPluginImplTest.java | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 578ff094..e2d3da48 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -123,6 +123,9 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.idrepo.biometric.field-name:individualBiometrics}") private String biometricDataFieldName; + @Value("${mosip.signup.idrepo.uin.length:10}") + private int uinLength; + @Autowired @Qualifier("selfTokenRestTemplate") private RestTemplate restTemplate; @@ -435,7 +438,7 @@ public ProfileResult createProfile(String requestId, ProfileDto profileDto) thro public ProfileResult updateProfile(String requestId, ProfileDto profileDto) throws ProfileException { JsonNode inputJson = profileDto.getIdentity(); - if(profileDto.getIndividualId().contains(HANDLE_SEPARATOR)) { + if(profileDto.getIndividualId().contains(HANDLE_SEPARATOR) || profileDto.getIndividualId().length() > uinLength) { ((ObjectNode) inputJson).set(UIN, objectMapper.valueToTree(getProfile(profileDto.getIndividualId()).getIndividualId())); } else { ((ObjectNode) inputJson).set(UIN, objectMapper.valueToTree(profileDto.getIndividualId())); @@ -479,7 +482,7 @@ public ProfileDto getProfile(String individualId) throws ProfileException { if (isHandle) { requestByIdDTO.setIdType("HANDLE"); } else { - requestByIdDTO.setIdType(individualId.length() > 10 ? VID : UIN); + requestByIdDTO.setIdType(individualId.length() > uinLength ? VID : UIN); } idDTORequestWrapper.setRequest(requestByIdDTO); idDTORequestWrapper.setRequesttime(getUTCDateTime()); diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 01fd0cfa..7449929a 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -39,6 +39,7 @@ mosip.signup.integration.profile-registry-plugin=MOSIPProfileRegistryPluginImpl mosip.signup.idrepo.schema-url=http://masterdata.kernel/v1/masterdata/idschema/latest?schemaVersion= mosip.signup.idrepo.url=${IDREPO_IDENTITY_URL:http://identity.idrepo} +mosip.signup.idrepo.uin.length=10 mosip.signup.idrepo.get-identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/idvid/ mosip.signup.idrepo.identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/v2/ diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index c60d615c..82141ce7 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -69,6 +69,7 @@ public void beforeEach(){ ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "docTypesAndCategoryBaseUrl", "http://mock/api/docTypes"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "mandatoryLanguages", List.of("en")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "optionalLanguages", List.of("fr","ar")); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uinLength", 10); } @Test From 89049c934f86a6e8519924ab4826fc58a875ae18 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Sat, 11 Oct 2025 13:47:06 +0530 Subject: [PATCH 39/58] [ES-2525] mosip identity plugin code coverage (#167) * code coverage Signed-off-by: Md-Humair-KK * code coverage Signed-off-by: Md-Humair-KK * renamed test case Signed-off-by: Md-Humair-KK * updated schemaJson name Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK --- .../IdrepoProfileRegistryPluginImplTest.java | 148 +++++++++++++++++- .../MockIdentityVerifierPluginImplTest.java | 17 ++ 2 files changed, 157 insertions(+), 8 deletions(-) diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 82141ce7..0052b72d 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -10,8 +10,10 @@ import io.mosip.signup.api.exception.InvalidProfileException; import io.mosip.signup.api.exception.ProfileException; import io.mosip.signup.api.util.ProfileCreateUpdateStatus; -import io.mosip.signup.plugin.mosipid.dto.*; import io.mosip.signup.plugin.mosipid.dto.Error; +import io.mosip.signup.plugin.mosipid.dto.*; +import io.mosip.signup.plugin.mosipid.util.BiometricUtil; +import io.mosip.signup.plugin.mosipid.util.ErrorConstants; import io.mosip.signup.plugin.mosipid.util.ProfileCacheService; import org.junit.Assert; import org.junit.Before; @@ -46,8 +48,10 @@ public class IdrepoProfileRegistryPluginImplTest { private ObjectMapper objectMapper; - private static final String schemaSchemaJson="{\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"description\":\"Identity schema for sign up\",\"additionalProperties\":false,\"title\":\"signup identity\",\"type\":\"object\",\"definitions\":{\"simpleType\":{\"uniqueItems\":true,\"additionalItems\":false,\"type\":\"array\",\"items\":{\"additionalProperties\":false,\"type\":\"object\",\"required\":[\"language\",\"value\"],\"properties\":{\"language\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}}}},\"documentType\":{\"additionalProperties\":false,\"type\":\"object\",\"properties\":{\"format\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}}},\"biometricsType\":{\"additionalProperties\":false,\"type\":\"object\",\"properties\":{\"format\":{\"type\":\"string\"},\"version\":{\"type\":\"number\",\"minimum\":0},\"value\":{\"type\":\"string\"}}},\"hashType\":{\"additionalProperties\":false,\"type\":\"object\",\"properties\":{\"hash\":{\"type\":\"string\"},\"salt\":{\"type\":\"string\"}}}},\"properties\":{\"identity\":{\"additionalProperties\":false,\"type\":\"object\",\"required\":[\"IDSchemaVersion\",\"phone\"],\"properties\":{\"UIN\":{\"bioAttributes\":[],\"fieldCategory\":\"none\",\"format\":\"none\",\"type\":\"string\",\"fieldType\":\"default\"},\"IDSchemaVersion\":{\"bioAttributes\":[],\"fieldCategory\":\"none\",\"format\":\"none\",\"type\":\"number\",\"fieldType\":\"default\",\"minimum\":0},\"selectedHandles\":{\"fieldCategory\":\"none\",\"format\":\"none\",\"type\":\"array\",\"items\":{\"type\":\"string\"},\"fieldType\":\"default\"},\"fullName\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"^(.{3,50})$\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"$ref\":\"#/definitions/simpleType\"},\"phone\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"^[+]91([0-9]{8,9})$\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"type\":\"string\",\"fieldType\":\"default\",\"requiredOn\":\"\",\"handle\":true},\"password\":{\"bioAttributes\":[],\"validators\":[],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"$ref\":\"#/definitions/hashType\"},\"preferredLang\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"(^eng$)\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"string\"},\"registrationType\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"^L[1-2]{1}$\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"string\"},\"phoneVerified\":{\"bioAttributes\":[],\"validators\":[],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"boolean\"},\"updatedAt\":{\"bioAttributes\":[],\"validators\":[],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"number\"}}}}}"; + private static final String schemaJson ="{\"$schema\":\"http://json-schema.org/draft-07/schema#\",\"description\":\"Identity schema for sign up\",\"additionalProperties\":false,\"title\":\"signup identity\",\"type\":\"object\",\"definitions\":{\"simpleType\":{\"uniqueItems\":true,\"additionalItems\":false,\"type\":\"array\",\"items\":{\"additionalProperties\":false,\"type\":\"object\",\"required\":[\"language\",\"value\"],\"properties\":{\"language\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}}}},\"documentType\":{\"additionalProperties\":false,\"type\":\"object\",\"properties\":{\"format\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"value\":{\"type\":\"string\"}}},\"biometricsType\":{\"additionalProperties\":false,\"type\":\"object\",\"properties\":{\"format\":{\"type\":\"string\"},\"version\":{\"type\":\"number\",\"minimum\":0},\"value\":{\"type\":\"string\"}}},\"hashType\":{\"additionalProperties\":false,\"type\":\"object\",\"properties\":{\"hash\":{\"type\":\"string\"},\"salt\":{\"type\":\"string\"}}}},\"properties\":{\"identity\":{\"additionalProperties\":false,\"type\":\"object\",\"required\":[\"IDSchemaVersion\",\"phone\"],\"properties\":{\"UIN\":{\"bioAttributes\":[],\"fieldCategory\":\"none\",\"format\":\"none\",\"type\":\"string\",\"fieldType\":\"default\"},\"IDSchemaVersion\":{\"bioAttributes\":[],\"fieldCategory\":\"none\",\"format\":\"none\",\"type\":\"number\",\"fieldType\":\"default\",\"minimum\":0},\"selectedHandles\":{\"fieldCategory\":\"none\",\"format\":\"none\",\"type\":\"array\",\"items\":{\"type\":\"string\"},\"fieldType\":\"default\"},\"fullName\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"^(.{3,50})$\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"$ref\":\"#/definitions/simpleType\"},\"phone\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"^[+]91([0-9]{8,9})$\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"type\":\"string\",\"fieldType\":\"default\",\"requiredOn\":\"\",\"handle\":true},\"password\":{\"bioAttributes\":[],\"validators\":[],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"$ref\":\"#/definitions/hashType\"},\"preferredLang\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"(^eng$)\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"string\"},\"registrationType\":{\"bioAttributes\":[],\"validators\":[{\"validator\":\"^L[1-2]{1}$\",\"arguments\":[],\"type\":\"regex\"}],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"string\"},\"phoneVerified\":{\"bioAttributes\":[],\"validators\":[],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"boolean\"},\"updatedAt\":{\"bioAttributes\":[],\"validators\":[],\"fieldCategory\":\"pvt\",\"format\":\"none\",\"fieldType\":\"default\",\"type\":\"number\"}}}}}"; + @Mock + private BiometricUtil biometricUtil; @Before public void beforeEach(){ @@ -70,6 +74,16 @@ public void beforeEach(){ ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "mandatoryLanguages", List.of("en")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "optionalLanguages", List.of("fr","ar")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uinLength", 10); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "schemaJsonpath", "$[0].jsonSpec[0].schema"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "errorsJsonpath", "$[0].jsonSpec[0].errors"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "i18nValuesJsonpath", "$[0].jsonSpec[0].i18nValues"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "i18nValuesErrorJsonpath", "$[0].jsonSpec[0].i18nValues.errors"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "allowedValuesJsonpath", "$[0].jsonSpec[0].allowedValues"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "maxUploadFileSizeJsonpath", "$[0].jsonSpec[0].maxUploadFileSize"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uiSpecUrl", "http://mock/uispec"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "biometricDataFieldName", "individualBiometrics"); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "defaultSelectedHandles", List.of("phone")); + } @Test @@ -88,7 +102,7 @@ public void validate_withValidProfile_thenPass() { ResponseWrapper responseWrapper = new ResponseWrapper<>(); SchemaResponse schemaResponse = new SchemaResponse(); schemaResponse.setIdVersion(0.0); - schemaResponse.setSchemaJson(schemaSchemaJson); + schemaResponse.setSchemaJson(schemaJson); responseWrapper.setResponse(schemaResponse); ResponseEntity> responseEntity2=new ResponseEntity<>(responseWrapper, HttpStatus.OK); Mockito.when(restTemplate.exchange( @@ -122,7 +136,7 @@ public void validate_withValidProfileContainingArrayDataType_thenPass() { ResponseWrapper responseWrapper = new ResponseWrapper<>(); SchemaResponse schemaResponse = new SchemaResponse(); schemaResponse.setIdVersion(0.0); - schemaResponse.setSchemaJson(schemaSchemaJson); + schemaResponse.setSchemaJson(schemaJson); responseWrapper.setResponse(schemaResponse); ResponseEntity> responseEntity2=new ResponseEntity<>(responseWrapper, HttpStatus.OK); Mockito.when(restTemplate.exchange( @@ -148,7 +162,7 @@ public void validate_withInvalidProfile_thenFail() { ResponseWrapper responseWrapper = new ResponseWrapper<>(); SchemaResponse schemaResponse = new SchemaResponse(); schemaResponse.setIdVersion(0.0); - schemaResponse.setSchemaJson(schemaSchemaJson); + schemaResponse.setSchemaJson(schemaJson); responseWrapper.setResponse(schemaResponse); ResponseEntity> responseEntity=new ResponseEntity<>(responseWrapper, HttpStatus.OK); Mockito.when(restTemplate.exchange( @@ -191,7 +205,7 @@ public void createProfile_withValidProfileDetails_thenPass() { ResponseWrapper responseWrapper2 = new ResponseWrapper<>(); SchemaResponse schemaResponse = new SchemaResponse(); schemaResponse.setIdVersion(0.0); - schemaResponse.setSchemaJson(schemaSchemaJson); + schemaResponse.setSchemaJson(schemaJson); responseWrapper2.setResponse(schemaResponse); ResponseEntity> responseEntity2=new ResponseEntity<>(responseWrapper2, HttpStatus.OK); Mockito.when(restTemplate.exchange( @@ -246,7 +260,7 @@ public void createProfile_withInValidProfileDetails_thenFail() { ResponseWrapper responseWrapper2 = new ResponseWrapper<>(); SchemaResponse schemaResponse = new SchemaResponse(); schemaResponse.setIdVersion(0.0); - schemaResponse.setSchemaJson(schemaSchemaJson); + schemaResponse.setSchemaJson(schemaJson); responseWrapper2.setResponse(schemaResponse); ResponseEntity> responseEntity2=new ResponseEntity<>(responseWrapper2, HttpStatus.OK); Mockito.when(restTemplate.exchange( @@ -296,7 +310,7 @@ public void updateProfile_withValidProfileDetails_thenPass() { ResponseWrapper responseWrapper= new ResponseWrapper<>(); SchemaResponse schemaResponse = new SchemaResponse(); schemaResponse.setIdVersion(0.0); - schemaResponse.setSchemaJson(schemaSchemaJson); + schemaResponse.setSchemaJson(schemaJson); responseWrapper.setResponse(schemaResponse); ResponseEntity> responseEntity=new ResponseEntity<>(responseWrapper, HttpStatus.OK); Mockito.when(restTemplate.exchange( @@ -684,4 +698,122 @@ public void generateAllowedValues_withInactiveDocumentTypesAndCategories_thenFai Assert.assertEquals(0, result.size()); } + @Test + public void validate_unableToFetchTheSchema_thenFail() throws ProfileException{ + ProfileDto profileDto = new ProfileDto(); + profileDto.setIndividualId("ind-123"); + profileDto.setIdentity(objectMapper.createObjectNode()); + + // Return schema with null/invalid schemaJson + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(new SchemaResponse()); + ResponseEntity> responseEntity = + new ResponseEntity<>(responseWrapper, HttpStatus.OK); + + Mockito.when(restTemplate.exchange( + Mockito.anyString(), + Mockito.eq(HttpMethod.GET), + Mockito.isNull(), + Mockito.>>any() + )).thenReturn(responseEntity); + try{ + idrepoProfileRegistryPlugin.validate("CREATE", profileDto); + }catch (ProfileException e){ + Assert.assertEquals(e.getErrorCode(), ErrorConstants.REQUEST_FAILED); + } + } + + @Test + public void init_shouldPopulateUiSpec_thenPass() { + ObjectNode specNode = objectMapper.createObjectNode(); + specNode.set("schema", objectMapper.createObjectNode().put("someKey", "someValue")); + specNode.set("errors", objectMapper.createObjectNode().put("errKey", "errVal")); + + ObjectNode i18n = objectMapper.createObjectNode(); + i18n.set("en", objectMapper.createObjectNode().put("label", "Name")); + ObjectNode i18nErrors = objectMapper.createObjectNode().put("required", "Required"); + i18n.set("errors", i18nErrors); + specNode.set("i18nValues", i18n); + + specNode.set("allowedValues", objectMapper.createObjectNode().put("gender", "M,F")); + specNode.put("maxUploadFileSize", 1048576); + + ArrayNode specArray = objectMapper.createArrayNode().add(specNode); + ObjectNode root = objectMapper.createObjectNode().set("jsonSpec", specArray); + ArrayNode rootArray = objectMapper.createArrayNode().add(root); + + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setResponse(rootArray); + ResponseEntity> responseEntity = + new ResponseEntity<>(wrapper, HttpStatus.OK); + + Mockito.when(restTemplate.exchange(Mockito.eq("http://mock/uispec"), Mockito.eq(HttpMethod.GET), Mockito.isNull(), + Mockito.>>any())).thenReturn(responseEntity); + idrepoProfileRegistryPlugin.init(); + + JsonNode uiSpec = idrepoProfileRegistryPlugin.getUISpecification(); + Assert.assertNotNull(uiSpec); + Assert.assertTrue(uiSpec.has("schema")); + Assert.assertTrue(uiSpec.has("errors")); + Assert.assertTrue(uiSpec.has("i18nValues")); + Assert.assertTrue(uiSpec.has("allowedValues")); + Assert.assertTrue(uiSpec.has("maxUploadFileSize")); + } + + @Test + public void createProfile_withValidBuildDocuments_thenPass() throws Exception { + String requestId = "req-123"; + String individualId = "ind-456"; + + ObjectNode biometrics = objectMapper.createObjectNode(); + biometrics.put("value", "base64string"); + ObjectNode mockIdentity = objectMapper.createObjectNode(); + mockIdentity.put("phone", individualId); + mockIdentity.set("individualBiometrics", biometrics); + ProfileDto profileDto = new ProfileDto(); + profileDto.setIndividualId(individualId); + profileDto.setIdentity(mockIdentity); + + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + UINResponse uinResponse = new UINResponse(); + uinResponse.setUIN("1234567890"); + responseWrapper.setResponse(uinResponse); + ResponseEntity> responseEntity = new ResponseEntity<>(responseWrapper, HttpStatus.OK); + + Mockito.when(profileCacheService.setHandleRequestIds(Mockito.anyString(),Mockito.anyList())).thenReturn(null); + Mockito.when(restTemplate.exchange("http://localhost:8080/identity/v1/uin", HttpMethod.GET, null, + new ParameterizedTypeReference>() {} + )).thenReturn(responseEntity); + + ResponseWrapper responseWrapper2 = new ResponseWrapper<>(); + SchemaResponse schemaResponse = new SchemaResponse(); + schemaResponse.setIdVersion(0.0); + schemaResponse.setSchemaJson("{\"properties\":{\"identity\":{\"required\":[\"phone\"],\"properties\":{\"phone\":{\"type\":\"string\"}}}}}"); + responseWrapper2.setResponse(schemaResponse); + ResponseEntity> responseEntity2=new ResponseEntity<>(responseWrapper2, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + "http://localhost:8080/identity/v1/schema/"+0.0, HttpMethod.GET, null, + new ParameterizedTypeReference>() {} + )).thenReturn(responseEntity2); + + // Mock biometricUtil + Mockito.when(biometricUtil.convertBase64JpegToBase64BirXML("base64string")).thenReturn("encodedXml"); + + ResponseWrapper responseWrapper3 = new ResponseWrapper<>(); + IdentityResponse identityResponse = new IdentityResponse(); + identityResponse.setStatus("SUCCESS"); + responseWrapper3.setResponse(identityResponse); + ResponseEntity> responseEntity3=new ResponseEntity<>(responseWrapper3, HttpStatus.OK); + + Mockito.when(restTemplate.exchange( + Mockito.anyString(), + Mockito.any(HttpMethod.class), + Mockito.any(HttpEntity.class), + Mockito.eq(new ParameterizedTypeReference>() { + }))).thenReturn(responseEntity3); + Mockito.when(profileCacheService.setHandleRequestIds(Mockito.anyString(), Mockito.anyList())).thenReturn(null); + ProfileResult profileResult = idrepoProfileRegistryPlugin.createProfile(requestId, profileDto); + Assert.assertNotNull(profileResult); + Assert.assertEquals(profileResult.getStatus(),"SUCCESS"); + } } diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java index 65a8c62f..e597f579 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.mosip.signup.api.dto.*; import io.mosip.signup.api.exception.IdentityVerifierException; +import io.mosip.signup.api.util.ProcessType; import io.mosip.signup.api.util.VerificationStatus; import org.junit.Assert; import org.junit.Before; @@ -120,4 +121,20 @@ public void getVerifiedResult_withInvalidTransactionId_thenFail() throws Identit Assert.assertEquals(verificationResult.getErrorCode(),"mock_verification_failed"); Assert.assertEquals(verificationResult.getStatus(),VerificationStatus.FAILED); } + + @Test + public void getSupportedProcessTypes_thenPass() { + List supportedTypes = mockIdentityVerifierPlugin.getSupportedProcessTypes(); + Assert.assertNotNull(supportedTypes); + Assert.assertEquals(1, supportedTypes.size()); + Assert.assertEquals(ProcessType.VIDEO, supportedTypes.get(0)); + } + + @Test + public void initialize_thenPass() { + IdentityVerificationInitDto dto = new IdentityVerificationInitDto(); + dto.setDisabilityType("NONE"); + mockIdentityVerifierPlugin.initialize("txn-123", dto); + } + } From 0c336ff88783661696023fcf14be9a4d208553cc Mon Sep 17 00:00:00 2001 From: ase-101 Date: Mon, 13 Oct 2025 17:18:49 +0530 Subject: [PATCH 40/58] ES-2589 (#169) Signed-off-by: ase-101 --- .../MockProfileRegistryPluginImpl.java | 15 +++++- .../MockProfileRegistryPluginImplTest.java | 46 +++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java b/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java index 257bcc0c..470d5b00 100644 --- a/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java +++ b/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java @@ -75,6 +75,12 @@ public class MockProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.mock.get-schema.endpoint}") private String getSchemaEndpoint; + @Value("${mosip.signup.mock.face.biometric.field-name:encodedPhoto}") + private String faceBiometricFieldName; + + @Value("${mosip.signup.mock.face.biometric.value.prefix:data:image/jpeg;base64,}") + private String faceBiometricValuePrefix; + @Autowired @Qualifier("selfTokenRestTemplate") private RestTemplate restTemplate; @@ -107,8 +113,13 @@ public ProfileResult createProfile(String requestId, ProfileDto profileDto) thro log.error("{} and userName mismatch", usernameField); throw new InvalidProfileException(ErrorConstants.IDENTIFIER_MISMATCH); } - JsonNode inputJson = profileDto.getIdentity(); - ((ObjectNode)inputJson).put("individualId", profileDto.getIndividualId()); + ObjectNode inputJson = (ObjectNode) profileDto.getIdentity(); + inputJson.put("individualId", profileDto.getIndividualId()); + + if(inputJson.hasNonNull(faceBiometricFieldName) && inputJson.get(faceBiometricFieldName).hasNonNull("value")) { + ObjectNode facePhotoNode = (ObjectNode) inputJson.get(faceBiometricFieldName); + inputJson.put(faceBiometricFieldName, faceBiometricValuePrefix+facePhotoNode.get("value").asText()); + } MockIdentityResponse identityResponse = addIdentity(inputJson); ProfileResult profileResult = new ProfileResult(); diff --git a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java index 069cf1a6..a9736eb1 100644 --- a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java +++ b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import io.mosip.esignet.core.dto.Error; import io.mosip.esignet.core.dto.ResponseWrapper; @@ -34,6 +35,8 @@ import java.util.List; import java.util.Map; +import static org.mockito.Mockito.mock; + @RunWith(MockitoJUnitRunner.class) public class MockProfileRegistryPluginImplTest { @@ -158,6 +161,49 @@ public void createProfile_withInValidRequestAndProfileDto_thenFail() throws Prof } } + @Test + public void createProfile_withFacePhoto_thenPass() throws ProfileException { + // Arrange + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identityEndpoint","http://localhost:8080/"); + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "usernameField","individualId"); + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "faceBiometricFieldName","encodedPhoto"); + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "faceBiometricValuePrefix","data:image/jpeg;base64,"); + + ObjectNode mockIdentity = mock(ObjectNode.class); + Mockito.when(mockIdentity.get("individualId")).thenReturn(objectMapper.valueToTree("1234567890")); + Mockito.when(mockIdentity.hasNonNull("encodedPhoto")).thenReturn(true); + ObjectNode encodedPhotoNode = mock(ObjectNode.class); + Mockito.when(mockIdentity.get("encodedPhoto")).thenReturn(encodedPhotoNode) + .thenReturn(encodedPhotoNode); + Mockito.when(encodedPhotoNode.hasNonNull("value")).thenReturn(true); + Mockito.when(encodedPhotoNode.get("value")).thenReturn(objectMapper.valueToTree("encodedPhotoString")) + .thenReturn(objectMapper.valueToTree("encodedPhotoString")); + ProfileDto profileDto = new ProfileDto(); + profileDto.setIndividualId("1234567890"); + profileDto.setIdentity(mockIdentity); + + MockIdentityResponse mockIdentityResponse=new MockIdentityResponse(); + mockIdentityResponse.setStatus("CREATED"); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(mockIdentityResponse); + ResponseEntity> responseEntity=new ResponseEntity<>(responseWrapper, HttpStatus.OK); + + Mockito.when(restTemplate.exchange( + Mockito.anyString(), + Mockito.any(HttpMethod.class), + Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() { + }))).thenReturn(responseEntity); + + ProfileResult result = mockProfileRegistryPlugin.createProfile("requestId", profileDto); + Mockito.verify(mockIdentity, Mockito.times(1)).put("individualId", + "1234567890"); + Mockito.verify(mockIdentity, Mockito.times(1)).put("encodedPhoto", + "data:image/jpeg;base64,encodedPhotoString"); + Assert.assertNotNull(result); + Assert.assertEquals(result.getStatus(), "CREATED"); + } + @Test public void getProfileCreateUpdateStatus_withValidRequestId_thenPass() throws ProfileException { From 4194119d7269be5bdda041cf6687c20af8454b2e Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Fri, 24 Oct 2025 11:43:44 +0530 Subject: [PATCH 41/58] [ES-2627] Cache UISpec with TTL in esignet-signup (#170) * moved UI spec logic from init to separate method Signed-off-by: Md-Humair-KK * resolved review comments Signed-off-by: Md-Humair-KK * added fallback of default value to maxupload file size Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK --- .../IdrepoProfileRegistryPluginImpl.java | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index e2d3da48..a65c1ba5 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -170,30 +170,9 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { private String docTypesAndCategoryBaseUrl; - private JsonNode uiSpec; - @PostConstruct public void init() { - String responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { - }) - .getResponse() - .toString(); - Object schema = JsonPath.read(responseJson, schemaJsonpath); - Object errors = readErrors(responseJson, errorsJsonpath); - ObjectNode i18nValues = readI18nValues(responseJson); - JsonNode allowedValues = readAllowedValues(responseJson); - Object maxUploadFileSize = JsonPath.read(responseJson, maxUploadFileSizeJsonpath); - this.uiSpec = objectMapper.valueToTree( - Map.ofEntries( - Map.entry("schema", schema), - Map.entry("errors", errors), - Map.entry("i18nValues", i18nValues), - Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)), - Map.entry("allowedValues", allowedValues), - Map.entry("maxUploadFileSize", maxUploadFileSize) - ) - ); IIORegistry registry = IIORegistry.getDefaultInstance(); registry.registerServiceProvider(new J2KImageReaderSpi()); } @@ -249,6 +228,22 @@ private Object readErrors(String responseJson, String jsonpath) { return errors; } + /** + * Reads max upload file size from the UI-spec + * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} + * @return maxUploadFileSize + */ + private Object readMaxUploadFileSize(String responseJson) { + Object maxUploadFileSize; + try { + maxUploadFileSize = JsonPath.read(responseJson, maxUploadFileSizeJsonpath); + } catch (PathNotFoundException e) { + log.error("maxUploadFileSize not found in schema, setting to default"); + maxUploadFileSize = 5242880; + } + return maxUploadFileSize; + } + /** * Generate combined JsonNode from List dynamicFields and List documentCategories * @return JsonNode containing the allowed values. @@ -539,7 +534,26 @@ public boolean isMatch(JsonNode identity, JsonNode inputChallenge) { @Override public JsonNode getUISpecification() { - return this.uiSpec; + String responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { + }) + .getResponse() + .toString(); + Object schema = JsonPath.read(responseJson, schemaJsonpath); + Object errors = readErrors(responseJson, errorsJsonpath); + ObjectNode i18nValues = readI18nValues(responseJson); + JsonNode allowedValues = readAllowedValues(responseJson); + Object maxUploadFileSize = readMaxUploadFileSize(responseJson); + + return objectMapper.valueToTree( + Map.ofEntries( + Map.entry("schema", schema), + Map.entry("errors", errors), + Map.entry("i18nValues", i18nValues), + Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)), + Map.entry("allowedValues", allowedValues), + Map.entry("maxUploadFileSize", maxUploadFileSize) + ) + ); } private SchemaResponse getSchemaJson(double version) throws ProfileException { From eb55a6bdc43869865d99539ac69631d307c9f0b3 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Sun, 2 Nov 2025 16:00:31 +0530 Subject: [PATCH 42/58] resolve vulnerabilities (#171) Signed-off-by: Md-Humair-KK --- sunbird-rc-plugin/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index 24b05d66..5655a411 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -143,7 +143,7 @@ com.fasterxml.jackson.core jackson-databind - 2.11.3 + 2.12.6 provided @@ -154,7 +154,7 @@ com.nimbusds nimbus-jose-jwt - 8.19 + 9.37.4 provided From 8569569136ffd67ac80f2b1ce4658b2ba28f5dc9 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Mon, 3 Nov 2025 23:01:09 +0530 Subject: [PATCH 43/58] Updated the develop version to 1.3.5-SNAPSHOT (#173) Signed-off-by: ase-101 --- mock-plugin/pom.xml | 2 +- mosip-identity-plugin/pom.xml | 2 +- sunbird-rc-plugin/pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index feef11ce..e1d66db9 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -5,7 +5,7 @@ io.mosip.esignet mock-plugin - 1.3.4-SNAPSHOT + 1.3.5-SNAPSHOT mock-plugin jar Mockup of a wrapper implementation that is used to showcase the integration with e-Signet diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 5188f241..e1a68484 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet - 1.3.4-SNAPSHOT + 1.3.5-SNAPSHOT mosip-identity-plugin mosip-identity-plugin e-Signet Integration Implementation for MOSIP ID system diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index 5655a411..7ebbd4bc 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet.plugin.sunbirdrc sunbird-rc-plugin - 1.3.4-SNAPSHOT + 1.3.5-SNAPSHOT jar sunbird-rc-plugin From a7556505fda02e528faac7b23ccb7dcc71b826b6 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 14 Nov 2025 14:41:00 +0530 Subject: [PATCH 44/58] Added backward compatiblity (#175) Signed-off-by: ase-101 --- .../java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java index f632139b..b776fa42 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java @@ -52,6 +52,7 @@ public BIR createBIRFromISO(byte[] isoImage) { BDBInfo bdbInfo = new BDBInfo.BDBInfoBuilder() .withCreationDate(LocalDateTime.now(ZoneOffset.UTC)) .withType(List.of(BiometricType.FACE)) + .withSubtype(List.of()) .withPurpose(PurposeType.ENROLL) .withLevel(ProcessedLevelType.RAW) .withFormat(new RegistryIDType("Mosip", "8")) From 318645030a34056ebb95192cd4c660a0dd74db20 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Tue, 2 Dec 2025 00:21:43 +0530 Subject: [PATCH 45/58] [ES-2393] Mock plugin java11 to java21 migration (#176) * initial PR mock plugin for java21 migration Signed-off-by: Md-Humair-KK * java 21 migration Signed-off-by: Md-Humair-KK * java 21 migration Signed-off-by: Md-Humair-KK * solved review comments Signed-off-by: Md-Humair-KK * solved review comments Signed-off-by: Md-Humair-KK * reverted test case changes Signed-off-by: Md-Humair-KK * verifier test class reverted Signed-off-by: Md-Humair-KK * removed spring boot and web dependencies Signed-off-by: Md-Humair-KK * removed spring boot and web dependencies Signed-off-by: Md-Humair-KK * fixed target release failure Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK --- .github/workflows/push-trigger.yml | 18 ++++---- mock-plugin/pom.xml | 42 ++++++++++--------- .../mock/service/MockHelperServiceTest.java | 36 ++-------------- 3 files changed, 36 insertions(+), 60 deletions(-) diff --git a/.github/workflows/push-trigger.yml b/.github/workflows/push-trigger.yml index 57258325..c3ef6f3e 100644 --- a/.github/workflows/push-trigger.yml +++ b/.github/workflows/push-trigger.yml @@ -23,7 +23,7 @@ on: jobs: build-maven-mock-plugin: - uses: mosip/kattu/.github/workflows/maven-build.yml@master + uses: mosip/kattu/.github/workflows/maven-build.yml@master-java21 with: SERVICE_LOCATION: ./mock-plugin BUILD_ARTIFACT: mock-plugin @@ -37,7 +37,7 @@ jobs: publish-mock-plugin-to-nexus: if: "${{ !contains(github.ref, 'master') && github.event_name != 'pull_request' && github.event_name != 'release' && github.event_name != 'prerelease' && github.event_name != 'publish' }}" needs: build-maven-mock-plugin - uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master + uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master-java21 with: SERVICE_LOCATION: ./mock-plugin secrets: @@ -51,7 +51,7 @@ jobs: sonar-analysis-mock-plugin: needs: build-maven-mock-plugin if: "${{ github.event_name != 'pull_request' }}" - uses: mosip/kattu/.github/workflows/maven-sonar-analysis.yml@master + uses: mosip/kattu/.github/workflows/maven-sonar-analysis.yml@master-java21 with: SERVICE_LOCATION: ./mock-plugin secrets: @@ -64,7 +64,7 @@ jobs: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} build-maven-mosip-identity-plugin: - uses: mosip/kattu/.github/workflows/maven-build.yml@master + uses: mosip/kattu/.github/workflows/maven-build.yml@master-java21 with: SERVICE_LOCATION: ./mosip-identity-plugin BUILD_ARTIFACT: mosip-identity-plugin @@ -78,7 +78,7 @@ jobs: publish-mosip-identity-plugin-to-nexus: if: "${{ !contains(github.ref, 'master') && github.event_name != 'pull_request' && github.event_name != 'release' && github.event_name != 'prerelease' && github.event_name != 'publish' }}" needs: build-maven-mosip-identity-plugin - uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master + uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master-java21 with: SERVICE_LOCATION: ./mosip-identity-plugin secrets: @@ -92,7 +92,7 @@ jobs: sonar-analysis-mosip-identity-plugin: needs: build-maven-mosip-identity-plugin if: "${{ github.event_name != 'pull_request' }}" - uses: mosip/kattu/.github/workflows/maven-sonar-analysis.yml@master + uses: mosip/kattu/.github/workflows/maven-sonar-analysis.yml@master-java21 with: SERVICE_LOCATION: ./mosip-identity-plugin secrets: @@ -105,7 +105,7 @@ jobs: SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} build-maven-sunbird-rc-plugin: - uses: mosip/kattu/.github/workflows/maven-build.yml@master + uses: mosip/kattu/.github/workflows/maven-build.yml@master-java21 with: SERVICE_LOCATION: ./sunbird-rc-plugin BUILD_ARTIFACT: sunbird-rc-plugin @@ -119,7 +119,7 @@ jobs: publish-sunbird-rc-plugin-to-nexus: if: "${{ !contains(github.ref, 'master') && github.event_name != 'pull_request' && github.event_name != 'release' && github.event_name != 'prerelease' && github.event_name != 'publish' }}" needs: build-maven-sunbird-rc-plugin - uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master + uses: mosip/kattu/.github/workflows/maven-publish-to-nexus.yml@master-java21 with: SERVICE_LOCATION: ./sunbird-rc-plugin secrets: @@ -133,7 +133,7 @@ jobs: sonar-analysis-sunbird-rc-plugin: needs: build-maven-sunbird-rc-plugin if: "${{ github.event_name != 'pull_request' }}" - uses: mosip/kattu/.github/workflows/maven-sonar-analysis.yml@master + uses: mosip/kattu/.github/workflows/maven-sonar-analysis.yml@master-java21 with: SERVICE_LOCATION: ./sunbird-rc-plugin secrets: diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index e1d66db9..0c4a25fa 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -67,32 +67,31 @@ - 11 + 21 UTF-8 - 11 - 11 - 3.8.0 - 3.0.2 - 3.1.0 - 2.22.0 - 0.8.5 - 3.7.0.1746 - 3.2.0 - 2.3 + 21 + 21 + 3.14.1 + 3.3.0 + 3.5.0 + 3.1.2 + 0.8.14 + 3.9.1.2184 + 3.4.0 + 3.5.0 - Hoxton.SR8 - 2.3.6.RELEASE + 2023.0.8 + 3.2.12 - 1.2.2.0-SNAPSHOT - 1.7.0-SNAPSHOT - 1.3.0-SNAPSHOT + 1.3.0-beta.4 + 1.7.1-SNAPSHOT + 1.3.1-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** - junit @@ -104,7 +103,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.42 compile @@ -146,6 +145,12 @@ ${esignet-signup.version} provided + + org.mockito + mockito-core + 5.20.0 + test + @@ -260,7 +265,6 @@ false ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED - --illegal-access=permit diff --git a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java index 577ca1b9..352026d3 100644 --- a/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java +++ b/mock-plugin/src/test/java/io/mosip/esignet/plugin/mock/service/MockHelperServiceTest.java @@ -4,7 +4,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import io.mosip.esignet.api.dto.*; +import io.mosip.esignet.api.dto.AuthChallenge; +import io.mosip.esignet.api.dto.KycAuthDto; +import io.mosip.esignet.api.dto.KycAuthResult; +import io.mosip.esignet.api.dto.SendOtpResult; import io.mosip.esignet.api.exception.KycAuthException; import io.mosip.esignet.api.exception.SendOtpException; import io.mosip.esignet.api.util.ErrorConstants; @@ -14,7 +17,6 @@ import io.mosip.kernel.signature.dto.JWTSignatureResponseDto; import io.mosip.kernel.signature.service.SignatureService; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; @@ -28,8 +30,6 @@ import org.springframework.test.util.ReflectionTestUtils; import org.springframework.web.client.RestTemplate; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.time.LocalDateTime; import java.util.HashMap; import java.util.List; @@ -52,34 +52,6 @@ public class MockHelperServiceTest { private ObjectMapper objectMapper = new ObjectMapper(); - @Before - public void setUp() throws Exception { - // Create the map you want to set - Map> supportedKycAuthFormats = new HashMap<>(); - supportedKycAuthFormats.put("OTP", List.of("alpha-numeric")); - supportedKycAuthFormats.put("PIN", List.of("number")); - supportedKycAuthFormats.put("BIO", List.of("encoded-json")); - supportedKycAuthFormats.put("WLA", List.of("jwt")); - supportedKycAuthFormats.put("KBI", List.of("base64url-encoded-json")); - supportedKycAuthFormats.put("PWD", List.of("alpha-numeric")); - - // Get the field - Field field = MockHelperService.class.getDeclaredField("supportedKycAuthFormats"); - - // Make the field accessible - field.setAccessible(true); - - // Remove the final modifier - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - int modifiers = field.getModifiers(); - modifiers &= ~Modifier.FINAL; // Clear the FINAL bit - modifiersField.setInt(field, modifiers); - - // Now you can set the field value - field.set(null, supportedKycAuthFormats); // Setting static field - } - @Test public void doKycAuthMock_withAuthFactorAsOTP_thenPass() throws KycAuthException { From e52adcbc52f0d5464b7afddb047df0c7e9d5cce3 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Wed, 3 Dec 2025 11:21:39 +0530 Subject: [PATCH 46/58] [ES-2394] java21 migration Mosip identity plugin (#177) * java21 migration mosip plugin Signed-off-by: Md-Humair-KK * java21 migration mosip plugin Signed-off-by: Md-Humair-KK * java21 migration sunbird plugin Signed-off-by: Md-Humair-KK * reverted test case Signed-off-by: Md-Humair-KK * reverted test case Signed-off-by: Md-Humair-KK * addressed coderabbit comments Signed-off-by: Md-Humair-KK * resolve coderabbit comments Signed-off-by: Md-Humair-KK * removed spring boot dependency Signed-off-by: Md-Humair-KK * fixed invalid traget release issue Signed-off-by: Md-Humair-KK * revreted as already done part of ES-2393 Signed-off-by: Md-Humair-KK * fixed target release failure Signed-off-by: Md-Humair-KK * removed deprecated code and updated Signed-off-by: Md-Humair-KK --------- Signed-off-by: Md-Humair-KK --- mosip-identity-plugin/pom.xml | 46 +++++++++---------- .../plugin/mosipid/service/HelperService.java | 2 +- .../IdrepoProfileRegistryPluginImpl.java | 2 +- .../plugin/mosipid/util/BiometricUtil.java | 6 +-- .../MockIdentityVerifierPluginImplTest.java | 10 ++-- sunbird-rc-plugin/pom.xml | 35 ++++++++------ .../SunbirdRCAuthenticationService.java | 10 ++-- 7 files changed, 57 insertions(+), 54 deletions(-) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index e1a68484..d87c4563 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -67,32 +67,31 @@ - 11 + 21 UTF-8 - 11 - 11 - 3.8.0 - 3.0.2 - 3.1.0 - 2.22.0 - 0.8.5 - 3.7.0.1746 - 3.2.0 - 2.3 - - Hoxton.SR8 - 2.3.6.RELEASE - - 1.2.2.0-SNAPSHOT - 1.7.0-SNAPSHOT - 1.3.0-SNAPSHOT + 21 + 21 + 3.14.1 + 3.3.0 + 3.5.0 + 3.1.2 + 0.8.14 + 3.9.1.2184 + 3.4.0 + 3.5.0 + + 2023.0.8 + 3.2.12 + + 1.3.0-beta.4 + 1.7.1-SNAPSHOT + 1.3.1-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** - @@ -116,7 +115,7 @@ io.mosip.biometric.util biometrics-util - 1.2.0.3 + 1.3.0-beta.1 com.fasterxml.jackson.core @@ -150,7 +149,7 @@ io.mosip.kernel kernel-cbeffutil-api - 1.2.0.3 + 1.3.0-beta.1 org.slf4j @@ -206,7 +205,7 @@ org.springframework.boot spring-boot-starter-test - 2.3.6.RELEASE + 3.2.12 test @@ -220,7 +219,7 @@ org.projectlombok lombok - 1.18.22 + 1.18.42 compile @@ -398,7 +397,6 @@ false ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED - --illegal-access=permit diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java index 2391b087..c255a2ab 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java @@ -122,7 +122,7 @@ protected void setAuthRequest(List challengeList, IdaKycAuthReque .filter( auth -> auth != null && auth.getAuthFactorType() != null) .forEach( auth -> { buildAuthRequest(auth, authRequest); }); - KeyGenerator keyGenerator = KeyGeneratorUtils.getKeyGenerator(symmetricAlgorithm, symmetricKeyLength); + KeyGenerator keyGenerator = KeyGeneratorUtils.getKeyGenerator(symmetricAlgorithm, symmetricKeyLength, secureRandom); final SecretKey symmetricKey = keyGenerator.generateKey(); String request = objectMapper.writeValueAsString(authRequest); String hexEncodedHash = HMACUtils2.digestAsPlainText(request.getBytes(StandardCharsets.UTF_8)); diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index a65c1ba5..2fc21510 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -42,7 +42,7 @@ import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; -import javax.annotation.PostConstruct; +import jakarta.annotation.PostConstruct; import javax.imageio.spi.IIORegistry; import java.nio.charset.StandardCharsets; import java.security.NoSuchAlgorithmException; diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java index b776fa42..f6b1a3c2 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/util/BiometricUtil.java @@ -11,10 +11,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import org.springframework.util.Base64Utils; import java.time.LocalDateTime; import java.time.ZoneOffset; +import java.util.Base64; import java.util.List; import static io.mosip.biometrics.util.CommonUtil.convertJPEGToJP2UsingOpenCV; @@ -29,7 +29,7 @@ public class BiometricUtil { private int faceImageCompressionRatio; public String convertBase64JpegToBase64BirXML(String base64Jpeg) throws Exception { - byte[] jpegImage = Base64Utils.decodeFromString(base64Jpeg); + byte[] jpegImage = Base64.getDecoder().decode(base64Jpeg); byte[] jp2Image = convertJPEGToJP2UsingOpenCV(jpegImage, faceImageCompressionRatio); ConvertRequestDto convertRequest = new ConvertRequestDto(); @@ -44,7 +44,7 @@ public String convertBase64JpegToBase64BirXML(String base64Jpeg) throws Exceptio BIR bir = createBIRFromISO(isoImage); - return Base64Utils.encodeToUrlSafeString(cbeffUtil.createXML(List.of(bir))); + return Base64.getUrlEncoder().encodeToString(cbeffUtil.createXML(List.of(bir))); } public BIR createBIRFromISO(byte[] isoImage) { diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java index e597f579..17ac2cac 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/MockIdentityVerifierPluginImplTest.java @@ -39,7 +39,11 @@ public class MockIdentityVerifierPluginImplTest { ResourceLoader resourceLoader; - ObjectMapper objectMapper = new ObjectMapper();; + ObjectMapper objectMapper = new ObjectMapper(); + + @Mock + private KafkaTemplate kafkaTemplate; + @Before public void before(){ @@ -66,10 +70,6 @@ public void verify_withValidIdentityVerificationDto_thenPass() throws IdentityVe Mockito.when(resourceLoader.getResource(Mockito.anyString())).thenReturn(resource); Mockito.when(resource.getInputStream()).thenReturn(new ByteArrayInputStream(jsonContent.getBytes())); - KafkaTemplate kafkaTemplate = Mockito.mock(KafkaTemplate.class); - ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "kafkaTemplate", kafkaTemplate); - //ReflectionTestUtils.setField(mockIdentityVerifierPlugin, "resultTopic", "ANALYZE_FRAMES_RESULT"); - mockIdentityVerifierPlugin.verify(transactionId, identityVerificationDto); Mockito.verify(resourceLoader).getResource(Mockito.anyString()); diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index 7ebbd4bc..e4c5023f 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -66,22 +66,22 @@ UTF-8 - 11 - 11 - 11 + 21 + 21 + 21 3.3.0 - 11 - 11 - 2.4 - 2.22.0 + 21 + 21 + 3.14.1 + 3.1.2 1.5 2.2.1 0.7.0 3.0.1 - 0.8.5 - 3.3.1 - 1.7.0-SNAPSHOT - 1.2.1.0 + 0.8.14 + 3.4.0 + 1.7.1-SNAPSHOT + 1.3.0-beta.4 @@ -96,7 +96,7 @@ org.projectlombok lombok compile - 1.18.22 + 1.18.42 @@ -143,7 +143,7 @@ com.fasterxml.jackson.core jackson-databind - 2.12.6 + 2.15.0 provided @@ -157,6 +157,12 @@ 9.37.4 provided + + org.mockito + mockito-core + 5.20.0 + test + @@ -283,14 +289,13 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.0 + ${maven-surefire-plugin.version} false false ${argLine} --add-opens java.xml/jdk.xml.internal=ALL-UNNAMED - --illegal-access=permit diff --git a/sunbird-rc-plugin/src/main/java/io/mosip/esignet/plugin/sunbirdrc/service/SunbirdRCAuthenticationService.java b/sunbird-rc-plugin/src/main/java/io/mosip/esignet/plugin/sunbirdrc/service/SunbirdRCAuthenticationService.java index 46d40b3d..f5eb1bc1 100644 --- a/sunbird-rc-plugin/src/main/java/io/mosip/esignet/plugin/sunbirdrc/service/SunbirdRCAuthenticationService.java +++ b/sunbird-rc-plugin/src/main/java/io/mosip/esignet/plugin/sunbirdrc/service/SunbirdRCAuthenticationService.java @@ -38,10 +38,10 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import javax.annotation.PostConstruct; -import javax.validation.Valid; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.annotation.PostConstruct; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import java.nio.charset.StandardCharsets; import java.util.*; @@ -264,7 +264,7 @@ private KycAuthResult validateKnowledgeBasedAuth(String individualId, AuthChalle String requestBody = objectMapper.writeValueAsString(registrySearchRequestDto); RequestEntity requestEntity = RequestEntity .post(UriComponentsBuilder.fromUriString(registrySearchUrl).build().toUri()) - .contentType(MediaType.APPLICATION_JSON_UTF8) + .contentType(MediaType.APPLICATION_JSON) .body(requestBody); ResponseEntity>> responseEntity = restTemplate.exchange(requestEntity, new ParameterizedTypeReference>>() {}); From 4e73cb5249e508b211f8a3fc02c2ca7c3c8b50f7 Mon Sep 17 00:00:00 2001 From: pvsaidurga Date: Fri, 5 Dec 2025 14:03:45 +0530 Subject: [PATCH 47/58] Updated pom version (#181) Signed-off-by: pvsaidurga --- mock-plugin/pom.xml | 6 +++--- mosip-identity-plugin/pom.xml | 7 ++++--- sunbird-rc-plugin/pom.xml | 4 ++-- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index 0c4a25fa..a9fdb91a 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -5,7 +5,7 @@ io.mosip.esignet mock-plugin - 1.3.5-SNAPSHOT + 1.4.0-SNAPSHOT mock-plugin jar Mockup of a wrapper implementation that is used to showcase the integration with e-Signet @@ -86,8 +86,8 @@ 3.2.12 1.3.0-beta.4 - 1.7.1-SNAPSHOT - 1.3.1-SNAPSHOT + 1.8.0-SNAPSHOT + 1.4.0-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index d87c4563..6c9e7188 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet - 1.3.5-SNAPSHOT + 1.4.0-SNAPSHOT mosip-identity-plugin mosip-identity-plugin e-Signet Integration Implementation for MOSIP ID system @@ -86,12 +86,13 @@ 3.2.12 1.3.0-beta.4 - 1.7.1-SNAPSHOT - 1.3.1-SNAPSHOT + 1.8.0-SNAPSHOT + 1.4.0-SNAPSHOT **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** **/dto/**,**/entity/**,**/config/** + diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index e4c5023f..fa0cac73 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 io.mosip.esignet.plugin.sunbirdrc sunbird-rc-plugin - 1.3.5-SNAPSHOT + 1.4.0-SNAPSHOT jar sunbird-rc-plugin @@ -80,7 +80,7 @@ 3.0.1 0.8.14 3.4.0 - 1.7.1-SNAPSHOT + 1.8.0-SNAPSHOT 1.3.0-beta.4 From 54a519e139ca46dda9339cce168df1eeddeaf55b Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Fri, 12 Dec 2025 16:09:02 +0530 Subject: [PATCH 48/58] [ES-2759] removed conflicting dependency (#182) * removed conflicting dependency Signed-off-by: Sachin Rana * removed other conflicting dependency Signed-off-by: Sachin Rana --------- Signed-off-by: Sachin Rana --- mosip-identity-plugin/pom.xml | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 6c9e7188..15d9f236 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -200,16 +200,13 @@ io.micrometer micrometer-registry-prometheus + + org.mockito + mockito-core + - - org.springframework.boot - spring-boot-starter-test - 3.2.12 - test - - junit junit From ecc1eeebf243da7f9d8ca6700941dd9b6cde8971 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Mon, 22 Dec 2025 19:27:01 +0530 Subject: [PATCH 49/58] added -parameters compiler flag (#183) Signed-off-by: Sachin Rana --- mock-plugin/pom.xml | 1 + mosip-identity-plugin/pom.xml | 1 + 2 files changed, 2 insertions(+) diff --git a/mock-plugin/pom.xml b/mock-plugin/pom.xml index a9fdb91a..19489856 100644 --- a/mock-plugin/pom.xml +++ b/mock-plugin/pom.xml @@ -381,6 +381,7 @@ org.apache.maven.plugins maven-compiler-plugin + true ${maven.compiler.source} ${maven.compiler.target} diff --git a/mosip-identity-plugin/pom.xml b/mosip-identity-plugin/pom.xml index 15d9f236..6f48c0d1 100644 --- a/mosip-identity-plugin/pom.xml +++ b/mosip-identity-plugin/pom.xml @@ -511,6 +511,7 @@ org.apache.maven.plugins maven-compiler-plugin + true ${maven.compiler.source} ${maven.compiler.target} From f698d66f86aa08d16557da16d0e7afdc8b1f1f55 Mon Sep 17 00:00:00 2001 From: Sachin Rana Date: Tue, 20 Jan 2026 13:33:14 +0530 Subject: [PATCH 50/58] setting refId in key generate request - java 21 migration (#184) Signed-off-by: Sachin Rana --- .../plugin/mock/service/MockKeyBindingWrapperService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperService.java b/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperService.java index 48dc47ef..4fef2d8f 100644 --- a/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperService.java +++ b/mock-plugin/src/main/java/io/mosip/esignet/plugin/mock/service/MockKeyBindingWrapperService.java @@ -174,6 +174,7 @@ public KeyBindingResult doKeyBinding(String individualId, List ch private void setupMockBindingKey() { KeyPairGenerateRequestDto mockBindingKeyRequest = new KeyPairGenerateRequestDto(); + mockBindingKeyRequest.setReferenceId(""); mockBindingKeyRequest.setApplicationId(BINDING_SERVICE_APP_ID); keymanagerService.generateMasterKey("CSR", mockBindingKeyRequest); log.info("===================== MOCK_BINDING_SERVICE KEY SETUP COMPLETED ========================"); From f93800c161d6b022e5e6d7380b63a55522c00d39 Mon Sep 17 00:00:00 2001 From: Rajapandi M <138785181+rajapandi1234@users.noreply.github.com> Date: Tue, 24 Feb 2026 14:57:00 +0530 Subject: [PATCH 51/58] Update README.md (#187) Signed-off-by: Rajapandi M <138785181+rajapandi1234@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 47337203..209023e9 100644 --- a/README.md +++ b/README.md @@ -21,5 +21,5 @@ One can use the esignet base image to test the new fixes in the plugin. There ar Either of the above 2 steps should be followed and finally set the "plugin_name_env" environment variable. With this setup, eSignet service should get started with the configured plugin. -## License +## License This project is licensed under the terms of [Mozilla Public License 2.0](LICENSE). From da49f0ea722105a3279c3a88a43cf2db87d3df32 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Thu, 12 Mar 2026 09:52:05 +0530 Subject: [PATCH 52/58] ES-2914 (#190) * ES-2914 Signed-off-by: ase-101 * Fixed review comments Signed-off-by: ase-101 * Fixed review comments Signed-off-by: ase-101 * Fixed review comments Signed-off-by: ase-101 * Fixed review comments Signed-off-by: ase-101 --------- Signed-off-by: ase-101 --- .../IdrepoProfileRegistryPluginImpl.java | 391 +++++++----------- .../src/main/resources/application.properties | 2 +- .../IdrepoProfileRegistryPluginImplTest.java | 206 +++++---- 3 files changed, 262 insertions(+), 337 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 2fc21510..4a2de7b0 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -12,8 +12,6 @@ import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; import com.github.jaiimageio.jpeg2000.impl.J2KImageReaderSpi; -import com.jayway.jsonpath.JsonPath; -import com.jayway.jsonpath.PathNotFoundException; import io.micrometer.core.annotation.Timed; import io.mosip.esignet.core.util.IdentityProviderUtil; import io.mosip.kernel.core.util.HMACUtils2; @@ -35,7 +33,6 @@ import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; @@ -71,19 +68,13 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("#{'${mosip.signup.idrepo.default.selected-handles:phone}'.split(',')}") private List defaultSelectedHandles; - - @Value("${mosip.signup.idrepo.identifier-field:phone}") + + @Value("${mosip.signup.identifier.name}") private String identifierField; @Value("${mosip.signup.idrepo.schema-url}") private String schemaUrl; - @Value("#{'${mosip.kernel.idobjectvalidator.mandatory-attributes.id-repository.new-registration:}'.split(',')}") - private List requiredFields; - - @Value("#{'${mosip.kernel.idobjectvalidator.mandatory-attributes.id-repository.update-uin:}'.split(',')}") - private List requiredUpdateFields; - @Value("${mosip.signup.idrepo.add-identity.request.id}") private String addIdentityRequestID; @@ -126,6 +117,18 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Value("${mosip.signup.idrepo.uin.length:10}") private int uinLength; + @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") + private String uiSpecUrl; + + @Value("${mosip.signup.mosipid.uispec.json.pointer:/0/jsonSpec/0/spec}") + private String uiSpecJsonPointer; + + @Value("${mosip.signup.mosipid.dynamic-fields.endpoint}") + private String dynamicFieldsBaseUrl; + + @Value("${mosip.signup.mosipid.doc-types-category.endpoint}") + private String docTypesAndCategoryBaseUrl; + @Autowired @Qualifier("selfTokenRestTemplate") private RestTemplate restTemplate; @@ -139,36 +142,6 @@ public class IdrepoProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Autowired private BiometricUtil biometricUtil; - @Value("${mosip.signup.mosipid.get-ui-spec.endpoint}") - private String uiSpecUrl; - - @Value("${mosip.signup.mosipid.uispec.schema-jsonpath:$[0].jsonSpec[0].spec.schema}") - private String schemaJsonpath; - - @Value("${mosip.signup.mosipid.uispec.allowedvalues-jsonpath:$[0].jsonSpec[0].spec.allowedValues}") - private String allowedValuesJsonpath; - - @Value("${mosip.signup.mosipid.uispec.i18values-jsonpath:$[0].jsonSpec[0].spec.i18nValues}") - private String i18nValuesJsonpath; - - @Value("${mosip.signup.mosipid.uispec.i18values-errors-jsonpath:$[0].jsonSpec[0].spec.i18nValues.errors}") - private String i18nValuesErrorJsonpath; - - @Value("${mosip.signup.mosipid.uispec.maxuploadfilesize-jsonpath:$[0].jsonSpec[0].spec.maxUploadFileSize}") - private String maxUploadFileSizeJsonpath; - - @Value("${mosip.signup.mosipid.uispec.errors-jsonpath:$[0].jsonSpec[0].spec.errors}") - private String errorsJsonpath; - - @Value("#{${mosip.signup.mosipid.uispec.errors:null}}") - private Map errorsFromConfig = new HashMap<>(); - - @Value("${mosip.signup.mosipid.dynamic-fields.endpoint}") - private String dynamicFieldsBaseUrl; - - @Value("${mosip.signup.mosipid.doc-types-category.endpoint}") - private String docTypesAndCategoryBaseUrl; - @PostConstruct public void init() { @@ -177,191 +150,6 @@ public void init() { registry.registerServiceProvider(new J2KImageReaderSpi()); } - /** - * Read the i18nValues from the UI-spec schema - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @return i18nValues - */ - private ObjectNode readI18nValues(String responseJson) { - Object i18nValueResponse; - ObjectNode i18nValues; - try { - i18nValueResponse = JsonPath.read(responseJson, i18nValuesJsonpath); - i18nValues = objectMapper.convertValue(i18nValueResponse, ObjectNode.class); - i18nValues.set("errors", objectMapper.valueToTree(readErrors(responseJson, i18nValuesErrorJsonpath))); - } catch (PathNotFoundException e) { - log.error("i18nValues not found in schema"); - i18nValues = objectMapper.createObjectNode(); - } - return i18nValues; - } - - /** - * Read the allowed values from master UI-spec and if not found read it from master data. - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @return allowedValues - */ - private JsonNode readAllowedValues(String responseJson) { - JsonNode allowedValues; - ObjectNode allowedValuesFromSpec = objectMapper.convertValue(JsonPath.read(responseJson, allowedValuesJsonpath), ObjectNode.class); - if (allowedValuesFromSpec != null && !allowedValuesFromSpec.isEmpty()) { - allowedValues = allowedValuesFromSpec; //allowed values from UI-Spec - } else { - allowedValues = generateAllowedValues(); //allowed values from master-data - } - return allowedValues; - } - - /** - * Read the errors from UI-spec if not present, from config - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @param jsonpath errors path inside schema - * @return errors - */ - private Object readErrors(String responseJson, String jsonpath) { - Object errors; - try { - errors = JsonPath.read(responseJson, jsonpath); - } catch (PathNotFoundException e) { - errors = errorsFromConfig; - } - return errors; - } - - /** - * Reads max upload file size from the UI-spec - * @param responseJson the response json from ${mosip.signup.mosipid.get-ui-spec.endpoint} - * @return maxUploadFileSize - */ - private Object readMaxUploadFileSize(String responseJson) { - Object maxUploadFileSize; - try { - maxUploadFileSize = JsonPath.read(responseJson, maxUploadFileSizeJsonpath); - } catch (PathNotFoundException e) { - log.error("maxUploadFileSize not found in schema, setting to default"); - maxUploadFileSize = 5242880; - } - return maxUploadFileSize; - } - - /** - * Generate combined JsonNode from List dynamicFields and List documentCategories - * @return JsonNode containing the allowed values. - */ - public JsonNode generateAllowedValues() { - ObjectNode result = objectMapper.createObjectNode(); - fetchAndProcessDynamicFields(result); - fetchAndProcessDocTypesAndCategories(result); - return result; - } - - private String buildDynamicFieldsUrl(int pageNumber, int pageSize) { - return String.format(dynamicFieldsBaseUrl, pageNumber, pageSize); - } - - /** - * Fetch and process document types and categories - */ - private void fetchAndProcessDocTypesAndCategories(ObjectNode result) { - ResponseEntity response = restTemplate.getForEntity(docTypesAndCategoryBaseUrl, JsonNode.class); - JsonNode responseBody = response.getBody(); - - if (responseBody != null && responseBody.has("response")) { - JsonNode data = responseBody.get("response").get("documentCategories"); - if (data != null && data.isArray()) { - for (JsonNode item : data) { - if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; - - String categoryCode = item.hasNonNull("code") ? item.get("code").asText() : null; - String langCode = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; - JsonNode documentTypes = item.get("documentTypes"); - - if (categoryCode == null || langCode == null || documentTypes == null || !documentTypes.isArray()) - continue; - - ObjectNode docTypeMap = (ObjectNode) result.get(categoryCode); - if (docTypeMap == null) { - docTypeMap = objectMapper.createObjectNode(); - result.set(categoryCode, docTypeMap); - } - - for (JsonNode docType : documentTypes) { - String docTypeCode = docType.hasNonNull("code") ? docType.get("code").asText() : null; - String docTypeName = docType.hasNonNull("name") ? docType.get("name").asText() : null; - if (docTypeCode == null || docTypeName == null) continue; - - ObjectNode langMap = (ObjectNode) docTypeMap.get(docTypeCode); - if (langMap == null) { - langMap = objectMapper.createObjectNode(); - docTypeMap.set(docTypeCode, langMap); - } - langMap.put(langCode, docTypeName); - } - } - } - } - } - - /** - * Fetch and processes the dynamic fields JSON list and adds their structured data into the provided ObjectNode. - * @param result The ObjectNode where data is accumulated - */ - private void fetchAndProcessDynamicFields(ObjectNode result) { - int pageNumber = 0; - int pageSize = 10; - int totalPages = 1; - int totalItems = 0; - - while (pageNumber < totalPages) { - String url = buildDynamicFieldsUrl(pageNumber, pageSize); - ResponseEntity response = restTemplate.getForEntity(url, JsonNode.class); - JsonNode responseBody = response.getBody(); - if (responseBody != null && responseBody.has("response")) { - JsonNode responseNode = responseBody.get("response"); - if (pageNumber == 0) { - totalPages = objectMapper.convertValue(responseNode.get("totalPages"), Integer.class); - totalItems = objectMapper.convertValue(responseNode.get("totalItems"), Integer.class); - } - JsonNode data = responseNode.get("data"); - if (data != null && data.isArray()) { - for (JsonNode item : data) { - if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; - - String name = item.hasNonNull("name") ? item.get("name").asText() : null; - String lang = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; - JsonNode fieldValues = item.get("fieldVal"); - - if (name == null || lang == null || fieldValues == null || !fieldValues.isArray()) continue; - - ObjectNode nameNode = (ObjectNode) result.get(name); - if (nameNode == null) { - nameNode = objectMapper.createObjectNode(); - result.set(name, nameNode); - } - - for (JsonNode fv : fieldValues) { - String code = fv.hasNonNull("code") ? fv.get("code").asText() : null; - String value = fv.hasNonNull("value") ? fv.get("value").asText() : null; - if (code == null || value == null) continue; - - ObjectNode langMap = (ObjectNode) nameNode.get(code); - if (langMap == null) { - langMap = objectMapper.createObjectNode(); - nameNode.set(code, langMap); - } - langMap.put(lang, value); - } - } - } - } - pageNumber++; - int remainingItems = totalItems - (pageNumber * pageSize); - if (remainingItems < pageSize) { - pageSize = remainingItems; - } - } - } - @Override public void validate(String action, ProfileDto profileDto) throws InvalidProfileException { @@ -534,26 +322,25 @@ public boolean isMatch(JsonNode identity, JsonNode inputChallenge) { @Override public JsonNode getUISpecification() { - String responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { - }) - .getResponse() - .toString(); - Object schema = JsonPath.read(responseJson, schemaJsonpath); - Object errors = readErrors(responseJson, errorsJsonpath); - ObjectNode i18nValues = readI18nValues(responseJson); - JsonNode allowedValues = readAllowedValues(responseJson); - Object maxUploadFileSize = readMaxUploadFileSize(responseJson); - - return objectMapper.valueToTree( - Map.ofEntries( - Map.entry("schema", schema), - Map.entry("errors", errors), - Map.entry("i18nValues", i18nValues), - Map.entry("language", Map.of("mandatory", mandatoryLanguages, "optional", optionalLanguages)), - Map.entry("allowedValues", allowedValues), - Map.entry("maxUploadFileSize", maxUploadFileSize) - ) - ); + JsonNode responseJson = request(uiSpecUrl, HttpMethod.GET, null, new ParameterizedTypeReference>() { + }).getResponse(); + + JsonNode extractedUiSpec = responseJson.at(uiSpecJsonPointer); + if (extractedUiSpec.isMissingNode() || extractedUiSpec.isNull() || !extractedUiSpec.isObject()) { + log.error("UI Spec is missing in the response from {} at json pointer {}", uiSpecUrl, uiSpecJsonPointer); + return objectMapper.createObjectNode(); + } + ObjectNode uiSpec = (ObjectNode) extractedUiSpec; + + uiSpec.putIfAbsent("language", objectMapper.valueToTree(Map.of("mandatory", mandatoryLanguages, + "optional", optionalLanguages))); + + if(!uiSpec.has("allowedValues")) + uiSpec.putIfAbsent("allowedValues", fetchAllowedValuesFromMasterDataService()); + + uiSpec.putIfAbsent("maxUploadFileSize", objectMapper.valueToTree(5242880)); //5MB default max upload file size + uiSpec.putIfAbsent("resetPasswordChallengeFields", objectMapper.valueToTree(List.of("fullName"))); + return uiSpec; } private SchemaResponse getSchemaJson(double version) throws ProfileException { @@ -837,4 +624,116 @@ private ArrayNode buildDocuments(JsonNode inputJson) { return documents; } + + /** + * Generate combined JsonNode from List dynamicFields and List documentCategories + * @return JsonNode containing the allowed values. + */ + public JsonNode fetchAllowedValuesFromMasterDataService() { + ObjectNode result = objectMapper.createObjectNode(); + fetchAndProcessDynamicFields(result); + fetchAndProcessDocTypesAndCategories(result); + return result; + } + + private String buildDynamicFieldsUrl(int pageNumber, int pageSize) { + return String.format(dynamicFieldsBaseUrl, pageNumber, pageSize); + } + + /** + * Fetch and process document types and categories + */ + private void fetchAndProcessDocTypesAndCategories(ObjectNode result) { + ResponseWrapper response = request(docTypesAndCategoryBaseUrl, HttpMethod.GET, null, + new ParameterizedTypeReference>() {}); + if (!response.getResponse().isNull()) { + JsonNode data = response.getResponse().get("documentCategories"); + if (data != null && data.isArray()) { + for (JsonNode item : data) { + if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; + + String categoryCode = item.hasNonNull("code") ? item.get("code").asText() : null; + String langCode = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; + JsonNode documentTypes = item.get("documentTypes"); + + if (categoryCode == null || langCode == null || documentTypes == null || !documentTypes.isArray()) + continue; + + ObjectNode docTypeMap = (ObjectNode) result.get(categoryCode); + if (docTypeMap == null) { + docTypeMap = objectMapper.createObjectNode(); + result.set(categoryCode, docTypeMap); + } + + for (JsonNode docType : documentTypes) { + String docTypeCode = docType.hasNonNull("code") ? docType.get("code").asText() : null; + String docTypeName = docType.hasNonNull("name") ? docType.get("name").asText() : null; + if (docTypeCode == null || docTypeName == null) continue; + + ObjectNode langMap = (ObjectNode) docTypeMap.get(docTypeCode); + if (langMap == null) { + langMap = objectMapper.createObjectNode(); + docTypeMap.set(docTypeCode, langMap); + } + langMap.put(langCode, docTypeName); + } + } + } + } + } + + /** + * Fetch and processes the dynamic fields JSON list and adds their structured data into the provided ObjectNode. + * @param result The ObjectNode where data is accumulated + */ + private void fetchAndProcessDynamicFields(ObjectNode result) { + int pageNumber = 0; + int pageSize = 10; + int totalPages = 1; + int totalItems = 0; + + while (pageNumber < totalPages) { + String url = buildDynamicFieldsUrl(pageNumber, pageSize); + ResponseWrapper response = request(url, HttpMethod.GET, null, new ParameterizedTypeReference>() {}); + if (!response.getResponse().isNull()) { + JsonNode responseNode = response.getResponse(); + if (pageNumber == 0) { + totalPages = Math.max(1, responseNode.path("totalPages").asInt(1)); + } + JsonNode data = responseNode.get("data"); + if (data != null && data.isArray()) { + for (JsonNode item : data) { + if (!item.has("isActive") || !item.get("isActive").asBoolean()) continue; + + String name = item.hasNonNull("name") ? item.get("name").asText() : null; + String lang = item.hasNonNull("langCode") ? item.get("langCode").asText() : null; + JsonNode fieldValues = item.get("fieldVal"); + + if (name == null || lang == null || fieldValues == null || !fieldValues.isArray()) continue; + + ObjectNode nameNode = (ObjectNode) result.get(name); + if (nameNode == null) { + nameNode = objectMapper.createObjectNode(); + result.set(name, nameNode); + } + + for (JsonNode fv : fieldValues) { + String code = fv.hasNonNull("code") ? fv.get("code").asText() : null; + String value = fv.hasNonNull("value") ? fv.get("value").asText() : null; + if (code == null || value == null) continue; + + ObjectNode langMap = (ObjectNode) nameNode.get(code); + if (langMap == null) { + langMap = objectMapper.createObjectNode(); + nameNode.set(code, langMap); + } + langMap.put(lang, value); + } + } + } + } + pageNumber++; + } + } + } diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 7449929a..05dc7637 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -51,7 +51,7 @@ mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/crede mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?type=schema mosip.signup.mosipid.uispec.errors={required:{en:"This field is required"},passwordMismatch:{en:"Passwords is not matching please check your password"}} -mosip.signup.mosipid.dynamic-fields.endpoint=http://masterdata.kernel/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d" +mosip.signup.mosipid.dynamic-fields.endpoint=http://masterdata.kernel/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d # for multiple languages scenario, the languages should be appended followed by ampersand as ?languages=eng&languages=fra&languages=khm mosip.signup.mosipid.doc-types-category.endpoint=http://masterdata.kernel/v1/masterdata/applicanttype/000/languages?languages=eng diff --git a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java index 0052b72d..9b78e9e9 100644 --- a/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java +++ b/mosip-identity-plugin/src/test/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImplTest.java @@ -1,5 +1,6 @@ package io.mosip.signup.plugin.mosipid.service; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; @@ -62,6 +63,7 @@ public void beforeEach(){ defaultSelectedHandles.add("email"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "defaultSelectedHandles",defaultSelectedHandles); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "objectMapper",objectMapper); + ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uiSpecJsonPointer", "/0/jsonSpec/0/spec"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "getUinEndpoint","http://localhost:8080/identity/v1/uin"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "schemaUrl","http://localhost:8080/identity/v1/schema/"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "identityEndpoint","http://localhost:8080/identity/v1/identity/"); @@ -74,12 +76,6 @@ public void beforeEach(){ ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "mandatoryLanguages", List.of("en")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "optionalLanguages", List.of("fr","ar")); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uinLength", 10); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "schemaJsonpath", "$[0].jsonSpec[0].schema"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "errorsJsonpath", "$[0].jsonSpec[0].errors"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "i18nValuesJsonpath", "$[0].jsonSpec[0].i18nValues"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "i18nValuesErrorJsonpath", "$[0].jsonSpec[0].i18nValues.errors"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "allowedValuesJsonpath", "$[0].jsonSpec[0].allowedValues"); - ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "maxUploadFileSizeJsonpath", "$[0].jsonSpec[0].maxUploadFileSize"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "uiSpecUrl", "http://mock/uispec"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "biometricDataFieldName", "individualBiometrics"); ReflectionTestUtils.setField(idrepoProfileRegistryPlugin, "defaultSelectedHandles", List.of("phone")); @@ -564,55 +560,20 @@ private JsonNode createIdentity() { } @Test - public void generateAllowedValues_withValidDetails_thenPass() { - ObjectNode dynamicItem = objectMapper.createObjectNode(); - dynamicItem.put("isActive", true); - dynamicItem.put("name", "fieldName"); - dynamicItem.put("langCode", "eng"); - - ArrayNode fieldValArray = objectMapper.createArrayNode(); - ObjectNode fieldVal = objectMapper.createObjectNode(); - fieldVal.put("code", "code1"); - fieldVal.put("value", "value1"); - fieldValArray.add(fieldVal); - dynamicItem.set("fieldVal", fieldValArray); - ArrayNode dynamicDataArray = objectMapper.createArrayNode(); - dynamicDataArray.add(dynamicItem); - - ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); - dynamicResponseNode.put("totalPages", 1); - dynamicResponseNode.put("totalItems", 1); - dynamicResponseNode.set("data", dynamicDataArray); - ObjectNode dynamicWrapper = objectMapper.createObjectNode(); - dynamicWrapper.set("response", dynamicResponseNode); - - ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); - - ObjectNode categoryItem = objectMapper.createObjectNode(); - categoryItem.put("isActive", true); - categoryItem.put("code", "cat1"); - categoryItem.put("langCode", "eng"); - - ArrayNode docTypesArray = objectMapper.createArrayNode(); - ObjectNode docType = objectMapper.createObjectNode(); - docType.put("code", "doc1"); - docType.put("name", "Document Name"); - docTypesArray.add(docType); - - categoryItem.set("documentTypes", docTypesArray); - - ArrayNode docCategoriesArray = objectMapper.createArrayNode(); - docCategoriesArray.add(categoryItem); - ObjectNode docResponseNode = objectMapper.createObjectNode(); - docResponseNode.set("documentCategories", docCategoriesArray); - ObjectNode docWrapper = objectMapper.createObjectNode(); - docWrapper.set("response", docResponseNode); + public void fetchAllowedValues_FromMasterDataService_withValidDetails_thenPass() { + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); - ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + ResponseEntity> docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docEntity); - JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); Assert.assertNotNull(result); Assert.assertTrue(result.has("fieldName")); @@ -624,8 +585,9 @@ public void generateAllowedValues_withValidDetails_thenPass() { Assert.assertEquals("Document Name", result.get("cat1").get("doc1").get("eng").asText()); } + @Test - public void generateAllowedValues_withInactiveDynamicField_thenFail() { + public void fetchAllowedValues_FromMasterDataService_withInactiveDynamicField_thenFail() { ObjectNode dynamicItem = objectMapper.createObjectNode(); dynamicItem.put("isActive", false); @@ -635,33 +597,41 @@ public void generateAllowedValues_withInactiveDynamicField_thenFail() { dynamicResponseNode.put("totalPages", 1); dynamicResponseNode.put("totalItems", 1); dynamicResponseNode.set("data", dynamicDataArray); - ObjectNode dynamicWrapper = objectMapper.createObjectNode(); - dynamicWrapper.set("response", dynamicResponseNode); + ResponseWrapper dynamicWrapper = new ResponseWrapper(); + dynamicWrapper.setResponse(dynamicResponseNode); + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); - ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); - ObjectNode docWrapper = objectMapper.createObjectNode(); - docWrapper.set("response", objectMapper.createObjectNode().set("documentCategories", objectMapper.createArrayNode())); - ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + ResponseWrapper docWrapper = new ResponseWrapper(); + docWrapper.setResponse(objectMapper.createObjectNode().set("documentCategories", objectMapper.createArrayNode())); + ResponseEntity> docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docEntity); - JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); Assert.assertNotNull(result); Assert.assertEquals(0, result.size()); } @Test - public void generateAllowedValues_withInactiveDocumentTypesAndCategories_thenFail() { + public void fetchAllowedValues_FromMasterDataService_withInactiveDocumentTypesAndCategories_thenFail() { ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); dynamicResponseNode.put("totalPages", 1); dynamicResponseNode.put("totalItems", 0); dynamicResponseNode.set("data", objectMapper.createArrayNode()); - ObjectNode dynamicWrapper = objectMapper.createObjectNode(); - dynamicWrapper.set("response", dynamicResponseNode); - - ResponseEntity dynamicEntity = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("dynamic"), Mockito.eq(JsonNode.class))).thenReturn(dynamicEntity); + ResponseWrapper dynamicWrapper = new ResponseWrapper(); + dynamicWrapper.setResponse(dynamicResponseNode); + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(dynamicWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); ObjectNode inactiveCategory = objectMapper.createObjectNode(); inactiveCategory.put("isActive", false); // should be skipped @@ -686,13 +656,16 @@ public void generateAllowedValues_withInactiveDocumentTypesAndCategories_thenFai ObjectNode docResponseNode = objectMapper.createObjectNode(); docResponseNode.set("documentCategories", docCategoriesArray); - ObjectNode docWrapper = objectMapper.createObjectNode(); - docWrapper.set("response", docResponseNode); + ResponseWrapper responseWrapper = new ResponseWrapper<>(); + responseWrapper.setResponse(docResponseNode); - ResponseEntity docEntity = new ResponseEntity<>(docWrapper, HttpStatus.OK); - Mockito.when(restTemplate.getForEntity(Mockito.contains("docTypes"), Mockito.eq(JsonNode.class))).thenReturn(docEntity); + ResponseEntity> docResponse = new ResponseEntity<>(responseWrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docResponse); - JsonNode result = idrepoProfileRegistryPlugin.generateAllowedValues(); + JsonNode result = idrepoProfileRegistryPlugin.fetchAllowedValuesFromMasterDataService(); Assert.assertNotNull(result); Assert.assertEquals(0, result.size()); @@ -724,21 +697,12 @@ public void validate_unableToFetchTheSchema_thenFail() throws ProfileException{ } @Test - public void init_shouldPopulateUiSpec_thenPass() { - ObjectNode specNode = objectMapper.createObjectNode(); - specNode.set("schema", objectMapper.createObjectNode().put("someKey", "someValue")); - specNode.set("errors", objectMapper.createObjectNode().put("errKey", "errVal")); - - ObjectNode i18n = objectMapper.createObjectNode(); - i18n.set("en", objectMapper.createObjectNode().put("label", "Name")); - ObjectNode i18nErrors = objectMapper.createObjectNode().put("required", "Required"); - i18n.set("errors", i18nErrors); - specNode.set("i18nValues", i18n); + public void getUISpecification_validResponse_thenPass() throws JsonProcessingException { + String jsonSpec = "{\"spec\":{\"schema\":{\"required\":[\"phone\"],\"properties\":{\"phone\":{\"type\":\"string\"}}}," + + "\"i18nValues\":{\"en\":{\"label\":\"Phone Number\"},\"errors\":{\"invalid_phone\":\"Phone number is invalid\"}}," + + "\"customField\":{\"gender\":\"M,F\"}}}}"; - specNode.set("allowedValues", objectMapper.createObjectNode().put("gender", "M,F")); - specNode.put("maxUploadFileSize", 1048576); - - ArrayNode specArray = objectMapper.createArrayNode().add(specNode); + ArrayNode specArray = objectMapper.createArrayNode().add(objectMapper.readTree(jsonSpec)); ObjectNode root = objectMapper.createObjectNode().set("jsonSpec", specArray); ArrayNode rootArray = objectMapper.createArrayNode().add(root); @@ -749,15 +713,28 @@ public void init_shouldPopulateUiSpec_thenPass() { Mockito.when(restTemplate.exchange(Mockito.eq("http://mock/uispec"), Mockito.eq(HttpMethod.GET), Mockito.isNull(), Mockito.>>any())).thenReturn(responseEntity); - idrepoProfileRegistryPlugin.init(); + + ResponseEntity> dynamicFieldResponse = new ResponseEntity<>(getDynamicFieldsEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("dynamic"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(dynamicFieldResponse); + + ResponseEntity> docEntity = new ResponseEntity<>(getDocumentTypesAndCategoriesEndpointResponse(), HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.contains("docTypes"), Mockito.eq(HttpMethod.GET), Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() {}) + )).thenReturn(docEntity); JsonNode uiSpec = idrepoProfileRegistryPlugin.getUISpecification(); Assert.assertNotNull(uiSpec); Assert.assertTrue(uiSpec.has("schema")); - Assert.assertTrue(uiSpec.has("errors")); + Assert.assertTrue(uiSpec.has("customField")); Assert.assertTrue(uiSpec.has("i18nValues")); Assert.assertTrue(uiSpec.has("allowedValues")); Assert.assertTrue(uiSpec.has("maxUploadFileSize")); + Assert.assertTrue(uiSpec.has("language")); + Assert.assertTrue(uiSpec.has("resetPasswordChallengeFields")); } @Test @@ -816,4 +793,53 @@ public void createProfile_withValidBuildDocuments_thenPass() throws Exception { Assert.assertNotNull(profileResult); Assert.assertEquals(profileResult.getStatus(),"SUCCESS"); } + + private ResponseWrapper getDynamicFieldsEndpointResponse() { + ObjectNode dynamicItem = objectMapper.createObjectNode(); + dynamicItem.put("isActive", true); + dynamicItem.put("name", "fieldName"); + dynamicItem.put("langCode", "eng"); + + ArrayNode fieldValArray = objectMapper.createArrayNode(); + ObjectNode fieldVal = objectMapper.createObjectNode(); + fieldVal.put("code", "code1"); + fieldVal.put("value", "value1"); + fieldValArray.add(fieldVal); + dynamicItem.set("fieldVal", fieldValArray); + ArrayNode dynamicDataArray = objectMapper.createArrayNode(); + dynamicDataArray.add(dynamicItem); + + ObjectNode dynamicResponseNode = objectMapper.createObjectNode(); + dynamicResponseNode.put("totalPages", 1); + dynamicResponseNode.put("totalItems", 1); + dynamicResponseNode.set("data", dynamicDataArray); + + ResponseWrapper dynamicWrapper = new ResponseWrapper(); + dynamicWrapper.setResponse(dynamicResponseNode); + return dynamicWrapper; + } + + private ResponseWrapper getDocumentTypesAndCategoriesEndpointResponse() { + ObjectNode docType = objectMapper.createObjectNode(); + docType.put("code", "doc1"); + docType.put("name", "Document Name"); + docType.put("langCode", "eng"); + ArrayNode docTypesArray = objectMapper.createArrayNode(); + docTypesArray.add(docType); + + ObjectNode category = objectMapper.createObjectNode(); + category.put("isActive", true); + category.put("code", "cat1"); + category.put("langCode", "eng"); + category.set("documentTypes", docTypesArray); + ArrayNode docCategoriesArray = objectMapper.createArrayNode(); + docCategoriesArray.add(category); + + ObjectNode docResponseNode = objectMapper.createObjectNode(); + docResponseNode.set("documentCategories", docCategoriesArray); + + ResponseWrapper docWrapper = new ResponseWrapper<>(); + docWrapper.setResponse(docResponseNode); + return docWrapper; + } } From 4432aeea12a53bc8354b8a7ddb5590154caf850b Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 13 Mar 2026 15:25:48 +0530 Subject: [PATCH 53/58] ES-2914 (#191) * Fixed mock identity validation issue removed unnecessary configurations Signed-off-by: ase-101 * Removed unnecessary configurations Signed-off-by: ase-101 * Fixed review comment Signed-off-by: ase-101 * Fixed review comment Signed-off-by: ase-101 * Fixed review comments Signed-off-by: ase-101 --------- Signed-off-by: ase-101 --- .../MockProfileRegistryPluginImpl.java | 71 +++--- .../src/main/resources/application.properties | 7 +- .../MockProfileRegistryPluginImplTest.java | 221 +++++++++++++++--- .../src/main/resources/application.properties | 38 +-- 4 files changed, 256 insertions(+), 81 deletions(-) diff --git a/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java b/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java index 470d5b00..71b831f4 100644 --- a/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java +++ b/mock-plugin/src/main/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImpl.java @@ -10,11 +10,13 @@ import java.time.ZoneOffset; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; +import java.util.*; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.networknt.schema.JsonSchema; +import com.networknt.schema.JsonSchemaFactory; +import com.networknt.schema.SpecVersion; +import com.networknt.schema.ValidationMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; @@ -50,30 +52,26 @@ public class MockProfileRegistryPluginImpl implements ProfileRegistryPlugin { private static final String UTC_DATETIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"; private static final List ACTIONS = Arrays.asList("CREATE", "UPDATE"); - - @Value("${mosip.signup.mock.username.field:phone}") - private String usernameField; - @Value("#{'${mosip.signup.mock.mandatory-attributes.CREATE:}'.split(',')}") - private List requiredFieldsOnCreate; - - @Value("#{'${mosip.signup.mock.mandatory-attributes.UPDATE:}'.split(',')}") - private List requiredFieldsOnUpdate; - - @Value("#{'${mosip.signup.mock.lang-based-attributes:}'.split(',')}") - private List langBasedFields; + @Value("${mosip.signup.identifier.name:phone}") + private String identifierField; + //Endpoint to add/update identity data @Value("${mosip.signup.mock.identity.endpoint}") private String identityEndpoint; + //Endpoint to fetch identity data @Value("${mosip.signup.mock.get-identity.endpoint}") private String getIdentityEndpoint; @Value("${mosip.signup.mock.add-verified-claims.endpoint}") private String addVerifiedClaimsEndpoint; - @Value("${mosip.signup.mock.get-schema.endpoint}") - private String getSchemaEndpoint; + @Value("${mosip.signup.mock.identity-schema.endpoint}") + private String identitySchemaEndpoint; + + @Value("${mosip.signup.mock.ui-schema.endpoint}") + private String uiSchemaEndpoint; @Value("${mosip.signup.mock.face.biometric.field-name:encodedPhoto}") private String faceBiometricFieldName; @@ -91,26 +89,46 @@ public class MockProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Autowired private ResourceLoader resourceLoader; + private volatile JsonSchema schema; + @Override public void validate(String action, ProfileDto profileDto) throws InvalidProfileException { - if (!ACTIONS.contains(action)) { + + if(schema == null) { + synchronized (this) { + ResponseWrapper responseWrapper = request(identitySchemaEndpoint, HttpMethod.GET, null, + new ParameterizedTypeReference>() { + }); + JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012); + schema = jsonSchemaFactory.getSchema(responseWrapper.getResponse()); + } + } + + if(!ACTIONS.contains(action)) { + log.error("Invalid action value : {}. Allowed values are CREATE and UPDATE", action); throw new InvalidProfileException(ErrorConstants.INVALID_ACTION); } - JsonNode inputJson = profileDto.getIdentity(); - List requiredFields = action.equals("CREATE") ? requiredFieldsOnCreate : requiredFieldsOnUpdate; - for (String fieldName : requiredFields) { - if (!fieldName.isEmpty() && (!inputJson.hasNonNull(fieldName) || (inputJson.get(fieldName).isArray() && inputJson.get(fieldName).isEmpty()))) { - log.error("Null value found in the required field of {}, required: {}", fieldName, requiredFields); - throw new InvalidProfileException("invalid_".concat(fieldName.toLowerCase())); + Set errors = schema.validate(profileDto.getIdentity()); + + for(ValidationMessage error : errors) { + log.error("Validation error for field {} with message {}", error.getInstanceLocation(), error.getMessage()); + String fieldName = error.getInstanceLocation().getNameCount() > 0 ? error.getInstanceLocation().getName(0) : + error.getProperty(); + if(action.equals("UPDATE") && error.getCode().equals("1028")) { + //Ignore required field validation errors for update action as in an update scenario, not all fields are mandatory + continue; } + throw new InvalidProfileException(fieldName != null ? "invalid_".concat(fieldName.toLowerCase()) : + "unknown_field"); } } @Override public ProfileResult createProfile(String requestId, ProfileDto profileDto) throws ProfileException { - if(usernameField != null && !profileDto.getIndividualId().equalsIgnoreCase(profileDto.getIdentity().get(usernameField).asText())) { - log.error("{} and userName mismatch", usernameField); + if(identifierField != null && (profileDto.getIdentity().hasNonNull(identifierField) + && !profileDto.getIndividualId().equalsIgnoreCase(profileDto.getIdentity().get(identifierField).asText()))) { + log.error("{} and userName mismatch", identifierField); throw new InvalidProfileException(ErrorConstants.IDENTIFIER_MISMATCH); } ObjectNode inputJson = (ObjectNode) profileDto.getIdentity(); @@ -253,9 +271,8 @@ private String getUTCDateTime() { @Override public JsonNode getUISpecification() { - ResponseWrapper responseWrapper = request(getSchemaEndpoint, HttpMethod.GET ,null, + ResponseWrapper responseWrapper = request(uiSchemaEndpoint, HttpMethod.GET ,null, new ParameterizedTypeReference>() {}); return responseWrapper.getResponse(); } - } diff --git a/mock-plugin/src/main/resources/application.properties b/mock-plugin/src/main/resources/application.properties index 504822c5..5f74b190 100644 --- a/mock-plugin/src/main/resources/application.properties +++ b/mock-plugin/src/main/resources/application.properties @@ -25,14 +25,11 @@ mosip.signup.mock.identity-verification.story-name=mock-idv-user-story.json ## File defined in the property `mosip.signup.mock.identity-verification.story-name` is loaded with below defined URL mosip.signup.mock.config-server-url=classpath: -mosip.signup.mock.get-schema.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity/ui-spec - -mosip.signup.mock.mandatory-attributes.CREATE=fullName,phone,password,preferredLang -mosip.signup.mock.mandatory-attributes.UPDATE= -mosip.signup.mock.username.field=phone mosip.signup.mock.identity.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity mosip.signup.mock.get-identity.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity/ +mosip.signup.mock.identity-schema.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity/identity-schema +mosip.signup.mock.ui-schema.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity/ui-spec mosip.signup.mock.add-verified-claims.endpoint=${mosip.esignet.mock.domain.url}/v1/mock-identity-system/identity/add-verified-claim ## Disable authz & authn with mock-plugin diff --git a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java index a9736eb1..22543aa1 100644 --- a/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java +++ b/mock-plugin/src/test/java/io/mosip/signup/plugin/mock/service/MockProfileRegistryPluginImplTest.java @@ -55,69 +55,224 @@ public void init(){ ReflectionTestUtils.setField(mockProfileRegistryPlugin, "objectMapper",objectMapper); } + String IDENTITY_SCHEMA = "{\n" + + " \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n" + + " \"type\": \"object\",\n" + + " \"$defs\": {\n" + + " \"langField\": {\n" + + " \"type\": \"array\",\n" + + " \"items\": {\n" + + " \"type\": \"object\",\n" + + " \"properties\": {\n" + + " \"language\": {\n" + + " \"type\": \"string\"\n" + + " },\n" + + " \"value\": {\n" + + " \"type\": \"string\"\n" + + " }\n" + + " },\n" + + " \"required\": [\n" + + " \"language\",\n" + + " \"value\"\n" + + " ],\n" + + " \"additionalProperties\": false\n" + + " }\n" + + " }\n" + + " },\n" + + " \"properties\": {\n" + + " \"individualId\": {\n" + + " \"type\": \"string\",\n" + + " \"pattern\": \"\\\\S\"\n" + + " },\n" + + " \"fullName\": {\n" + + " \"allOf\": [\n" + + " { \"$ref\": \"#/$defs/langField\" },\n" + + " {\n" + + " \"items\": {\n" + + " \"properties\": {\n" + + " \"value\": {\n" + + " \"pattern\": \"^(?=.*[^\\\\s])^(?:[a-zA-ZÀ-ÿ\\\\s]{1,40}|[ء-ي\\\\s٩ٱ-ڿﹰ-\\uFEFF\\u0600-ۿ]{1,40}|[ក-\\u17FF᧠-᧿ᨀ-\\u1A9F ]{1,40})$\"\n" + + " },\n" + + " \"language\": {\n" + + " \"type\": \"string\",\n" + + " \"enum\": [\"eng\",\"fra\",\"ara\"]\n" + + " }\n" + + " }\n" + + " }\n" + + " }\n" + + " ]\n" + + " },\n" + + " \"preferredLang\": {\n" + + " \"type\": \"string\",\n" + + " \"enum\": [\"eng\",\"fra\",\"ara\"],\n" + + " \"nullable\": true\n" + + " },\n" + + " \"phone\": {\n" + + " \"type\": \"string\",\n" + + " \"pattern\": \"^\\\\+[1-9]\\\\d{8,13}$\"\n" + + " },\n" + + " \"password\": {\n" + + " \"type\": \"string\",\n" + + " \"pattern\": \"^[A-Za-z__1-9]{6,9}\\\\d{1}$\"\n" + + " }\n" + + " },\n" + + " \"required\": [\n" + + " \"individualId\",\n" + + " \"fullName\",\n" + + " \"phone\",\n" + + " \"password\"\n" + + " ],\n" + + " \"additionalProperties\": false\n" + + "}"; + @Test public void validate_withValidActionAndProfileDto_thenPass() throws JsonProcessingException { - - List requiredField=new ArrayList<>(); - requiredField.add("phone"); - ReflectionTestUtils.setField(mockProfileRegistryPlugin, "requiredFieldsOnCreate", requiredField); + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identitySchemaEndpoint", "http://localhost:8080/"); String action = "CREATE"; - String phone="{ \"value\": \"7408001310\", \"essential\":true }"; - String verifiedClaims="[{\"verification\":{\"trust_framework\":{\"value\":\"income-tax\"}},\"claims\":{\"name\":null,\"email\":{\"essential\":0}}},{\"verification\":{\"trust_framework\":{\"value\":\"pwd\"}},\"claims\":{\"birthdate\":{\"essential\":true},\"address\":null}},{\"verification\":{\"trust_framework\":{\"value\":\"cbi\"}},\"claims\":{\"gender\":{\"essential\":true},\"email\":{\"essential\":true}}}]"; - JsonNode addressNode = objectMapper.readValue(phone, JsonNode.class); - JsonNode verifiedClaimNode = objectMapper.readValue(verifiedClaims, JsonNode.class); + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setResponse(objectMapper.readTree(IDENTITY_SCHEMA)); + ResponseEntity> responseEntity=new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.eq("http://localhost:8080/"), + Mockito.any(HttpMethod.class), + Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() { + }))).thenReturn(responseEntity); - Map userinfoMap = new HashMap<>(); - userinfoMap.put("phone", addressNode); - userinfoMap.put("verified_claims", verifiedClaimNode); - JsonNode mockIdentity=objectMapper.valueToTree(userinfoMap); + String userinfo = "{\"individualId\" : \"1234567890\",\"phone\" : \"+9134567890\", \"fullName\": [{\"value\": \"John Doe\", \"language\": \"eng\"}], \"preferredLang\": \"eng\", \"password\": \"pas_swo3\"}"; + JsonNode mockIdentity=objectMapper.readTree(userinfo); ProfileDto profileDto = new ProfileDto(); - profileDto.setIndividualId("individualId"); + profileDto.setIndividualId("1234567890"); profileDto.setIdentity(mockIdentity); - mockProfileRegistryPlugin.validate(action, profileDto); } @Test - public void validate_withInValidRequiredField_thenFail() throws JsonProcessingException { - - List requiredField=new ArrayList<>(); - requiredField.add("email"); - ReflectionTestUtils.setField(mockProfileRegistryPlugin, "requiredFieldsOnCreate", requiredField); + public void validate_withInvalidRequiredField_thenFail() throws JsonProcessingException { + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identitySchemaEndpoint", "http://localhost:8080/"); String action = "CREATE"; - String phone="{ \"value\": \"7408001310\", \"essential\":true }"; - String verifiedClaims="[{\"verification\":{\"trust_framework\":{\"value\":\"income-tax\"}},\"claims\":{\"name\":null,\"email\":{\"essential\":0}}},{\"verification\":{\"trust_framework\":{\"value\":\"pwd\"}},\"claims\":{\"birthdate\":{\"essential\":true},\"address\":null}},{\"verification\":{\"trust_framework\":{\"value\":\"cbi\"}},\"claims\":{\"gender\":{\"essential\":true},\"email\":{\"essential\":true}}}]"; - JsonNode addressNode = objectMapper.readValue(phone, JsonNode.class); - JsonNode verifiedClaimNode = objectMapper.readValue(verifiedClaims, JsonNode.class); + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setResponse(objectMapper.readTree(IDENTITY_SCHEMA)); + ResponseEntity> responseEntity=new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.eq("http://localhost:8080/"), + Mockito.any(HttpMethod.class), + Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() { + }))).thenReturn(responseEntity); - Map userinfoMap = new HashMap<>(); - userinfoMap.put("phone", addressNode); - userinfoMap.put("verified_claims", verifiedClaimNode); - JsonNode mockIdentity=objectMapper.valueToTree(userinfoMap); + String userinfo = "{\"individualId\" : \"1234567890\", \"fullName\": [{\"value\": \"John Doe\", \"language\": \"eng\"}], \"preferredLang\": \"eng\", \"password\": \"pas_swo3\"}"; + JsonNode mockIdentity=objectMapper.readTree(userinfo); ProfileDto profileDto = new ProfileDto(); - profileDto.setIndividualId("individualId"); + profileDto.setIndividualId("1234567890"); profileDto.setIdentity(mockIdentity); try{ mockProfileRegistryPlugin.validate(action, profileDto); Assert.fail(); }catch (InvalidProfileException e){ - Assert.assertEquals(e.getMessage(),"invalid_email"); + Assert.assertEquals("invalid_phone", e.getErrorCode()); + } + } + + @Test + public void validate_withInvalidFieldValue_thenFail() throws JsonProcessingException { + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identitySchemaEndpoint", "http://localhost:8080/"); + String action = "CREATE"; + + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setResponse(objectMapper.readTree(IDENTITY_SCHEMA)); + ResponseEntity> responseEntity=new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.eq("http://localhost:8080/"), + Mockito.any(HttpMethod.class), + Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() { + }))).thenReturn(responseEntity); + + String userinfo = "{\"individualId\" : \"1234567890\", \"fullName\": [{\"value\": \"John Doe\", \"language\": \"eng\"}], \"preferredLang\": \"khm\", \"password\": \"pas_swo3\"}"; + JsonNode mockIdentity=objectMapper.readTree(userinfo); + ProfileDto profileDto = new ProfileDto(); + profileDto.setIndividualId("1234567890"); + profileDto.setIdentity(mockIdentity); + + try{ + mockProfileRegistryPlugin.validate(action, profileDto); + Assert.fail(); + }catch (InvalidProfileException e) { + Assert.assertEquals("invalid_preferredlang", e.getErrorCode()); + } + } + + @Test + public void validate_patternNotMatching_thenFail() throws JsonProcessingException { + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identitySchemaEndpoint", "http://localhost:8080/"); + String action = "CREATE"; + + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setResponse(objectMapper.readTree(IDENTITY_SCHEMA)); + ResponseEntity> responseEntity=new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.eq("http://localhost:8080/"), + Mockito.any(HttpMethod.class), + Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() { + }))).thenReturn(responseEntity); + + String userinfo = "{\"individualId\" : \"1234567890\",\"phone\" : \"+0134567890\", \"fullName\": [{\"value\": \"John Doe\", \"language\": \"eng\"}], \"preferredLang\": \"eng\", \"password\": \"pas_swo3\"}"; + JsonNode mockIdentity=objectMapper.readTree(userinfo); + ProfileDto profileDto = new ProfileDto(); + profileDto.setIndividualId("1234567890"); + profileDto.setIdentity(mockIdentity); + + try{ + mockProfileRegistryPlugin.validate(action, profileDto); + Assert.fail(); + }catch (InvalidProfileException e) { + Assert.assertEquals("invalid_phone", e.getErrorCode()); } + } + + @Test + public void validate_withInvalidUpdateData_thenFail() throws JsonProcessingException { + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identitySchemaEndpoint", "http://localhost:8080/"); + String action = "UPDATE"; + + ResponseWrapper wrapper = new ResponseWrapper<>(); + wrapper.setResponse(objectMapper.readTree(IDENTITY_SCHEMA)); + ResponseEntity> responseEntity=new ResponseEntity<>(wrapper, HttpStatus.OK); + Mockito.when(restTemplate.exchange( + Mockito.eq("http://localhost:8080/"), + Mockito.any(HttpMethod.class), + Mockito.any(), + Mockito.eq(new ParameterizedTypeReference>() { + }))).thenReturn(responseEntity); + String userinfo = "{\"individualId\": \"1234567890\", \"password\": \"@password123\"}"; + JsonNode mockIdentity=objectMapper.readTree(userinfo); + ProfileDto profileDto = new ProfileDto(); + profileDto.setIndividualId("1234567890"); + profileDto.setIdentity(mockIdentity); + + try{ + mockProfileRegistryPlugin.validate(action, profileDto); + Assert.fail(); + }catch (InvalidProfileException e) { + Assert.assertEquals("invalid_password", e.getErrorCode()); + } } @Test public void createProfile_withValidRequestAndProfileDto_thenPass() throws ProfileException { // Arrange ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identityEndpoint","http://localhost:8080/"); - ReflectionTestUtils.setField(mockProfileRegistryPlugin, "usernameField","individualId"); + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identifierField","individualId"); Map identityData = new HashMap<>(); identityData.put("individualId","1234567890"); JsonNode mockIdentity = objectMapper.valueToTree(identityData); @@ -147,7 +302,7 @@ public void createProfile_withValidRequestAndProfileDto_thenPass() throws Profil @Test public void createProfile_withInValidRequestAndProfileDto_thenFail() throws ProfileException { // Arrange - ReflectionTestUtils.setField(mockProfileRegistryPlugin, "usernameField","individualId"); + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identifierField","individualId"); Map identityData=new HashMap<>(); identityData.put("individualId","1234567890"); JsonNode mockIdentity = objectMapper.valueToTree(identityData); @@ -165,12 +320,12 @@ public void createProfile_withInValidRequestAndProfileDto_thenFail() throws Prof public void createProfile_withFacePhoto_thenPass() throws ProfileException { // Arrange ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identityEndpoint","http://localhost:8080/"); - ReflectionTestUtils.setField(mockProfileRegistryPlugin, "usernameField","individualId"); + ReflectionTestUtils.setField(mockProfileRegistryPlugin, "identifierField","individualId"); ReflectionTestUtils.setField(mockProfileRegistryPlugin, "faceBiometricFieldName","encodedPhoto"); ReflectionTestUtils.setField(mockProfileRegistryPlugin, "faceBiometricValuePrefix","data:image/jpeg;base64,"); ObjectNode mockIdentity = mock(ObjectNode.class); - Mockito.when(mockIdentity.get("individualId")).thenReturn(objectMapper.valueToTree("1234567890")); + //Mockito.when(mockIdentity.get("individualId")).thenReturn(objectMapper.valueToTree("1234567890")); Mockito.when(mockIdentity.hasNonNull("encodedPhoto")).thenReturn(true); ObjectNode encodedPhotoNode = mock(ObjectNode.class); Mockito.when(mockIdentity.get("encodedPhoto")).thenReturn(encodedPhotoNode) diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index 05dc7637..a2a5a4e7 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -5,6 +5,18 @@ mosip.esignet.integration.authenticator=IdaAuthenticatorImpl mosip.esignet.integration.key-binder=IdaKeyBinderImpl mosip.esignet.integration.audit-plugin=IdaAuditPluginImpl +mosip.esignet.ida.auth.url=${MOSIP_API_INTERNAL_HOST:http://ida-auth.ida} +mosip.esignet.ida.otp.url=${MOSIP_API_INTERNAL_HOST:http://ida-otp.ida} +mosip.esignet.ida.internal.url=${MOSIP_API_INTERNAL_HOST:http://ida-internal.ida} +mosip.esignet.authmanager.url=${MOSIP_API_INTERNAL_HOST:http://authmanager.kernel} +mosip.esignet.auditmanager.url=${MOSIP_API_INTERNAL_HOST:http://auditmanager.kernel} +mosip.esignet.masterdata.url=${MOSIP_API_INTERNAL_HOST:http://masterdata.kernel} +mosip.signup.idrepo.url=${MOSIP_API_INTERNAL_HOST:http://identity.idrepo} +mosip.signup.keymanager.url=${MOSIP_API_INTERNAL_HOST:http://keymanager.keymanager} +mosip.signup.credreq.url=${MOSIP_API_INTERNAL_HOST:http://credentialrequest.idrepo} +mosip.signup.idgenerator.url=${MOSIP_API_INTERNAL_HOST:http://idgenerator.kernel} +mosip.signup.fileserver.url=${MOSIP_API_INTERNAL_HOST:http://mosip-file-server.mosip-file-server} + # IDA integration props mosip.esignet.authenticator.ida-auth-id=mosip.identity.kycauth mosip.esignet.authenticator.ida-exchange-id=mosip.identity.kycexchange @@ -12,10 +24,7 @@ mosip.esignet.authenticator.ida-send-otp-id=mosip.identity.otp mosip.esignet.authenticator.ida-version=1.0 mosip.esignet.authenticator.ida.misp-license-key=${mosip.esignet.misp.key} mosip.esignet.authenticator.ida-domainUri=${mosip.esignet.domain.url} -mosip.esignet.ida.auth.url=${IDA_AUTH_URL:http://ida-auth.ida} -mosip.esignet.ida.otp.url=${IDA_OTP_URL:http://ida-otp.ida} -mosip.esignet.ida.internal.url=${IDA_INTERNAL_URL:http://ida-internal.ida} -mosip.esignet.authenticator.ida.cert-url=http://mosip-file-server.mosip-file-server/mosip-certs/ida-partner.cer +mosip.esignet.authenticator.ida.cert-url=${mosip.signup.fileserver.url}/mosip-certs/ida-partner.cer mosip.esignet.authenticator.ida.kyc-auth-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-auth/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.kyc-auth-url-v2=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-auth/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.kyc-exchange-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-exchange/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ @@ -23,8 +32,8 @@ mosip.esignet.authenticator.ida.kyc-exchange-url-v2=${mosip.esignet.ida.auth.url mosip.esignet.authenticator.ida.send-otp-url=${mosip.esignet.ida.otp.url}/idauthentication/v1/otp/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.binder.ida.key-binding-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/identity-key-binding/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ mosip.esignet.authenticator.ida.get-certificates-url=${mosip.esignet.ida.internal.url}/idauthentication/v1/internal/getAllCertificates -mosip.esignet.authenticator.ida.auth-token-url=http://authmanager.kernel/v1/authmanager/authenticate/clientidsecretkey -mosip.esignet.authenticator.ida.audit-manager-url=http://auditmanager.kernel/v1/auditmanager/audits +mosip.esignet.authenticator.ida.auth-token-url=${mosip.esignet.authmanager.url}/v1/authmanager/authenticate/clientidsecretkey +mosip.esignet.authenticator.ida.audit-manager-url=${mosip.esignet.auditmanager.url}/v1/auditmanager/audits mosip.esignet.authenticator.ida.client-id=mosip-ida-client mosip.esignet.authenticator.ida.secret-key=${mosip.ida.client.secret} mosip.esignet.authenticator.ida.app-id=ida @@ -36,25 +45,22 @@ mosip.signup.integration.impl.basepackage=io.mosip.signup.plugin.mosipid,io.mosi mosip.kernel.xsdstorage-uri=classpath: mosip.kernel.xsdfile=mosip-cbeff.xsd mosip.signup.integration.profile-registry-plugin=MOSIPProfileRegistryPluginImpl -mosip.signup.idrepo.schema-url=http://masterdata.kernel/v1/masterdata/idschema/latest?schemaVersion= - -mosip.signup.idrepo.url=${IDREPO_IDENTITY_URL:http://identity.idrepo} +mosip.signup.idrepo.schema-url=${mosip.esignet.masterdata.url}/v1/masterdata/idschema/latest?schemaVersion= mosip.signup.idrepo.uin.length=10 mosip.signup.idrepo.get-identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/idvid/ mosip.signup.idrepo.identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/v2/ -mosip.signup.idrepo.generate-hash.endpoint=http://keymanager.keymanager/v1/keymanager/generateArgon2Hash -mosip.signup.idrepo.get-uin.endpoint=http://idgenerator.kernel/v1/idgenerator/uin -mosip.signup.idrepo.get-status.endpoint=http://credentialrequest.idrepo/v1/credentialrequest/get/ +mosip.signup.idrepo.generate-hash.endpoint=${mosip.signup.keymanager.url}/v1/keymanager/generateArgon2Hash +mosip.signup.idrepo.get-uin.endpoint=${mosip.signup.idgenerator.url}/v1/idgenerator/uin +mosip.signup.idrepo.get-status.endpoint=${mosip.signup.credreq.url}/v1/credentialrequest/get/ # This is the url to fetch ui-spec from masterdata - 'esignet-signup' in the url should match with domain name of the schema in the masterdata. -mosip.signup.mosipid.get-ui-spec.endpoint=http://masterdata.kernel/v1/masterdata/uispec/esignet-signup/latest?type=schema -mosip.signup.mosipid.uispec.errors={required:{en:"This field is required"},passwordMismatch:{en:"Passwords is not matching please check your password"}} +mosip.signup.mosipid.get-ui-spec.endpoint=${mosip.esignet.masterdata.url}/v1/masterdata/uispec/esignet-signup/latest?type=schema -mosip.signup.mosipid.dynamic-fields.endpoint=http://masterdata.kernel/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d +mosip.signup.mosipid.dynamic-fields.endpoint=${mosip.esignet.masterdata.url}/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d # for multiple languages scenario, the languages should be appended followed by ampersand as ?languages=eng&languages=fra&languages=khm -mosip.signup.mosipid.doc-types-category.endpoint=http://masterdata.kernel/v1/masterdata/applicanttype/000/languages?languages=eng +mosip.signup.mosipid.doc-types-category.endpoint=${mosip.esignet.masterdata.url}/v1/masterdata/applicanttype/000/languages?languages=eng mosip.signup.idrepo.add-identity.request.id=mosip.id.create mosip.signup.idrepo.update-identity.request.id=mosip.id.update From 11fea508adada515ae8ea7749f905159beb5c40a Mon Sep 17 00:00:00 2001 From: Nandhukumar Date: Wed, 18 Mar 2026 10:13:41 +0530 Subject: [PATCH 54/58] ES-2955 idrepo update identity workaround (#193) * fix: idrepo update identity workaround Signed-off-by: Nandhukumar * ES-2955 | fix: idrepo update identity workaround Signed-off-by: Nandhukumar --------- Signed-off-by: Nandhukumar --- .../main/java/io/mosip/signup/plugin/mosipid/dto/Password.java | 1 + .../plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/Password.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/Password.java index 5ea1d1ad..4331b085 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/Password.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/dto/Password.java @@ -14,6 +14,7 @@ public class Password { private String hash; private String salt; + private String value; // Added for compatible with 1.3.0 IDRepo @Data @AllArgsConstructor diff --git a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java index 4a2de7b0..1b275787 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/signup/plugin/mosipid/service/IdrepoProfileRegistryPluginImpl.java @@ -385,7 +385,7 @@ private Password generateSaltedHash(String password) throws ProfileException { if (!StringUtils.isEmpty(responseWrapper.getResponse().getHashValue()) && !StringUtils.isEmpty(responseWrapper.getResponse().getSalt())) { return new Password(responseWrapper.getResponse().getHashValue(), - responseWrapper.getResponse().getSalt()); + responseWrapper.getResponse().getSalt(), responseWrapper.getResponse().getHashValue()); // Added for compatible with 1.3.0 IDRepo ('https://github.com/mosip/id-repository/blob/v1.3.0/id-repository/id-repository-identity-service/src/main/java/io/mosip/idrepository/identity/service/impl/IdRepoServiceImpl.java#L508') } log.error("Failed to generate salted hash {}", responseWrapper.getResponse()); throw new ProfileException(REQUEST_FAILED); From f99afa6afadc89241ef526ed15df86da94268d42 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Wed, 18 Mar 2026 10:51:30 +0530 Subject: [PATCH 55/58] Corrected the property name (#194) Signed-off-by: ase-101 --- .../src/main/resources/application.properties | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/mosip-identity-plugin/src/main/resources/application.properties b/mosip-identity-plugin/src/main/resources/application.properties index a2a5a4e7..41ed8a64 100644 --- a/mosip-identity-plugin/src/main/resources/application.properties +++ b/mosip-identity-plugin/src/main/resources/application.properties @@ -5,17 +5,17 @@ mosip.esignet.integration.authenticator=IdaAuthenticatorImpl mosip.esignet.integration.key-binder=IdaKeyBinderImpl mosip.esignet.integration.audit-plugin=IdaAuditPluginImpl -mosip.esignet.ida.auth.url=${MOSIP_API_INTERNAL_HOST:http://ida-auth.ida} -mosip.esignet.ida.otp.url=${MOSIP_API_INTERNAL_HOST:http://ida-otp.ida} -mosip.esignet.ida.internal.url=${MOSIP_API_INTERNAL_HOST:http://ida-internal.ida} -mosip.esignet.authmanager.url=${MOSIP_API_INTERNAL_HOST:http://authmanager.kernel} -mosip.esignet.auditmanager.url=${MOSIP_API_INTERNAL_HOST:http://auditmanager.kernel} -mosip.esignet.masterdata.url=${MOSIP_API_INTERNAL_HOST:http://masterdata.kernel} -mosip.signup.idrepo.url=${MOSIP_API_INTERNAL_HOST:http://identity.idrepo} -mosip.signup.keymanager.url=${MOSIP_API_INTERNAL_HOST:http://keymanager.keymanager} -mosip.signup.credreq.url=${MOSIP_API_INTERNAL_HOST:http://credentialrequest.idrepo} -mosip.signup.idgenerator.url=${MOSIP_API_INTERNAL_HOST:http://idgenerator.kernel} -mosip.signup.fileserver.url=${MOSIP_API_INTERNAL_HOST:http://mosip-file-server.mosip-file-server} +mosip.esignet.ida.auth.domain=${MOSIP_API_INTERNAL_HOST:http://ida-auth.ida} +mosip.esignet.ida.otp.domain=${MOSIP_API_INTERNAL_HOST:http://ida-otp.ida} +mosip.esignet.ida.internal.domain=${MOSIP_API_INTERNAL_HOST:http://ida-internal.ida} +mosip.esignet.authmanager.domain=${MOSIP_API_INTERNAL_HOST:http://authmanager.kernel} +mosip.esignet.auditmanager.domain=${MOSIP_API_INTERNAL_HOST:http://auditmanager.kernel} +mosip.esignet.masterdata.domain=${MOSIP_API_INTERNAL_HOST:http://masterdata.kernel} +mosip.signup.idrepo.domain=${MOSIP_API_INTERNAL_HOST:http://identity.idrepo} +mosip.signup.keymanager.domain=${MOSIP_API_INTERNAL_HOST:http://keymanager.keymanager} +mosip.signup.credreq.domain=${MOSIP_API_INTERNAL_HOST:http://credentialrequest.idrepo} +mosip.signup.idgenerator.domain=${MOSIP_API_INTERNAL_HOST:http://idgenerator.kernel} +mosip.signup.fileserver.domain=${MOSIP_API_INTERNAL_HOST:http://mosip-file-server.mosip-file-server} # IDA integration props mosip.esignet.authenticator.ida-auth-id=mosip.identity.kycauth @@ -24,16 +24,16 @@ mosip.esignet.authenticator.ida-send-otp-id=mosip.identity.otp mosip.esignet.authenticator.ida-version=1.0 mosip.esignet.authenticator.ida.misp-license-key=${mosip.esignet.misp.key} mosip.esignet.authenticator.ida-domainUri=${mosip.esignet.domain.url} -mosip.esignet.authenticator.ida.cert-url=${mosip.signup.fileserver.url}/mosip-certs/ida-partner.cer -mosip.esignet.authenticator.ida.kyc-auth-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-auth/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-auth-url-v2=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-auth/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-exchange-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-exchange/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.kyc-exchange-url-v2=${mosip.esignet.ida.auth.url}/idauthentication/v1/kyc-exchange/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.send-otp-url=${mosip.esignet.ida.otp.url}/idauthentication/v1/otp/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.binder.ida.key-binding-url=${mosip.esignet.ida.auth.url}/idauthentication/v1/identity-key-binding/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ -mosip.esignet.authenticator.ida.get-certificates-url=${mosip.esignet.ida.internal.url}/idauthentication/v1/internal/getAllCertificates -mosip.esignet.authenticator.ida.auth-token-url=${mosip.esignet.authmanager.url}/v1/authmanager/authenticate/clientidsecretkey -mosip.esignet.authenticator.ida.audit-manager-url=${mosip.esignet.auditmanager.url}/v1/auditmanager/audits +mosip.esignet.authenticator.ida.cert-url=${mosip.signup.fileserver.domain}/mosip-certs/ida-partner.cer +mosip.esignet.authenticator.ida.kyc-auth-url=${mosip.esignet.ida.auth.domain}/idauthentication/v1/kyc-auth/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-auth-url-v2=${mosip.esignet.ida.auth.domain}/idauthentication/v1/kyc-auth/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-exchange-url=${mosip.esignet.ida.auth.domain}/idauthentication/v1/kyc-exchange/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.kyc-exchange-url-v2=${mosip.esignet.ida.auth.domain}/idauthentication/v1/kyc-exchange/v2/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.send-otp-url=${mosip.esignet.ida.otp.domain}/idauthentication/v1/otp/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.binder.ida.key-binding-url=${mosip.esignet.ida.auth.domain}/idauthentication/v1/identity-key-binding/delegated/${mosip.esignet.authenticator.ida.misp-license-key}/ +mosip.esignet.authenticator.ida.get-certificates-url=${mosip.esignet.ida.internal.domain}/idauthentication/v1/internal/getAllCertificates +mosip.esignet.authenticator.ida.auth-token-url=${mosip.esignet.authmanager.domain}/v1/authmanager/authenticate/clientidsecretkey +mosip.esignet.authenticator.ida.audit-manager-url=${mosip.esignet.auditmanager.domain}/v1/auditmanager/audits mosip.esignet.authenticator.ida.client-id=mosip-ida-client mosip.esignet.authenticator.ida.secret-key=${mosip.ida.client.secret} mosip.esignet.authenticator.ida.app-id=ida @@ -45,22 +45,22 @@ mosip.signup.integration.impl.basepackage=io.mosip.signup.plugin.mosipid,io.mosi mosip.kernel.xsdstorage-uri=classpath: mosip.kernel.xsdfile=mosip-cbeff.xsd mosip.signup.integration.profile-registry-plugin=MOSIPProfileRegistryPluginImpl -mosip.signup.idrepo.schema-url=${mosip.esignet.masterdata.url}/v1/masterdata/idschema/latest?schemaVersion= +mosip.signup.idrepo.schema-url=${mosip.esignet.masterdata.domain}/v1/masterdata/idschema/latest?schemaVersion= mosip.signup.idrepo.uin.length=10 -mosip.signup.idrepo.get-identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/idvid/ -mosip.signup.idrepo.identity.endpoint=${mosip.signup.idrepo.url}/idrepository/v1/identity/v2/ -mosip.signup.idrepo.generate-hash.endpoint=${mosip.signup.keymanager.url}/v1/keymanager/generateArgon2Hash -mosip.signup.idrepo.get-uin.endpoint=${mosip.signup.idgenerator.url}/v1/idgenerator/uin -mosip.signup.idrepo.get-status.endpoint=${mosip.signup.credreq.url}/v1/credentialrequest/get/ +mosip.signup.idrepo.get-identity.endpoint=${mosip.signup.idrepo.domain}/idrepository/v1/identity/idvid/ +mosip.signup.idrepo.identity.endpoint=${mosip.signup.idrepo.domain}/idrepository/v1/identity/v2/ +mosip.signup.idrepo.generate-hash.endpoint=${mosip.signup.keymanager.domain}/v1/keymanager/generateArgon2Hash +mosip.signup.idrepo.get-uin.endpoint=${mosip.signup.idgenerator.domain}/v1/idgenerator/uin +mosip.signup.idrepo.get-status.endpoint=${mosip.signup.credreq.domain}/v1/credentialrequest/get/ # This is the url to fetch ui-spec from masterdata - 'esignet-signup' in the url should match with domain name of the schema in the masterdata. -mosip.signup.mosipid.get-ui-spec.endpoint=${mosip.esignet.masterdata.url}/v1/masterdata/uispec/esignet-signup/latest?type=schema +mosip.signup.mosipid.get-ui-spec.endpoint=${mosip.esignet.masterdata.domain}/v1/masterdata/uispec/esignet-signup/latest?type=schema -mosip.signup.mosipid.dynamic-fields.endpoint=${mosip.esignet.masterdata.url}/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d +mosip.signup.mosipid.dynamic-fields.endpoint=${mosip.esignet.masterdata.domain}/v1/masterdata/dynamicfields?pageNumber=%d&pageSize=%d # for multiple languages scenario, the languages should be appended followed by ampersand as ?languages=eng&languages=fra&languages=khm -mosip.signup.mosipid.doc-types-category.endpoint=${mosip.esignet.masterdata.url}/v1/masterdata/applicanttype/000/languages?languages=eng +mosip.signup.mosipid.doc-types-category.endpoint=${mosip.esignet.masterdata.domain}/v1/masterdata/applicanttype/000/languages?languages=eng mosip.signup.idrepo.add-identity.request.id=mosip.id.create mosip.signup.idrepo.update-identity.request.id=mosip.id.update From d0246c045dd27b885e0545c94e96bc0ddbd386f0 Mon Sep 17 00:00:00 2001 From: Md Humair Kankudti Date: Fri, 20 Mar 2026 16:42:27 +0530 Subject: [PATCH 56/58] build actin failure in sun bird plugin due to inclusion/exclusion strategies (#192) Signed-off-by: Md-Humair-KK --- sunbird-rc-plugin/pom.xml | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/sunbird-rc-plugin/pom.xml b/sunbird-rc-plugin/pom.xml index fa0cac73..c4b758df 100644 --- a/sunbird-rc-plugin/pom.xml +++ b/sunbird-rc-plugin/pom.xml @@ -81,6 +81,10 @@ 0.8.14 3.4.0 1.8.0-SNAPSHOT + 3.9.1.2184 + **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** + **/dto/**,**/entity/**,**/config/** + **/dto/**,**/entity/**,**/exception/**,**/spi/**,**/advice/**,**/config/** 1.3.0-beta.4 @@ -340,4 +344,35 @@ + + + sonar + + . + src/main/java/**,src/main/resources/** + ${sonar.coverage.exclusions} + https://sonarcloud.io + + + false + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${maven.sonar.plugin.version} + + + verify + + sonar + + + + + + + + From a155125eb0de7bb8326a77bfb2ce663a00a07c82 Mon Sep 17 00:00:00 2001 From: Nandhukumar Date: Fri, 27 Mar 2026 19:58:17 +0530 Subject: [PATCH 57/58] added logger to debug the sendotp response Signed-off-by: Nandhukumar --- .../io/mosip/esignet/plugin/mosipid/service/HelperService.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java index c255a2ab..006c3c9e 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java @@ -156,6 +156,8 @@ protected SendOtpResult sendOTP(String partnerId, String clientId, IdaSendOtpReq if(responseEntity.getStatusCode().is2xxSuccessful() && responseEntity.getBody() != null) { IdaSendOtpResponse idaSendOtpResponse = responseEntity.getBody(); if(idaSendOtpRequest.getTransactionID().equals(idaSendOtpResponse.getTransactionID()) && idaSendOtpResponse.getResponse() != null){ + log.info("IDA Send OTP Inner Response (JSON): {}", objectMapper.writeValueAsString(idaSendOtpResponse.getResponse())); + log.info("IDA Send OTP Inner Response (RAW): {}", idaSendOtpResponse.getResponse()); return new SendOtpResult(idaSendOtpResponse.getTransactionID(), idaSendOtpResponse.getResponse().getMaskedEmail(), idaSendOtpResponse.getResponse().getMaskedMobile()); From 893d5b09126f7fdfb9afdb3a0facd17fb5ab5159 Mon Sep 17 00:00:00 2001 From: Nandhukumar Date: Thu, 2 Apr 2026 14:46:32 +0530 Subject: [PATCH 58/58] added debug logger for send-otp response Signed-off-by: Nandhukumar --- .../io/mosip/esignet/plugin/mosipid/service/HelperService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java index 006c3c9e..8ed70303 100644 --- a/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java +++ b/mosip-identity-plugin/src/main/java/io/mosip/esignet/plugin/mosipid/service/HelperService.java @@ -156,8 +156,7 @@ protected SendOtpResult sendOTP(String partnerId, String clientId, IdaSendOtpReq if(responseEntity.getStatusCode().is2xxSuccessful() && responseEntity.getBody() != null) { IdaSendOtpResponse idaSendOtpResponse = responseEntity.getBody(); if(idaSendOtpRequest.getTransactionID().equals(idaSendOtpResponse.getTransactionID()) && idaSendOtpResponse.getResponse() != null){ - log.info("IDA Send OTP Inner Response (JSON): {}", objectMapper.writeValueAsString(idaSendOtpResponse.getResponse())); - log.info("IDA Send OTP Inner Response (RAW): {}", idaSendOtpResponse.getResponse()); + log.debug("IDA Send OTP Inner Response (RAW): {}", idaSendOtpResponse.getResponse()); return new SendOtpResult(idaSendOtpResponse.getTransactionID(), idaSendOtpResponse.getResponse().getMaskedEmail(), idaSendOtpResponse.getResponse().getMaskedMobile());