package org.apereo.cas.logging.web; import org.apache.commons.lang3.StringUtils; import org.apereo.cas.authentication.principal.Principal; import org.apereo.cas.ticket.registry.TicketRegistrySupport; import org.apereo.cas.web.support.CookieRetrievingCookieGenerator; import org.slf4j.MDC; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.Map; import java.util.TimeZone; /** * This is {@link ThreadContextMDCServletFilter}. * * @author Misagh Moayyed * @since 5.0.0 */ public class ThreadContextMDCServletFilter implements Filter { private final CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator; private final TicketRegistrySupport ticketRegistrySupport; public ThreadContextMDCServletFilter(final TicketRegistrySupport ticketRegistrySupport, final CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator) { this.ticketGrantingTicketCookieGenerator = ticketGrantingTicketCookieGenerator; this.ticketRegistrySupport = ticketRegistrySupport; } /** * Does nothing. * * @param filterConfig filter initial configuration. Ignored. * @throws ServletException never thrown in this case. */ @Override public void init(final FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException { try { final HttpServletRequest request = (HttpServletRequest) servletRequest; addContextAttribute("remoteAddress", request.getRemoteAddr()); addContextAttribute("remoteUser", request.getRemoteUser()); addContextAttribute("serverName", request.getServerName()); addContextAttribute("serverPort", String.valueOf(request.getServerPort())); addContextAttribute("locale", request.getLocale().getDisplayName()); addContextAttribute("contentType", request.getContentType()); addContextAttribute("contextPath", request.getContextPath()); addContextAttribute("localAddress", request.getLocalAddr()); addContextAttribute("localPort", String.valueOf(request.getLocalPort())); addContextAttribute("remotePort", String.valueOf(request.getRemotePort())); addContextAttribute("pathInfo", request.getPathInfo()); addContextAttribute("protocol", request.getProtocol()); addContextAttribute("authType", request.getAuthType()); addContextAttribute("method", request.getMethod()); addContextAttribute("queryString", request.getQueryString()); addContextAttribute("requestUri", request.getRequestURI()); addContextAttribute("scheme", request.getScheme()); addContextAttribute("timezone", TimeZone.getDefault().getDisplayName()); final Map<String, String[]> params = request.getParameterMap(); params.keySet().forEach(k -> { final String[] values = params.get(k); addContextAttribute(k, Arrays.toString(values)); }); Collections.list(request.getAttributeNames()) .forEach(a -> addContextAttribute(a, request.getAttribute(a))); final String cookieValue = this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request); if (StringUtils.isNotBlank(cookieValue)) { final Principal p = this.ticketRegistrySupport.getAuthenticatedPrincipalFrom(cookieValue); if (p != null) { addContextAttribute("principal", p.getId()); } } filterChain.doFilter(servletRequest, servletResponse); } finally { MDC.clear(); } } private static void addContextAttribute(final String attributeName, final Object value) { if (value != null && StringUtils.isNotBlank(value.toString())) { MDC.put(attributeName, value.toString()); } } /** * Does nothing. */ @Override public void destroy() { } }