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
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
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
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
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
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
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
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 }