Author: bago
Date: Mon Jan 15 08:50:29 2007
New Revision: 496403
URL: http://svn.apache.org/viewvc?view=rev&rev=496403
Log:
Second fix for macro expansion: now it should be strict and compliant.
Modified:
james/jspf/trunk/src/main/java/org/apache/james/jspf/macro/MacroExpand.java
james/jspf/trunk/src/main/java/org/apache/james/jspf/terms/ExpModifier.java
james/jspf/trunk/src/main/java/org/apache/james/jspf/util/SPFTermsRegexps.java
Modified:
james/jspf/trunk/src/main/java/org/apache/james/jspf/macro/MacroExpand.java
URL:
http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/macro/MacroExpand.java?view=diff&rev=496403&r1=496402&r2=496403
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/macro/MacroExpand.java
(original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/macro/MacroExpand.java
Mon Jan 15 08:50:29 2007
@@ -44,11 +44,11 @@
private Pattern macroStringPattern;
- private Pattern cellPattern;
+ private Pattern macroLettersPattern;
- private Matcher cellMatcher;
+ private Pattern macroLettersExpPattern;
- private boolean isExplanation = false;
+ private Pattern cellPattern;
private Logger log;
@@ -64,6 +64,10 @@
domainSpecPattern =
Pattern.compile(SPFTermsRegexps.DOMAIN_SPEC_REGEX_R);
// The real pattern replacer
macroStringPattern =
Pattern.compile(SPFTermsRegexps.MACRO_STRING_REGEX_TOKEN);
+ // The macro letters pattern
+ macroLettersPattern =
Pattern.compile(SPFTermsRegexps.MACRO_LETTER_PATTERN);
+ // The macro letters pattern for explanation
+ macroLettersExpPattern =
Pattern.compile(SPFTermsRegexps.MACRO_LETTER_PATTERN_EXP);
log = logger;
}
@@ -81,11 +85,10 @@
log.debug("Start do expand explanation: " + input);
String[] parts = input.split(" ");
- isExplanation = true;
StringBuffer res = new StringBuffer();
for (int i = 0; i < parts.length; i++) {
if (i > 0) res.append(" ");
- res.append(expandMacroString(parts[i]));
+ res.append(expandMacroString(parts[i], true));
}
log.debug("Done expand explanation: " + res);
@@ -110,27 +113,28 @@
throw new PermErrorException("Invalid DomainSpec: "+input);
}
- System.err.println(inputMatcher.group(1)+"|"+inputMatcher.group(2));
StringBuffer res = new StringBuffer();
if (inputMatcher.group(1) != null && inputMatcher.group(1).length() >
0) {
- res.append(expandMacroString(inputMatcher.group(1)));
+ res.append(expandMacroString(inputMatcher.group(1), false));
}
if (inputMatcher.group(2) != null && inputMatcher.group(2).length() >
0) {
if (inputMatcher.group(2).startsWith(".")) {
res.append(inputMatcher.group(2));
} else {
- res.append(expandMacroString(inputMatcher.group(2)));
+ res.append(expandMacroString(inputMatcher.group(2), false));
}
}
- isExplanation = false;
- String domainName = expandMacroString(input);
+ String domainName = expandMacroString(input, false);
// reduce to less than 255 characters, deleting subdomains from left
int split = 0;
while (domainName.length() > 255 && split > -1) {
split = domainName.indexOf(".");
domainName = domainName.substring(split + 1);
}
+
+ log.debug("Domain expanded: " + domainName);
+
return domainName;
}
@@ -143,7 +147,7 @@
* @throws PermErrorException
* This get thrown if invalid macros are used
*/
- private String expandMacroString(String input) throws PermErrorException {
+ private String expandMacroString(String input, boolean isExplanation)
throws PermErrorException {
StringBuffer decodedValue = new StringBuffer();
Matcher inputMatcher = macroStringPattern.matcher(input);
@@ -153,14 +157,14 @@
while (inputMatcher.find()) {
String match2 = inputMatcher.group();
if (pos != inputMatcher.start()) {
- throw new PermErrorException("Middle part does not match:
"+input.substring(0,pos)+">>"+input.substring(pos,
inputMatcher.start())+"<<"+input.substring(inputMatcher.start()));
+ throw new PermErrorException("Middle part does not match:
"+input.substring(0,pos)+">>"+input.substring(pos,
inputMatcher.start())+"<<"+input.substring(inputMatcher.start())+"
["+input+"]");
}
if (match2.length() > 0) {
if (match2.startsWith("%{")) {
macroCell = input.substring(inputMatcher.start() + 2,
inputMatcher
.end() - 1);
inputMatcher
- .appendReplacement(decodedValue,
replaceCell(macroCell));
+ .appendReplacement(decodedValue,
replaceCell(macroCell, isExplanation));
} else if (match2.length() == 2 && match2.startsWith("%")) {
// handle the % escaping
inputMatcher.appendReplacement(decodedValue,
match2.substring(1));
@@ -188,42 +192,36 @@
* @throws PermErrorException
* Get thrown if an error in processing happen
*/
- private String replaceCell(String replaceValue) throws PermErrorException {
+ private String replaceCell(String replaceValue, boolean isExplanation)
throws PermErrorException {
String variable = "";
String domainNumber = "";
boolean isReversed = false;
String delimeters = ".";
- if (isExplanation) {
- // Find command
- cellPattern = Pattern.compile("[ctCT]");
- cellMatcher = cellPattern.matcher(replaceValue);
- while (cellMatcher.find()) {
- if (cellMatcher.group().toUpperCase().equals(
- cellMatcher.group())) {
- variable = encodeURL(matchMacro(cellMatcher.group()));
- } else {
- variable = matchMacro(cellMatcher.group());
- }
- }
- }
+
// Get only command character so that 'r' command and 'r' modifier
don't
// clash
String commandCharacter = replaceValue.substring(0, 1);
+ Matcher cellMatcher;
// Find command
- cellPattern = Pattern.compile("[lsodipvhrLSODIPVHR]");
- cellMatcher = cellPattern.matcher(commandCharacter);
- while (cellMatcher.find()) {
+ if (isExplanation) {
+ cellMatcher = macroLettersExpPattern.matcher(commandCharacter);
+ } else {
+ cellMatcher = macroLettersPattern.matcher(commandCharacter);
+ }
+ if (cellMatcher.find()) {
if (cellMatcher.group().toUpperCase().equals(cellMatcher.group()))
{
variable = encodeURL(matchMacro(cellMatcher.group()));
} else {
variable = matchMacro(cellMatcher.group());
}
+ // Remove Macro code so that r macro code does not clash with r the
+ // reverse modifier
+ replaceValue = replaceValue.substring(1);
+ } else {
+ throw new PermErrorException("MacroLetter not found:
"+replaceValue);
}
- // Remove Macro code so that r macro code does not clash with r the
- // reverse modifier
- replaceValue = replaceValue.substring(1);
// Find number of domains to use
cellPattern = Pattern.compile("\\d+");
Modified:
james/jspf/trunk/src/main/java/org/apache/james/jspf/terms/ExpModifier.java
URL:
http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/terms/ExpModifier.java?view=diff&rev=496403&r1=496402&r2=496403
==============================================================================
--- james/jspf/trunk/src/main/java/org/apache/james/jspf/terms/ExpModifier.java
(original)
+++ james/jspf/trunk/src/main/java/org/apache/james/jspf/terms/ExpModifier.java
Mon Jan 15 08:50:29 2007
@@ -51,8 +51,9 @@
*
* @param spfData
* The SPF1Data which should used
+ * @throws PermErrorException
*/
- protected void checkSPFLogged(SPF1Data spfData) {
+ protected void checkSPFLogged(SPF1Data spfData) throws PermErrorException {
String exp = null;
String host = getHost();
@@ -65,8 +66,9 @@
if (spfData.getCurrentResult()== null ||
!spfData.getCurrentResult().equals(SPF1Constants.FAIL))
return;
+ host = new MacroExpand(spfData, log).expandDomain(host);
+
try {
- host = new MacroExpand(spfData, log).expandDomain(host);
try {
exp = getTxtType(dnsService, host);
} catch (TempErrorException e) {
@@ -79,6 +81,7 @@
.expandExplanation(exp));
}
} catch (PermErrorException e) {
+ // TODO add logging here!
// Only catch the error and return null
return;
}
Modified:
james/jspf/trunk/src/main/java/org/apache/james/jspf/util/SPFTermsRegexps.java
URL:
http://svn.apache.org/viewvc/james/jspf/trunk/src/main/java/org/apache/james/jspf/util/SPFTermsRegexps.java?view=diff&rev=496403&r1=496402&r2=496403
==============================================================================
---
james/jspf/trunk/src/main/java/org/apache/james/jspf/util/SPFTermsRegexps.java
(original)
+++
james/jspf/trunk/src/main/java/org/apache/james/jspf/util/SPFTermsRegexps.java
Mon Jan 15 08:50:29 2007
@@ -27,13 +27,15 @@
final String ALPHA_PATTERN = "[a-zA-Z]";
- final String MACRO_LETTER_PATTERN = "[ctlsodipvhCTLSODIPVH]";
+ final String MACRO_LETTER_PATTERN_EXP = "[rctlsodipvhRCTLSODIPVH]";
+
+ final String MACRO_LETTER_PATTERN = "[lsodipvhLSODIPVH]";
final String TRANSFORMERS_REGEX = "\\d*[r]?";
final String DELEMITER_REGEX = "[\\.\\-\\+,/_\\=]";
- final String MACRO_LETTERS_REGEX = MACRO_LETTER_PATTERN +
TRANSFORMERS_REGEX + DELEMITER_REGEX + "*";
+ final String MACRO_LETTERS_REGEX = MACRO_LETTER_PATTERN_EXP +
TRANSFORMERS_REGEX + DELEMITER_REGEX + "*";
final String MACRO_EXPAND_REGEX = "\\%(?:\\{"
+ MACRO_LETTERS_REGEX + "\\}|\\%|\\_|\\-)";
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]