View Javadoc

1   package org.restafarian.core.filters;
2   
3   import java.io.IOException;
4   import java.util.ArrayList;
5   import java.util.HashMap;
6   import java.util.Iterator;
7   import java.util.List;
8   import java.util.Map;
9   import java.util.Set;
10  
11  import javax.servlet.Filter;
12  import javax.servlet.FilterChain;
13  import javax.servlet.FilterConfig;
14  import javax.servlet.ServletException;
15  import javax.servlet.ServletRequest;
16  import javax.servlet.ServletResponse;
17  import javax.servlet.http.Cookie;
18  import javax.servlet.http.HttpServletRequest;
19  import javax.servlet.http.HttpServletResponse;
20  import javax.servlet.http.HttpSession;
21  
22  import org.apache.commons.logging.Log;
23  import org.apache.commons.logging.LogFactory;
24  import org.restafarian.core.beans.Person;
25  import org.verisign.joid.OpenIdRuntimeException;
26  import org.verisign.joid.consumer.AuthenticationException;
27  import org.verisign.joid.consumer.AuthenticationResult;
28  import org.verisign.joid.consumer.JoidConsumer;
29  
30  /***
31   * <p>
32   * This filter is a modified version of the OpenIdFilter that ships with JOID.
33   * </p>
34   */
35  public class OpenIdFilter implements Filter {
36  	private static Log log = LogFactory.getLog(OpenIdFilter.class);
37  	private static JoidConsumer joid = new JoidConsumer();
38  	public static final String OPENID_ATTRIBUTE = "openid.identity";
39  	boolean saveIdentityUrlAsCookie = false;
40  	private String cookieDomain;
41  	private List ignorePaths = new ArrayList();
42  	private static boolean configuredProperly = false;
43  
44  	public void init(FilterConfig filterConfig) throws ServletException {
45  		log.info("init OpenIdFilter");
46  		String saveInCookie = filterConfig.getInitParameter("saveInCookie");
47  		if (saveInCookie != null) {
48  			saveIdentityUrlAsCookie = org.verisign.joid.util.Boolean.parseBoolean(saveInCookie);
49  			// saveIdentityUrlAsCookie = Boolean.parseBoolean(saveInCookie);
50  			log.debug("saving identities in cookie: " + saveIdentityUrlAsCookie);
51  		}
52  		cookieDomain = filterConfig.getInitParameter("cookieDomain");
53  		String ignorePaths = filterConfig.getInitParameter("ignorePaths");
54  		if (ignorePaths != null) {
55  			String paths[] = ignorePaths.split(",");
56  			for (int i = 0; i < paths.length; i++) {
57  				String path = paths[i].trim();
58  				this.ignorePaths.add(path);
59  			}
60  		}
61  		configuredProperly = true;
62  		log.debug("end init OpenIdFilter");
63  	}
64  
65  	/***
66  	 * This is to check to make sure the OpenIdFilter is setup propertly in the
67  	 * web.xml.
68  	 */
69  	private static void ensureFilterConfiguredProperly() {
70  		if (!configuredProperly) {
71  			// log.warn("OpenIdFilter Not Configured Properly!");
72  			throw new OpenIdRuntimeException("OpenIdFilter Not Configured Properly! Check your web.xml for OpenIdFilter.");
73  		}
74  	}
75  
76  	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
77  		// basically just check for openId parameters
78  		HttpServletRequest request = (HttpServletRequest) servletRequest;
79  		if (servletRequest.getParameter(OPENID_ATTRIBUTE) != null && !ignored(request)) {
80  			try {
81  				AuthenticationResult result = joid.authenticate(convertToStringValueMap(servletRequest.getParameterMap()));
82  				String identity = result.getIdentity();
83  				if (identity != null) {
84  					HttpServletRequest req = (HttpServletRequest) servletRequest;
85  					req.getSession().setAttribute(OPENID_ATTRIBUTE, identity);
86  // custom additions begin here ***************************************************
87  					Person user = new Person();
88  					user.setId(identity);
89  					user.setUri(identity);
90  					user.setName(request.getParameter("openid.sreg.fullname"));
91  					user.setEmail(request.getParameter("openid.sreg.email"));
92  					req.getSession().setAttribute("authenticatedUser", user);
93  // custom additions end here *****************************************************
94  					HttpServletResponse resp = (HttpServletResponse) servletResponse; 
95  					Cookie cookie = new Cookie(OPENID_ATTRIBUTE, identity);
96  					if (cookieDomain != null) {
97  						cookie.setDomain(cookieDomain);
98  					}
99  					resp.addCookie(cookie);
100 					String redirectTo = (String) req.getSession().getAttribute("postLogonReturnPath");
101 System.out.println("redirectTo: " + redirectTo);
102 					if (redirectTo == null || redirectTo.length() == 0) {
103 						redirectTo = result.getResponse().getReturnTo();
104 System.out.println("redirectTo: " + redirectTo);
105 					}
106 System.out.println("redirectTo: " + redirectTo);
107 					resp.sendRedirect(redirectTo);
108 					return;
109 				}
110 			} catch (AuthenticationException e) {
111 				e.printStackTrace();
112 				log.info("auth failed: " + e.getMessage());
113 				// should this be handled differently?
114 			} catch (Exception e) {
115 				e.printStackTrace();
116 			}
117 		}
118 		filterChain.doFilter(servletRequest, servletResponse);
119 	}
120 
121 	private boolean ignored(HttpServletRequest request) {
122 		String servletPath = request.getServletPath();
123 		for (int i = 0; i < ignorePaths.size(); i++) {
124 			String s = (String) ignorePaths.get(i);
125 			if (servletPath.startsWith(s)) {
126 				// System.out.println("IGNORING: " + servletPath);
127 				return true;
128 			}
129 		}
130 		return false;
131 	}
132 
133 	public static void logout(HttpSession session) {
134 		session.removeAttribute(OPENID_ATTRIBUTE);
135 	}
136 
137 	private Map convertToStringValueMap(Map parameterMap) {
138 		Map ret = new HashMap();
139 		Set set = parameterMap.entrySet();
140 		for (Iterator iter = set.iterator(); iter.hasNext();) {
141 			Map.Entry mapEntry = (Map.Entry) iter.next();
142 			String key = (String) mapEntry.getKey();
143 			String[] value = (String[]) mapEntry.getValue();
144 			ret.put(key, value[0]);
145 		}
146 		return ret;
147 	}
148 
149 	public void destroy() {
150 	}
151 
152 	public static JoidConsumer joid() {
153 		return joid;
154 	}
155 
156 	public static String getCurrentUser(HttpSession session) {
157 		ensureFilterConfiguredProperly();
158 		return (String) session.getAttribute(OPENID_ATTRIBUTE);
159 	}
160 }