package com.atlassian.labs.speakeasy.git; import java.io.IOException; 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.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; /** * */ public class FixAuthenticateHeaderFilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, new SpeakeasyWWWAuthenticateAddingResponse((HttpServletResponse) response)); } public void destroy() { } /** * Wraps a HttpServletResponse and listens for the status to be set to a "401 Not authorized" or a 401 error to * be sent so that it can add the WWW-Authenticate headers for Speakeasy. Necessary because of OAuth filter. */ private static final class SpeakeasyWWWAuthenticateAddingResponse extends HttpServletResponseWrapper { public SpeakeasyWWWAuthenticateAddingResponse(HttpServletResponse response) { super(response); } @Override public void sendError(int sc, String msg) throws IOException { if (sc == SC_UNAUTHORIZED) { addSpeakeasyAuthenticateHeader(); } super.sendError(sc, msg); } @Override public void sendError(int sc) throws IOException { if (sc == SC_UNAUTHORIZED) { addSpeakeasyAuthenticateHeader(); } super.sendError(sc); } @Override public void setStatus(int sc, String sm) { if (sc == SC_UNAUTHORIZED) { addSpeakeasyAuthenticateHeader(); } super.setStatus(sc, sm); } @Override public void setStatus(int sc) { if (sc == SC_UNAUTHORIZED) { addSpeakeasyAuthenticateHeader(); } } private void addSpeakeasyAuthenticateHeader() { super.addHeader("WWW-Authenticate", "Basic realm=\"Speakeasy git server\""); } } }