package com.sun.j2ee.blueprints.signon.web;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.net.URL;
import javax.servlet.ServletException;
import javax.servlet.ServletContext;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Cookie;
import javax.ejb.CreateException;
import javax.naming.NamingException;
import javax.naming.InitialContext;
import com.sun.j2ee.blueprints.signon.ejb.SignOnLocalHome;
import com.sun.j2ee.blueprints.signon.ejb.SignOnLocal;
public class SignOnFilter implements Filter {
public static final String FORM_SIGNON_URL = "j_signon_check";
public static final String FORM_USER_NAME = "j_username";
public static final String FORM_PASSWORD = "j_password";
public static final String REMEMBER_USERNAME = "j_remember_username";
public static final String USER_NAME = "j_signon_username";
public static final String SIGNED_ON_USER = "j_signon";
public static final String ORIGINAL_URL = "j_signon_original_url";
public static final String CREATE_USER_URL = "j_create_user";
public static final String COOKIE_NAME = "bp_signon";
private HashMap protectedResources;
private FilterConfig config = null;
private String signOnErrorPage = null;
private String signOnPage = null;
private String userCreationError = null;
public void init(FilterConfig config) throws ServletException {
this.config = config;
URL protectedResourcesURL = null;
try {
protectedResourcesURL = config.getServletContext().getResource("/WEB-INF/signon-config.xml");
if (protectedResourcesURL != null) {
SignOnDAO dao = new SignOnDAO(protectedResourcesURL);
signOnErrorPage = dao.getSignOnErrorPage();
signOnPage = dao.getSignOnPage();
protectedResources = dao.getProtectedResources();
}
} catch (java.net.MalformedURLException ex) {
System.err.println("SignonFilter: malformed URL exception: " + ex);
}
}
public void destroy() {
config = null;
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest)request;
String currentURI = hreq.getRequestURL().toString();
String currentURL = hreq.getRequestURI();
int firstSlash = currentURL.indexOf("/",1); String targetURL = null;
if (firstSlash != -1) targetURL = currentURL.substring(firstSlash + 1, currentURL.length());
if ((targetURL != null) && targetURL.equals(FORM_SIGNON_URL)) {
validateSignOn(request, response, chain);
return;
}
boolean signedOn = false;
if (hreq.getSession().getAttribute(SIGNED_ON_USER) != null) {
signedOn =((Boolean)hreq.getSession().getAttribute(SIGNED_ON_USER)).booleanValue();
} else {
hreq.getSession().setAttribute(SIGNED_ON_USER, new Boolean(false));
}
if (signedOn) {
chain.doFilter(request,response);
return;
}
Iterator it = null;
if (protectedResources != null) it = protectedResources.keySet().iterator();
while ((it != null) && it.hasNext()) {
String protectedName = (String)it.next();
ProtectedResource resource = (ProtectedResource)protectedResources.get(protectedName);
String urlPattern = resource.getURLPattern();
if (urlPattern.equals(targetURL)) {
hreq.getSession().setAttribute(ORIGINAL_URL, targetURL);
config.getServletContext().getRequestDispatcher("/" + signOnPage).forward(request, response);
return;
}
}
chain.doFilter(request,response);
}
public void validateSignOn(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest hreq = (HttpServletRequest)request;
HttpServletResponse hres = (HttpServletResponse)response;
String userName = hreq.getParameter(FORM_USER_NAME);
String password = hreq.getParameter(FORM_PASSWORD);
String rememberUserName = hreq.getParameter(REMEMBER_USERNAME);
if (rememberUserName != null) {
Cookie userNameCookie = new Cookie(COOKIE_NAME, userName);
userNameCookie.setMaxAge(2678400);
hres.addCookie(userNameCookie);
} else {
Cookie[] cookies = hreq.getCookies();
if (cookies != null) {
for (int loop=0; loop < cookies.length; loop++) {
if (cookies[loop].getName().equals(COOKIE_NAME)) {
cookies[loop].setMaxAge(0);
hres.addCookie(cookies[loop]);
}
}
}
}
SignOnLocal signOn = getSignOnEjb();
boolean authenticated = signOn.authenticate(userName, password);
if (authenticated) {
if (hreq.getSession().getAttribute(USER_NAME) != null) {
hreq.getSession().removeAttribute(USER_NAME);
}
hreq.getSession().setAttribute(USER_NAME, userName);
if (hreq.getSession().getAttribute(SIGNED_ON_USER) != null) {
hreq.getSession().removeAttribute(SIGNED_ON_USER);
}
hreq.getSession().setAttribute(SIGNED_ON_USER, new Boolean(true));
String targetURL = (String)hreq.getSession().getAttribute(ORIGINAL_URL);
hres.sendRedirect(targetURL);
return;
} else {
hres.sendRedirect(signOnErrorPage);
return;
}
}
private SignOnLocal getSignOnEjb() throws ServletException {
SignOnLocal signOn = null;
try {
InitialContext ic = new InitialContext();
Object o = ic.lookup("java:comp/env/ejb/SignOn");
SignOnLocalHome home =(SignOnLocalHome)o;
signOn = home.create();
} catch (javax.ejb.CreateException cx) {
throw new ServletException("Failed to Create SignOn EJB: caught " + cx);
} catch (javax.naming.NamingException nx) {
throw new ServletException("Failed to Create SignOn EJB: caught " + nx);
}
return signOn;
}
}