/*
* This file is part of the Wayback archival access software
* (http://archive-access.sourceforge.net/projects/wayback/).
*
* Licensed to the Internet Archive (IA) by one or more individual
* contributors.
*
* The IA licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.archive.wayback.accesspoint.proxy;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.codec.binary.Base64;
import org.archive.wayback.replay.StringHttpServletResponseWrapper;
public class AuthProxyConfigSelector implements ProxyConfigSelector {
public final static String PROXY_REFERRER_KEY = "wayback-wombat-proxy-referrer";
private String proxyInfoJsp = "/WEB-INF/replay/ProxyInfo.jsp";
private String authMsg = "Please enter the collection number to see Wayback content from that collection. (You can leave the password blank)";
public String getProxyInfoJsp() {
return proxyInfoJsp;
}
public void setProxyInfoJsp(String proxyInfoJsp) {
this.proxyInfoJsp = proxyInfoJsp;
}
public String getAuthMsg() {
return authMsg;
}
public void setAuthMsg(String authMsg) {
this.authMsg = authMsg;
}
public String resolveConfig(HttpServletRequest request) {
String customCollHeader = request.getHeader("X-Wayback-Proxy-Coll");
if (customCollHeader != null) {
return customCollHeader;
}
String authenticate = request.getHeader("Proxy-Authorization");
if (authenticate != null) {
String auth = decodeBasic(authenticate);
if (auth != null) {
int userEnd = auth.indexOf(':');
return auth.substring(0, userEnd);
}
}
return null;
}
public boolean selectConfigHandler(HttpServletRequest request, HttpServletResponse response, ProxyAccessPoint proxy) throws IOException
{
response.setStatus(HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED); //407
response.setHeader("Proxy-Authenticate", "Basic realm=\"" + authMsg + "\"");
response.setContentType("text/html");
//TODO: Better way to pass this to jsp?
request.setAttribute("proxyAccessPoint", proxy);
StringHttpServletResponseWrapper wrappedResponse =
new StringHttpServletResponseWrapper(response);
RequestDispatcher dispatcher = request.getRequestDispatcher(proxyInfoJsp);
try {
dispatcher.forward(request, wrappedResponse);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter writer = response.getWriter();
writer.println(wrappedResponse.getStringResponse());
return true;
}
private String decodeBasic(String authHeaderValue) {
if(authHeaderValue != null) {
if(authHeaderValue.startsWith("Basic ")) {
String b64 = authHeaderValue.substring(6);
byte[] decoded = Base64.decodeBase64(b64.getBytes());
try {
return new String(decoded,"utf-8");
} catch (UnsupportedEncodingException e) {
// really?...
return new String(decoded);
}
}
}
return null;
}
public void handleSwitch(HttpServletRequest request,
HttpServletResponse response, ProxyAccessPoint proxy) throws IOException {
// Check reset cookie...
HttpSession sess = request.getSession();
String referrer = (String)sess.getAttribute(PROXY_REFERRER_KEY);
// If referrer not set, we're sending the switch request
if (referrer == null) {
String httpReferrer = request.getHeader("Referer");
if (httpReferrer == null) {
httpReferrer = proxy.getReplayPrefix();
}
sess.setAttribute(PROXY_REFERRER_KEY, httpReferrer);
selectConfigHandler(request, response, proxy);
} else {
sess.removeAttribute(PROXY_REFERRER_KEY);
response.sendRedirect(referrer);
}
}
public void handleProxyPac(HttpServletRequest httpRequest,
HttpServletResponse httpResponse) {
//No Special Handling for Proxy Pac request
}
}