Преглед изворни кода

ZF-6363 Zend_Validate_Hostname should allow trailing dot (RFC3986)

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@23487 44c647ce-9c0f-0410-b52a-842ac1e357ba
mjh_ca пре 15 година
родитељ
комит
fbff38f496
2 измењених фајлова са 27 додато и 0 уклоњено
  1. 15 0
      library/Zend/Validate/Hostname.php
  2. 12 0
      tests/Zend/Validate/HostnameTest.php

+ 15 - 0
library/Zend/Validate/Hostname.php

@@ -512,6 +512,21 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract
             }
         }
 
+        // RFC3986 3.2.2 states:
+        // 
+        //     The rightmost domain label of a fully qualified domain name
+        //     in DNS may be followed by a single "." and should be if it is 
+        //     necessary to distinguish between the complete domain name and
+        //     some local domain.
+        //     
+        // Strip trailing '.' since it is not necessary to validate a non-IP
+        // hostname.
+        //
+        // (see ZF-6363)
+        if (substr($value, -1) === '.') {
+            $value = substr($value, 0, strlen($value)-1);
+        }
+        
         // Check input against DNS hostname schema
         $domainParts = explode('.', $value);
         if ((count($domainParts) > 1) && (strlen($value) >= 4) && (strlen($value) <= 254)) {

+ 12 - 0
tests/Zend/Validate/HostnameTest.php

@@ -406,4 +406,16 @@ class Zend_Validate_HostnameTest extends PHPUnit_Framework_TestCase
             }
         }
     }
+
+    /**
+     * Ensure that a trailing "." in a hostname (but not ip) is permitted
+     *
+     * @group ZF-6363
+     */
+    public function testTrailingDot()
+    {
+        $this->assertTrue($this->_validator->isValid('example.com.'));
+        $this->assertFalse($this->_validator->isValid('example.com..'));
+        $this->assertFalse($this->_validator->isValid('1.2.3.4.'));
+    }
 }