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 no...@apache.org on 2009/05/30 19:03:55 UTC

svn commit: r780297 - in /james/jspf/trunk/resolver/src: main/java/org/apache/james/jspf/core/MacroExpand.java test/java/org/apache/james/jspf/core/MacroExpandTest.java

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{$LNAME}@email.example.com";
+    		}
+    		   public String getCurrentSenderPart() {
+    	            return "test{$LNAME}";
+    	        }
+    	}, MacroExpand.DOMAIN);
     }
 
 }



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