You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by bs...@apache.org on 2007/11/12 18:41:50 UTC

svn commit: r594224 - in /commons/proper/validator/trunk/src: main/java/org/apache/commons/validator/routines/UrlValidator.java test/java/org/apache/commons/validator/routines/UrlValidatorTest.java

Author: bspeakmon
Date: Mon Nov 12 09:41:43 2007
New Revision: 594224

URL: http://svn.apache.org/viewvc?rev=594224&view=rev
Log:
VALIDATOR-248: add MANUAL_AUTHORITY_VALIDATION feature and tests

Modified:
    commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/UrlValidator.java
    commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java

Modified: commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/UrlValidator.java
URL: http://svn.apache.org/viewvc/commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/UrlValidator.java?rev=594224&r1=594223&r2=594224&view=diff
==============================================================================
--- commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/UrlValidator.java (original)
+++ commons/proper/validator/trunk/src/main/java/org/apache/commons/validator/routines/UrlValidator.java Mon Nov 12 09:41:43 2007
@@ -27,14 +27,18 @@
 import java.util.regex.Pattern;
 
 /**
- * <p>Validates URLs.</p>
- * Behavour of validation is modified by passing in options:
+ * <p><b>URL Validation</b> routines.</p>
+ * Behavior of validation is modified by passing in options:
  * <li>ALLOW_2_SLASHES - [FALSE]  Allows double '/' characters in the path
  * component.</li>
  * <li>NO_FRAGMENT- [FALSE]  By default fragments are allowed, if this option is
  * included then fragments are flagged as illegal.</li>
  * <li>ALLOW_ALL_SCHEMES - [FALSE] By default only http, https, and ftp are
  * considered valid schemes.  Enabling this option will let any scheme pass validation.</li>
+ * <li>MANUAL_AUTHORITY_VALIDATION - [FALSE] By default, URL authorities must be IANA-defined
+ * domain names. Enabling this option and providing an array of authority validators
+ * will validate the URL's authority against the regexes; if it matches, the authority
+ * validation will succeed. If no match is found, domain name validation is used.</li>
  *
  * <p>Originally based in on php script by Debbie Dyer, validation.php v1.2b, Date: 03/07/02,
  * http://javascript.internet.com. However, this validation now bears little resemblance
@@ -90,6 +94,12 @@
      */
     public static final int NO_FRAGMENTS = 1 << 2;
 
+    /**
+     * If enabled, consults a provided list of RegexValidators when validating
+     * the URL authority. This allows names like "localhost", "test-machine", etc.
+     */
+    public static final int MANUAL_AUTHORITY_VALIDATION = 1 << 3;
+
     // Drop numeric, and  "+-." for now
     private static final String AUTHORITY_CHARS_REGEX = "\\p{Alnum}\\-\\.";
 
@@ -160,6 +170,12 @@
     private Set allowedSchemes = new HashSet();
 
     /**
+     * Regular expressions used to manually validate authorities if IANA
+     * domain name validation isn't desired.
+     */
+    private RegexValidator[] authorityValidators;
+
+    /**
      * If no schemes are provided, default to this set.
      */
     protected String[] defaultSchemes = {"http", "https", "ftp"};
@@ -203,17 +219,43 @@
      * ALLOW_2_SLASHES + NO_FRAGMENTS enables both of those options.
      */
     public UrlValidator(int options) {
-        this(null, options);
+        this(null, null, options);
     }
 
     /**
-     * Behavour of validation is modified by passing in options:
+     * Behavior of validation is modified by passing in options:
      * @param schemes The set of valid schemes.
      * @param options The options should be set using the public constants declared in
      * this class.  To set multiple options you simply add them together.  For example,
      * ALLOW_2_SLASHES + NO_FRAGMENTS enables both of those options.
      */
     public UrlValidator(String[] schemes, int options) {
+        this(schemes, null, options);
+    }
+
+    /**
+     * Initialize a UrlValidator with the given validation options.
+     * @param authorityValidators regexes used to validate the authority part;
+     * see {@link #MANUAL_AUTHORITY_VALIDATION}
+     * @param options Validation options. Set using the public constants of this class.
+     * To set multiple options, simply add them together:
+     * <p><code>ALLOW_2_SLASHES + NO_FRAGMENTS</code></p>
+     * enables both of those options.
+     */
+    public UrlValidator(RegexValidator[] authorityValidators, int options) {
+        this(null, authorityValidators, options);
+    }
+
+    /**
+     * Customizable constructor. Validation behavior is modifed by passing in options.
+     * @param schemes the set of valid schemes
+     * @param authorityValidators the set of regexes to manually validate the scheme against
+     * @param options Validation options. Set using the public constants of this class.
+     * To set multiple options, simply add them together:
+     * <p><code>ALLOW_2_SLASHES + NO_FRAGMENTS</code></p>
+     * enables both of those options.
+     */
+    public UrlValidator(String[] schemes, RegexValidator[] authorityValidators, int options) {
         this.options = new Flags(options);
 
         if (this.options.isOn(ALLOW_ALL_SCHEMES)) {
@@ -224,6 +266,10 @@
             schemes = this.defaultSchemes;
         }
 
+        if (this.options.isOn(MANUAL_AUTHORITY_VALIDATION)) {
+            this.authorityValidators = authorityValidators;
+        }
+
         this.allowedSchemes.addAll(Arrays.asList(schemes));
     }
 
@@ -308,6 +354,20 @@
     protected boolean isValidAuthority(String authority) {
         if (authority == null) {
             return false;
+        }
+
+        // check manual authority validation if specified
+        if (this.options.isOn(MANUAL_AUTHORITY_VALIDATION)) {
+            if (authorityValidators == null) {
+                throw new IllegalStateException(
+                        "manual authority validation enabled, but no authority validators specified");
+            }
+
+            for (int i = 0; i < authorityValidators.length; i++) {
+                if (authorityValidators[i].isValid(authority)) {
+                    return true;
+                }
+            }
         }
 
         Matcher authorityMatcher = AUTHORITY_PATTERN.matcher(authority);

Modified: commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java
URL: http://svn.apache.org/viewvc/commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java?rev=594224&r1=594223&r2=594224&view=diff
==============================================================================
--- commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java (original)
+++ commons/proper/validator/trunk/src/test/java/org/apache/commons/validator/routines/UrlValidatorTest.java Mon Nov 12 09:41:43 2007
@@ -92,7 +92,7 @@
     * @param testObjects Used to create a url.
     */
    public void testIsValid(Object[] testObjects, int options) {
-      UrlValidator urlVal = new UrlValidator(null, options);
+      UrlValidator urlVal = new UrlValidator(null, null, options);
       assertTrue(urlVal.isValid("http://www.google.com"));
       assertTrue(urlVal.isValid("http://www.google.com/"));
       int statusPerLine = 60;
@@ -151,6 +151,28 @@
        assertTrue("parentheses should be valid in URLs",
                validator.isValid("http://somewhere.com/pathxyz/file(1).html"));
    }
+
+    public void testValidator248() {
+        RegexValidator[] regex = new RegexValidator[] {
+            new RegexValidator("localhost"),
+            new RegexValidator(".*\\.my-testing")
+        };
+        UrlValidator validator = new UrlValidator(regex, UrlValidator.MANUAL_AUTHORITY_VALIDATION);
+
+        assertTrue("localhost URL should validate",
+                validator.isValid("http://localhost/test/index.html"));
+        assertTrue("first.my-testing should validate",
+                validator.isValid("http://first.my-testing/test/index.html"));
+        assertTrue("sup3r.my-testing should validate",
+                validator.isValid("http://sup3r.my-testing/test/index.html"));
+
+        assertFalse("broke.my-test should not validate",
+                validator.isValid("http://broke.my-test/test/index.html"));
+
+        assertTrue("www.apache.org should still validate",
+                validator.isValid("http://www.apache.org/test/index.html"));
+
+    }
 
    static boolean incrementTestPartsIndex(int[] testPartsIndex, Object[] testParts) {
       boolean carry = true;  //add 1 to lowest order part.