Author: norman
Date: Sat May 30 17:03:55 2009
New Revision: 780297

URL: http://svn.apache.org/viewvc?rev=780297&view=rev
Log:
Correctly handle dollar sign in local-part of emailaddress. See JSPF-71. Thx to 
Frank Stolle for reporting

Modified:
    
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java
    
james/jspf/trunk/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java

Modified: 
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java
URL: 
http://svn.apache.org/viewvc/james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java?rev=780297&r1=780296&r2=780297&view=diff
==============================================================================
--- 
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java
 (original)
+++ 
james/jspf/trunk/resolver/src/main/java/org/apache/james/jspf/core/MacroExpand.java
 Sat May 30 17:03:55 2009
@@ -278,7 +278,7 @@
                     macroCell = input.substring(inputMatcher.start() + 2, 
inputMatcher
                             .end() - 1);
                     inputMatcher
-                            .appendReplacement(decodedValue, 
replaceCell(macroCell, macroData, isExplanation));
+                            .appendReplacement(decodedValue, 
escapeForMatcher(replaceCell(macroCell, macroData, isExplanation)));
                 } else if (match2.length() == 2 && match2.startsWith("%")) {
                     // handle the % escaping
                     /*
@@ -293,7 +293,7 @@
                     } else if ("%-".equals(match2)) {
                         inputMatcher.appendReplacement(decodedValue, "%20");
                     } else {
-                        inputMatcher.appendReplacement(decodedValue, 
match2.substring(1));
+                        inputMatcher.appendReplacement(decodedValue, 
escapeForMatcher(match2.substring(1)));
                     }
                 }
             }
@@ -562,5 +562,27 @@
         return data.replaceAll("\\+", "%20");
 
     }
+    
+    /**
+     * Because Dollar signs may be treated as references to captured 
subsequences in method Matcher.appendReplacement
+     * its necessary to escape Dollar signs because its allowed in the 
local-part of an emailaddress.
+     * 
+     * See JSPF-71 for the bugreport
+     * 
+     * @param raw
+     * @return escaped string
+     */
+    private String escapeForMatcher(String raw) {
+       StringBuffer sb= new StringBuffer();
+       
+       for (int i = 0; i < raw.length(); i++) {
+               char c = raw.charAt(i);
+               if (c == '$') {
+                       sb.append('\\');
+               }
+               sb.append(c);
+       }
+       return sb.toString();
+    }
 
 }
\ No newline at end of file

Modified: 
james/jspf/trunk/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java
URL: 
http://svn.apache.org/viewvc/james/jspf/trunk/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java?rev=780297&r1=780296&r2=780297&view=diff
==============================================================================
--- 
james/jspf/trunk/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java
 (original)
+++ 
james/jspf/trunk/resolver/src/test/java/org/apache/james/jspf/core/MacroExpandTest.java
 Sat May 30 17:03:55 2009
@@ -184,7 +184,18 @@
     public void testExample6_ipv6() throws PermErrorException {
         assertEquals(
                 
"1.0.B.C.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.B.D.0.1.0.0.2.ip6._spf.example.com",
-                defIp6me.expand("%{ir}.%{v}._spf.%{d2}", new 
rfcIP6MacroData(), MacroExpand.DOMAIN));
+                defIp6me.expand("%{ir}.%{v}._spf.%{d2}", new 
rfcIP6MacroData(), MacroExpand.EXPLANATION));
+    }
+    
+    public void testLocalPartWithSpecialChars() throws PermErrorException {
+       defIp4me.expand("+exists:CL.%{i}.FR.%{s}.spf.test.com", new 
rfcIP4MacroData() {
+               public String getMailFrom() {
+                       return "test{[email protected]";
+               }
+                  public String getCurrentSenderPart() {
+                   return "test{$LNAME}";
+               }
+       }, MacroExpand.DOMAIN);
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to