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]