svnno****@sourc*****
svnno****@sourc*****
2008年 5月 15日 (木) 08:52:08 JST
Revision: 916 http://svn.sourceforge.jp/cgi-bin/viewcvs.cgi?root=pal&view=rev&rev=916 Author: shinsuke Date: 2008-05-15 08:52:08 +0900 (Thu, 15 May 2008) Log Message: ----------- added servlet filter to transfer cookie to others. Added Paths: ----------- pal-portal/trunk/portal/files/components/portal/src/java/jp/sf/pal/portal/filter/CookieTransferFilter.java -------------- next part -------------- Added: pal-portal/trunk/portal/files/components/portal/src/java/jp/sf/pal/portal/filter/CookieTransferFilter.java =================================================================== --- pal-portal/trunk/portal/files/components/portal/src/java/jp/sf/pal/portal/filter/CookieTransferFilter.java (rev 0) +++ pal-portal/trunk/portal/files/components/portal/src/java/jp/sf/pal/portal/filter/CookieTransferFilter.java 2008-05-14 23:52:08 UTC (rev 916) @@ -0,0 +1,241 @@ +package jp.sf.pal.portal.filter; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.prefs.Preferences; + +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.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jetspeed.Jetspeed; +import org.apache.jetspeed.security.SecurityException; +import org.apache.jetspeed.security.User; +import org.apache.jetspeed.security.UserManager; + +public class CookieTransferFilter implements Filter { + private static final Log log = LogFactory + .getLog(CookieTransferFilter.class); + + private static final String EMPTY_STRING = ""; + + protected static final String IS_TRANSFERRED = "jp.sf.pal.portal.login.TransferredInfo"; + + // see JSR 168 PLT.D + // an username and password are defined as "username" and "password". + // a format of transferrred.info is "<user-defined-value>=<PLT.D-value>,..". + protected static final String TRANSFERRED_INFO = "transferred.info"; + + protected static final String PATH = "path"; + + protected static final String DOMAIN = "domain"; + + protected static final String MAX_AGE = "max.age"; + + protected static final String SECURE = "secure"; + + protected static final String USERNAME = "username"; + + protected String path; + + protected String domain; + + protected int maxAge = -1; + + protected boolean secure = false; + + protected String usernameKey; + + protected Map transferredInfo; + + public void init(FilterConfig filterConfig) throws ServletException { + + path = filterConfig.getInitParameter(PATH); + domain = filterConfig.getInitParameter(DOMAIN); + String value = filterConfig.getInitParameter(MAX_AGE); + if (value != null) { + try { + maxAge = Integer.parseInt(value); + } catch (NumberFormatException e) { + } + } + value = filterConfig.getInitParameter(SECURE); + if (value != null && value.equalsIgnoreCase("true")) { + secure = true; + } + + transferredInfo = new HashMap(); + value = filterConfig.getInitParameter(TRANSFERRED_INFO); + if (value != null) { + StringTokenizer st = new StringTokenizer(value, ", \t\n\r\f"); + while (st.hasMoreTokens()) { + String pair = st.nextToken(); + int index = pair.indexOf("="); + if (index > 0 && index + 1 < pair.length()) { + String k = pair.substring(0, index); + String v = pair.substring(index + 1); + + if (USERNAME.equals(v)) { + usernameKey = k; + } else { + transferredInfo.put(k, v); + } + } + } + } + + // debug + if (log.isDebugEnabled()) { + log.debug("path=" + path); + log.debug("domain=" + domain); + log.debug("maxAge=" + maxAge); + log.debug("secure=" + secure); + log.debug("transferredInfo=" + transferredInfo); + } + } + + public void destroy() { + path = null; + domain = null; + usernameKey = null; + transferredInfo = null; + } + + public void doFilter(ServletRequest request, ServletResponse response, + FilterChain chain) throws IOException, ServletException { + + if (request instanceof HttpServletRequest + && response instanceof HttpServletResponse) { + HttpServletRequest hRequest = (HttpServletRequest) request; + HttpServletResponse hResponse = (HttpServletResponse) response; + String username = hRequest.getRemoteUser(); + if (username != null) { + if (!checkTransferredInfo(hRequest, false)) { + UserManager userManager = (UserManager) Jetspeed + .getComponentManager().getComponent( + "org.apache.jetspeed.security.UserManager"); + + if (usernameKey != null) { + hResponse.addCookie(createNewCookie(usernameKey, + username)); + } + + if (!transferredInfo.isEmpty()) { + try { + User user = userManager.getUser(username); + Preferences userAttributes = user + .getUserAttributes(); + Iterator itr = transferredInfo.entrySet() + .iterator(); + while (itr.hasNext()) { + Map.Entry entry = (Map.Entry) itr.next(); + String value = userAttributes + .get((String) entry.getValue(), + EMPTY_STRING); + if (!value.equals(EMPTY_STRING)) { + hResponse.addCookie(createNewCookie( + (String) entry.getKey(), value)); + } + } + } catch (SecurityException e) { + log.warn( + "Could not get the user info: " + username, + e); + } + } + + // additional tasks + storeCookies(hRequest, hResponse); + + hRequest.getSession().setAttribute(IS_TRANSFERRED, + Boolean.TRUE); + } + } else { + if (checkTransferredInfo(hRequest, true)) { + + if (usernameKey != null) { + hResponse.addCookie(createExpiredCookie(usernameKey)); + } + + if (!transferredInfo.isEmpty()) { + Iterator itr = transferredInfo.entrySet().iterator(); + while (itr.hasNext()) { + Map.Entry entry = (Map.Entry) itr.next(); + hResponse + .addCookie(createExpiredCookie((String) entry + .getKey())); + } + } + + // additional tasks + removeCookies(hRequest, hResponse); + + hRequest.getSession().setAttribute(IS_TRANSFERRED, + Boolean.FALSE); + } + } + } + + if (chain != null) { + chain.doFilter(request, response); + } + + } + + protected boolean checkTransferredInfo(HttpServletRequest hRequest, + boolean defaultValue) { + HttpSession session = hRequest.getSession(false); + if (session != null) { + Boolean isTransferredInfo = (Boolean) session + .getAttribute(IS_TRANSFERRED); + if (isTransferredInfo != null) { + return isTransferredInfo.booleanValue(); + } + } + return defaultValue; + } + + protected Cookie createNewCookie(String name, String value) { + return createCookie(name, value, maxAge); + } + + protected Cookie createExpiredCookie(String name) { + return createCookie(name, EMPTY_STRING, 0); + } + + private Cookie createCookie(String name, String value, int age) { + Cookie cookie = new Cookie(name, value); + if (domain != null) { + cookie.setDomain(domain); + } + if (path != null) { + cookie.setPath("/"); + } + cookie.setMaxAge(age); + if (secure) { + cookie.setSecure(secure); + } + return cookie; + } + + protected void storeCookies(HttpServletRequest hRequest, + HttpServletResponse hResponse) { + } + + protected void removeCookies(HttpServletRequest hRequest, + HttpServletResponse hResponse) { + } + +} Property changes on: pal-portal/trunk/portal/files/components/portal/src/java/jp/sf/pal/portal/filter/CookieTransferFilter.java ___________________________________________________________________ Name: svn:eol-style + native