Jelajahi Sumber

[ZF-7277] Zend_Validate:

- fixed userland iconv encoding

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@17138 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 16 tahun lalu
induk
melakukan
7b3b3ced8e
2 mengubah file dengan 38 tambahan dan 5 penghapusan
  1. 9 5
      library/Zend/Validate/Hostname.php
  2. 29 0
      tests/Zend/Validate/HostnameTest.php

+ 9 - 5
library/Zend/Validate/Hostname.php

@@ -419,12 +419,12 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract
         $this->_setValue($value);
 
         // Check input against IP address schema
-        if (preg_match('/^[0-9.a-e:.]*$/i', $value, $nothing) &&
+        if (preg_match('/^[0-9.a-e:.]*$/i', $value) &&
             $this->_ipValidator->setTranslator($this->getTranslator())->isValid($value)) {
             if (!($this->_allow & self::ALLOW_IP)) {
                 $this->_error(self::IP_ADDRESS_NOT_ALLOWED);
                 return false;
-            } else{
+            } else {
                 return true;
             }
         }
@@ -434,8 +434,11 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract
         if ((count($domainParts) > 1) && (strlen($value) >= 4) && (strlen($value) <= 254)) {
             $status = false;
 
+            $origenc = iconv_get_encoding('internal_encoding');
+            iconv_set_encoding('internal_encoding', 'UTF-8');
             do {
                 // First check TLD
+                $matches = array();
                 if (preg_match('/([^.]{2,10})$/i', end($domainParts), $matches) ||
                     (end($domainParts) == 'ایران') || (end($domainParts) == '中国') ||
                     (end($domainParts) == '公司') || (end($domainParts) == '网络')) {
@@ -497,6 +500,7 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract
                         foreach($regexChars as $regexKey => $regexChar) {
                             $status = @preg_match($regexChar, $domainPart);
                             if ($status === false) {
+                                iconv_set_encoding('internal_encoding', $origenc);
                                 require_once 'Zend/Validate/Exception.php';
                                 throw new Zend_Validate_Exception('Internal error: DNS validation failed');
                             } elseif ($status !== 0) {
@@ -533,6 +537,7 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract
                 }
             } while (false);
 
+            iconv_set_encoding('internal_encoding', $origenc);
             // If the input passes as an Internet domain name, and domain names are allowed, then the hostname
             // passes validation
             if ($status && ($this->_allow & self::ALLOW_DNS)) {
@@ -583,9 +588,8 @@ class Zend_Validate_Hostname extends Zend_Validate_Abstract
      */
     protected function decodePunycode($encoded)
     {
-        $matches = array();
-        $found   = preg_match('/([^a-z0-9\x2d]{1,10})$/i', $encoded);
-        if (empty($encoded) || (count($matches) > 0)) {
+        $found = preg_match('/([^a-z0-9\x2d]{1,10})$/i', $encoded);
+        if (empty($encoded) || ($found > 0)) {
             // no punycode encoded string, return as is
             $this->_error(self::CANNOT_DECODE_PUNYCODE);
             return false;

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

@@ -55,10 +55,19 @@ class Zend_Validate_HostnameTest extends PHPUnit_Framework_TestCase
      */
     public function setUp()
     {
+        $this->_origEncoding = iconv_get_encoding('internal_encoding');
         $this->_validator = new Zend_Validate_Hostname();
     }
 
     /**
+     * Reset iconv
+     */
+    public function tearDown()
+    {
+        iconv_set_encoding('internal_encoding', $this->_origEncoding);
+    }
+
+    /**
      * Ensures that the validator follows expected behavior
      *
      * @return void
@@ -351,4 +360,24 @@ class Zend_Validate_HostnameTest extends PHPUnit_Framework_TestCase
         $this->assertFalse($this->_validator->isValid('place@y*ahoo.com'));
         $this->assertFalse($this->_validator->isValid('ya#hoo'));
     }
+
+    /**
+     * @see ZF-7277
+     */
+    public function testDifferentIconvEncoding()
+    {
+        iconv_set_encoding('internal_encoding', 'ISO8859-1');
+        $validator = new Zend_Validate_Hostname();
+
+        $valuesExpected = array(
+            array(true, array('bürger.com', 'hãllo.com', 'hållo.com')),
+            array(true, array('bÜrger.com', 'hÃllo.com', 'hÅllo.com')),
+            array(false, array('hãllo.lt', 'bürger.lt', 'hãllo.lt'))
+            );
+        foreach ($valuesExpected as $element) {
+            foreach ($element[1] as $input) {
+                $this->assertEquals($element[0], $validator->isValid($input), implode("\n", $validator->getMessages()) . $input);
+            }
+        }
+    }
 }