diff --git a/openid-connect-server-webapp/src/main/webapp/WEB-INF/application-context.xml b/openid-connect-server-webapp/src/main/webapp/WEB-INF/application-context.xml index 480b5780c..1d52ff719 100644 --- a/openid-connect-server-webapp/src/main/webapp/WEB-INF/application-context.xml +++ b/openid-connect-server-webapp/src/main/webapp/WEB-INF/application-context.xml @@ -100,6 +100,8 @@ + + @@ -117,6 +119,7 @@ + @@ -125,11 +128,13 @@ + + @@ -137,6 +142,7 @@ + @@ -144,6 +150,7 @@ + @@ -152,6 +159,7 @@ + @@ -160,12 +168,14 @@ + + @@ -180,6 +190,7 @@ + @@ -194,6 +205,7 @@ + @@ -207,6 +219,7 @@ + diff --git a/openid-connect-server-webapp/src/main/webapp/WEB-INF/user-context.xml b/openid-connect-server-webapp/src/main/webapp/WEB-INF/user-context.xml index 2aff94363..86e4be23c 100644 --- a/openid-connect-server-webapp/src/main/webapp/WEB-INF/user-context.xml +++ b/openid-connect-server-webapp/src/main/webapp/WEB-INF/user-context.xml @@ -52,6 +52,7 @@ + diff --git a/openid-connect-server/src/main/java/org/mitre/mdc/MultiMDCFilter.java b/openid-connect-server/src/main/java/org/mitre/mdc/MultiMDCFilter.java new file mode 100644 index 000000000..9f3c1043f --- /dev/null +++ b/openid-connect-server/src/main/java/org/mitre/mdc/MultiMDCFilter.java @@ -0,0 +1,37 @@ +package org.mitre.mdc; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.springframework.web.filter.GenericFilterBean; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +public class MultiMDCFilter extends GenericFilterBean { + + private static final Logger log = LoggerFactory.getLogger(MultiMDCFilter.class); + + private final RemoteAddressMDCFilter remoteAddressMDCFilter; + private final SessionIdMDCFilter sessionIdMDCFilter; + + public MultiMDCFilter() { + this.remoteAddressMDCFilter = new RemoteAddressMDCFilter(); + this.sessionIdMDCFilter = new SessionIdMDCFilter(); + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) + throws IOException, ServletException + { + log.info("--- Initialized MultiMDCFilter ---"); + remoteAddressMDCFilter.doFilter(servletRequest); + sessionIdMDCFilter.doFilter(servletRequest); + filterChain.doFilter(servletRequest, servletResponse); + MDC.clear(); + } + +} diff --git a/openid-connect-server/src/main/java/org/mitre/mdc/RemoteAddressMDCFilter.java b/openid-connect-server/src/main/java/org/mitre/mdc/RemoteAddressMDCFilter.java new file mode 100644 index 000000000..45b6beb46 --- /dev/null +++ b/openid-connect-server/src/main/java/org/mitre/mdc/RemoteAddressMDCFilter.java @@ -0,0 +1,44 @@ +package org.mitre.mdc; + +import org.slf4j.MDC; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; + +public class RemoteAddressMDCFilter { + + private static final String[] IP_HEADER_CANDIDATES = { + "X-Forwarded-For", + "Proxy-Client-IP", + "WL-Proxy-Client-IP", + "HTTP_X_FORWARDED_FOR", + "HTTP_X_FORWARDED", + "HTTP_X_CLUSTER_CLIENT_IP", + "HTTP_CLIENT_IP", + "HTTP_FORWARDED_FOR", + "HTTP_FORWARDED", + "HTTP_VIA", + "REMOTE_ADDR" + }; + + private static final String REMOTE_ADDR = "remoteAddr"; + + public void doFilter(ServletRequest servletRequest) { + MDC.put(REMOTE_ADDR, getRemoteAddr((HttpServletRequest) servletRequest)); + } + + private String getRemoteAddr(HttpServletRequest request) { + if (request.getRemoteAddr() != null) { + return request.getRemoteAddr(); + } + + for (String header: IP_HEADER_CANDIDATES) { + String ipList = request.getHeader(header); + if (ipList != null && ipList.length() != 0 && !"unknown".equalsIgnoreCase(ipList)) { + return ipList.split(",")[0]; + } + } + return ""; + } + +} diff --git a/openid-connect-server/src/main/java/org/mitre/mdc/SessionIdMDCFilter.java b/openid-connect-server/src/main/java/org/mitre/mdc/SessionIdMDCFilter.java new file mode 100644 index 000000000..85f95de87 --- /dev/null +++ b/openid-connect-server/src/main/java/org/mitre/mdc/SessionIdMDCFilter.java @@ -0,0 +1,24 @@ +package org.mitre.mdc; + +import org.slf4j.MDC; + +import javax.servlet.ServletRequest; +import javax.servlet.http.HttpServletRequest; + +public class SessionIdMDCFilter { + + private static final int SIZE = 12; + private static final String SESSION_ID = "sessionID"; + + public void doFilter(ServletRequest servletRequest) { + HttpServletRequest req = (HttpServletRequest) servletRequest; + if (req.getSession() != null) { + String id = req.getSession().getId(); + if (id != null && id.length() > SIZE) { + id = id.substring(0, SIZE); + } + MDC.put(SESSION_ID, id); + } + } + +}