Author: markt
Date: Wed May 21 12:31:10 2014
New Revision: 1596559

URL: http://svn.apache.org/r1596559
Log:
Apply patch 03 from jboynes to improve cookie handling.
Allow V0 cookies to use names that start with $.
Add a (currently unused) RFC6265 Cookie validator.
Patch should be safe since it relaxes the current behaviour.
Added:
    tomcat/trunk/test/javax/servlet/http/TestCookieRFC6265Validator.java   
(with props)
Modified:
    tomcat/trunk/java/javax/servlet/http/Cookie.java
    tomcat/trunk/test/javax/servlet/http/TestCookie.java
    tomcat/trunk/test/javax/servlet/http/TestCookieRFC2109Validator.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/javax/servlet/http/Cookie.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/javax/servlet/http/Cookie.java?rev=1596559&r1=1596558&r2=1596559&view=diff
==============================================================================
--- tomcat/trunk/java/javax/servlet/http/Cookie.java (original)
+++ tomcat/trunk/java/javax/servlet/http/Cookie.java Wed May 21 12:31:10 2014
@@ -384,7 +384,7 @@ public class Cookie implements Cloneable
 
 class CookieNameValidator {
     private static final String LSTRING_FILE = 
"javax.servlet.http.LocalStrings";
-    private static final ResourceBundle lStrings = 
ResourceBundle.getBundle(LSTRING_FILE);
+    protected static final ResourceBundle lStrings = 
ResourceBundle.getBundle(LSTRING_FILE);
 
     protected final BitSet allowed;
 
@@ -401,7 +401,7 @@ class CookieNameValidator {
         if (name == null || name.length() == 0) {
             throw new 
IllegalArgumentException(lStrings.getString("err.cookie_name_blank"));
         }
-        if (!isToken(name) || name.startsWith("$")) {
+        if (!isToken(name)) {
             String errMsg = lStrings.getString("err.cookie_name_is_token");
             throw new IllegalArgumentException(MessageFormat.format(errMsg, 
name));
         }
@@ -428,10 +428,10 @@ class NetscapeValidator extends CookieNa
     }
 }
 
-class RFC2109Validator extends CookieNameValidator {
+class RFC6265Validator extends CookieNameValidator {
     private static final String RFC2616_SEPARATORS = "()<>@,;:\\\"/[]?={} \t";
 
-    RFC2109Validator() {
+    RFC6265Validator() {
         super(RFC2616_SEPARATORS);
 
         // special treatment to allow for FWD_SLASH_IS_SEPARATOR property
@@ -447,3 +447,17 @@ class RFC2109Validator extends CookieNam
         }
     }
 }
+
+class RFC2109Validator extends RFC6265Validator {
+    RFC2109Validator() {
+    }
+
+    @Override
+    void validate(String name) {
+        super.validate(name);
+        if (name.charAt(0) == '$') {
+            String errMsg = lStrings.getString("err.cookie_name_is_token");
+            throw new IllegalArgumentException(MessageFormat.format(errMsg, 
name));
+        }
+    }
+}

Modified: tomcat/trunk/test/javax/servlet/http/TestCookie.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/javax/servlet/http/TestCookie.java?rev=1596559&r1=1596558&r2=1596559&view=diff
==============================================================================
--- tomcat/trunk/test/javax/servlet/http/TestCookie.java (original)
+++ tomcat/trunk/test/javax/servlet/http/TestCookie.java Wed May 21 12:31:10 
2014
@@ -66,11 +66,11 @@ public class TestCookie {
         Assert.assertEquals(0, cookie.getVersion());
     }
 
-
-    @Test(expected = IllegalArgumentException.class)
-    public void leadingDollar() {
-        @SuppressWarnings("unused")
-        Cookie c = new Cookie("$Version", null);
+    @Test()
+    public void defaultImpliesNetscape() {
+        // $Foo is allowed by Netscape but not by RFC2109
+        Cookie cookie = new Cookie("$Foo", null);
+        Assert.assertEquals("$Foo", cookie.getName());
     }
 
     @Test

Modified: tomcat/trunk/test/javax/servlet/http/TestCookieRFC2109Validator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/javax/servlet/http/TestCookieRFC2109Validator.java?rev=1596559&r1=1596558&r2=1596559&view=diff
==============================================================================
--- tomcat/trunk/test/javax/servlet/http/TestCookieRFC2109Validator.java 
(original)
+++ tomcat/trunk/test/javax/servlet/http/TestCookieRFC2109Validator.java Wed 
May 21 12:31:10 2014
@@ -32,4 +32,9 @@ public class TestCookieRFC2109Validator 
     public void actualCharactersAllowedInName() {
         TestCookie.checkCharInName(validator, TestCookie.TOKEN);
     }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void leadingDollar() {
+        validator.validate("$Version");
+    }
 }

Added: tomcat/trunk/test/javax/servlet/http/TestCookieRFC6265Validator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/javax/servlet/http/TestCookieRFC6265Validator.java?rev=1596559&view=auto
==============================================================================
--- tomcat/trunk/test/javax/servlet/http/TestCookieRFC6265Validator.java (added)
+++ tomcat/trunk/test/javax/servlet/http/TestCookieRFC6265Validator.java Wed 
May 21 12:31:10 2014
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package javax.servlet.http;
+
+import org.junit.Test;
+
+/**
+ * Basic tests for Cookie in default configuration.
+ */
+public class TestCookieRFC6265Validator {
+    static {
+        
System.setProperty("org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR",
 "true");
+    }
+
+    private RFC6265Validator validator = new RFC6265Validator();
+
+    @Test
+    public void actualCharactersAllowedInName() {
+        TestCookie.checkCharInName(validator, TestCookie.TOKEN);
+    }
+
+    @Test()
+    public void leadingDollar() {
+        validator.validate("$Version");
+    }
+}
\ No newline at end of file

Propchange: tomcat/trunk/test/javax/servlet/http/TestCookieRFC6265Validator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1596559&r1=1596558&r2=1596559&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Wed May 21 12:31:10 2014
@@ -89,6 +89,11 @@
         names. The restriction that prevented such usage has been removed.
         (jboynes/markt) 
       </fix>
+      <fix>
+        Further relax cookie naming restrictions. Version 0 (a.k.a Netscape
+        format) cookies may now use names that start with the <code>$</code>
+        character. (jboynes/markt) 
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to