You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rd...@apache.org on 2007/10/24 20:16:38 UTC

svn commit: r587951 - in /james/jsieve/trunk/src: main/java/org/apache/jsieve/SieveParserVisitorImpl.java main/jjtree/sieve/sieve.jjt test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java test/java/org/apache/jsieve/junit/QuotingTest.java

Author: rdonkin
Date: Wed Oct 24 11:16:38 2007
New Revision: 587951

URL: http://svn.apache.org/viewvc?rev=587951&view=rev
Log:
Support escaping within quoted strings as per RFC3028. https://issues.apache.org/jira/browse/JSIEVE-18. Contributed by Dennis Sieben, JSIEVE-18.

Added:
    james/jsieve/trunk/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java
    james/jsieve/trunk/src/test/java/org/apache/jsieve/junit/QuotingTest.java
Modified:
    james/jsieve/trunk/src/main/java/org/apache/jsieve/SieveParserVisitorImpl.java
    james/jsieve/trunk/src/main/jjtree/sieve/sieve.jjt

Modified: james/jsieve/trunk/src/main/java/org/apache/jsieve/SieveParserVisitorImpl.java
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/src/main/java/org/apache/jsieve/SieveParserVisitorImpl.java?rev=587951&r1=587950&r2=587951&view=diff
==============================================================================
--- james/jsieve/trunk/src/main/java/org/apache/jsieve/SieveParserVisitorImpl.java (original)
+++ james/jsieve/trunk/src/main/java/org/apache/jsieve/SieveParserVisitorImpl.java Wed Oct 24 11:16:38 2007
@@ -207,11 +207,21 @@
      */
     public Object visit(ASTstring node, Object data) {
         // Strings are always surround by double-quotes
-        String value = (String) node.getValue();
-        String string = value.substring(1, value.length() - 1);
-
+        final String value = (String) node.getValue();
+        final StringBuffer buffer = new StringBuffer(value);
+        buffer.deleteCharAt(value.length() - 1);
+        buffer.deleteCharAt(0);
+        int i = 0;
+        while (i<buffer.length()) {
+            if ('\\' == buffer.charAt(i)) {
+                buffer.deleteCharAt(i);
+            }
+            i++;
+        }
+        
+        final String result = buffer.toString();
         // A String is terminal, add it
-        ((List) data).add(string);
+        ((List) data).add(result);
         return data;
     }
 

Modified: james/jsieve/trunk/src/main/jjtree/sieve/sieve.jjt
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/src/main/jjtree/sieve/sieve.jjt?rev=587951&r1=587950&r2=587951&view=diff
==============================================================================
--- james/jsieve/trunk/src/main/jjtree/sieve/sieve.jjt (original)
+++ james/jsieve/trunk/src/main/jjtree/sieve/sieve.jjt Wed Oct 24 11:16:38 2007
@@ -120,7 +120,7 @@
 // note that newlines and other characters are all allowed strings
   < QUOTED_STRING:
       "\""
-      (~["\""])*
+      (~["\""]|"\\\"")*
       "\""
   >
 |

Added: james/jsieve/trunk/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java?rev=587951&view=auto
==============================================================================
--- james/jsieve/trunk/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java (added)
+++ james/jsieve/trunk/src/test/java/org/apache/jsieve/SieveParserVisitorImplQuoteTest.java Wed Oct 24 11:16:38 2007
@@ -0,0 +1,94 @@
+/****************************************************************
+ * 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 org.apache.jsieve;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.jsieve.parser.generated.ASTstring;
+
+import junit.framework.TestCase;
+
+public class SieveParserVisitorImplQuoteTest extends TestCase {
+
+    SieveParserVisitorImpl visitor;
+    List data;
+    ASTstring node;
+    
+    protected void setUp() throws Exception {
+        super.setUp();
+        visitor = new SieveParserVisitorImpl();
+        data = new ArrayList();
+        node = new ASTstring(100);
+    }
+
+    protected void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testVisitASTstringObjectQuoted() {
+
+        node.setValue("\"value\"");
+        visitor.visit(node, data);
+        assertEquals("Data value added after quotes stripped", 1, data.size());
+        assertEquals("Data value added after quotes stripped", "value", data.get(0));
+    }
+
+    public void testVisitASTstringObjectQuoteInQuoted() {
+
+        node.setValue("\"val\\\"ue\"");
+        visitor.visit(node, data);
+        assertEquals("Data value added after quotes stripped", 1, data.size());
+        assertEquals("Data value added after quotes stripped", "val\"ue", data.get(0));
+    }
+    
+    public void testVisitASTstringObjectDoubleSlashQuoted() {
+
+        node.setValue("\"val\\\\ue\"");
+        visitor.visit(node, data);
+        assertEquals("Data value added after quotes stripped", 1, data.size());
+        assertEquals("Data value added after quotes stripped", "val\\ue", data.get(0));
+    }
+    
+    
+    public void testVisitASTstringObjectSlashQuoted() {
+
+        node.setValue("\"val\\ue\"");
+        visitor.visit(node, data);
+        assertEquals("Data value added after quotes stripped", 1, data.size());
+        assertEquals("Data value added after quotes stripped", "value", data.get(0));
+    }
+    
+    public void testVisitASTstringEmptyQuoted() {
+
+        node.setValue("\"\"");
+        visitor.visit(node, data);
+        assertEquals("Data value added after quotes stripped", 1, data.size());
+        assertEquals("Data value added after quotes stripped", "", data.get(0));
+    }
+    
+    public void testVisitASTstringObjectMultiSlashQuoted() {
+
+        node.setValue("\"v\\\\al\\\\u\\e\\\\\"");
+        visitor.visit(node, data);
+        assertEquals("Data value added after quotes stripped", 1, data.size());
+        assertEquals("Data value added after quotes stripped", "v\\al\\ue\\", data.get(0));
+    }
+}

Added: james/jsieve/trunk/src/test/java/org/apache/jsieve/junit/QuotingTest.java
URL: http://svn.apache.org/viewvc/james/jsieve/trunk/src/test/java/org/apache/jsieve/junit/QuotingTest.java?rev=587951&view=auto
==============================================================================
--- james/jsieve/trunk/src/test/java/org/apache/jsieve/junit/QuotingTest.java (added)
+++ james/jsieve/trunk/src/test/java/org/apache/jsieve/junit/QuotingTest.java Wed Oct 24 11:16:38 2007
@@ -0,0 +1,42 @@
+/****************************************************************
+ * 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 org.apache.jsieve.junit;
+
+import junit.framework.TestCase;
+
+import org.apache.jsieve.junit.commands.ThrowTestException;
+import org.apache.jsieve.junit.utils.JUnitUtils;
+import org.apache.jsieve.junit.utils.SieveMailAdapter;
+
+public class QuotingTest extends TestCase {
+
+    public void testQuoteInQuotedString() throws Exception {
+        String script = "if header :is \"X-Test\" \"Before\\\"After\" {throwTestException;}";
+        
+        final SieveMailAdapter mail = (SieveMailAdapter) JUnitUtils.createMail();
+        mail.getMessage().addHeader("X-Test", "Before\"After");
+        try {
+            JUnitUtils.interpret(mail, script);
+            fail("Expected header to be matched");
+        } catch (ThrowTestException.TestException e) {
+            // expected
+        }
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org