[pal-cvs 3180] [916] added servlet filter to transfer cookie to others.

Back to archive index

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


pal-cvs メーリングリストの案内
Back to archive index