From cb04653952daa8e88ab4753fc9080cc850576193 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Thu, 12 Mar 2026 23:49:36 +0530 Subject: [PATCH 1/5] Fixed mock identity validation issue removed unnecessary configurations Signed-off-by: ase-101 --- .../MockProfileRegistryPluginImpl.java | 69 +++--- .../src/main/resources/application.properties | 7 +- .../MockProfileRegistryPluginImplTest.java | 219 +++++++++++++++--- 3 files changed, 231 insertions(+), 64 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..1cbc3fff 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,15 @@ 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 java.util.stream.Collectors; import com.fasterxml.jackson.databind.node.ObjectNode; +import com.fasterxml.jackson.databind.node.TextNode; +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 +54,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 +91,42 @@ public class MockProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Autowired private ResourceLoader resourceLoader; + private JsonSchema schema; + @Override public void validate(String action, ProfileDto profileDto) throws InvalidProfileException { - if (!ACTIONS.contains(action)) { + + if(schema == null) { + 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.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 +269,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..9bf6835e 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,7 +320,7 @@ 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,"); From 8bf1db89ea3a6ff8affe862512daee87e9744fcb Mon Sep 17 00:00:00 2001 From: ase-101 Date: Thu, 12 Mar 2026 23:50:04 +0530 Subject: [PATCH 2/5] Removed unnecessary configurations Signed-off-by: ase-101 --- .../src/main/resources/application.properties | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) 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 bdec5b4fb67b9481e14112be0a9b6a4e347d0098 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 13 Mar 2026 01:59:52 +0530 Subject: [PATCH 3/5] Fixed review comment Signed-off-by: ase-101 --- .../plugin/mock/service/MockProfileRegistryPluginImpl.java | 5 ++--- 1 file changed, 2 insertions(+), 3 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 1cbc3fff..717fb71d 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 @@ -11,10 +11,8 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.stream.Collectors; import com.fasterxml.jackson.databind.node.ObjectNode; -import com.fasterxml.jackson.databind.node.TextNode; import com.networknt.schema.JsonSchema; import com.networknt.schema.JsonSchemaFactory; import com.networknt.schema.SpecVersion; @@ -125,7 +123,8 @@ public void validate(String action, ProfileDto profileDto) throws InvalidProfile @Override public ProfileResult createProfile(String requestId, ProfileDto profileDto) throws ProfileException { - if(identifierField != null && !profileDto.getIndividualId().equalsIgnoreCase(profileDto.getIdentity().get(identifierField).asText())) { + 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); } From 567c4166cf74ea132a288eb0a029c153694a7f45 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 13 Mar 2026 02:07:53 +0530 Subject: [PATCH 4/5] Fixed review comment Signed-off-by: ase-101 --- .../mock/service/MockProfileRegistryPluginImpl.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 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 717fb71d..a995cd2b 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 @@ -89,16 +89,19 @@ public class MockProfileRegistryPluginImpl implements ProfileRegistryPlugin { @Autowired private ResourceLoader resourceLoader; - private JsonSchema schema; + private volatile JsonSchema schema; @Override public void validate(String action, ProfileDto profileDto) throws InvalidProfileException { if(schema == null) { - ResponseWrapper responseWrapper = request(identitySchemaEndpoint, HttpMethod.GET ,null, - new ParameterizedTypeReference>() {}); - JsonSchemaFactory jsonSchemaFactory = JsonSchemaFactory.getInstance(SpecVersion.VersionFlag.V202012); - schema = jsonSchemaFactory.getSchema(responseWrapper.getResponse()); + 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)) { From 8785defea4b70182d71017d6a131d7698bbc39e5 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 13 Mar 2026 02:23:13 +0530 Subject: [PATCH 5/5] Fixed review comments Signed-off-by: ase-101 --- .../plugin/mock/service/MockProfileRegistryPluginImpl.java | 4 ++-- .../mock/service/MockProfileRegistryPluginImplTest.java | 2 +- 2 files changed, 3 insertions(+), 3 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 a995cd2b..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 @@ -126,8 +126,8 @@ public void validate(String action, ProfileDto profileDto) throws InvalidProfile @Override public ProfileResult createProfile(String requestId, ProfileDto profileDto) throws ProfileException { - if(identifierField != null && !profileDto.getIdentity().hasNonNull(identifierField) - && !profileDto.getIndividualId().equalsIgnoreCase(profileDto.getIdentity().get(identifierField).asText())) { + 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); } 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 9bf6835e..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 @@ -325,7 +325,7 @@ public void createProfile_withFacePhoto_thenPass() throws ProfileException { 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)