Author: ssmiweve
Date: 2009-10-15 12:44:45 +0200 (Thu, 15 Oct 2009)
New Revision: 7305

Modified:
   branches/2.18/war/src/main/java/no/sesat/search/http/filters/UserFilter.java
Log:
strengthen r7304 by
 - avoiding all logout attempts when sesat.user.logout.disabled=true
 - documentation about using sesat.user.logout.disabled=true
 - fix so that parameters after the action=lagout are kept in the redirect
 - fix to avoid the filter chaining more if response was committed (eg from the 
redirect)


Modified: 
branches/2.18/war/src/main/java/no/sesat/search/http/filters/UserFilter.java
===================================================================
--- 
branches/2.18/war/src/main/java/no/sesat/search/http/filters/UserFilter.java    
    2009-10-11 16:42:57 UTC (rev 7304)
+++ 
branches/2.18/war/src/main/java/no/sesat/search/http/filters/UserFilter.java    
    2009-10-15 10:44:45 UTC (rev 7305)
@@ -49,6 +49,8 @@
  * The user's manual logging in with username and password
  *  must be performed in a separate application that fronts to UserService.
  *
+ * @xxx it may be more appropriate that this class belongs in sesat-user 
project?
+ *
  * @version <tt>$Id$</tt>
  */
 public final class UserFilter implements Filter {
@@ -57,6 +59,10 @@
 
     private static final Logger LOG = Logger.getLogger(UserFilter.class);
 
+    private static final String DISABLE_LOGOUT = "sesat.user.logout.disabled";
+    private static final String ACTION_PARAMETER = "action";
+    private static final String LOGOUT_PARAMETER_VALUE = "logout";
+
     // Attributes ----------------------------------------------------
 
     // Static --------------------------------------------------------
@@ -90,7 +96,9 @@
             performAutomaticLogin((HttpServletRequest) request, 
(HttpServletResponse) response);
 
         }
-        chain.doFilter(request, response);
+        if(!response.isCommitted()){
+            chain.doFilter(request, response);
+        }
     }
 
     /**
@@ -130,15 +138,13 @@
         final BasicUserService basicUserService = 
getBasicUserService(datamodel);
 
         if (null != basicUserService) {
-            final SiteConfiguration siteConf = 
datamodel.getSite().getSiteConfiguration();
             final String loginKey = UserCookieUtil.getUserLoginCookie(request);
             final boolean isLegalLoginKey = 
basicUserService.isLegalLoginKey(loginKey);
 
             final BasicUser user = datamodel.getUser().getUser();
             final Date updateTimestamp = 
UserCookieUtil.getUserUpdateCookie(request);
 
-            final boolean actionLogout = 
"logout".equals(request.getParameter("action"))
-                    && 
!Boolean.parseBoolean(siteConf.getProperty("sesat.user.logout.disabled"));
+            final boolean actionLogout = 
LOGOUT_PARAMETER_VALUE.equals(request.getParameter(ACTION_PARAMETER));
 
             if (user == null && isLegalLoginKey) {
 
@@ -153,10 +159,10 @@
                 // Remove the logout from the url to prevent problems with 
sesamBackUrl.
                 if (actionLogout) {
 
-                    final String strippedUrl = request.getRequestURL() + "?"
-                            + request.getQueryString().substring(0, 
request.getQueryString().indexOf("&action"));
+                    final String queryString = request.getQueryString()
+                            .replaceFirst("&?" + ACTION_PARAMETER + '=' + 
LOGOUT_PARAMETER_VALUE, "");
 
-                    redirect(strippedUrl, response);
+                    redirect(request.getRequestURL() + "?" + queryString, 
response);
                 }
 
             } else if (null != user && isLegalLoginKey && 
user.isDirty(updateTimestamp)) {
@@ -211,7 +217,15 @@
 
     /**
      * Method used to reset a session totally.
+     * It removes the user object from the datamodel, calls 
basicUserService.invalidateLogin(loginKey)
+     *  and resets the loginKey cookie to its default value.
      *
+     * The invalidateLogin(..) call and cookie reset can be disabled by 
setting in the skin's configuration.properties
+     * sesat.user.logout.disabled=true
+     *
+     * but the user will always be removed from the datamodel,
+     *  and expected to be re-inserted on the next loginUsingCookie(..) call.
+     *
      * @param datamodel the datamodel
      * @param userService the user service
      * @param response the request response
@@ -221,14 +235,19 @@
             final BasicUserService userService,
             final HttpServletResponse response) {
 
-        final BasicUser user = datamodel.getUser().getUser();
-        LOG.info("Logout: " + user.getFullName());
+        final SiteConfiguration siteConf = 
datamodel.getSite().getSiteConfiguration();
 
-        if (userService.isLegalLoginKey(user.getNextLoginKey())) {
-            userService.invalidateLogin(user.getNextLoginKey());
+        if(!Boolean.parseBoolean(siteConf.getProperty(DISABLE_LOGOUT))){
+
+            final BasicUser user = datamodel.getUser().getUser();
+            LOG.info("Logout: " + user.getFullName());
+
+            if (userService.isLegalLoginKey(user.getNextLoginKey())) {
+                userService.invalidateLogin(user.getNextLoginKey());
+            }
+
+            UserCookieUtil.setUserLoginCookieDefault(response);
         }
-
-        UserCookieUtil.setUserLoginCookieDefault(response);
         datamodel.getUser().setUser(null);
     }
 

_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits

Reply via email to