浏览代码

Fixed double encoding issue with strings and added a few more test cases to catch these kind of issues

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@19642 44c647ce-9c0f-0410-b52a-842ac1e357ba
lars 16 年之前
父节点
当前提交
27cd6eeebc
共有 3 个文件被更改,包括 32 次插入33 次删除
  1. 0 22
      library/Zend/XmlRpc/Generator/Abstract.php
  2. 3 5
      library/Zend/XmlRpc/Value/String.php
  3. 29 6
      tests/Zend/XmlRpc/ValueTest.php

+ 0 - 22
library/Zend/XmlRpc/Generator/Abstract.php

@@ -111,26 +111,4 @@ abstract class Zend_XmlRpc_Generator_Abstract
     {
         return preg_replace('/<\?xml version="1.0"( encoding="[^\"]*")?\?>\n/u', '', $xml);
     }
-
-    /**
-     * Make sure a string will be safe for XML, convert risky characters to entities
-     *
-     * @param string $str
-     * @return string
-     */
-    public function escapeEntities($str)
-    {
-        return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
-    }
-
-    /**
-     * Convert XML entities into string values
-     *
-     * @param string $str
-     * @return string
-     */
-    public function decodeEntities($str)
-    {
-        return html_entity_decode($str, ENT_QUOTES, 'UTF-8');
-    }
 }

+ 3 - 5
library/Zend/XmlRpc/Value/String.php

@@ -45,18 +45,16 @@ class Zend_XmlRpc_Value_String extends Zend_XmlRpc_Value_Scalar
         $this->_type = self::XMLRPC_TYPE_STRING;
 
         // Make sure this value is string and all XML characters are encoded
-        $this->_value = $this->getGenerator()->escapeEntities($value);
+        $this->_value = (string)$value;
     }
 
     /**
      * Return the value of this object, convert the XML-RPC native string value into a PHP string
-     * Decode all encoded risky XML entities back to normal characters
      *
      * @return string
      */
     public function getValue()
     {
-        return $this->getGenerator()->decodeEntities($this->_value);
+        return (string)$this->_value;
     }
-}
-
+}

+ 29 - 6
tests/Zend/XmlRpc/ValueTest.php

@@ -291,8 +291,8 @@ class Zend_XmlRpc_ValueTest extends PHPUnit_Framework_TestCase
     public function testMarshalStringFromXmlRpc(Zend_XmlRpc_Generator_Abstract $generator)
     {
         Zend_XmlRpc_Value::setGenerator($generator);
-        $native = 'foo';
-        $xml = "<value><string>$native</string></value>";
+        $native = 'foo<>';
+        $xml = "<value><string>foo&lt;&gt;</string></value>";
         $val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
                                     Zend_XmlRpc_Value::XML_STRING);
 
@@ -308,8 +308,8 @@ class Zend_XmlRpc_ValueTest extends PHPUnit_Framework_TestCase
     public function testMarshalStringFromDefault(Zend_XmlRpc_Generator_Abstract $generator)
     {
         Zend_XmlRpc_Value::setGenerator($generator);
-        $native = 'foo';
-        $xml = "<string>$native</string>";
+        $native = 'foo<br/>bar';
+        $xml = "<string>foo&lt;br/&gt;bar</string>";
         $val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
                                     Zend_XmlRpc_Value::XML_STRING);
 
@@ -480,9 +480,10 @@ class Zend_XmlRpc_ValueTest extends PHPUnit_Framework_TestCase
     public function testMarshalStructFromXmlRpc(Zend_XmlRpc_Generator_Abstract $generator)
     {
         Zend_XmlRpc_Value::setGenerator($generator);
-        $native = array('foo' => 0);
+        $native = array('foo' => 0, 'bar' => 'foo<>bar');
         $xml = '<value><struct><member><name>foo</name><value><int>0</int>'
-             . '</value></member></struct></value>';
+             . '</value></member><member><name>bar</name><value><string>'
+             . 'foo&lt;&gt;bar</string></value></member></struct></value>';
 
         $val = Zend_XmlRpc_Value::getXmlRpcValue($xml,
                                     Zend_XmlRpc_Value::XML_STRING);
@@ -496,6 +497,28 @@ class Zend_XmlRpc_ValueTest extends PHPUnit_Framework_TestCase
     /**
      * @dataProvider Zend_XmlRpc_TestProvider::provideGenerators
      */
+    public function testMarshallingNestedStructFromXmlRpc(Zend_XmlRpc_Generator_Abstract $generator)
+    {
+        Zend_XmlRpc_Value::setGenerator($generator);
+        $native = array('foo' => array('bar' => '<br/>'));
+        $xml = '<value><struct><member><name>foo</name><value><struct><member>'
+             . '<name>bar</name><value><string>&lt;br/&gt;</string></value>'
+             . '</member></struct></value></member></struct></value>';
+
+        $val = Zend_XmlRpc_Value::getXmlRpcValue($xml, Zend_XmlRpc_Value::XML_STRING);
+
+        $this->assertXmlRpcType('struct', $val);
+        $this->assertEquals('struct', $val->getType());
+        $this->assertSame($native, $val->getValue());
+        $this->assertSame($this->wrapXml($xml), $val->saveXml());
+
+        $val = Zend_XmlRpc_Value::getXmlRpcValue($native);
+        $this->assertSame(trim($xml), trim($val->saveXml()));
+    }
+
+    /**
+     * @dataProvider Zend_XmlRpc_TestProvider::provideGenerators
+     */
     public function testMarshallingStructWithMemberWithoutValue(Zend_XmlRpc_Generator_Abstract $generator)
     {
         Zend_XmlRpc_Value::setGenerator($generator);