package org.molgenis.ui.browserdetection;
import eu.bitwalker.useragentutils.Browser;
import eu.bitwalker.useragentutils.UserAgent;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
/**
* Servlet filter that forwards the request to an browser unsupported message page if the user uses an unsupported
* browser (< IE9)
* <p>
* IE compatibility mode is not taken into account (see https://github.com/molgenis/molgenis/issues/3481)
*/
public class BrowserDetectionFilter implements Filter
{
private static final String USER_AGENT_HEADER_NAME = "User-Agent";
private static final String UNSUPPORTED_BROWSER_MESSAGE_PAGE = "/html/unsupported-browser-message.html";
private static final List<Browser> UNSUPPORTED_BROWSERS = Arrays
.asList(Browser.IE5, Browser.IE5_5, Browser.IE6, Browser.IE7, Browser.IE8);
private static final String CONTINUE_WITH_UNSUPPORTED_BROWSER_TOKEN = "continueWithUnsupportedBrowser";
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) request;
if (!httpRequest.getRequestURI().startsWith("/api/") && !isSupported(
httpRequest.getHeader(USER_AGENT_HEADER_NAME)))
{
HttpSession session = httpRequest.getSession();
if (session.getAttribute(CONTINUE_WITH_UNSUPPORTED_BROWSER_TOKEN) == null)
{
if (request.getParameter(CONTINUE_WITH_UNSUPPORTED_BROWSER_TOKEN) != null)
{
session.setAttribute(CONTINUE_WITH_UNSUPPORTED_BROWSER_TOKEN, true);
}
else
{
httpRequest.getRequestDispatcher(UNSUPPORTED_BROWSER_MESSAGE_PAGE).forward(request, response);
return;
}
}
}
chain.doFilter(request, response);
}
protected boolean isSupported(String userAgentHeaderValue)
{
UserAgent userAgent = UserAgent.parseUserAgentString(userAgentHeaderValue);
return !UNSUPPORTED_BROWSERS.contains(userAgent.getBrowser());
}
@Override
public void destroy()
{
}
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
}