|  | @@ -55,6 +55,9 @@ public class FilterInvocationDefinitionSourceEditor
 | 
	
		
			
				|  |  |      //~ Static fields/initializers =============================================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      private static final Log logger = LogFactory.getLog(FilterInvocationDefinitionSourceEditor.class);
 | 
	
		
			
				|  |  | +    public static final String DIRECTIVE_CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON =
 | 
	
		
			
				|  |  | +        "CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON";
 | 
	
		
			
				|  |  | +    public static final String DIRECTIVE_PATTERN_TYPE_APACHE_ANT = "PATTERN_TYPE_APACHE_ANT";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      //~ Methods ================================================================
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -65,14 +68,27 @@ public class FilterInvocationDefinitionSourceEditor
 | 
	
		
			
				|  |  |              // Leave target object empty
 | 
	
		
			
				|  |  |          } else {
 | 
	
		
			
				|  |  |              // Check if we need to override the default definition map
 | 
	
		
			
				|  |  | -            if (s.lastIndexOf("PATTERN_TYPE_APACHE_ANT") != -1) {
 | 
	
		
			
				|  |  | +            if (s.lastIndexOf(DIRECTIVE_PATTERN_TYPE_APACHE_ANT) != -1) {
 | 
	
		
			
				|  |  |                  source = new PathBasedFilterInvocationDefinitionMap();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (logger.isDebugEnabled()) {
 | 
	
		
			
				|  |  | -                    logger.debug(("Detected PATTERN_TYPE_APACHE_ANT directive; using Apache Ant style path expressions"));
 | 
	
		
			
				|  |  | +                    logger.debug(("Detected "
 | 
	
		
			
				|  |  | +                        + DIRECTIVE_PATTERN_TYPE_APACHE_ANT
 | 
	
		
			
				|  |  | +                        + " directive; using Apache Ant style path expressions"));
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +            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;
 | 
	
	
		
			
				|  | @@ -100,24 +116,36 @@ public class FilterInvocationDefinitionSourceEditor
 | 
	
		
			
				|  |  |                      continue;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                if (line.equals("CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON")) {
 | 
	
		
			
				|  |  | -                    if (logger.isDebugEnabled()) {
 | 
	
		
			
				|  |  | -                        logger.debug("Line " + counter
 | 
	
		
			
				|  |  | -                            + ": Instructing mapper to convert URLs to lowercase before comparison");
 | 
	
		
			
				|  |  | +                // 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);
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    source.setConvertUrlToLowercaseBeforeComparison(true);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -                    continue;
 | 
	
		
			
				|  |  | +                // 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);
 | 
	
		
			
				|  |  | +                        "Only single equals should be used in line " + line);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  // Tokenize the line into its name/value tokens
 | 
	
	
		
			
				|  | @@ -129,7 +157,25 @@ public class FilterInvocationDefinitionSourceEditor
 | 
	
		
			
				|  |  |                      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 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 + "')");
 | 
	
		
			
				|  |  | +                        }
 | 
	
		
			
				|  |  | +                    }
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  // Convert value to series of security configuration attributes
 | 
	
		
			
				|  |  |                  ConfigAttributeEditor configAttribEd = new ConfigAttributeEditor();
 | 
	
		
			
				|  |  |                  configAttribEd.setAsText(value);
 |