11package com .iemr .tm .utils ;
22
33import java .io .IOException ;
4+ import java .util .Arrays ;
45
56import org .slf4j .Logger ;
67import org .slf4j .LoggerFactory ;
1718import jakarta .servlet .http .HttpServletRequest ;
1819import jakarta .servlet .http .HttpServletResponse ;
1920
20- @ Component
2121public class JwtUserIdValidationFilter implements Filter {
2222
2323 private final JwtAuthenticationUtil jwtAuthenticationUtil ;
2424 private final Logger logger = LoggerFactory .getLogger (this .getClass ().getName ());
25+ private final String allowedOrigins ;
2526
26- public JwtUserIdValidationFilter (JwtAuthenticationUtil jwtAuthenticationUtil ) {
27+ public JwtUserIdValidationFilter (JwtAuthenticationUtil jwtAuthenticationUtil ,
28+ String allowedOrigins ) {
2729 this .jwtAuthenticationUtil = jwtAuthenticationUtil ;
30+ this .allowedOrigins = allowedOrigins ;
2831 }
2932
3033 @ Override
@@ -33,6 +36,27 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
3336 HttpServletRequest request = (HttpServletRequest ) servletRequest ;
3437 HttpServletResponse response = (HttpServletResponse ) servletResponse ;
3538
39+ String origin = request .getHeader ("Origin" );
40+
41+ logger .debug ("Incoming Origin: {}" , origin );
42+ logger .debug ("Allowed Origins Configured: {}" , allowedOrigins );
43+
44+ if (origin != null && isOriginAllowed (origin )) {
45+ response .setHeader ("Access-Control-Allow-Origin" , origin );
46+ response .setHeader ("Access-Control-Allow-Methods" , "GET, POST, PUT, DELETE, OPTIONS" );
47+ response .setHeader ("Access-Control-Allow-Headers" , "Authorization, Content-Type, Accept, Jwttoken" );
48+ response .setHeader ("Vary" , "Origin" );
49+ response .setHeader ("Access-Control-Allow-Credentials" , "true" );
50+ } else {
51+ logger .warn ("Origin [{}] is NOT allowed. CORS headers NOT added." , origin );
52+ }
53+
54+ if ("OPTIONS" .equalsIgnoreCase (request .getMethod ())) {
55+ logger .info ("OPTIONS request - skipping JWT validation" );
56+ response .setStatus (HttpServletResponse .SC_OK );
57+ return ;
58+ }
59+
3660 String path = request .getRequestURI ();
3761 String contextPath = request .getContextPath ();
3862 logger .info ("JwtUserIdValidationFilter invoked for path: " + path );
@@ -110,12 +134,33 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo
110134 response .sendError (HttpServletResponse .SC_UNAUTHORIZED , "Authorization error: " + e .getMessage ());
111135 }
112136 }
137+
138+ private boolean isOriginAllowed (String origin ) {
139+ if (origin == null || allowedOrigins == null || allowedOrigins .trim ().isEmpty ()) {
140+ logger .warn ("No allowed origins configured or origin is null" );
141+ return false ;
142+ }
143+
144+ return Arrays .stream (allowedOrigins .split ("," ))
145+ .map (String ::trim )
146+ .anyMatch (pattern -> {
147+ String regex = pattern
148+ .replace ("." , "\\ ." )
149+ .replace ("*" , ".*" )
150+ .replace ("http://localhost:.*" , "http://localhost:\\ d+" ); // special case for wildcard port
151+
152+ boolean matched = origin .matches (regex );
153+ return matched ;
154+ });
155+ }
156+
113157 private boolean isMobileClient (String userAgent ) {
114158 if (userAgent == null )
115159 return false ;
116160 userAgent = userAgent .toLowerCase ();
117161 return userAgent .contains ("okhttp" );
118162 }
163+
119164 private String getJwtTokenFromCookies (HttpServletRequest request ) {
120165 Cookie [] cookies = request .getCookies ();
121166 if (cookies != null ) {
0 commit comments