diff --git a/kernel/kernel-otpmanager-service/pom.xml b/kernel/kernel-otpmanager-service/pom.xml index dd15b28b..8878d959 100644 --- a/kernel/kernel-otpmanager-service/pom.xml +++ b/kernel/kernel-otpmanager-service/pom.xml @@ -231,58 +231,6 @@ https://github.com/mosip/commons - - io.mosip.kernel - kernel-core - ${kernel.core.version} - - - - org.springframework.boot - spring-boot-starter-security - ${spring.boot.version} - - - org.springframework.security - spring-security-test - ${spring.security.test.version} - - - io.mosip.kernel - kernel-dataaccess-hibernate - ${kernel.dataaccess-hibernate.version} - - - org.postgresql - postgresql - ${postgresql.version} - - - io.mosip.kernel - kernel-logger-logback - ${kernel.logger.version} - - - org.springdoc - springdoc-openapi-ui - ${springdoc.version} - - - - org.springframework.boot - spring-boot-configuration-processor - true - ${spring.boot.version} - com.googlecode.json-simple json-simple @@ -294,6 +242,11 @@ + + io.mosip.kernel + kernel-otpmanager + 1.2.1-SNAPSHOT + @@ -497,7 +450,7 @@ io.mosip.kernel kernel-auth-adapter - ${project.version} + ${kernel.auth-adapter.version} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/OtpmanagerBootApplication.java b/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/OtpmanagerBootApplication.java index 738ebd24..6855ef15 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/OtpmanagerBootApplication.java +++ b/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/OtpmanagerBootApplication.java @@ -2,6 +2,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; /** * OTP Manager Application @@ -13,6 +14,7 @@ */ @SpringBootApplication(scanBasePackages = { "io.mosip.kernel.otpmanager.*", "${mosip.auth.adapter.impl.basepackage}", "io.mosip.kernel.core.logger.config" }) +@EnableCaching public class OtpmanagerBootApplication { /** diff --git a/kernel/kernel-otpmanager-service/src/main/resources/application-local.properties b/kernel/kernel-otpmanager-service/src/main/resources/application-local.properties index 36b3b5ff..c7594952 100644 --- a/kernel/kernel-otpmanager-service/src/main/resources/application-local.properties +++ b/kernel/kernel-otpmanager-service/src/main/resources/application-local.properties @@ -25,6 +25,15 @@ auth.header.name=Authorization spring.h2.console.enabled=true +mosip.auth.adapter.impl.basepackage=io.mosip.kernel.auth.defaultadapter +mosip.kernel.auth.appids.realm.map={prereg:'preregistration',ida:'mosip',registrationclient:'mosip',regproc:'mosip',partner:'mosip',resident:'mosip',admin:'mosip',crereq:'mosip',creser:'mosip',datsha:'mosip'} +mosip.kernel.auth.proxy-otp=false + +#set the datastore +mosip.datastore.type=cache +mosip.datastore.cache.name=otpEntity + + hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.jdbc.lob.non_contextual_creation=true diff --git a/kernel/kernel-otpmanager-service/src/main/resources/bootstrap.properties b/kernel/kernel-otpmanager-service/src/main/resources/bootstrap.properties index f3ac9152..0934450a 100644 --- a/kernel/kernel-otpmanager-service/src/main/resources/bootstrap.properties +++ b/kernel/kernel-otpmanager-service/src/main/resources/bootstrap.properties @@ -34,3 +34,5 @@ openapi.service.servers[0].description=OTP Manager Service springdoc.swagger-ui.disable-swagger-default-url=true spring.mvc.servlet.path=${server.servlet.path} +server.servlet.context-path=/v1/otpmanager + diff --git a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpGeneratorControllerTest.java b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpGeneratorControllerTest.java index 7eca43e1..87e0dc36 100644 --- a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpGeneratorControllerTest.java +++ b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpGeneratorControllerTest.java @@ -1,47 +1,39 @@ package io.mosip.kernel.otpmanager.test.controller; -import static org.hamcrest.CoreMatchers.is; -import static org.mockito.BDDMockito.given; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.core.http.ResponseWrapper; +import io.mosip.kernel.otpmanager.controller.OtpGeneratorController; +import io.mosip.kernel.otpmanager.dto.OtpGeneratorRequestDto; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - import io.mosip.kernel.otpmanager.dto.OtpGeneratorResponseDto; import io.mosip.kernel.otpmanager.service.impl.OtpGeneratorServiceImpl; -import io.mosip.kernel.otpmanager.test.OtpmanagerTestBootApplication; @RunWith(SpringRunner.class) -@AutoConfigureMockMvc -@SpringBootTest(classes = OtpmanagerTestBootApplication.class) public class OtpGeneratorControllerTest { - @Autowired - private MockMvc mockMvc; - @MockBean + @Mock private OtpGeneratorServiceImpl service; - @WithUserDetails("individual") + @InjectMocks + private OtpGeneratorController otpGeneratorController; + @Test public void testOtpGenerationController() throws Exception { - String otp = "3214"; OtpGeneratorResponseDto dto = new OtpGeneratorResponseDto(); - dto.setOtp(otp); - given(service.getOtp(Mockito.any())).willReturn(dto); - String json = "{\"key\":\"123456789\"}"; - mockMvc.perform(post("/otp/generate").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.otp", is("3214"))); - } + dto.setOtp("3124"); + Mockito.when(service.getOtp(Mockito.any())).thenReturn(dto); + OtpGeneratorRequestDto requestDto = new OtpGeneratorRequestDto(); + RequestWrapper requestWrapper = new RequestWrapper(); + requestWrapper.setRequest(requestDto); + OtpGeneratorResponseDto responseDto = new OtpGeneratorResponseDto(); + responseDto.setOtp("3124"); + ResponseWrapper actualResponseWrapper = otpGeneratorController.generateOtp(requestWrapper); + Assert.assertEquals(responseDto, actualResponseWrapper.getResponse()); } } diff --git a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpValidatorControllerTest.java b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpValidatorControllerTest.java index dcd8c177..ee334e7d 100644 --- a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpValidatorControllerTest.java +++ b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/controller/OtpValidatorControllerTest.java @@ -19,9 +19,7 @@ import io.mosip.kernel.otpmanager.service.impl.OtpValidatorServiceImpl; import io.mosip.kernel.otpmanager.test.OtpmanagerTestBootApplication; -@SpringBootTest(classes = OtpmanagerTestBootApplication.class) @RunWith(SpringRunner.class) -@AutoConfigureMockMvc public class OtpValidatorControllerTest { @Mock private OtpValidatorServiceImpl service; diff --git a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/exception/OtpExceptionTest.java b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/exception/OtpExceptionTest.java deleted file mode 100644 index 0106da7c..00000000 --- a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/exception/OtpExceptionTest.java +++ /dev/null @@ -1,96 +0,0 @@ - -package io.mosip.kernel.otpmanager.test.exception; - -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.core.http.RequestWrapper; -import io.mosip.kernel.otpmanager.constant.OtpErrorConstants; -import io.mosip.kernel.otpmanager.dto.OtpGeneratorRequestDto; -import io.mosip.kernel.otpmanager.exception.OtpInvalidArgumentException; -import io.mosip.kernel.otpmanager.service.impl.OtpGeneratorServiceImpl; -import io.mosip.kernel.otpmanager.service.impl.OtpValidatorServiceImpl; -import io.mosip.kernel.otpmanager.test.OtpmanagerTestBootApplication; - -@RunWith(SpringRunner.class) -@AutoConfigureMockMvc -@SpringBootTest(classes = OtpmanagerTestBootApplication.class) -public class OtpExceptionTest { - @Autowired - private MockMvc mockMvc; - - @Autowired - private ObjectMapper objectMapper; - - @MockBean - private OtpGeneratorServiceImpl service; - - @MockBean - private OtpValidatorServiceImpl validatorService; - - @WithUserDetails("individual") - @Test - public void testForExceptionWhenKeyIsNull() throws Exception { - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(new ServiceError(OtpErrorConstants.OTP_VAL_INVALID_KEY_INPUT.getErrorCode(), - OtpErrorConstants.OTP_VAL_INVALID_KEY_INPUT.getErrorMessage())); - when(service.getOtp(Mockito.any())).thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - OtpGeneratorRequestDto otpGeneratorRequestDto = new OtpGeneratorRequestDto(); - otpGeneratorRequestDto.setKey(null); - RequestWrapper reqWrapperDTO = new RequestWrapper<>(); - reqWrapperDTO.setId("ID"); - reqWrapperDTO.setMetadata(null); - reqWrapperDTO.setRequest(otpGeneratorRequestDto); - reqWrapperDTO.setRequesttime(LocalDateTime.now()); - reqWrapperDTO.setVersion("v1.0"); - String json = objectMapper.writeValueAsString(reqWrapperDTO); - mockMvc.perform(post("/otp/generate").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()); - } - - @WithUserDetails("individual") - @Test - public void testForExceptionWhenKeyNotFound() throws Exception { - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(new ServiceError(OtpErrorConstants.OTP_VAL_INVALID_KEY_INPUT.getErrorCode(), - OtpErrorConstants.OTP_VAL_INVALID_KEY_INPUT.getErrorMessage())); - when(validatorService.validateOtp(Mockito.any(), Mockito.any())) - .thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - mockMvc.perform(get("/otp/validate?key=test&otp=3212").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); - } - - @WithUserDetails("individual") - @Test - public void testForExceptionWhenKeyLengthInvalid() throws Exception { - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(new ServiceError(OtpErrorConstants.OTP_VAL_INVALID_KEY_INPUT.getErrorCode(), - OtpErrorConstants.OTP_VAL_INVALID_KEY_INPUT.getErrorMessage())); - when(validatorService.validateOtp(Mockito.any(), Mockito.any())) - .thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - mockMvc.perform(get("/otp/validate?key=sa&otp=3212").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()); - } - -} diff --git a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpGeneratorServiceTest.java b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpGeneratorServiceTest.java deleted file mode 100644 index e21accd8..00000000 --- a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpGeneratorServiceTest.java +++ /dev/null @@ -1,80 +0,0 @@ -package io.mosip.kernel.otpmanager.test.service; - -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.time.LocalDateTime; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - -import com.fasterxml.jackson.databind.ObjectMapper; - -import io.mosip.kernel.core.http.RequestWrapper; -import io.mosip.kernel.otpmanager.dto.OtpGeneratorRequestDto; -import io.mosip.kernel.otpmanager.entity.OtpEntity; -import io.mosip.kernel.otpmanager.repository.OtpRepository; -import io.mosip.kernel.otpmanager.test.OtpmanagerTestBootApplication; - -@RunWith(SpringRunner.class) -@AutoConfigureMockMvc -@SpringBootTest(classes = OtpmanagerTestBootApplication.class) -public class OtpGeneratorServiceTest { - - @Autowired - private MockMvc mockMvc; - - @Autowired - private ObjectMapper objectMapper; - - @MockBean - OtpRepository repository; - - @WithUserDetails("individual") - @Test - public void testOtpGeneratorServicePositiveCase() throws Exception { - OtpGeneratorRequestDto otpGeneratorRequestDto = new OtpGeneratorRequestDto(); - otpGeneratorRequestDto.setKey("testKey"); - RequestWrapper reqWrapperDTO = new RequestWrapper<>(); - reqWrapperDTO.setId("ID"); - reqWrapperDTO.setMetadata(null); - reqWrapperDTO.setRequest(otpGeneratorRequestDto); - reqWrapperDTO.setRequesttime(LocalDateTime.now()); - reqWrapperDTO.setVersion("v1.0"); - String json = objectMapper.writeValueAsString(reqWrapperDTO); - mockMvc.perform(post("/otp/generate").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andReturn(); - } - - @WithUserDetails("individual") - @Test - public void testOtpGenerationFreezedCase() throws Exception { - OtpGeneratorRequestDto otpGeneratorRequestDto = new OtpGeneratorRequestDto(); - otpGeneratorRequestDto.setKey("testKey"); - RequestWrapper reqWrapperDTO = new RequestWrapper<>(); - reqWrapperDTO.setId("ID"); - reqWrapperDTO.setMetadata(null); - reqWrapperDTO.setRequest(otpGeneratorRequestDto); - reqWrapperDTO.setRequesttime(LocalDateTime.now()); - reqWrapperDTO.setVersion("v1.0"); - String json = objectMapper.writeValueAsString(reqWrapperDTO); - OtpEntity entity = new OtpEntity(); - entity.setOtp("1234"); - entity.setId("testKey"); - entity.setValidationRetryCount(0); - entity.setStatusCode("KEY_FREEZED"); - entity.setUpdatedDtimes(LocalDateTime.now()); - when(repository.findById(OtpEntity.class, "testKey")).thenReturn(entity); - mockMvc.perform(post("/otp/generate").contentType(MediaType.APPLICATION_JSON).content(json)) - .andExpect(status().isOk()).andReturn(); - } -} diff --git a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidationsTest.java b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidationsTest.java deleted file mode 100644 index e05e2008..00000000 --- a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidationsTest.java +++ /dev/null @@ -1,135 +0,0 @@ -package io.mosip.kernel.otpmanager.test.service; - -import static org.hamcrest.CoreMatchers.is; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - -import io.mosip.kernel.core.exception.ServiceError; -import io.mosip.kernel.otpmanager.entity.OtpEntity; -import io.mosip.kernel.otpmanager.exception.OtpInvalidArgumentException; -import io.mosip.kernel.otpmanager.repository.OtpRepository; -import io.mosip.kernel.otpmanager.test.OtpmanagerTestBootApplication; - -@RunWith(SpringRunner.class) -@AutoConfigureMockMvc -@SpringBootTest(classes = OtpmanagerTestBootApplication.class) -public class OtpValidationsTest { - - @Autowired - MockMvc mockMvc; - - @Value("${mosip.kernel.otp.default-length}") - double otpLength; - - @MockBean - private OtpRepository otpRepository; - - @WithUserDetails("individual") - @Test - public void testNullKey() throws Exception { - when(otpRepository.findById(OtpEntity.class, "testKey")).thenReturn(null); - mockMvc.perform(get("/otp/validate?key=testKey&otp=1234").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn(); - } - - @WithUserDetails("individual") - @Ignore - @Test - public void testOtpValidatorServiceExpiredOTPCase() throws Exception { - Random randomKey = new Random(); - double id = Math.pow(10, otpLength) + randomKey.nextInt((int) (9 * Math.pow(10, otpLength))); - OtpEntity entity = new OtpEntity(); - entity.setOtp("1234"); - entity.setId(Double.toString(id)); - entity.setValidationRetryCount(0); - entity.setStatusCode("OTP_UNUSED"); - entity.setGeneratedDtimes(LocalDateTime.now(ZoneId.of("UTC")).minusMinutes(3)); - when(otpRepository.findById(OtpEntity.class, "testKey")).thenReturn(entity); - mockMvc.perform(get("/otp/validate?key=testKey&otp=1234").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("failure"))); - - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceKeyEmptyCase() throws Exception { - ServiceError serviceError = new ServiceError("TESTCODE", "TESTMESSAGE"); - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(serviceError); - when(otpRepository.findById(OtpEntity.class, "testKey")) - .thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - mockMvc.perform(get("/otp/validate?key=&otp=1234").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn(); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceOtpEmptyCase() throws Exception { - ServiceError serviceError = new ServiceError("TESTCODE", "TESTMESSAGE"); - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(serviceError); - when(otpRepository.findById(OtpEntity.class, "testKey")) - .thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - mockMvc.perform(get("/otp/validate?key=testkey&otp=").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn(); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceKeyLengthLessThanRequiredCase() throws Exception { - ServiceError serviceError = new ServiceError("TESTCODE", "TESTMESSAGE"); - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(serviceError); - when(otpRepository.findById(OtpEntity.class, "testKey")) - .thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - mockMvc.perform( - get("/otp/validate").param("key", "sa").param("otp", "123456").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn(); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceKeyLengthMoreThanRequiredCase() throws Exception { - ServiceError serviceError = new ServiceError("TESTCODE", "TESTMESSAGE"); - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(serviceError); - when(otpRepository.findById(OtpEntity.class, "testKey")) - .thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - mockMvc.perform(get("/otp/validate").param("key", - "ykbbgyhogsmziqozetsyexoazpqhcpqywqmuyyijaweoswjlvhemamrmbuorixvnwlrhgfbnrmoorscjkllmgzqxtauoolvhoiyxfwoiotkvimcqshxvxplrqsfxmlmroyxcphstayxnowmjsnwdwhazpotqqrafuvpcaccaxneavptzwwsukhjqzwhjpdgrbqfybsyyryqlbrpdakuvtvswcwpzvkkaonblwlkjvytiodlnvsodsxkkgbbzvxkjbgbhnnvpkohydywdaudekflgbvbkeqwrekdgsneomyovczvnqhuitmr") - .param("otp", "123456").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andReturn(); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceOtpIsCharacter() throws Exception { - ServiceError serviceError = new ServiceError("TESTCODE", "TESTMESSAGE"); - List validationErrorsList = new ArrayList<>(); - validationErrorsList.add(serviceError); - when(otpRepository.findById(OtpEntity.class, "testKey")) - .thenThrow(new OtpInvalidArgumentException(validationErrorsList)); - mockMvc.perform(get("/otp/validate").param("key", "test").param("otp", "INVALID-TYPE") - .contentType(MediaType.APPLICATION_JSON)).andExpect(status().isOk()).andReturn(); - } -} diff --git a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidatorServiceTest.java b/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidatorServiceTest.java deleted file mode 100644 index 1bc1ad44..00000000 --- a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidatorServiceTest.java +++ /dev/null @@ -1,109 +0,0 @@ -package io.mosip.kernel.otpmanager.test.service; - -import static org.hamcrest.CoreMatchers.is; -import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.temporal.ChronoUnit; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.MediaType; -import org.springframework.security.test.context.support.WithUserDetails; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; - -import io.mosip.kernel.otpmanager.entity.OtpEntity; -import io.mosip.kernel.otpmanager.repository.OtpRepository; -import io.mosip.kernel.otpmanager.test.OtpmanagerTestBootApplication; - -@RunWith(SpringRunner.class) -@AutoConfigureMockMvc -@SpringBootTest(classes = OtpmanagerTestBootApplication.class) -public class OtpValidatorServiceTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - OtpRepository repository; - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServicePositiveCase() throws Exception { - OtpEntity entity = new OtpEntity(); - entity.setOtp("1234"); - entity.setId("testKey"); - entity.setValidationRetryCount(0); - entity.setStatusCode("OTP_UNUSED"); - entity.setUpdatedDtimes(LocalDateTime.now(ZoneId.of("UTC")).plusSeconds(50)); - when(repository.findById(OtpEntity.class, "testKey")).thenReturn(entity); - mockMvc.perform(get("/otp/validate?key=testKey&otp=1234").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("success"))); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceNegativeCase() throws Exception { - OtpEntity entity = new OtpEntity(); - entity.setOtp("1234"); - entity.setId("testKey"); - entity.setValidationRetryCount(0); - entity.setStatusCode("OTP_UNUSED"); - entity.setUpdatedDtimes(LocalDateTime.now()); - when(repository.findById(OtpEntity.class, "testKey")).thenReturn(entity); - mockMvc.perform(get("/otp/validate?key=testKey&otp=5431").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("failure"))); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceWhenMaxAttemptReached() throws Exception { - OtpEntity entity = new OtpEntity(); - entity.setOtp("1234"); - entity.setId("testKey"); - entity.setValidationRetryCount(3); - entity.setStatusCode("OTP_UNUSED"); - entity.setUpdatedDtimes(LocalDateTime.now()); - when(repository.findById(OtpEntity.class, "testKey")).thenReturn(entity); - mockMvc.perform(get("/otp/validate?key=testKey&otp=5431").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("failure"))); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceWhenKeyFreezedPositiveCase() throws Exception { - OtpEntity entity = new OtpEntity(); - entity.setOtp("1234"); - entity.setId("testKey"); - entity.setValidationRetryCount(3); - entity.setStatusCode("KEY_FREEZED"); - entity.setUpdatedDtimes(LocalDateTime.now(ZoneId.of("UTC")).minus(1, ChronoUnit.MINUTES)); - when(repository.findById(OtpEntity.class, "testKey")).thenReturn(entity); - mockMvc.perform(get("/otp/validate?key=testKey&otp=2345").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("failure"))); - } - - @WithUserDetails("individual") - @Test - public void testOtpValidatorServiceWhenKeyFreezedNegativeCase() throws Exception { - OtpEntity entity = new OtpEntity(); - entity.setOtp("1234"); - entity.setId("testKey"); - entity.setValidationRetryCount(0); - entity.setStatusCode("KEY_FREEZED"); - entity.setUpdatedDtimes(LocalDateTime.now().minus(20, ChronoUnit.SECONDS)); - when(repository.findById(OtpEntity.class, "testKey")).thenReturn(entity); - mockMvc.perform(get("/otp/validate?key=testKey&otp=1234").contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andExpect(jsonPath("$.response.status", is("failure"))); - } - -} diff --git a/kernel/kernel-otpmanager/pom.xml b/kernel/kernel-otpmanager/pom.xml new file mode 100644 index 00000000..5c8af872 --- /dev/null +++ b/kernel/kernel-otpmanager/pom.xml @@ -0,0 +1,328 @@ + + + 4.0.0 + + io.mosip.kernel + kernel-otpmanager + 1.2.1-SNAPSHOT + + UTF-8 + + + 11 + 11 + 3.8.0 + + + 3.0.2 + 3.1.0 + + + 3.2.0 + 2.3 + + + 2.0.2.RELEASE + 2.0.7.RELEASE + 5.0.5.RELEASE + 2.0.4.RELEASE + + + 2.0.7 + 1.5.21 + 2.9.2 + + + 3.6.2 + 3.7.0 + + + + 1.2 + 3.0.0 + 1.3 + 2.2 + 2.0.1.Final + 2.2.6 + + + 1.4.197 + 5.1.46 + 42.2.2 + 2.5.0 + 5.2.17.Final + 6.0.12.Final + + + 4.12 + 2.23.4 + 1.7.4 + 2.0.7 + + + 1.2.3 + 1.7.19 + 1.7.7 + 1.7.25 + + + 2.9.5 + 2.9.8 + 2.9.6 + 20180130 + 2.2.10 + 20180813 + 1.1.1 + + + 3.6.1 + 3.7 + 2.6 + 1.11 + 4.3 + 1.9.2 + 2.2 + 4.5.6 + 19.0 + 1.18.8 + 0.1.54 + 1.4.0 + 7.1.0 + 2.0.0 + 5.5.13 + 2.3.23 + 1.7 + 2.0 + 1.5.2 + 2.1.1 + 1.66 + 63.1 + 1.0.0 + 3.3.3 + 3.1.0 + 4.1.0-incubating + 1.11.368 + 0.2.4 + 2.3.0 + 3.0.1 + 1.9.12 + 0.6.0 + 2.0.0.AM2 + 1.8.12 + 1.4.2 + 1.4.2 + UTF-8 + + + 11 + 11 + 3.8.0 + + + 3.0.2 + 3.1.0 + + + 3.2.0 + 2.3 + + + 2.0.2.RELEASE + 2.0.7.RELEASE + 5.0.5.RELEASE + 2.0.4.RELEASE + + + 2.0.7 + 1.5.21 + 2.9.2 + + + 3.6.2 + 3.7.0 + + + + 1.2 + 3.0.0 + 1.3 + 2.2 + 2.0.1.Final + 2.2.6 + + + 1.4.197 + 5.1.46 + 42.2.2 + 2.5.0 + 5.2.17.Final + 6.0.12.Final + + + 4.12 + 2.23.4 + 1.7.4 + 2.0.7 + + + 1.2.3 + 1.7.19 + 1.7.7 + 1.7.25 + + + 2.9.5 + 2.9.8 + 2.9.6 + 20180130 + 2.2.10 + 20180813 + 1.1.1 + + + 3.6.1 + 3.7 + 2.6 + 1.11 + 4.3 + 1.9.2 + 2.2 + 4.5.6 + 19.0 + 1.18.8 + 0.1.54 + 1.4.0 + 7.1.0 + 2.0.0 + 5.5.13 + 2.3.23 + 1.7 + 2.0 + 1.5.2 + 2.1.1 + 1.66 + 63.1 + 1.0.0 + 3.3.3 + 3.1.0 + 4.1.0-incubating + 1.11.368 + 0.2.4 + 2.3.0 + 3.0.1 + 1.9.12 + 0.6.0 + 2.0.0.AM2 + 1.8.12 + 1.4.2 + 1.4.2 + 1.2.1-SNAPSHOT + 1.2.1-SNAPSHOT + 1.2.1-SNAPSHOT + 1.2.1-SNAPSHOT + 0.8.5 + 1.5.10 + + kernel-otpmanager + Mosip commons project + https://github.com/mosip/commons + + + + io.mosip.kernel + kernel-core + ${kernel.core.version} + + + + + org.springframework.boot + spring-boot-starter-security + ${spring.boot.version} + + + org.springframework.security + spring-security-test + ${spring.security.test.version} + + + io.mosip.kernel + kernel-dataaccess-hibernate + ${kernel.dataaccess-hibernate.version} + + + org.postgresql + postgresql + ${postgresql.version} + + + io.mosip.kernel + kernel-logger-logback + ${kernel.logger.version} + + + org.springdoc + springdoc-openapi-ui + ${springdoc.version} + + + + org.springframework.boot + spring-boot-configuration-processor + true + ${spring.boot.version} + + + com.googlecode.json-simple + json-simple + 1.1.1 + + + junit + junit + + + + + + + + org.springframework.boot + spring-boot-starter-cache + ${spring.boot.version} + + + + + + ossrh + https://oss.sonatype.org/content/repositories/snapshots + + + ossrh + https://oss.sonatype.org/service/local/staging/deploy/maven2/ + + + + scm:git:git://github.com/mosip/commons.git + scm:git:ssh://github.com:mosip/commons.git + https://github.com/mosip/commons + HEAD + + + + MPL 2.0 + https://www.mozilla.org/en-US/MPL/2.0/ + + + + + Mosip + mosip.emailnotifier@gmail.com + io.mosip + https://github.com/mosip/commons + + + diff --git a/kernel/kernel-otpmanager/src/main/java/META-INF/MANIFEST.MF b/kernel/kernel-otpmanager/src/main/java/META-INF/MANIFEST.MF new file mode 100644 index 00000000..254272e1 --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/java/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/constant/OtpErrorConstants.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/constant/OtpErrorConstants.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/constant/OtpErrorConstants.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/constant/OtpErrorConstants.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/constant/OtpStatusConstants.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/constant/OtpStatusConstants.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/constant/OtpStatusConstants.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/constant/OtpStatusConstants.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/constant/SqlQueryConstants.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/constant/SqlQueryConstants.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/constant/SqlQueryConstants.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/constant/SqlQueryConstants.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/AuthorizedRolesDto.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/AuthorizedRolesDto.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/AuthorizedRolesDto.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/AuthorizedRolesDto.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/GenerationDTOValidationLevels.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/GenerationDTOValidationLevels.java similarity index 95% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/GenerationDTOValidationLevels.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/GenerationDTOValidationLevels.java index 439b4dec..a5eb1b83 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/GenerationDTOValidationLevels.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/GenerationDTOValidationLevels.java @@ -1,23 +1,23 @@ -package io.mosip.kernel.otpmanager.dto; - -import javax.validation.GroupSequence; - -/** - * This class contains group sequence levels for validation of key. - * - * @author Sagar Mahapatra - * @author Ritesh Sinha - * @since 1.0.0 - */ -public class GenerationDTOValidationLevels { - @GroupSequence({ NullEmptyValidationLevel.class, InvalidLengthValidationLevel.class }) - public interface ValidationLevel { - - } - - public interface NullEmptyValidationLevel { - } - - public interface InvalidLengthValidationLevel { - } -} +package io.mosip.kernel.otpmanager.dto; + +import javax.validation.GroupSequence; + +/** + * This class contains group sequence levels for validation of key. + * + * @author Sagar Mahapatra + * @author Ritesh Sinha + * @since 1.0.0 + */ +public class GenerationDTOValidationLevels { + @GroupSequence({ NullEmptyValidationLevel.class, InvalidLengthValidationLevel.class }) + public interface ValidationLevel { + + } + + public interface NullEmptyValidationLevel { + } + + public interface InvalidLengthValidationLevel { + } +} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorRequestDto.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorRequestDto.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorRequestDto.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorRequestDto.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorResponseDto.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorResponseDto.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorResponseDto.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/OtpGeneratorResponseDto.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/OtpValidatorResponseDto.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/OtpValidatorResponseDto.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/dto/OtpValidatorResponseDto.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/dto/OtpValidatorResponseDto.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/entity/OtpEntity.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/entity/OtpEntity.java similarity index 96% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/entity/OtpEntity.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/entity/OtpEntity.java index 08fb624c..f78e6bb3 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/entity/OtpEntity.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/entity/OtpEntity.java @@ -1,5 +1,6 @@ package io.mosip.kernel.otpmanager.entity; +import java.io.Serializable; import java.time.LocalDateTime; import java.time.ZoneId; @@ -22,7 +23,7 @@ @Entity @Data @Table(name = "otp_transaction", schema = "kernel") -public class OtpEntity { +public class OtpEntity implements Serializable { /** * The variable that holds the unique ID. */ diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/CryptoFailureException.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/CryptoFailureException.java similarity index 96% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/CryptoFailureException.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/CryptoFailureException.java index 9c4373ae..9e09a6c5 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/CryptoFailureException.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/CryptoFailureException.java @@ -1,30 +1,30 @@ -package io.mosip.kernel.otpmanager.exception; - -import io.mosip.kernel.core.exception.BaseUncheckedException; - -/** - * Class to handle exceptions for CRYPTO failure. - * - * @author Ritesh Sinha - * @since 1.0.0 - * - */ -public class CryptoFailureException extends BaseUncheckedException { - - /** - * Serializable version ID. - */ - private static final long serialVersionUID = -3069970234745966967L; - - /** - * Constructor for CryptoFailureException class. - * - * @param errorCode the error code. - * @param errorMessage the error message. - * @param rootCause the cause. - */ - public CryptoFailureException(String errorCode, String errorMessage, Throwable rootCause) { - super(errorCode, errorMessage, rootCause); - } - -} +package io.mosip.kernel.otpmanager.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; + +/** + * Class to handle exceptions for CRYPTO failure. + * + * @author Ritesh Sinha + * @since 1.0.0 + * + */ +public class CryptoFailureException extends BaseUncheckedException { + + /** + * Serializable version ID. + */ + private static final long serialVersionUID = -3069970234745966967L; + + /** + * Constructor for CryptoFailureException class. + * + * @param errorCode the error code. + * @param errorMessage the error message. + * @param rootCause the cause. + */ + public CryptoFailureException(String errorCode, String errorMessage, Throwable rootCause) { + super(errorCode, errorMessage, rootCause); + } + +} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpControllerAdvice.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpControllerAdvice.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpControllerAdvice.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpControllerAdvice.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpIOException.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpIOException.java similarity index 95% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpIOException.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpIOException.java index 8953ad76..1597bbd8 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpIOException.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpIOException.java @@ -1,29 +1,29 @@ -package io.mosip.kernel.otpmanager.exception; - -import io.mosip.kernel.core.exception.BaseUncheckedException; - -/** - * Exception class for Otp IO exception. - * - * @author Ritesh Sinha - * @since 1.0.0 - */ -public class OtpIOException extends BaseUncheckedException { - - /** - * - */ - private static final long serialVersionUID = -8462152397501555128L; - - /** - * Constructor for OtpIOException. - * - * @param errorCode the error code. - * @param errorMessage the error message. - * @param rootCause the root cause. - */ - public OtpIOException(String errorCode, String errorMessage, Throwable rootCause) { - super(errorCode, errorMessage, rootCause); - } - -} +package io.mosip.kernel.otpmanager.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; + +/** + * Exception class for Otp IO exception. + * + * @author Ritesh Sinha + * @since 1.0.0 + */ +public class OtpIOException extends BaseUncheckedException { + + /** + * + */ + private static final long serialVersionUID = -8462152397501555128L; + + /** + * Constructor for OtpIOException. + * + * @param errorCode the error code. + * @param errorMessage the error message. + * @param rootCause the root cause. + */ + public OtpIOException(String errorCode, String errorMessage, Throwable rootCause) { + super(errorCode, errorMessage, rootCause); + } + +} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpInvalidArgumentException.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpInvalidArgumentException.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpInvalidArgumentException.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpInvalidArgumentException.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpServiceException.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpServiceException.java similarity index 96% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpServiceException.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpServiceException.java index d647bf18..225fcf4f 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/OtpServiceException.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/OtpServiceException.java @@ -1,16 +1,16 @@ -package io.mosip.kernel.otpmanager.exception; - -import io.mosip.kernel.core.exception.BaseUncheckedException; - -public class OtpServiceException extends BaseUncheckedException { - - /** - * - */ - private static final long serialVersionUID = 6963954493840799987L; - - public OtpServiceException(String errorCode, String errorMessage, Throwable rootCause) { - super(errorCode, errorMessage, rootCause); - } - -} +package io.mosip.kernel.otpmanager.exception; + +import io.mosip.kernel.core.exception.BaseUncheckedException; + +public class OtpServiceException extends BaseUncheckedException { + + /** + * + */ + private static final long serialVersionUID = 6963954493840799987L; + + public OtpServiceException(String errorCode, String errorMessage, Throwable rootCause) { + super(errorCode, errorMessage, rootCause); + } + +} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/RequiredKeyNotFoundException.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/RequiredKeyNotFoundException.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/RequiredKeyNotFoundException.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/RequiredKeyNotFoundException.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/ResourceNotFoundException.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/ResourceNotFoundException.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/exception/ResourceNotFoundException.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/exception/ResourceNotFoundException.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/repository/OtpRepository.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/repository/OtpRepository.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/repository/OtpRepository.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/repository/OtpRepository.java diff --git a/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/PersistenceService.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/PersistenceService.java new file mode 100644 index 00000000..4d2f0457 --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/PersistenceService.java @@ -0,0 +1,16 @@ +package io.mosip.kernel.otpmanager.service; + +import io.mosip.kernel.otpmanager.entity.OtpEntity; + +import java.util.Map; + +public interface PersistenceService { + + public void saveOtp(OtpEntity otpEntity); + + public OtpEntity findOtpByKey(String key); + + public void deleteOtpByKey(String key); + + public void updateOtp(Map updateMap); +} diff --git a/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/CachePersistenceServiceImpl.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/CachePersistenceServiceImpl.java new file mode 100644 index 00000000..29df15e2 --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/CachePersistenceServiceImpl.java @@ -0,0 +1,66 @@ +package io.mosip.kernel.otpmanager.service.impl; + +import io.mosip.kernel.core.util.StringUtils; +import io.mosip.kernel.otpmanager.constant.SqlQueryConstants; +import io.mosip.kernel.otpmanager.entity.OtpEntity; +import io.mosip.kernel.otpmanager.service.PersistenceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.cache.CacheManager; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Map; + + +@ConditionalOnProperty(name = "mosip.datastore.type", havingValue = "cache") +@Component +public class CachePersistenceServiceImpl implements PersistenceService { + @Autowired + CacheManager cacheManager; + + + @Value("${mosip.datastore.cache.name}") + String cache; + + @Override + public void saveOtp(OtpEntity otpEntity) { + + cacheManager.getCache(cache).put(otpEntity.getId(),otpEntity); + } + + @Override + public OtpEntity findOtpByKey(String key) { + return cacheManager.getCache(cache).get(key,OtpEntity.class); + } + + @Override + public void deleteOtpByKey(String key) { + cacheManager.getCache(cache).evict(key); + } + + @Override + public void updateOtp(Map updateMap) { + + OtpEntity otpEntity = cacheManager.getCache(cache).get(updateMap.get(SqlQueryConstants.ID.getProperty()).toString(), OtpEntity.class); + for(String key: updateMap.keySet()){ + if (StringUtils.equals(key,SqlQueryConstants.ID.getProperty())) { + otpEntity.setId(key); + continue; + } + if (StringUtils.equals(key,SqlQueryConstants.NEW_OTP_STATUS.getProperty())) { + otpEntity.setStatusCode(updateMap.get(SqlQueryConstants.NEW_OTP_STATUS.getProperty()).toString()); + continue; + } + if (StringUtils.equals(key,SqlQueryConstants.NEW_NUM_OF_ATTEMPT.getProperty())) { + otpEntity.setValidationRetryCount(Integer.parseInt(updateMap.get(SqlQueryConstants.NEW_NUM_OF_ATTEMPT.getProperty()).toString())); + continue; + } + if (StringUtils.equals(key,SqlQueryConstants.NEW_VALIDATION_TIME.getProperty())) { + otpEntity.setUpdatedDtimes((LocalDateTime) updateMap.get(SqlQueryConstants.NEW_VALIDATION_TIME.getProperty())); + } + } + cacheManager.getCache(cache).put(otpEntity.getId(),otpEntity); + } +} diff --git a/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/DatabasePersistenceServiceImpl.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/DatabasePersistenceServiceImpl.java new file mode 100644 index 00000000..af8561da --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/DatabasePersistenceServiceImpl.java @@ -0,0 +1,53 @@ +package io.mosip.kernel.otpmanager.service.impl; + +import io.mosip.kernel.otpmanager.constant.SqlQueryConstants; +import io.mosip.kernel.otpmanager.entity.OtpEntity; +import io.mosip.kernel.otpmanager.repository.OtpRepository; +import io.mosip.kernel.otpmanager.service.PersistenceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import java.util.Map; + +@ConditionalOnProperty(name = "mosip.datastore.type", havingValue = "postgres") +@Component +public class DatabasePersistenceServiceImpl implements PersistenceService { + + private final String UPDATE_OTP_STATUS = "updateOtpStatus"; + + private final String UPDATE_OTP_ATTEMPT = "updateOtpAttempt"; + + @Autowired + private OtpRepository otpRepository; + + @Override + public void saveOtp(OtpEntity otpEntity) { + otpRepository.save(otpEntity); + } + + @Override + public OtpEntity findOtpByKey(String key) { + return otpRepository.findById(OtpEntity.class,key); + } + + @Override + public void deleteOtpByKey(String key) { + otpRepository.deleteById(key); + } + + @Override + public void updateOtp(Map updateMap) { + String updateString; + if(updateMap.containsKey(SqlQueryConstants.NEW_OTP_STATUS.getProperty())){ + updateString = SqlQueryConstants.UPDATE.getProperty() + " " + OtpEntity.class.getSimpleName() + + " SET status_code = :newOtpStatus," + "upd_dtimes = :newValidationTime," + + "validation_retry_count = :newNumOfAttempt WHERE id=:id"; + }else{ + updateString=SqlQueryConstants.UPDATE.getProperty() + " " + OtpEntity.class.getSimpleName() + + " SET validation_retry_count = :newNumOfAttempt," + + "upd_dtimes = :newValidationTime WHERE id=:id"; + } + otpRepository.createQueryUpdateOrDelete(updateString, updateMap); + } +} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpGeneratorServiceImpl.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpGeneratorServiceImpl.java similarity index 83% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpGeneratorServiceImpl.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpGeneratorServiceImpl.java index a5f9798a..cf8126dc 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpGeneratorServiceImpl.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpGeneratorServiceImpl.java @@ -1,94 +1,89 @@ -package io.mosip.kernel.otpmanager.service.impl; - -import java.time.LocalDateTime; -import java.time.ZoneId; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.stereotype.Service; - -import io.mosip.kernel.core.otpmanager.spi.OtpGenerator; -import io.mosip.kernel.otpmanager.constant.OtpStatusConstants; -import io.mosip.kernel.otpmanager.dto.OtpGeneratorRequestDto; -import io.mosip.kernel.otpmanager.dto.OtpGeneratorResponseDto; -import io.mosip.kernel.otpmanager.entity.OtpEntity; -import io.mosip.kernel.otpmanager.repository.OtpRepository; -import io.mosip.kernel.otpmanager.util.OtpManagerUtils; -import io.mosip.kernel.otpmanager.util.OtpProvider; - -/** - * This class provides the implementation for the methods of OtpGeneratorService - * interface. - * - * @author Ritesh Sinha - * @since 1.0.0 - * - */ -@RefreshScope -@Service -public class OtpGeneratorServiceImpl implements OtpGenerator { - /** - * The reference that autowires OtpRepository class. - */ - private static final Logger LOGGER = LoggerFactory.getLogger(OtpGeneratorServiceImpl.class); - @Autowired - private OtpRepository otpRepository; - - @Autowired - private OtpProvider otpProvider; - - @Value("${mosip.kernel.otp.key-freeze-time}") - String keyFreezeTime; - - @Value("${mosip.kernel.otp.default-length}") - int otpLength; - - @Value("${mosip.kernel.otp.mac-algorithm}") - String macAlgorithm; - - @Value("${javax.persistence.jdbc.url}") - String jdbcUrl; - - - /* - * (non-Javadoc) - * - * @see - * io.mosip.kernel.otpmanagerservice.service.OtpGeneratorService#getOtp(org. - * mosip.kernel.otpmanagerservice.dto.OtpGeneratorRequestDto) - */ - @Override - public OtpGeneratorResponseDto getOtp(OtpGeneratorRequestDto otpDto) { - - String generatedOtp; - - /* - * Creating object to return the generation response. - */ - OtpGeneratorResponseDto response = new OtpGeneratorResponseDto(); - /* - * Checking whether the key exists in the repository. - */ - OtpEntity keyCheck = otpRepository.findById(OtpEntity.class, otpDto.getKey()); - if ((keyCheck != null) && (keyCheck.getStatusCode().equals(OtpStatusConstants.KEY_FREEZED.getProperty())) - && (OtpManagerUtils.timeDifferenceInSeconds(keyCheck.getUpdatedDtimes(), - LocalDateTime.now(ZoneId.of("UTC"))) <= Integer.parseInt(keyFreezeTime))) { - response.setOtp(OtpStatusConstants.SET_AS_NULL_IN_STRING.getProperty()); - response.setStatus(OtpStatusConstants.BLOCKED_USER.getProperty()); - } else { - generatedOtp = otpProvider.computeOtp(otpDto.getKey(), otpLength, macAlgorithm); - - OtpEntity otp = new OtpEntity(); - otp.setId(otpDto.getKey()); - otp.setValidationRetryCount(0); - otp.setOtp(generatedOtp); - otpRepository.save(otp); - response.setOtp(generatedOtp); - response.setStatus(OtpStatusConstants.GENERATION_SUCCESSFUL.getProperty()); - } - return response; - } -} +package io.mosip.kernel.otpmanager.service.impl; + +import java.time.LocalDateTime; +import java.time.ZoneId; + +import io.mosip.kernel.otpmanager.service.PersistenceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.stereotype.Service; + +import io.mosip.kernel.core.otpmanager.spi.OtpGenerator; +import io.mosip.kernel.otpmanager.constant.OtpStatusConstants; +import io.mosip.kernel.otpmanager.dto.OtpGeneratorRequestDto; +import io.mosip.kernel.otpmanager.dto.OtpGeneratorResponseDto; +import io.mosip.kernel.otpmanager.entity.OtpEntity; +import io.mosip.kernel.otpmanager.util.OtpManagerUtils; +import io.mosip.kernel.otpmanager.util.OtpProvider; + +/** + * This class provides the implementation for the methods of OtpGeneratorService + * interface. + * + * @author Ritesh Sinha + * @since 1.0.0 + * + */ +@RefreshScope +@Service +public class OtpGeneratorServiceImpl implements OtpGenerator { + + @Autowired + private OtpProvider otpProvider; + + @Autowired + PersistenceService persistenceService; + + @Value("${mosip.kernel.otp.key-freeze-time}") + String keyFreezeTime; + + @Value("${mosip.kernel.otp.default-length}") + int otpLength; + + @Value("${mosip.kernel.otp.mac-algorithm}") + String macAlgorithm; + + @Value("${javax.persistence.jdbc.url}") + String jdbcUrl; + + + /* + * (non-Javadoc) + * + * @see + * io.mosip.kernel.otpmanagerservice.service.OtpGeneratorService#getOtp(org. + * mosip.kernel.otpmanagerservice.dto.OtpGeneratorRequestDto) + */ + @Override + public OtpGeneratorResponseDto getOtp(OtpGeneratorRequestDto otpDto) { + + String generatedOtp; + + /* + * Creating object to return the generation response. + */ + OtpGeneratorResponseDto response = new OtpGeneratorResponseDto(); + /* + * Checking whether the key exists in the repository. + */ + OtpEntity keyCheck= persistenceService.findOtpByKey(otpDto.getKey()); + if ((keyCheck != null) && (keyCheck.getStatusCode().equals(OtpStatusConstants.KEY_FREEZED.getProperty())) + && (OtpManagerUtils.timeDifferenceInSeconds(keyCheck.getUpdatedDtimes(), + LocalDateTime.now(ZoneId.of("UTC"))) <= Integer.parseInt(keyFreezeTime))) { + response.setOtp(OtpStatusConstants.SET_AS_NULL_IN_STRING.getProperty()); + response.setStatus(OtpStatusConstants.BLOCKED_USER.getProperty()); + } else { + generatedOtp = otpProvider.computeOtp(otpDto.getKey(), otpLength, macAlgorithm); + + OtpEntity otp = new OtpEntity(); + otp.setId(otpDto.getKey()); + otp.setValidationRetryCount(0); + otp.setOtp(generatedOtp); + persistenceService.saveOtp(otp); + response.setOtp(generatedOtp); + response.setStatus(OtpStatusConstants.GENERATION_SUCCESSFUL.getProperty()); + } + return response; + } +} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpValidatorServiceImpl.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpValidatorServiceImpl.java similarity index 82% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpValidatorServiceImpl.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpValidatorServiceImpl.java index c7850308..13c4c01b 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpValidatorServiceImpl.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/service/impl/OtpValidatorServiceImpl.java @@ -6,6 +6,7 @@ import java.util.HashMap; import java.util.List; +import io.mosip.kernel.otpmanager.service.PersistenceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; @@ -21,7 +22,6 @@ import io.mosip.kernel.otpmanager.dto.OtpValidatorResponseDto; import io.mosip.kernel.otpmanager.entity.OtpEntity; import io.mosip.kernel.otpmanager.exception.RequiredKeyNotFoundException; -import io.mosip.kernel.otpmanager.repository.OtpRepository; import io.mosip.kernel.otpmanager.util.OtpManagerUtils; /** @@ -35,11 +35,9 @@ @RefreshScope @Service public class OtpValidatorServiceImpl implements OtpValidator> { - /** - * The reference that autowires OtpRepository. - */ + @Autowired - OtpRepository otpRepository; + PersistenceService persistenceService; /** * The reference that autowires OtpManagerUtils. @@ -64,13 +62,11 @@ public class OtpValidatorServiceImpl implements OtpValidator validateOtp(String key, String otp) { ResponseEntity validationResponseEntity; @@ -82,17 +78,16 @@ public ResponseEntity validateOtp(String key, String ot OtpValidatorResponseDto responseDto; // The OTP entity for a specific key. - OtpEntity otpResponse = otpRepository.findById(OtpEntity.class, key); + OtpEntity otpResponse = persistenceService.findOtpByKey(key); responseDto = new OtpValidatorResponseDto(); responseDto.setMessage(OtpStatusConstants.FAILURE_MESSAGE.getProperty()); responseDto.setStatus(OtpStatusConstants.FAILURE_STATUS.getProperty()); validationResponseEntity = new ResponseEntity<>(responseDto, HttpStatus.OK); requireKeyNotFound(otpResponse); - // This variable holds the update query to be performed. - String updateString; // This variable holds the count of number int attemptCount = otpResponse.getValidationRetryCount(); + //checking the expiry if ((OtpManagerUtils.timeDifferenceInSeconds(otpResponse.getGeneratedDtimes(), OtpManagerUtils.getCurrentLocalDateTime())) > (Integer.parseInt(otpExpiryLimit))) { @@ -103,12 +98,10 @@ public ResponseEntity validateOtp(String key, String ot // This condition increases the validation attempt count. if ((attemptCount < Integer.parseInt(numberOfValidationAttemptsAllowed)) && (otpResponse.getStatusCode().equals(OtpStatusConstants.UNUSED_OTP.getProperty()))) { - updateString = SqlQueryConstants.UPDATE.getProperty() + " " + OtpEntity.class.getSimpleName() - + " SET validation_retry_count = :newNumOfAttempt," - + "upd_dtimes = :newValidationTime WHERE id=:id"; HashMap updateMap = createUpdateMap(key, null, attemptCount + 1, LocalDateTime.now(ZoneId.of("UTC"))); - updateData(updateString, updateMap); + + persistenceService.updateOtp(updateMap); } /* * This condition freezes the key for a certain time, if the validation attempt @@ -116,12 +109,9 @@ public ResponseEntity validateOtp(String key, String ot */ if ((attemptCount == Integer.parseInt(numberOfValidationAttemptsAllowed) - 1) && (!otp.equals(otpResponse.getOtp()))) { - updateString = SqlQueryConstants.UPDATE.getProperty() + " " + OtpEntity.class.getSimpleName() - + " SET status_code = :newOtpStatus," + "upd_dtimes = :newValidationTime," - + "validation_retry_count = :newNumOfAttempt WHERE id=:id"; HashMap updateMap = createUpdateMap(key, OtpStatusConstants.KEY_FREEZED.getProperty(), 0, OtpManagerUtils.getCurrentLocalDateTime()); - updateData(updateString, updateMap); + persistenceService.updateOtp(updateMap); responseDto.setStatus(OtpStatusConstants.FAILURE_STATUS.getProperty()); responseDto.setMessage(OtpStatusConstants.FAILURE_AND_FREEZED_MESSAGE.getProperty()); validationResponseEntity = new ResponseEntity<>(responseDto, HttpStatus.OK); @@ -143,7 +133,7 @@ public ResponseEntity validateOtp(String key, String ot OtpManagerUtils.getCurrentLocalDateTime())) <= (Integer.parseInt(otpExpiryLimit))))) { responseDto.setStatus(OtpStatusConstants.SUCCESS_STATUS.getProperty()); responseDto.setMessage(OtpStatusConstants.SUCCESS_MESSAGE.getProperty()); - otpRepository.deleteById(key); + persistenceService.deleteOtpByKey(key); return new ResponseEntity<>(responseDto, HttpStatus.OK); } return validationResponseEntity; @@ -169,14 +159,13 @@ private ResponseEntity proxyForLocalProfile(String otp) if (otp.equalsIgnoreCase(localOtp)) { responseDto.setStatus(OtpStatusConstants.SUCCESS_STATUS.getProperty()); responseDto.setMessage(OtpStatusConstants.SUCCESS_MESSAGE.getProperty()); - validationResponseEntity = new ResponseEntity<>(responseDto, HttpStatus.OK); - return validationResponseEntity; + } else { responseDto.setStatus(OtpStatusConstants.FAILURE_STATUS.getProperty()); responseDto.setMessage(OtpStatusConstants.FAILURE_MESSAGE.getProperty()); - validationResponseEntity = new ResponseEntity<>(responseDto, HttpStatus.OK); - return validationResponseEntity; } + validationResponseEntity = new ResponseEntity<>(responseDto, HttpStatus.OK); + return validationResponseEntity; } /** @@ -195,22 +184,18 @@ private ResponseEntity proxyForLocalProfile(String otp) private ResponseEntity unFreezeKey(String key, String otp, OtpEntity otpResponse, int attemptCount, OtpValidatorResponseDto responseDto, ResponseEntity validationResponseEntity) { - String updateString; if (otpResponse.getStatusCode().equals(OtpStatusConstants.KEY_FREEZED.getProperty())) { if ((OtpManagerUtils.timeDifferenceInSeconds(otpResponse.getUpdatedDtimes(), OtpManagerUtils.getCurrentLocalDateTime())) > (Integer.parseInt(keyFreezeDuration))) { - updateString = SqlQueryConstants.UPDATE.getProperty() + " " + OtpEntity.class.getSimpleName() - + " SET status_code = :newOtpStatus," + " validation_retry_count = :newNumOfAttempt," - + " upd_dtimes = :newValidationTime WHERE id=:id"; HashMap updateMap = createUpdateMap(key, OtpStatusConstants.UNUSED_OTP.getProperty(), Integer.valueOf(attemptCount + 1), OtpManagerUtils.getCurrentLocalDateTime()); if (otp.equals(otpResponse.getOtp())) { responseDto.setStatus(OtpStatusConstants.SUCCESS_STATUS.getProperty()); responseDto.setMessage(OtpStatusConstants.SUCCESS_MESSAGE.getProperty()); validationResponseEntity = new ResponseEntity<>(responseDto, HttpStatus.OK); - otpRepository.deleteById(key); + persistenceService.deleteOtpByKey(key); } else { - updateData(updateString, updateMap); + persistenceService.updateOtp(updateMap); } } else { responseDto.setMessage(OtpStatusConstants.FAILURE_AND_FREEZED_MESSAGE.getProperty()); @@ -247,13 +232,4 @@ private HashMap createUpdateMap(String key, String status, Integ return updateMap; } - /** - * This method handles UPDATE query operations. - * - * @param updateString the query string. - * @param updateMap the query map. - */ - private void updateData(String updateString, HashMap updateMap) { - otpRepository.createQueryUpdateOrDelete(updateString, updateMap); - } } \ No newline at end of file diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/OtpManagerUtils.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/OtpManagerUtils.java similarity index 100% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/OtpManagerUtils.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/OtpManagerUtils.java diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/OtpProvider.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/OtpProvider.java similarity index 97% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/OtpProvider.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/OtpProvider.java index 3504cc2b..d9f053fe 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/OtpProvider.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/OtpProvider.java @@ -1,61 +1,61 @@ -package io.mosip.kernel.otpmanager.util; - -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; - -import javax.crypto.Mac; -import javax.crypto.spec.SecretKeySpec; - -import org.springframework.stereotype.Component; - -import io.mosip.kernel.otpmanager.constant.OtpErrorConstants; -import io.mosip.kernel.otpmanager.exception.CryptoFailureException; -import io.mosip.kernel.otpmanager.exception.OtpServiceException; -import io.mosip.kernel.otpmanager.util.PasscodeGenerator.Signer; - -/** - * This class contains methods to generate OTP. - * - * @author Ritesh Sinha - * @since 1.0.0 - * - */ -@Component -public class OtpProvider { - - /** - * This method compute OTP against provided key and macAlgo. - * - * @param key the key against which OTP generates. - * @param otpLength the length of OTP. - * @param macAlgorithm the crypto algorithm. - * @return the string OTP. - */ - public String computeOtp(String key, int otpLength, String macAlgorithm) { - try { - PasscodeGenerator pcg = new PasscodeGenerator(getSigning(key, macAlgorithm), otpLength); - return pcg.generateResponseCode(System.currentTimeMillis()); - } catch (Exception e) { - throw new CryptoFailureException(OtpErrorConstants.OTP_GEN_CRYPTO_FAILURE.getErrorCode(), - OtpErrorConstants.OTP_GEN_CRYPTO_FAILURE.getErrorMessage(), e); - } - } - - /** - * Method to generate Signer for provided key. - * - * @param secret the key for which signer generates. - * @param macAlgo the crypto algorithm. - * @return the signer. - */ - static Signer getSigning(String secret, String macAlgo) { - try { - final Mac mac = Mac.getInstance(macAlgo); - mac.init(new SecretKeySpec(secret.getBytes(), "")); - return (byte[] data) -> mac.doFinal(data); - } catch (NoSuchAlgorithmException | InvalidKeyException error) { - throw new OtpServiceException(OtpErrorConstants.OTP_GEN_ALGO_FAILURE.getErrorCode(), - OtpErrorConstants.OTP_GEN_ALGO_FAILURE.getErrorMessage(), error); - } - } -} +package io.mosip.kernel.otpmanager.util; + +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; + +import org.springframework.stereotype.Component; + +import io.mosip.kernel.otpmanager.constant.OtpErrorConstants; +import io.mosip.kernel.otpmanager.exception.CryptoFailureException; +import io.mosip.kernel.otpmanager.exception.OtpServiceException; +import io.mosip.kernel.otpmanager.util.PasscodeGenerator.Signer; + +/** + * This class contains methods to generate OTP. + * + * @author Ritesh Sinha + * @since 1.0.0 + * + */ +@Component +public class OtpProvider { + + /** + * This method compute OTP against provided key and macAlgo. + * + * @param key the key against which OTP generates. + * @param otpLength the length of OTP. + * @param macAlgorithm the crypto algorithm. + * @return the string OTP. + */ + public String computeOtp(String key, int otpLength, String macAlgorithm) { + try { + PasscodeGenerator pcg = new PasscodeGenerator(getSigning(key, macAlgorithm), otpLength); + return pcg.generateResponseCode(System.currentTimeMillis()); + } catch (Exception e) { + throw new CryptoFailureException(OtpErrorConstants.OTP_GEN_CRYPTO_FAILURE.getErrorCode(), + OtpErrorConstants.OTP_GEN_CRYPTO_FAILURE.getErrorMessage(), e); + } + } + + /** + * Method to generate Signer for provided key. + * + * @param secret the key for which signer generates. + * @param macAlgo the crypto algorithm. + * @return the signer. + */ + static Signer getSigning(String secret, String macAlgo) { + try { + final Mac mac = Mac.getInstance(macAlgo); + mac.init(new SecretKeySpec(secret.getBytes(), "")); + return (byte[] data) -> mac.doFinal(data); + } catch (NoSuchAlgorithmException | InvalidKeyException error) { + throw new OtpServiceException(OtpErrorConstants.OTP_GEN_ALGO_FAILURE.getErrorCode(), + OtpErrorConstants.OTP_GEN_ALGO_FAILURE.getErrorMessage(), error); + } + } +} diff --git a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/PasscodeGenerator.java b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/PasscodeGenerator.java similarity index 96% rename from kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/PasscodeGenerator.java rename to kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/PasscodeGenerator.java index 85729a6d..6bfe8468 100644 --- a/kernel/kernel-otpmanager-service/src/main/java/io/mosip/kernel/otpmanager/util/PasscodeGenerator.java +++ b/kernel/kernel-otpmanager/src/main/java/io/mosip/kernel/otpmanager/util/PasscodeGenerator.java @@ -1,100 +1,100 @@ -package io.mosip.kernel.otpmanager.util; - -import java.io.ByteArrayInputStream; -import java.io.DataInput; -import java.io.DataInputStream; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.security.GeneralSecurityException; - -import io.mosip.kernel.otpmanager.constant.OtpErrorConstants; -import io.mosip.kernel.otpmanager.exception.OtpIOException; - -/** - * Passcode generator class. - * - * @author Ritesh Sinha - * @since 1.0.0 - */ -public class PasscodeGenerator { - - /** Powers of 10 used to shorten the pin to the desired number of digits */ - private static final int[] DIGITS_POWER = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, - 1000000000 }; - - private final Signer signer; - - private final int codeLength; - - /** - * Using an interface to allow us to inject different signature implementations. - */ - interface Signer { - /** - * @param data Preimage to sign, represented as sequence of arbitrary bytes - * @return Signature as sequence of bytes. - * @throws GeneralSecurityException - */ - byte[] sign(byte[] data) throws GeneralSecurityException; - } - - public PasscodeGenerator(Signer signer, int passCodeLength) { - this.signer = signer; - this.codeLength = passCodeLength; - } - - private String padOutput(int value) { - StringBuilder result = new StringBuilder(Integer.toString(value)); - for (int i = result.length(); i < codeLength; i++) { - result.insert(0, "0"); - } - return result.toString(); - } - - /** - * @param state 8-byte integer value representing internal OTP state. - * @return A decimal response code - * @throws GeneralSecurityException If a JCE exception occur - */ - public String generateResponseCode(long state) throws GeneralSecurityException { - byte[] value = ByteBuffer.allocate(8).putLong(state).array(); - return generateResponseCode(value); - } - - /** - * @param value An arbitrary byte array used as a value - * @return A decimal response code - * @throws GeneralSecurityException If a JCE exception occur - */ - public String generateResponseCode(byte[] value) throws GeneralSecurityException { - byte[] hash = signer.sign(value); - - // Dynamically truncate the hash - // OffsetBits are the low order bits of the last byte of the hash - int offset = hash[hash.length - 1] & 0xF; - // Grab a positive integer value starting at the given offset. - int truncatedHash = hashToInt(hash, offset) & 0x7FFFFFFF; - int pinValue = truncatedHash % DIGITS_POWER[codeLength]; - return padOutput(pinValue); - } - - /** - * Grabs a positive integer value from the input array starting at the given - * offset. - * - * @param bytes the array of bytes - * @param start the index into the array to start grabbing bytes - * @return the integer constructed from the four bytes in the array - */ - private int hashToInt(byte[] bytes, int start) { - DataInput input = new DataInputStream(new ByteArrayInputStream(bytes, start, bytes.length - start)); - int val; - try { - val = input.readInt(); - } catch (IOException e) { - throw new OtpIOException(OtpErrorConstants.OTP_GEN_IO_FAILURE.getErrorCode(), - OtpErrorConstants.OTP_GEN_IO_FAILURE.getErrorMessage(), e); - } - return val; - } -} +package io.mosip.kernel.otpmanager.util; + +import java.io.ByteArrayInputStream; +import java.io.DataInput; +import java.io.DataInputStream; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.security.GeneralSecurityException; + +import io.mosip.kernel.otpmanager.constant.OtpErrorConstants; +import io.mosip.kernel.otpmanager.exception.OtpIOException; + +/** + * Passcode generator class. + * + * @author Ritesh Sinha + * @since 1.0.0 + */ +public class PasscodeGenerator { + + /** Powers of 10 used to shorten the pin to the desired number of digits */ + private static final int[] DIGITS_POWER = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, + 1000000000 }; + + private final Signer signer; + + private final int codeLength; + + /** + * Using an interface to allow us to inject different signature implementations. + */ + interface Signer { + /** + * @param data Preimage to sign, represented as sequence of arbitrary bytes + * @return Signature as sequence of bytes. + * @throws GeneralSecurityException + */ + byte[] sign(byte[] data) throws GeneralSecurityException; + } + + public PasscodeGenerator(Signer signer, int passCodeLength) { + this.signer = signer; + this.codeLength = passCodeLength; + } + + private String padOutput(int value) { + StringBuilder result = new StringBuilder(Integer.toString(value)); + for (int i = result.length(); i < codeLength; i++) { + result.insert(0, "0"); + } + return result.toString(); + } + + /** + * @param state 8-byte integer value representing internal OTP state. + * @return A decimal response code + * @throws GeneralSecurityException If a JCE exception occur + */ + public String generateResponseCode(long state) throws GeneralSecurityException { + byte[] value = ByteBuffer.allocate(8).putLong(state).array(); + return generateResponseCode(value); + } + + /** + * @param value An arbitrary byte array used as a value + * @return A decimal response code + * @throws GeneralSecurityException If a JCE exception occur + */ + public String generateResponseCode(byte[] value) throws GeneralSecurityException { + byte[] hash = signer.sign(value); + + // Dynamically truncate the hash + // OffsetBits are the low order bits of the last byte of the hash + int offset = hash[hash.length - 1] & 0xF; + // Grab a positive integer value starting at the given offset. + int truncatedHash = hashToInt(hash, offset) & 0x7FFFFFFF; + int pinValue = truncatedHash % DIGITS_POWER[codeLength]; + return padOutput(pinValue); + } + + /** + * Grabs a positive integer value from the input array starting at the given + * offset. + * + * @param bytes the array of bytes + * @param start the index into the array to start grabbing bytes + * @return the integer constructed from the four bytes in the array + */ + private int hashToInt(byte[] bytes, int start) { + DataInput input = new DataInputStream(new ByteArrayInputStream(bytes, start, bytes.length - start)); + int val; + try { + val = input.readInt(); + } catch (IOException e) { + throw new OtpIOException(OtpErrorConstants.OTP_GEN_IO_FAILURE.getErrorCode(), + OtpErrorConstants.OTP_GEN_IO_FAILURE.getErrorMessage(), e); + } + return val; + } +} diff --git a/kernel/kernel-otpmanager/src/main/resources/application-dev.properties b/kernel/kernel-otpmanager/src/main/resources/application-dev.properties new file mode 100644 index 00000000..5896e03a --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/resources/application-dev.properties @@ -0,0 +1,27 @@ +#the default length for otp(in number) +mosip.kernel.otp.default-length=6 +#the default crypto function +#It can be: HmacSHA512, HmacSHA256, HmacSHA1. +mosip.kernel.otp.mac-algorithm=HmacSHA512 +#the OTP expires after the given time(in seconds). +mosip.kernel.otp.expiry-time=120 +#the key is freezed for the given time(in seconds). +mosip.kernel.otp.key-freeze-time=7200 +#the number of validation attempts allowed(in number). +#mosip.kernel.otp.validation-attempt-threshold =3 means , the validation and generation will be blocked from 4th time. +mosip.kernel.otp.validation-attempt-threshold=3 +#minimum length of key(in number). +mosip.kernel.otp.min-key-length=3 +#maximum length of key(in number). +mosip.kernel.otp.max-key-length=64 +spring.h2.console.enabled=true +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.hbm2ddl.auto=update +javax.persistence.jdbc.driver=org.h2.Driver +otpmanager_database_url=jdbc:h2:mem:mosip_kernel; +otpmanager_database_username=kerneluser +otpmanager_database_password=Mosip@dev123 + +auth.server.validate.url=http://localhost:8091/authmanager/authorize/validateToken +auth.role.prefix=ROLE_ +auth.header.name=Authorization diff --git a/kernel/kernel-otpmanager/src/main/resources/application-local.properties b/kernel/kernel-otpmanager/src/main/resources/application-local.properties new file mode 100644 index 00000000..08056c61 --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/resources/application-local.properties @@ -0,0 +1,46 @@ +##the default length for otp(in number) +#mosip.kernel.otp.default-length=6 +##the default crypto function +##It can be: HmacSHA512, HmacSHA256, HmacSHA1. +#mosip.kernel.otp.mac-algorithm=HmacSHA512 +##the OTP expires after the given time(in seconds). +#mosip.kernel.otp.expiry-time=120 +##the key is freezed for the given time(in seconds). +#mosip.kernel.otp.key-freeze-time=7200 +##the number of validation attempts allowed(in number). +##mosip.kernel.otp.validation-attempt-threshold =3 means , the validation and generation will be blocked from 4th time. +#mosip.kernel.otp.validation-attempt-threshold=3 +##minimum length of key(in number). +#mosip.kernel.otp.min-key-length=3 +##maximum length of key(in number). +#mosip.kernel.otp.max-key-length=64 +# +#javax.persistence.jdbc.driver=org.h2.Driver +#javax.persistence.jdbc.url=jdbc:h2:mem:mosip_kernel;INIT=RUNSCRIPT FROM 'classpath:schema.sql';DB_CLOSE_DELAY=-1; +#javax.persistence.jdbc.user=kerneluser +#javax.persistence.jdbc.password=Mosip@dev123 +#auth.server.validate.url=http://localhost:8091/authmanager/authorize/admin/validateToken +#auth.role.prefix=ROLE_ +#auth.header.name=Authorization +# +#spring.h2.console.enabled=true +# +# +#hibernate.dialect=org.hibernate.dialect.H2Dialect +#hibernate.jdbc.lob.non_contextual_creation=true +#hibernate.hbm2ddl.auto=update +#hibernate.show_sql=true +#hibernate.format_sql=true +#hibernate.connection.charSet=utf8 +#hibernate.cache.use_second_level_cache=false +#hibernate.cache.use_query_cache=false +#hibernate.cache.use_structured_entries=false +#hibernate.generate_statistics=false +# +#mosip.role.kernel.postotpgenerate=INDIVIDUAL,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,ID_AUTHENTICATION,AUTH,RESIDENT,REGISTRATION_OFFICER +#mosip.role.kernel.getotpvalidate=INDIVIDUAL,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,ID_AUTHENTICATION,AUTH,RESIDENT,REGISTRATION_OFFICER +# +#mosip.datastore.type=postgres +#mosip.service-context=/v1/otpmanager +#mosip.service.end-points=/**/* +#mosip.service.exclude.auth.allowed.method=GET,POST \ No newline at end of file diff --git a/kernel/kernel-otpmanager/src/main/resources/bootstrap.properties b/kernel/kernel-otpmanager/src/main/resources/bootstrap.properties new file mode 100644 index 00000000..437ff417 --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/resources/bootstrap.properties @@ -0,0 +1,36 @@ +#spring.cloud.config.uri=localhost +#spring.cloud.config.label=master +spring.profiles.active=local +spring.cloud.config.name=kernel +spring.application.name=kernel-otpmanager-service +#management.security.enabled=false +#management.endpoint.health.show-details=when-authorized +#management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=always +management.endpoints.web.exposure.include=info,health,refresh,mappings,prometheus +management.endpoint.metrics.enabled=true +management.endpoint.prometheus.enabled=true +management.metrics.export.prometheus.enabled=true + +server.port=8085 +server.servlet.path=/v1/otpmanager + + +javax.persistence.jdbc.url=${otpmanager_database_url} +javax.persistence.jdbc.user=${otpmanager_database_username} +javax.persistence.jdbc.password=${otpmanager_database_password} + +#disabling health check so that client doesnt try to load properties from sprint config server every +# 5 minutes (should not be done in production) +health.config.enabled=false +openapi.info.title=OTP Manager Service +openapi.info.description=Rest Endpoints for operations related to OTP +openapi.info.version=1.0 +openapi.info.license.name=Mosip +openapi.info.license.url=https://docs.mosip.io/platform/license +mosipbox.public.url=http://localhost:${server.port} +openapi.service.servers[0].url=${mosipbox.public.url}${server.servlet.path} +openapi.service.servers[0].description=OTP Manager Service +springdoc.swagger-ui.disable-swagger-default-url=true +spring.mvc.servlet.path=${server.servlet.path} + diff --git a/kernel/kernel-otpmanager/src/main/resources/logback.xml b/kernel/kernel-otpmanager/src/main/resources/logback.xml new file mode 100644 index 00000000..150c6224 --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/resources/logback.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/kernel/kernel-otpmanager/src/main/resources/schema.sql b/kernel/kernel-otpmanager/src/main/resources/schema.sql new file mode 100644 index 00000000..297520e3 --- /dev/null +++ b/kernel/kernel-otpmanager/src/main/resources/schema.sql @@ -0,0 +1 @@ +CREATE SCHEMA IF NOT EXISTS kernel; \ No newline at end of file diff --git a/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/OtpmanagerTestBootApplication.java b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/OtpmanagerTestBootApplication.java new file mode 100644 index 00000000..8092387b --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/OtpmanagerTestBootApplication.java @@ -0,0 +1,24 @@ +package io.mosip.kernel.otpmanager.test; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * Crypto manager application + * + * @author Urvil Joshi + * @since 1.0.0 + * + */ +@SpringBootApplication(scanBasePackages = { "io.mosip.kernel.otpmanager.*" }) +public class OtpmanagerTestBootApplication { + + /** + * Main method to run spring boot application + * + * @param args args + */ + public static void main(String[] args) { + SpringApplication.run(OtpmanagerTestBootApplication.class, args); + } +} diff --git a/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/CachePersistenceServiceImplTest.java b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/CachePersistenceServiceImplTest.java new file mode 100644 index 00000000..b38764ba --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/CachePersistenceServiceImplTest.java @@ -0,0 +1,89 @@ +package io.mosip.kernel.otpmanager.test.service; + + +import io.mosip.kernel.otpmanager.constant.SqlQueryConstants; +import io.mosip.kernel.otpmanager.entity.OtpEntity; +import io.mosip.kernel.otpmanager.service.impl.CachePersistenceServiceImpl; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@RunWith(SpringRunner.class) +public class CachePersistenceServiceImplTest { + + @Mock + CacheManager cacheManager; + + @InjectMocks + CachePersistenceServiceImpl cacheDatastore; + + @Mock + Cache cache; + + + @Test + public void saveTest(){ + ReflectionTestUtils.setField(cacheDatastore,"cache","otp"); + OtpEntity otpEntity=new OtpEntity(); + otpEntity.setId("key"); + otpEntity.setOtp("123456"); + Mockito.when(cacheManager.getCache(Mockito.anyString())).thenReturn(cache); + + Cache cache1=Mockito.mock(Cache.class); + Mockito.doNothing().when(cache1).put(Mockito.anyString(), Mockito.any()); + cacheDatastore.saveOtp(otpEntity); + + } + + @Test + public void findOtpByKeyTest(){ + ReflectionTestUtils.setField(cacheDatastore,"cache","otp"); + OtpEntity otpEntity=new OtpEntity(); + otpEntity.setId("key"); + otpEntity.setOtp("123456"); + Mockito.when(cacheManager.getCache(Mockito.anyString())).thenReturn(cache); + Mockito.when(cache.get("key", OtpEntity.class)).thenReturn(otpEntity); + + cacheDatastore.findOtpByKey("key"); + } + + @Test + public void deleteOtpByKeyTest(){ + + ReflectionTestUtils.setField(cacheDatastore,"cache","otp"); + OtpEntity otpEntity=new OtpEntity(); + otpEntity.setId("key"); + otpEntity.setOtp("123456"); + Mockito.when(cacheManager.getCache(Mockito.anyString())).thenReturn(cache); + + Cache cache1=Mockito.mock(Cache.class); + Mockito.doNothing().when(cache1).evict(Mockito.anyString()); + cacheDatastore.findOtpByKey("key"); + } + + @Test + public void testUpdateOtp() { + ReflectionTestUtils.setField(cacheDatastore,"cache","123"); + OtpEntity otpEntity = new OtpEntity(); + otpEntity.setId("123"); + Mockito.when(cache.get("123", OtpEntity.class)).thenReturn(otpEntity); + + Map updateMap = new HashMap<>(); + updateMap.put(SqlQueryConstants.ID.getProperty(), "123"); + updateMap.put(SqlQueryConstants.NEW_OTP_STATUS.getProperty(), "ACTIVE"); + updateMap.put(SqlQueryConstants.NEW_NUM_OF_ATTEMPT.getProperty(), "3"); + updateMap.put(SqlQueryConstants.NEW_VALIDATION_TIME.getProperty(), LocalDateTime.now()); + + Mockito.when(cacheManager.getCache(Mockito.anyString())).thenReturn(cache); + cacheDatastore.updateOtp(updateMap); + } +} diff --git a/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/DatabasePersistenceServiceImplTest.java b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/DatabasePersistenceServiceImplTest.java new file mode 100644 index 00000000..b79e22f4 --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/DatabasePersistenceServiceImplTest.java @@ -0,0 +1,61 @@ +package io.mosip.kernel.otpmanager.test.service; + +import io.mosip.kernel.otpmanager.constant.SqlQueryConstants; +import io.mosip.kernel.otpmanager.entity.OtpEntity; +import io.mosip.kernel.otpmanager.repository.OtpRepository; +import io.mosip.kernel.otpmanager.service.impl.DatabasePersistenceServiceImpl; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.test.context.junit4.SpringRunner; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +@RunWith(SpringRunner.class) +public class DatabasePersistenceServiceImplTest { + + @Mock + private OtpRepository otpRepository; + + @InjectMocks + private DatabasePersistenceServiceImpl databaseDatastore; + + @Test + public void saveTest(){ + OtpEntity otpEntity=new OtpEntity(); + otpEntity.setId("key"); + otpEntity.setOtp("123456"); + Mockito.when(otpRepository.save(otpEntity)).thenReturn(otpEntity); + databaseDatastore.saveOtp(otpEntity); + } + + @Test + public void findOtpByKeyTest(){ + OtpEntity otpEntity=new OtpEntity(); + otpEntity.setId("key"); + otpEntity.setOtp("123456"); + Mockito.when(otpRepository.findById(OtpEntity.class,"key")).thenReturn(otpEntity); + databaseDatastore.findOtpByKey("key"); + } + + @Test + public void deleteOtpByKeyTest(){ + databaseDatastore.deleteOtpByKey("key"); + } + + @Test + public void updateOtpTest() { + Map updateMap = new HashMap<>(); + updateMap.put(SqlQueryConstants.ID.getProperty(), "123"); + updateMap.put(SqlQueryConstants.NEW_NUM_OF_ATTEMPT.getProperty(), "3"); + updateMap.put(SqlQueryConstants.NEW_VALIDATION_TIME.getProperty(), LocalDateTime.now()); + databaseDatastore.updateOtp(updateMap); + updateMap.put(SqlQueryConstants.NEW_OTP_STATUS.getProperty(), "ACTIVE"); + databaseDatastore.updateOtp(updateMap); + } + +} diff --git a/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpGeneratorServiceTest.java b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpGeneratorServiceTest.java new file mode 100644 index 00000000..fa08c326 --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpGeneratorServiceTest.java @@ -0,0 +1,69 @@ +package io.mosip.kernel.otpmanager.test.service; + + +import java.time.LocalDateTime; + +import io.mosip.kernel.otpmanager.dto.OtpGeneratorResponseDto; +import io.mosip.kernel.otpmanager.service.PersistenceService; +import io.mosip.kernel.otpmanager.service.impl.OtpGeneratorServiceImpl; +import io.mosip.kernel.otpmanager.util.OtpProvider; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; +import io.mosip.kernel.core.http.RequestWrapper; +import io.mosip.kernel.otpmanager.dto.OtpGeneratorRequestDto; +import io.mosip.kernel.otpmanager.entity.OtpEntity; +@RunWith(SpringRunner.class) +public class OtpGeneratorServiceTest { + + @Mock + PersistenceService persistenceService; + + @Mock + OtpProvider otpProvider; + + @InjectMocks + OtpGeneratorServiceImpl otpGeneratorService; + + @Test + public void testOtpGenerationFreezedCase() throws Exception { + ReflectionTestUtils.setField(otpGeneratorService,"keyFreezeTime","500"); + OtpGeneratorRequestDto otpGeneratorRequestDto = new OtpGeneratorRequestDto(); + otpGeneratorRequestDto.setKey("testKey"); + RequestWrapper reqWrapperDTO = new RequestWrapper<>(); + reqWrapperDTO.setId("ID"); + reqWrapperDTO.setMetadata(null); + reqWrapperDTO.setRequest(otpGeneratorRequestDto); + reqWrapperDTO.setRequesttime(LocalDateTime.now()); + reqWrapperDTO.setVersion("v1.0"); + + OtpEntity otpEntity=new OtpEntity(); + otpEntity.setId("123"); + otpEntity.setStatusCode("KEY_FREEZED"); + otpEntity.setUpdatedDtimes(LocalDateTime.now()); + +// Mockito.when(repository.findById(Mockito.any(),Mockito.anyString())).thenReturn(otpEntity); + Mockito.when(persistenceService.findOtpByKey(Mockito.anyString())).thenReturn(otpEntity); + + otpGeneratorService.getOtp(otpGeneratorRequestDto); + + } + + @Test + public void testOtpGeneratorServicePositiveCase() throws Exception { + ReflectionTestUtils.setField(otpGeneratorService,"macAlgorithm","SHA257"); + ReflectionTestUtils.setField(otpGeneratorService,"otpLength",6); + OtpGeneratorRequestDto otpGeneratorRequestDto = new OtpGeneratorRequestDto(); + otpGeneratorRequestDto.setKey("testKey"); + + Mockito.when(otpProvider.computeOtp(Mockito.anyString(),Mockito.anyInt(),Mockito.anyString())).thenReturn("123456"); + OtpGeneratorResponseDto otp = otpGeneratorService.getOtp(otpGeneratorRequestDto); + Assert.assertEquals(otp.getOtp(),"123456"); + Assert.assertEquals(otp.getStatus(),"GENERATION_SUCCESSFUL"); + } +} diff --git a/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidatorServiceTest.java b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidatorServiceTest.java new file mode 100644 index 00000000..ce81a237 --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/service/OtpValidatorServiceTest.java @@ -0,0 +1,119 @@ +package io.mosip.kernel.otpmanager.test.service; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; + +import io.mosip.kernel.otpmanager.service.PersistenceService; +import io.mosip.kernel.otpmanager.service.impl.OtpValidatorServiceImpl; +import io.mosip.kernel.otpmanager.util.OtpManagerUtils; +import io.mosip.kernel.otpmanager.util.OtpProvider; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.util.ReflectionTestUtils; + +import io.mosip.kernel.otpmanager.entity.OtpEntity; + +@RunWith(SpringRunner.class) +public class OtpValidatorServiceTest { + + + @Mock + PersistenceService persistenceService; + + @Mock + OtpProvider provider; + + @Mock + OtpManagerUtils otpManagerUtils; + + @InjectMocks + OtpValidatorServiceImpl otpValidatorService; + + + @Test + public void testOtpValidatorServiceWhenMaxAttemptReached() throws Exception { + ReflectionTestUtils.setField(otpValidatorService,"activeProfile","main"); + ReflectionTestUtils.setField(otpValidatorService,"otpExpiryLimit","2000"); + ReflectionTestUtils.setField(otpValidatorService,"numberOfValidationAttemptsAllowed","3"); + OtpEntity entity = new OtpEntity(); + entity.setOtp("1234"); + entity.setId("12345"); + entity.setValidationRetryCount(3); + entity.setStatusCode("OTP_UNUSED"); + entity.setValidationRetryCount(0); + entity.setUpdatedDtimes(LocalDateTime.now()); + Mockito.when(persistenceService.findOtpByKey(Mockito.anyString())).thenReturn(entity); + otpValidatorService.validateOtp("12345","123456"); + } + + @Test + public void testOtpValidatorServiceWhenKeyFreezedPositiveCase() throws Exception { + ReflectionTestUtils.setField(otpValidatorService,"activeProfile","main"); + ReflectionTestUtils.setField(otpValidatorService,"otpExpiryLimit","20000"); + ReflectionTestUtils.setField(otpValidatorService,"numberOfValidationAttemptsAllowed","1"); + OtpEntity entity = new OtpEntity(); + entity.setOtp("1234"); + entity.setId("testKey"); + entity.setValidationRetryCount(0); + entity.setStatusCode("KEY_FREEZED"); + entity.setUpdatedDtimes(LocalDateTime.now(ZoneId.of("UTC")).minus(1, ChronoUnit.MINUTES)); + Mockito.when(persistenceService.findOtpByKey(Mockito.anyString())).thenReturn(entity); + otpValidatorService.validateOtp("12345","123456"); + } + + @Test + public void testOtpValidatorServiceWhenKeyFreezedPostiveCase() throws Exception { + ReflectionTestUtils.setField(otpValidatorService,"activeProfile","main"); + ReflectionTestUtils.setField(otpValidatorService,"otpExpiryLimit","20000"); + ReflectionTestUtils.setField(otpValidatorService,"numberOfValidationAttemptsAllowed","0"); + ReflectionTestUtils.setField(otpValidatorService,"keyFreezeDuration","0"); + OtpEntity entity = new OtpEntity(); + entity.setOtp("1234"); + entity.setId("12345"); + entity.setValidationRetryCount(0); + entity.setStatusCode("KEY_FREEZED"); + entity.setUpdatedDtimes(LocalDateTime.now(ZoneId.of("UTC"))); + Mockito.when(persistenceService.findOtpByKey(Mockito.anyString())).thenReturn(entity); + otpValidatorService.validateOtp("12345","1234"); + } + + @Test + public void testOtpValidatorServiceWhenKeyUnUsedNegativeCase() throws Exception { + ReflectionTestUtils.setField(otpValidatorService,"activeProfile","main"); + ReflectionTestUtils.setField(otpValidatorService,"otpExpiryLimit","20000"); + ReflectionTestUtils.setField(otpValidatorService,"numberOfValidationAttemptsAllowed","0"); + ReflectionTestUtils.setField(otpValidatorService,"keyFreezeDuration","0"); + OtpEntity entity = new OtpEntity(); + entity.setOtp("1234"); + entity.setId("12345"); + entity.setValidationRetryCount(0); + entity.setStatusCode("OTP_UNUSED"); + entity.setUpdatedDtimes(LocalDateTime.now(ZoneId.of("UTC"))); + Mockito.when(persistenceService.findOtpByKey(Mockito.anyString())).thenReturn(entity); + otpValidatorService.validateOtp("12345","1234"); + } + + @Test + public void testOtpValidatorServiceWithLocalProfile() throws Exception { + + ReflectionTestUtils.setField(otpValidatorService,"otpExpiryLimit","20000"); + ReflectionTestUtils.setField(otpValidatorService,"numberOfValidationAttemptsAllowed","0"); + ReflectionTestUtils.setField(otpValidatorService,"activeProfile","local"); + ReflectionTestUtils.setField(otpValidatorService,"localOtp","111111"); + OtpEntity entity = new OtpEntity(); + entity.setOtp("1234"); + entity.setId("12345"); + entity.setValidationRetryCount(0); + entity.setStatusCode("OTP_UNUSED"); + entity.setUpdatedDtimes(LocalDateTime.now(ZoneId.of("UTC"))); + Mockito.when(persistenceService.findOtpByKey(Mockito.anyString())).thenReturn(entity); + otpValidatorService.validateOtp("12345","1234"); + entity.setOtp("111111"); + otpValidatorService.validateOtp("12345","111111"); + } +} diff --git a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/util/OtpProviderTest.java b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/util/OtpProviderTest.java similarity index 92% rename from kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/util/OtpProviderTest.java rename to kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/util/OtpProviderTest.java index 24420fd3..71817094 100644 --- a/kernel/kernel-otpmanager-service/src/test/java/io/mosip/kernel/otpmanager/test/util/OtpProviderTest.java +++ b/kernel/kernel-otpmanager/src/test/java/io/mosip/kernel/otpmanager/test/util/OtpProviderTest.java @@ -1,24 +1,24 @@ -package io.mosip.kernel.otpmanager.test.util; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import io.mosip.kernel.otpmanager.exception.CryptoFailureException; -import io.mosip.kernel.otpmanager.util.OtpProvider; - -@SpringBootTest -@RunWith(SpringRunner.class) -public class OtpProviderTest { - - @Autowired - private OtpProvider provider; - - @Test(expected = CryptoFailureException.class) - public void getSigningExceptionTest() { - provider.computeOtp("98989898999", 6, "nsjkbdcdj"); - } - -} +package io.mosip.kernel.otpmanager.test.util; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import io.mosip.kernel.otpmanager.exception.CryptoFailureException; +import io.mosip.kernel.otpmanager.util.OtpProvider; + +@RunWith(SpringRunner.class) +public class OtpProviderTest { + + @InjectMocks + private OtpProvider provider; + + @Test(expected = CryptoFailureException.class) + public void getSigningExceptionTest() { + provider.computeOtp("98989898999", 6, "nsjkbdcdj"); + } + +} diff --git a/kernel/kernel-otpmanager/src/test/resources/application.properties b/kernel/kernel-otpmanager/src/test/resources/application.properties new file mode 100644 index 00000000..3b284ad5 --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/resources/application.properties @@ -0,0 +1,66 @@ +# In Memory DB For Test +#-------------------------------------- +#The Driver name for test DB. +javax.persistence.jdbc.driver=org.h2.Driver +#The URL for test DB. +javax.persistence.jdbc.url=jdbc:h2\:mem\:testdb;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS kernel +#The username for test DB. +javax.persistence.jdbc.user=sa +#The password for test DB. +javax.persistence.jdbc.password= + +# Hibernate properties +#------------------------------------- +#It automatically validates or exports schema DDL to the database when the SessionFactory is created. +hibernate.hbm2ddl.auto=create-drop +#It makes Hibernate to generate the appropriate SQL statements for the chosen database. +hibernate.dialect=org.hibernate.dialect.H2Dialect +#It enables/disables the logging of all the generated SQL statements to the console. +hibernate.show_sql=false +#It enables/disables formatting the generated SQL statement to make it more readable. +hibernate.format_sql=false +#It sets the default encoding to UTF8. +hibernate.connection.charSet=utf8 +#It enables/disables L2 caching. +hibernate.cache.use_second_level_cache=false +#It enables/disables query caching. +hibernate.cache.use_query_cache=false +#It specifies whether entries will be written in a readable format or not in the L2 cache. +hibernate.cache.use_structured_entries=false +#It is used to analyze performance issues. +hibernate.generate_statistics=false + +#OTP Properties +#------------------------------- +#the default length for otp(in number) +mosip.kernel.otp.default-length=6 +#the default crypto function +#It can be: HmacSHA512, HmacSHA256, HmacSHA1. +mosip.kernel.otp.mac-algorithm=HmacSHA512 +#the default shared key +mosip.kernel.otp.shared-key=123456 +#the OTP expires after the given time(in seconds). +mosip.kernel.otp.expiry-time=40 +#the key is freezed for the given time(in seconds). +mosip.kernel.otp.key-freeze-time=40 +#the number of validation attempts allowed(in number). +#mosip.kernel.otp.validation-attempt-threshold =3 means , the validation and generation will be blocked from 4th time. +mosip.kernel.otp.validation-attempt-threshold=3 +#minimum length of key(in number). +mosip.kernel.otp.min-key-length=3 +#maximum length of key(in number). +mosip.kernel.otp.max-key-length=255 +mosip.kernel.auth.proxy-otp=false +mosip.kernel.auth.proxy-otp-value=111111 + +## To disable the logging (spring boot) +logging.level.org.springframework=OFF +logging.level.root=OFF +spring.main.banner-mode=off + +mosip.role.kernel.postotpgenerate=INDIVIDUAL,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,ID_AUTHENTICATION,AUTH,RESIDENT,REGISTRATION_OFFICER +mosip.role.kernel.getotpvalidate=INDIVIDUAL,REGISTRATION_ADMIN,REGISTRATION_SUPERVISOR,ID_AUTHENTICATION,AUTH,RESIDENT,REGISTRATION_OFFICER + +mosip.auth.adapter.impl.basepackage=io.mosip.kernel.auth.defaultadapter +auth.server.validate.url=http://localhost:8091/v1/authmanager/authorize/admin/validateToken +mosip.kernel.auth.appids.realm.map={prereg:'preregistration',ida:'mosip',registrationclient:'mosip',regproc:'mosip',partner:'mosip',resident:'mosip',admin:'mosip',crereq:'mosip',creser:'mosip',datsha:'mosip'} diff --git a/kernel/kernel-otpmanager/src/test/resources/bootstrap.properties b/kernel/kernel-otpmanager/src/test/resources/bootstrap.properties new file mode 100644 index 00000000..293878bc --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/resources/bootstrap.properties @@ -0,0 +1,64 @@ +# Spring properties +#---------------------------------------------------------------- +spring.cloud.config.uri=localhost +spring.cloud.config.label=master +spring.cloud.config.name=kernel +spring.application.name=kernel-otpmanager-service +spring.profiles.active=test +management.endpoints.web.exposure.include=refresh +#management.security.enabled=false + +# Server properties +#------------------------------------------------------------------------------------------------ +#server port +server.port=8085 +#servlet path +server.servlet.path=/otpmanager +#disabling health check so that client doesnt try to load properties from sprint config server every +# 5 minutes (should not be done in production) +health.config.enabled=false + +# In Memory DB For Test +#-------------------------------------- +#The Driver name for test DB. +javax.persistence.jdbc.driver=org.h2.Driver +#The URL for test DB. +javax.persistence.jdbc.url=jdbc:h2\:mem\:testdb;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS kernel +#The username for test DB. +javax.persistence.jdbc.user=sa +#The password for test DB. +javax.persistence.jdbc.password= + +# Hibernate properties +#------------------------------------- +#It automatically validates or exports schema DDL to the database when the SessionFactory is created. +hibernate.hbm2ddl.auto=create-drop +#It makes Hibernate to generate the appropriate SQL statements for the chosen database. +hibernate.dialect=org.hibernate.dialect.H2Dialect +#It enables/disables the logging of all the generated SQL statements to the console. +hibernate.show_sql=false +#It enables/disables formatting the generated SQL statement to make it more readable. +hibernate.format_sql=false +#It sets the default encoding to UTF8. +hibernate.connection.charSet=utf8 +#It enables/disables L2 caching. +hibernate.cache.use_second_level_cache=false +#It enables/disables query caching. +hibernate.cache.use_query_cache=false +#It specifies whether entries will be written in a readable format or not in the L2 cache. +hibernate.cache.use_structured_entries=false +#It is used to analyze performance issues. +hibernate.generate_statistics=false + +openapi.info.title=OTP Manager Service +openapi.info.description=Rest Endpoints for operations related to OTP +openapi.info.version=1.0 +openapi.info.license.name=Mosip +openapi.info.license.url=https://docs.mosip.io/platform/license +mosipbox.public.url=http://localhost:${server.port} +openapi.service.servers[0].url=${mosipbox.public.url}${server.servlet.path} +openapi.service.servers[0].description=OTP Manager Service +springdoc.swagger-ui.disable-swagger-default-url=true +spring.mvc.servlet.path=${server.servlet.path} + + diff --git a/kernel/kernel-otpmanager/src/test/resources/logback.xml b/kernel/kernel-otpmanager/src/test/resources/logback.xml new file mode 100644 index 00000000..7285a15d --- /dev/null +++ b/kernel/kernel-otpmanager/src/test/resources/logback.xml @@ -0,0 +1,10 @@ + + + + %d [%t] %p [%C{1}].%M.%L : %m%n + + + + + + \ No newline at end of file diff --git a/kernel/pom.xml b/kernel/pom.xml index d03b27b2..4865bace 100644 --- a/kernel/pom.xml +++ b/kernel/pom.xml @@ -44,6 +44,7 @@ kernel-otpmanager-service + kernel-otpmanager