diff --git a/pom.xml b/pom.xml index a9499b72..84eb1596 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.common.identity identity-api - 3.4.0 + 3.6.0 war diff --git a/src/main/java/com/iemr/common/identity/config/CorsConfig.java b/src/main/java/com/iemr/common/identity/config/CorsConfig.java index d52f7e35..d4b38cab 100644 --- a/src/main/java/com/iemr/common/identity/config/CorsConfig.java +++ b/src/main/java/com/iemr/common/identity/config/CorsConfig.java @@ -17,7 +17,9 @@ public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**").allowedOriginPatterns( allowedOrigins != null && !allowedOrigins.trim().isEmpty() ? Arrays.stream(allowedOrigins.split(",")) .map(String::trim).filter(s -> !s.isEmpty()).toArray(String[]::new) : new String[0]) - .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS").allowedHeaders("*") + .allowedMethods("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS") + .allowedHeaders("Authorization", "Content-Type", "Accept", "Jwttoken", + "serverAuthorization", "ServerAuthorization", "serverauthorization", "Serverauthorization") .exposedHeaders("Authorization", "Jwttoken").allowCredentials(true).maxAge(3600); } } diff --git a/src/main/java/com/iemr/common/identity/controller/IdentityController.java b/src/main/java/com/iemr/common/identity/controller/IdentityController.java index 4ac603ae..16995734 100644 --- a/src/main/java/com/iemr/common/identity/controller/IdentityController.java +++ b/src/main/java/com/iemr/common/identity/controller/IdentityController.java @@ -24,6 +24,7 @@ import java.lang.reflect.Type; import java.math.BigInteger; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -44,11 +45,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.reflect.TypeToken; import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonNull; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.google.gson.JsonPrimitive; +import com.google.gson.JsonSyntaxException; import com.iemr.common.identity.dto.BenIdImportDTO; import com.iemr.common.identity.dto.BeneficiariesDTO; import com.iemr.common.identity.dto.BeneficiariesPartialDTO; diff --git a/src/main/java/com/iemr/common/identity/domain/User.java b/src/main/java/com/iemr/common/identity/domain/User.java index cf0f5053..2a88b2e1 100644 --- a/src/main/java/com/iemr/common/identity/domain/User.java +++ b/src/main/java/com/iemr/common/identity/domain/User.java @@ -15,9 +15,9 @@ import jakarta.persistence.Table; import lombok.Data; @Entity -@Table(name = "m_User") -@JsonIgnoreProperties(ignoreUnknown = true) +@Table(name = "m_User",schema = "db_iemr") @Data +@JsonIgnoreProperties(ignoreUnknown = true) public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/iemr/common/identity/dto/BenIdImportDTO.java b/src/main/java/com/iemr/common/identity/dto/BenIdImportDTO.java index 319ee596..9d093e53 100644 --- a/src/main/java/com/iemr/common/identity/dto/BenIdImportDTO.java +++ b/src/main/java/com/iemr/common/identity/dto/BenIdImportDTO.java @@ -30,6 +30,7 @@ public class BenIdImportDTO { private BigInteger beneficiaryId; private String createdBy; private Timestamp createdDate; + private BigInteger vanID; public BigInteger getBenRegId() { return benRegId; @@ -63,4 +64,11 @@ public void setCreatedDate(Timestamp createdDate) { this.createdDate = createdDate; } + public void setVanID(BigInteger vanID) { + this.vanID = vanID; + } + + public BigInteger getVanID() { + return vanID; + } } diff --git a/src/main/java/com/iemr/common/identity/mapper/BenIdImportMapper.java b/src/main/java/com/iemr/common/identity/mapper/BenIdImportMapper.java index 651b0437..74715704 100644 --- a/src/main/java/com/iemr/common/identity/mapper/BenIdImportMapper.java +++ b/src/main/java/com/iemr/common/identity/mapper/BenIdImportMapper.java @@ -39,6 +39,7 @@ public interface BenIdImportMapper { @Mapping(source = "beneficiaryId", target = "beneficiaryID") @Mapping(source = "createdBy", target = "createdBy") @Mapping(source = "createdDate", target = "createdDate") + @Mapping(source = "vanID", target = "vanID") MBeneficiaryregidmapping benIdImportDTOToMBeneficiaryregidmapping(BenIdImportDTO dto); ArrayList benIdImportDTOToMBeneficiaryregidmappings(List dto); diff --git a/src/main/java/com/iemr/common/identity/service/IdentityService.java b/src/main/java/com/iemr/common/identity/service/IdentityService.java index a0b8761f..029b60a4 100644 --- a/src/main/java/com/iemr/common/identity/service/IdentityService.java +++ b/src/main/java/com/iemr/common/identity/service/IdentityService.java @@ -1130,6 +1130,37 @@ public BeneficiaryCreateResp createIdentity(IdentityDTO identity) { logger.info("IdentityService.createIdentity - saving Contacts"); MBeneficiarycontact mContc = identityDTOToMBeneficiarycontact(identity); + + if (mContc.getEmergencyContactNum() != null) { + mContc.setEmergencyContactNum(cleanPhoneNumber(mContc.getEmergencyContactNum())); + } + + if (mContc.getPhoneNum1() != null) { + mContc.setPhoneNum1(cleanPhoneNumber(mContc.getPhoneNum1())); + } + + if (mContc.getPhoneNum2() != null) { + mContc.setPhoneNum2(cleanPhoneNumber(mContc.getPhoneNum2())); + } + if (mContc.getPhoneNum3() != null) { + mContc.setPhoneNum3(cleanPhoneNumber(mContc.getPhoneNum3())); + } + + if (mContc.getPhoneNum4() != null) { + mContc.setPhoneNum4(cleanPhoneNumber(mContc.getPhoneNum4())); + } + if (mContc.getPhoneNum5() != null) { + mContc.setPhoneNum5(cleanPhoneNumber(mContc.getPhoneNum5())); + } + if (mContc.getPreferredSMSPhoneNum() != null) { + mContc.setPreferredSMSPhoneNum(cleanPhoneNumber(mContc.getPreferredSMSPhoneNum())); + } if (mContc.getPreferredPhoneNum() != null) { + mContc.setPreferredPhoneNum(cleanPhoneNumber(mContc.getPreferredPhoneNum())); + } + + + + // MBeneficiarycontact mContc = // mapper.identityDTOToMBeneficiarycontact(identity); if (mContc.getCreatedDate() == null) { @@ -1302,7 +1333,22 @@ public BeneficiaryCreateResp createIdentity(IdentityDTO identity) { logger.info("IdentityService.createIdentity - end. id = " + benMapping.getBenMapId()); return partialMapper.mBeneficiarymappingToBeneficiaryCreateResp(benMapping); } - +private String cleanPhoneNumber(String phoneNumber) { + if (phoneNumber == null || phoneNumber.trim().isEmpty()) { + return phoneNumber; + } + + // Remove +91 prefix + String cleaned = phoneNumber.trim(); + if (cleaned.startsWith("+91")) { + cleaned = cleaned.substring(3); + } else if (cleaned.startsWith("91") && cleaned.length() == 12) { + // Handle case where + is already removed but 91 remains + cleaned = cleaned.substring(2); + } + + return cleaned.trim(); +} private MBeneficiarydetail convertIdentityDTOToMBeneficiarydetail(IdentityDTO dto) { MBeneficiarydetail beneficiarydetail = new MBeneficiarydetail(); beneficiarydetail.setAreaId(dto.getAreaId()); @@ -1751,7 +1797,10 @@ public int importBenIdToLocalServer(List benIdImportDTOList) { + " Provisioned, CreatedDate, CreatedBy, Reserved) VALUES (?,?,?,?,?,?) "; logger.info("query : " + query); for (MBeneficiaryregidmapping obj : mBeneficiaryregidmappingList) { - objArr = new Object[6]; + logger.info("inside for check->",obj); + + logger.info("In for loop of importBenIdToLocalServer"+obj.getVanID()); + objArr = new Object[7]; objArr[0] = obj.getBenRegId(); objArr[1] = obj.getBeneficiaryID(); @@ -1759,6 +1808,7 @@ public int importBenIdToLocalServer(List benIdImportDTOList) { objArr[3] = obj.getCreatedDate(); objArr[4] = obj.getCreatedBy(); objArr[5] = false; + objArr[6] = obj.getVanID(); dataList.add(objArr); logger.info("regid :" + obj.getBenRegId() + " - benid :" + obj.getBeneficiaryID()); diff --git a/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java index 3343e6ca..6d5c55f9 100644 --- a/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/common/identity/utils/JwtUserIdValidationFilter.java @@ -97,34 +97,58 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } } + /** + * Handles CORS headers by validating the origin and setting appropriate + * headers. + * AMM-1927: Only sets CORS headers if the origin is from an allowed domain. + * + * @param request The HTTP request + * @param response The HTTP response + */ private void handleCorsHeaders(HttpServletRequest request, HttpServletResponse response) { String origin = request.getHeader("Origin"); logger.debug("Incoming Origin: {}", origin); logger.debug("Allowed Origins Configured: {}", allowedOrigins); - if (origin != null && isOriginAllowed(origin)) { + // Only set CORS headers if the origin is allowed + if (isOriginAllowed(origin)) { response.setHeader("Access-Control-Allow-Origin", origin); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, JwtToken, Jwttoken"); response.setHeader("Vary", "Origin"); response.setHeader("Access-Control-Allow-Credentials", "true"); + + logger.debug("CORS headers set for allowed origin: {}", origin); } else { logger.warn("Origin [{}] is NOT allowed. CORS headers NOT added.", origin); } - } + /** + * Validates if the request origin is in the allowed origins list. + * AMM-1927: Aligns with Admin-API implementation for consistent origin + * validation. + * + * @param origin The Origin header value from the HTTP request + * @return true if the origin is allowed, false otherwise + */ private boolean isOriginAllowed(String origin) { - if (origin == null || allowedOrigins == null || allowedOrigins.trim().isEmpty()) { - logger.warn("No allowed origins configured or origin is null"); + // Null or empty origin is not allowed + if (origin == null || origin.isEmpty()) { + logger.debug("Origin is null or empty"); + return false; + } + + // Check if allowed origins are configured + if (allowedOrigins == null || allowedOrigins.trim().isEmpty()) { + logger.warn("No allowed origins configured"); return false; } return Arrays.stream(allowedOrigins.split(",")).map(String::trim).anyMatch(pattern -> { - String regex = pattern.replace(".", "\\.").replace("*", ".*").replace("http://localhost:.*", - "http://localhost:\\d+"); // special case for wildcard port + String regex = pattern.replace(".", "\\.").replace("*", ".*"); boolean matched = origin.matches(regex); return matched; diff --git a/src/main/java/com/iemr/common/identity/utils/http/HTTPRequestInterceptor.java b/src/main/java/com/iemr/common/identity/utils/http/HTTPRequestInterceptor.java index 7156102c..11cf7570 100644 --- a/src/main/java/com/iemr/common/identity/utils/http/HTTPRequestInterceptor.java +++ b/src/main/java/com/iemr/common/identity/utils/http/HTTPRequestInterceptor.java @@ -22,11 +22,14 @@ package com.iemr.common.identity.utils.http; +import java.util.Arrays; + import javax.ws.rs.core.MediaType; 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.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @@ -42,6 +45,9 @@ public class HTTPRequestInterceptor implements HandlerInterceptor { Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + @Value("${cors.allowed-origins}") + private String allowedOrigins; + private SessionObject sessionObject; @Autowired @@ -84,8 +90,13 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons response.getOutputStream().print(output.toString()); response.setContentType(MediaType.APPLICATION_JSON); response.setContentLength(output.toString().length()); - response.setHeader("Access-Control-Allow-Origin", "*"); - status = false; + String origin = request.getHeader("Origin"); + if (origin != null && isOriginAllowed(origin)) { + response.setHeader("Access-Control-Allow-Origin", origin); + response.setHeader("Access-Control-Allow-Credentials", "true"); + } else if (origin != null) { + logger.warn("CORS headers NOT added for error response | Unauthorized origin: {}", origin); + } status = false; } } return status; @@ -115,4 +126,19 @@ public void afterCompletion(HttpServletRequest request, HttpServletResponse resp throws Exception { logger.debug("In afterCompletion Request Completed"); } + + private boolean isOriginAllowed(String origin) { + if (origin == null || allowedOrigins == null || allowedOrigins.trim().isEmpty()) { + return false; + } + + return Arrays.stream(allowedOrigins.split(",")) + .map(String::trim) + .anyMatch(pattern -> { + String regex = pattern + .replace(".", "\\.") + .replace("*", ".*"); + return origin.matches(regex); + }); + } } \ No newline at end of file