Skip to content

Commit 5919a09

Browse files
jwttoken and user-agent validation (#73)
* jwttoken and user-agent validation * added file * null check
1 parent c7f24be commit 5919a09

7 files changed

Lines changed: 151 additions & 34 deletions

File tree

src/main/java/com/iemr/ecd/service/associate/BeneficiaryRegistrationServiceImpl.java

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
import com.iemr.ecd.repo.call_conf_allocation.OutboundCallsRepo;
5252
import com.iemr.ecd.utils.advice.exception_handler.ECDException;
5353
import com.iemr.ecd.utils.mapper.CookieUtil;
54+
import com.iemr.ecd.utils.mapper.RestTemplateUtil;
5455

5556
import jakarta.servlet.http.HttpServletRequest;
5657
import jakarta.transaction.Transactional;
@@ -106,17 +107,9 @@ public String beneficiaryRegistration(RequestBeneficiaryRegistrationDTO request,
106107
// request.setEdd(getTimestampFromString(request.getEddStr()));
107108

108109
RestTemplate restTemplate = new RestTemplate();
109-
HttpServletRequest requestHeader = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
110-
.getRequest();
111-
String jwtTokenFromCookie = cookieUtil.getJwtTokenFromCookie(requestHeader);
112-
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
113-
headers.add("Content-Type", MediaType.APPLICATION_JSON + ";charset=utf-8");
114-
headers.add("AUTHORIZATION", Authorization);
115-
headers.add("Cookie", "Jwttoken=" + jwtTokenFromCookie);
116110
String json = objectMapper.writeValueAsString(request);
117-
118-
HttpEntity<Object> requestObj = new HttpEntity<Object>(json, headers);
119-
111+
HttpEntity<Object> requestObj = RestTemplateUtil.createRequestEntity(json, Authorization);
112+
120113
ResponseEntity<String> response = restTemplate.exchange(registerBeneficiaryUrl, HttpMethod.POST, requestObj,
121114
String.class);
122115

@@ -184,14 +177,7 @@ public String updateBeneficiaryDetails(RequestBeneficiaryRegistrationDTO request
184177
}
185178

186179
RestTemplate restTemplate = new RestTemplate();
187-
HttpServletRequest requestHeader = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
188-
.getRequest();
189-
String jwtTokenFromCookie = cookieUtil.getJwtTokenFromCookie(requestHeader);
190-
MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
191-
headers.add("Content-Type", MediaType.APPLICATION_JSON + ";charset=utf-8");
192-
headers.add("AUTHORIZATION", Authorization);
193-
headers.add("Cookie", "Jwttoken=" + jwtTokenFromCookie);
194-
HttpEntity<Object> requestObj = new HttpEntity<Object>(request, headers);
180+
HttpEntity<Object> requestObj = RestTemplateUtil.createRequestEntity(request, Authorization);
195181
ResponseEntity<String> response = restTemplate.exchange(beneficiaryEditUrl, HttpMethod.POST, requestObj,
196182
String.class);
197183

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.iemr.ecd.utils.http_request_interceptor;
2+
3+
import java.util.Collections;
4+
import java.util.Enumeration;
5+
import java.util.List;
6+
7+
import jakarta.servlet.http.HttpServletRequest;
8+
import jakarta.servlet.http.HttpServletRequestWrapper;
9+
10+
public class AuthorizationHeaderRequestWrapper extends HttpServletRequestWrapper{
11+
private final String Authorization;
12+
13+
public AuthorizationHeaderRequestWrapper(HttpServletRequest request, String authHeaderValue) {
14+
super(request);
15+
this.Authorization = authHeaderValue;
16+
}
17+
18+
@Override
19+
public String getHeader(String name) {
20+
if ("Authorization".equalsIgnoreCase(name)) {
21+
return Authorization;
22+
}
23+
return super.getHeader(name);
24+
}
25+
26+
@Override
27+
public Enumeration<String> getHeaders(String name) {
28+
if ("Authorization".equalsIgnoreCase(name)) {
29+
return Collections.enumeration(Collections.singletonList(Authorization));
30+
}
31+
return super.getHeaders(name);
32+
}
33+
34+
@Override
35+
public Enumeration<String> getHeaderNames() {
36+
List<String> names = Collections.list(super.getHeaderNames());
37+
if (!names.contains("Authorization")) {
38+
names.add("Authorization");
39+
}
40+
return Collections.enumeration(names);
41+
}
42+
}

src/main/java/com/iemr/ecd/utils/http_request_interceptor/HttpInterceptor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
5757
authorization=preAuth.replace("Bearer ", "");
5858
else
5959
authorization = preAuth;
60+
if (authorization == null || authorization.isEmpty()) {
61+
logger.info("Authorization header is null or empty. Skipping HTTPRequestInterceptor.");
62+
return true; // Allow the request to proceed without validation
63+
}
6064
if (!request.getMethod().equalsIgnoreCase("OPTIONS")) {
6165
try {
6266
String[] requestURIParts = request.getRequestURI().split("/");

src/main/java/com/iemr/ecd/utils/mapper/CookieUtil.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,15 @@ public Optional<String> getCookieValue(HttpServletRequest request, String cookie
2424
return Optional.empty();
2525
}
2626

27-
public String getJwtTokenFromCookie(HttpServletRequest request) {
28-
return Arrays.stream(request.getCookies()).filter(cookie -> "Jwttoken".equals(cookie.getName()))
29-
.map(Cookie::getValue).findFirst().orElse(null);
27+
public static String getJwtTokenFromCookie(HttpServletRequest request) {
28+
Cookie[] cookies = request.getCookies();
29+
if (cookies == null) {
30+
return null; // No cookies present, return null safely
31+
}
32+
return Arrays.stream(cookies)
33+
.filter(cookie -> "Jwttoken".equals(cookie.getName()))
34+
.map(Cookie::getValue)
35+
.findFirst()
36+
.orElse(null);
3037
}
3138
}

src/main/java/com/iemr/ecd/utils/mapper/JwtUserIdValidationFilter.java

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.slf4j.LoggerFactory;
77
import org.springframework.stereotype.Component;
88

9+
import com.iemr.ecd.utils.http_request_interceptor.AuthorizationHeaderRequestWrapper;
10+
911
import jakarta.servlet.Filter;
1012
import jakarta.servlet.FilterChain;
1113
import jakarta.servlet.ServletException;
@@ -72,29 +74,36 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
7274
if (jwtFromCookie != null) {
7375
logger.info("Validating JWT token from cookie");
7476
if (jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtFromCookie)) {
75-
filterChain.doFilter(servletRequest, servletResponse);
77+
AuthorizationHeaderRequestWrapper authorizationHeaderRequestWrapper = new AuthorizationHeaderRequestWrapper(
78+
request, "");
79+
filterChain.doFilter(authorizationHeaderRequestWrapper, servletResponse);
7680
return;
7781
}
78-
}
79-
80-
if (jwtFromHeader != null) {
82+
} else if (jwtFromHeader != null) {
8183
logger.info("Validating JWT token from header");
8284
if (jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtFromHeader)) {
83-
filterChain.doFilter(servletRequest, servletResponse);
85+
AuthorizationHeaderRequestWrapper authorizationHeaderRequestWrapper = new AuthorizationHeaderRequestWrapper(
86+
request, "");
87+
filterChain.doFilter(authorizationHeaderRequestWrapper, servletResponse);
88+
return;
89+
}
90+
} else {
91+
String userAgent = request.getHeader("User-Agent");
92+
logger.info("User-Agent: " + userAgent);
93+
if (userAgent != null && isMobileClient(userAgent) && authHeader != null) {
94+
try {
95+
UserAgentContext.setUserAgent(userAgent);
96+
filterChain.doFilter(servletRequest, servletResponse);
97+
} finally {
98+
UserAgentContext.clear();
99+
}
84100
return;
85101
}
86-
}
87-
String userAgent = request.getHeader("User-Agent");
88-
logger.info("User-Agent: " + userAgent);
89-
90-
if (userAgent != null && isMobileClient(userAgent) && authHeader != null) {
91-
filterChain.doFilter(servletRequest, servletResponse);
92-
return;
93102
}
94103

95104
logger.warn("No valid authentication token found");
96105
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized: Invalid or missing token");
97-
106+
98107
} catch (Exception e) {
99108
logger.error("Authorization error: ", e);
100109
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization error: " + e.getMessage());
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.iemr.ecd.utils.mapper;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.http.HttpEntity;
6+
import org.springframework.http.HttpHeaders;
7+
import org.springframework.http.MediaType;
8+
import org.springframework.util.LinkedMultiValueMap;
9+
import org.springframework.util.MultiValueMap;
10+
import org.springframework.web.context.request.RequestContextHolder;
11+
import org.springframework.web.context.request.ServletRequestAttributes;
12+
13+
import jakarta.servlet.http.HttpServletRequest;
14+
15+
public class RestTemplateUtil {
16+
private final static Logger logger = LoggerFactory.getLogger(RestTemplateUtil.class);
17+
18+
public static HttpEntity<Object> createRequestEntity(Object body, String authorization) {
19+
20+
ServletRequestAttributes servletRequestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
21+
if (servletRequestAttributes == null) {
22+
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
23+
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8");
24+
headers.add(HttpHeaders.AUTHORIZATION, authorization);
25+
return new HttpEntity<>(body, headers);
26+
}
27+
HttpServletRequest requestHeader = servletRequestAttributes.getRequest();
28+
String jwtTokenFromCookie = null;
29+
try {
30+
jwtTokenFromCookie = CookieUtil.getJwtTokenFromCookie(requestHeader);
31+
32+
} catch (Exception e) {
33+
logger.error("Error while getting jwtToken from Cookie" + e.getMessage() );
34+
}
35+
36+
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
37+
headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8");
38+
if(null != UserAgentContext.getUserAgent()) {
39+
headers.add(HttpHeaders.USER_AGENT, UserAgentContext.getUserAgent());
40+
}
41+
headers.add(HttpHeaders.AUTHORIZATION, authorization);
42+
headers.add("JwtToken",requestHeader.getHeader("JwtToken"));
43+
if(null != jwtTokenFromCookie) {
44+
headers.add(HttpHeaders.COOKIE, "Jwttoken=" + jwtTokenFromCookie);
45+
}
46+
47+
return new HttpEntity<>(body, headers);
48+
}
49+
50+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.iemr.ecd.utils.mapper;
2+
3+
public class UserAgentContext {
4+
private static final ThreadLocal<String> userAgentHolder = new ThreadLocal<>();
5+
6+
public static void setUserAgent(String userAgent) {
7+
userAgentHolder.set(userAgent);
8+
}
9+
10+
public static String getUserAgent() {
11+
return userAgentHolder.get();
12+
}
13+
14+
public static void clear() {
15+
userAgentHolder.remove();
16+
}
17+
18+
}
19+

0 commit comments

Comments
 (0)