You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2010/05/14 21:00:21 UTC
svn commit: r944398 - in /tomcat/tc6.0.x/trunk: STATUS.txt
java/org/apache/catalina/connector/Request.java
java/org/apache/catalina/connector/Response.java webapps/docs/changelog.xml
Author: markt
Date: Fri May 14 19:00:21 2010
New Revision: 944398
URL: http://svn.apache.org/viewvc?rev=944398&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49158
Ensure only one session cookie is returned for a single request.
Modified:
tomcat/tc6.0.x/trunk/STATUS.txt
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java
tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java
tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
Modified: tomcat/tc6.0.x/trunk/STATUS.txt
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/STATUS.txt?rev=944398&r1=944397&r2=944398&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/STATUS.txt (original)
+++ tomcat/tc6.0.x/trunk/STATUS.txt Fri May 14 19:00:21 2010
@@ -221,21 +221,6 @@ PATCHES PROPOSED TO BACKPORT:
+1: kkolinko, markt, rjung
-1:
-* Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=49158
- http://svn.apache.org/viewvc?view=revision&revision=935998
- +1: fhanik
- -1: kkolinko: 1) because Response#addSessionCookieInternal(..) skips
- cookies.add(cookie); call
- 2) you need to take care of the useHttpOnly flag
- -1:
- Alternative patch that addresses Konstatin's review comments
- http://people.apache.org/~markt/patches/2010-05-05-bug49158.patch
- +1: markt, kkolinko, rjung
- -1:
- kkolinko: (Trivial: in generateCookieString() you can declare
- httpOnlyParam as "final" and get rid of a local variable.)
-
-
* Configure Tomcat to use HttpOnly for session cookies by default
http://people.apache.org/~kkolinko/patches/2010-04-21_tc6_context_httpOnly.patch
+1: kkolinko
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java?rev=944398&r1=944397&r2=944398&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Request.java Fri May 14 19:00:21 2010
@@ -68,7 +68,6 @@ import org.apache.catalina.core.Applicat
import org.apache.catalina.realm.GenericPrincipal;
import org.apache.catalina.util.Enumerator;
import org.apache.catalina.util.ParameterMap;
-import org.apache.catalina.util.RequestUtil;
import org.apache.catalina.util.StringManager;
import org.apache.catalina.util.StringParser;
@@ -2269,9 +2268,10 @@ public class Request
newCookie.setSecure(true);
}
if (context == null) {
- response.addCookieInternal(newCookie, false);
+ response.addSessionCookieInternal(newCookie, false);
} else {
- response.addCookieInternal(newCookie, context.getUseHttpOnly());
+ response.addSessionCookieInternal(newCookie,
+ context.getUseHttpOnly());
}
}
}
@@ -2398,7 +2398,7 @@ public class Request
Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME,
session.getIdInternal());
configureSessionCookie(cookie);
- response.addCookieInternal(cookie, context.getUseHttpOnly());
+ response.addSessionCookieInternal(cookie, context.getUseHttpOnly());
}
if (session != null) {
Modified: tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java?rev=944398&r1=944397&r2=944398&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java (original)
+++ tomcat/tc6.0.x/trunk/java/org/apache/catalina/connector/Response.java Fri May 14 19:00:21 2010
@@ -30,6 +30,7 @@ import java.security.PrivilegedException
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Enumeration;
+import java.util.Iterator;
import java.util.Locale;
import java.util.TimeZone;
import java.util.Vector;
@@ -222,7 +223,7 @@ public class Response
/**
* The set of Cookies associated with this Response.
*/
- protected ArrayList cookies = new ArrayList();
+ protected ArrayList<Cookie> cookies = new ArrayList<Cookie>();
/**
@@ -864,7 +865,7 @@ public class Response
* a zero-length array if no cookies have been set.
*/
public Cookie[] getCookies() {
- return ((Cookie[]) cookies.toArray(new Cookie[cookies.size()]));
+ return cookies.toArray(new Cookie[cookies.size()]);
}
@@ -968,7 +969,47 @@ public class Response
}
-
+ /**
+ * Special method for adding a session cookie as we should be overriding
+ * any previous
+ * @param cookie
+ */
+ public void addSessionCookieInternal(final Cookie cookie,
+ boolean httpOnly) {
+ if (isCommitted())
+ return;
+
+ String name = cookie.getName();
+ final String headername = "Set-Cookie";
+ final String startsWith = name + "=";
+ final StringBuffer sb = generateCookieString(cookie, httpOnly);
+ boolean set = false;
+ MimeHeaders headers = coyoteResponse.getMimeHeaders();
+ int n = headers.size();
+ for (int i = 0; i < n; i++) {
+ if (headers.getName(i).toString().equals(headername)) {
+ if (headers.getValue(i).toString().startsWith(startsWith)) {
+ headers.setValue(sb.toString());
+ set = true;
+ }
+ }
+ }
+ if (set) {
+ Iterator<Cookie> iter = cookies.iterator();
+ while (iter.hasNext()) {
+ Cookie c = iter.next();
+ if (name.equals(c.getName())) {
+ iter.remove();
+ break;
+ }
+ }
+ } else {
+ addHeader(headername, sb.toString());
+ }
+ cookies.add(cookie);
+
+
+ }
/**
* Add the specified Cookie to those that will be included with
* this Response.
@@ -991,6 +1032,18 @@ public class Response
if (isCommitted())
return;
+ final StringBuffer sb = generateCookieString(cookie, httpOnly);
+ //if we reached here, no exception, cookie is valid
+ // the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
+ // RFC2965 is not supported by browsers and the Servlet spec
+ // asks for 2109.
+ addHeader("Set-Cookie", sb.toString());
+
+ cookies.add(cookie);
+ }
+
+ public StringBuffer generateCookieString(final Cookie cookie,
+ final boolean httpOnly) {
final StringBuffer sb = new StringBuffer();
//web application code can receive a IllegalArgumentException
//from the appendCookieValue invokation
@@ -1012,13 +1065,7 @@ public class Response
cookie.getPath(), cookie.getDomain(), cookie.getComment(),
cookie.getMaxAge(), cookie.getSecure(), httpOnly);
}
- //if we reached here, no exception, cookie is valid
- // the header name is Set-Cookie for both "old" and v.1 ( RFC2109 )
- // RFC2965 is not supported by browsers and the Servlet spec
- // asks for 2109.
- addHeader("Set-Cookie", sb.toString());
-
- cookies.add(cookie);
+ return sb;
}
Modified: tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml
URL: http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml?rev=944398&r1=944397&r2=944398&view=diff
==============================================================================
--- tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc6.0.x/trunk/webapps/docs/changelog.xml Fri May 14 19:00:21 2010
@@ -103,6 +103,10 @@
prevent memory leak. (kfujino)
</fix>
<fix>
+ <bug>49158</bug>: Ensure only one session cookie is returned for a
+ single request. (markt/fhanik)
+ </fix>
+ <fix>
<bug>49245</bug>: Fix session expiration check in cross-context
requests. (markt)
</fix>
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org