Hi all,

I encountered a bug in the MailboxQuery class, posted as the following ticket: https://issues.apache.org/jira/browse/JAMES-1566 . It occures for folder names which contain unclosed parentheses (like "Folder.foo(bar") and will raise the following exception:

java.util.regex.PatternSyntaxException: Unclosed group near index 13
Folder.foo(bar
                        ^
    at java.util.regex.Pattern.error(Pattern.java:1955)
    at java.util.regex.Pattern.accept(Pattern.java:1813)
    at java.util.regex.Pattern.group0(Pattern.java:2908)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.compile(Pattern.java:1696)
    at java.util.regex.Pattern.<init>(Pattern.java:1351)
    at java.util.regex.Pattern.compile(Pattern.java:1028)
at org.apache.james.mailbox.model.MailboxQuery.<init>(MailboxQuery.java:72) at org.apache.james.imap.processor.ListProcessor.doProcess(ListProcessor.java:175)
[...]

A possible workaround is to always treat the whole folder name literally and only replace the wildcard characters. I made a patch which should solve the problem.

Best regards
Thomas
### Eclipse Workspace Patch 1.0
#P mailbox-trunk-temp
Index: api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java
===================================================================
--- api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java  
(revision 1651383)
+++ api/src/main/java/org/apache/james/mailbox/model/MailboxQuery.java  
(working copy)
@@ -68,8 +68,11 @@
         }
         this.pathDelimiter = pathDelimiter;
 
+        //escape the whole string and replace the wildcard characters
+        String escapedRegex = ("\\Q" + this.expression + 
"\\E").replace(""+getFreeWildcard(), "\\E.*\\Q").replace(""+getLocalWildcard(), 
"\\E[^\\Q" + pathDelimiter + "\\E]*\\Q" );
+       
         // Compile some pattern which is used later
-        pattern = Pattern.compile(this.expression.replaceAll("\\" + 
pathDelimiter ,"\\\\" + pathDelimiter).replaceAll("\\*", 
"\\.\\*").replaceAll("\\%", "[^\\" + pathDelimiter  + "]*"));
+        pattern = Pattern.compile(escapedRegex);
     }
 
     /**
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to