diff --git a/core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditor.java b/core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditor.java index 46e40358c1..c26b84d407 100644 --- a/core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditor.java +++ b/core/src/main/java/org/springframework/security/intercept/web/FilterInvocationDefinitionSourceEditor.java @@ -54,125 +54,127 @@ public class FilterInvocationDefinitionSourceEditor extends PropertyEditorSuppor if ((s == null) || "".equals(s)) { // Leave target object empty - source.setDecorated(new RegExpBasedFilterInvocationDefinitionMap()); - } else { - // Check if we need to override the default definition map - if (s.lastIndexOf(DIRECTIVE_PATTERN_TYPE_APACHE_ANT) != -1) { - source.setDecorated(new PathBasedFilterInvocationDefinitionMap()); + setValue(new RegExpBasedFilterInvocationDefinitionMap()); - if (logger.isDebugEnabled()) { - logger.debug(("Detected " + DIRECTIVE_PATTERN_TYPE_APACHE_ANT - + " directive; using Apache Ant style path expressions")); - } - } else { - source.setDecorated(new RegExpBasedFilterInvocationDefinitionMap()); - } - - if (s.lastIndexOf(DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON) != -1) { - if (logger.isDebugEnabled()) { - logger.debug("Detected " + DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON - + " directive; Instructing mapper to convert URLs to lowercase before comparison"); - } - - source.setConvertUrlToLowercaseBeforeComparison(true); - } - - BufferedReader br = new BufferedReader(new StringReader(s)); - int counter = 0; - String line; - - List mappings = new ArrayList(); - - while (true) { - counter++; - - try { - line = br.readLine(); - } catch (IOException ioe) { - throw new IllegalArgumentException(ioe.getMessage()); - } - - if (line == null) { - break; - } - - line = line.trim(); - - if (logger.isDebugEnabled()) { - logger.debug("Line " + counter + ": " + line); - } - - if (line.startsWith("//")) { - continue; - } - - // Attempt to detect malformed lines (as per SEC-204) - if (line.lastIndexOf(DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON) != -1) { - // Directive found; check for second directive or name=value - if ((line.lastIndexOf(DIRECTIVE_PATTERN_TYPE_APACHE_ANT) != -1) || (line.lastIndexOf("=") != -1)) { - throw new IllegalArgumentException("Line appears to be malformed: " + line); - } - } - - // Attempt to detect malformed lines (as per SEC-204) - if (line.lastIndexOf(DIRECTIVE_PATTERN_TYPE_APACHE_ANT) != -1) { - // Directive found; check for second directive or name=value - if ((line.lastIndexOf(DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON) != -1) - || (line.lastIndexOf("=") != -1)) { - throw new IllegalArgumentException("Line appears to be malformed: " + line); - } - } - - // Skip lines that are not directives - if (line.lastIndexOf('=') == -1) { - continue; - } - - if (line.lastIndexOf("==") != -1) { - throw new IllegalArgumentException("Only single equals should be used in line " + line); - } - - // Tokenize the line into its name/value tokens - // As per SEC-219, use the LAST equals as the delimiter between LHS and RHS - String name = StringSplitUtils.substringBeforeLast(line, "="); - String value = StringSplitUtils.substringAfterLast(line, "="); - - if (!StringUtils.hasText(name) || !StringUtils.hasText(value)) { - throw new IllegalArgumentException("Failed to parse a valid name/value pair from " + line); - } - - // Attempt to detect malformed lines (as per SEC-204) - if (source.isConvertUrlToLowercaseBeforeComparison() - && source.getDecorated() instanceof PathBasedFilterInvocationDefinitionMap) { - // Should all be lowercase; check each character - // We only do this for Ant (regexp have control chars) - for (int i = 0; i < name.length(); i++) { - String character = name.substring(i, i + 1); - - if (!character.toLowerCase().equals(character)) { - throw new IllegalArgumentException("You are using the " - + DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON - + " with Ant Paths, yet you have specified an uppercase character in line: " + line - + " (character '" + character + "')"); - } - } - } - - FilterInvocationDefinitionSourceMapping mapping = new FilterInvocationDefinitionSourceMapping(); - mapping.setUrl(name); - - String[] tokens = org.springframework.util.StringUtils - .commaDelimitedListToStringArray(value); - - for (int i = 0; i < tokens.length; i++) { - mapping.addConfigAttribute(tokens[i].trim()); - } - - mappings.add(mapping); - } - source.setMappings(mappings); + return; } + // Check if we need to override the default definition map + if (s.lastIndexOf(DIRECTIVE_PATTERN_TYPE_APACHE_ANT) != -1) { + source.setDecorated(new PathBasedFilterInvocationDefinitionMap()); + + if (logger.isDebugEnabled()) { + logger.debug(("Detected " + DIRECTIVE_PATTERN_TYPE_APACHE_ANT + + " directive; using Apache Ant style path expressions")); + } + } else { + source.setDecorated(new RegExpBasedFilterInvocationDefinitionMap()); + } + + if (s.lastIndexOf(DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON) != -1) { + if (logger.isDebugEnabled()) { + logger.debug("Detected " + DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON + + " directive; Instructing mapper to convert URLs to lowercase before comparison"); + } + + source.setConvertUrlToLowercaseBeforeComparison(true); + } + + BufferedReader br = new BufferedReader(new StringReader(s)); + int counter = 0; + String line; + + List mappings = new ArrayList(); + + while (true) { + counter++; + + try { + line = br.readLine(); + } catch (IOException ioe) { + throw new IllegalArgumentException(ioe.getMessage()); + } + + if (line == null) { + break; + } + + line = line.trim(); + + if (logger.isDebugEnabled()) { + logger.debug("Line " + counter + ": " + line); + } + + if (line.startsWith("//")) { + continue; + } + + // Attempt to detect malformed lines (as per SEC-204) + if (line.lastIndexOf(DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON) != -1) { + // Directive found; check for second directive or name=value + if ((line.lastIndexOf(DIRECTIVE_PATTERN_TYPE_APACHE_ANT) != -1) || (line.lastIndexOf("=") != -1)) { + throw new IllegalArgumentException("Line appears to be malformed: " + line); + } + } + + // Attempt to detect malformed lines (as per SEC-204) + if (line.lastIndexOf(DIRECTIVE_PATTERN_TYPE_APACHE_ANT) != -1) { + // Directive found; check for second directive or name=value + if ((line.lastIndexOf(DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON) != -1) + || (line.lastIndexOf("=") != -1)) { + throw new IllegalArgumentException("Line appears to be malformed: " + line); + } + } + + // Skip lines that are not directives + if (line.lastIndexOf('=') == -1) { + continue; + } + + if (line.lastIndexOf("==") != -1) { + throw new IllegalArgumentException("Only single equals should be used in line " + line); + } + + // Tokenize the line into its name/value tokens + // As per SEC-219, use the LAST equals as the delimiter between LHS and RHS + String name = StringSplitUtils.substringBeforeLast(line, "="); + String value = StringSplitUtils.substringAfterLast(line, "="); + + if (!StringUtils.hasText(name) || !StringUtils.hasText(value)) { + throw new IllegalArgumentException("Failed to parse a valid name/value pair from " + line); + } + + // Attempt to detect malformed lines (as per SEC-204) + if (source.isConvertUrlToLowercaseBeforeComparison() + && source.getDecorated() instanceof PathBasedFilterInvocationDefinitionMap) { + // Should all be lowercase; check each character + // We only do this for Ant (regexp have control chars) + for (int i = 0; i < name.length(); i++) { + String character = name.substring(i, i + 1); + + if (!character.toLowerCase().equals(character)) { + throw new IllegalArgumentException("You are using the " + + DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON + + " with Ant Paths, yet you have specified an uppercase character in line: " + line + + " (character '" + character + "')"); + } + } + } + + FilterInvocationDefinitionSourceMapping mapping = new FilterInvocationDefinitionSourceMapping(); + mapping.setUrl(name); + + String[] tokens = StringUtils.commaDelimitedListToStringArray(value); + + for (int i = 0; i < tokens.length; i++) { + mapping.addConfigAttribute(tokens[i].trim()); + } + + mappings.add(mapping); + } + source.setMappings(mappings); + + setValue(source.getDecorated()); } }