WordPress 4.3
[autoinstalls/wordpress.git] / wp-includes / class-IXR.php
index 64a60d46b31ed799fb52a0cdd1ef3bbfab35966b..ec3f70ca71f71703dcf96c7ffb715fe02b177f86 100644 (file)
@@ -30,7 +30,7 @@
  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * @package IXR
  * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  *
  * @copyright  Incutio Ltd 2010 (http://www.incutio.com)
  * @version    1.7.4 7th September 2010
  *
  * @copyright  Incutio Ltd 2010 (http://www.incutio.com)
  * @version    1.7.4 7th September 2010
  * IXR_Value
  *
  * @package IXR
  * IXR_Value
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_Value {
     var $data;
     var $type;
 
  */
 class IXR_Value {
     var $data;
     var $type;
 
-    function IXR_Value($data, $type = false)
+       /**
+        * PHP5 constructor.
+        */
+       function __construct( $data, $type = false )
     {
         $this->data = $data;
         if (!$type) {
     {
         $this->data = $data;
         if (!$type) {
@@ -69,6 +72,13 @@ class IXR_Value {
         }
     }
 
         }
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Value( $data, $type = false ) {
+               self::__construct( $data, $type );
+       }
+
     function calculateType()
     {
         if ($this->data === true || $this->data === false) {
     function calculateType()
     {
         if ($this->data === true || $this->data === false) {
@@ -151,8 +161,8 @@ class IXR_Value {
     /**
      * Checks whether or not the supplied array is a struct or not
      *
     /**
      * Checks whether or not the supplied array is a struct or not
      *
-     * @param unknown_type $array
-     * @return boolean
+     * @param array $array
+     * @return bool
      */
     function isStruct($array)
     {
      */
     function isStruct($array)
     {
@@ -171,7 +181,7 @@ class IXR_Value {
  * IXR_MESSAGE
  *
  * @package IXR
  * IXR_MESSAGE
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  *
  */
 class IXR_Message
  *
  */
 class IXR_Message
@@ -194,20 +204,63 @@ class IXR_Message
     // The XML parser
     var $_parser;
 
     // The XML parser
     var $_parser;
 
-    function IXR_Message($message)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct( $message )
     {
         $this->message =& $message;
     }
 
     {
         $this->message =& $message;
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Message( $message ) {
+               self::__construct( $message );
+       }
+
     function parse()
     {
         // first remove the XML declaration
         // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages
     function parse()
     {
         // first remove the XML declaration
         // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages
-        $header = preg_replace( '/<\?xml.*?\?'.'>/', '', substr($this->message, 0, 100), 1);
-        $this->message = substr_replace($this->message, $header, 0, 100);
-        if (trim($this->message) == '') {
+        $header = preg_replace( '/<\?xml.*?\?'.'>/s', '', substr( $this->message, 0, 100 ), 1 );
+        $this->message = trim( substr_replace( $this->message, $header, 0, 100 ) );
+        if ( '' == $this->message ) {
+            return false;
+        }
+
+        // Then remove the DOCTYPE
+        $header = preg_replace( '/^<!DOCTYPE[^>]*+>/i', '', substr( $this->message, 0, 200 ), 1 );
+        $this->message = trim( substr_replace( $this->message, $header, 0, 200 ) );
+        if ( '' == $this->message ) {
+            return false;
+        }
+
+        // Check that the root tag is valid
+        $root_tag = substr( $this->message, 0, strcspn( substr( $this->message, 0, 20 ), "> \t\r\n" ) );
+        if ( '<!DOCTYPE' === strtoupper( $root_tag ) ) {
+            return false;
+        }
+        if ( ! in_array( $root_tag, array( '<methodCall', '<methodResponse', '<fault' ) ) ) {
+            return false;
+        }
+
+        // Bail if there are too many elements to parse
+        $element_limit = 30000;
+        if ( function_exists( 'apply_filters' ) ) {
+            /**
+             * Filter the number of elements to parse in an XML-RPC response.
+             *
+             * @since 4.0.0
+             *
+             * @param int $element_limit Default elements limit.
+             */
+            $element_limit = apply_filters( 'xmlrpc_element_limit', $element_limit );
+        }
+        if ( $element_limit && 2 * $element_limit < substr_count( $this->message, '<' ) ) {
             return false;
         }
             return false;
         }
+
         $this->_parser = xml_parser_create();
         // Set XML parser to take the case of tags in to account
         xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
         $this->_parser = xml_parser_create();
         // Set XML parser to take the case of tags in to account
         xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
@@ -332,7 +385,7 @@ class IXR_Message
                     $this->_arraystructs[count($this->_arraystructs)-1][] = $value;
                 }
             } else {
                     $this->_arraystructs[count($this->_arraystructs)-1][] = $value;
                 }
             } else {
-                // Just add as a paramater
+                // Just add as a parameter
                 $this->params[] = $value;
             }
         }
                 $this->params[] = $value;
             }
         }
@@ -344,7 +397,7 @@ class IXR_Message
  * IXR_Server
  *
  * @package IXR
  * IXR_Server
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_Server
 {
  */
 class IXR_Server
 {
@@ -353,7 +406,10 @@ class IXR_Server
     var $message;
     var $capabilities;
 
     var $message;
     var $capabilities;
 
-    function IXR_Server($callbacks = false, $data = false, $wait = false)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct( $callbacks = false, $data = false, $wait = false )
     {
         $this->setCapabilities();
         if ($callbacks) {
     {
         $this->setCapabilities();
         if ($callbacks) {
@@ -365,11 +421,22 @@ class IXR_Server
         }
     }
 
         }
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Server( $callbacks = false, $data = false, $wait = false ) {
+               self::__construct( $callbacks, $data, $wait );
+       }
+
     function serve($data = false)
     {
         if (!$data) {
             if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') {
     function serve($data = false)
     {
         if (!$data) {
             if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') {
-               header('Content-Type: text/plain'); // merged from WP #9093
+                if ( function_exists( 'status_header' ) ) {
+                    status_header( 405 ); // WP #20986
+                    header( 'Allow: POST' );
+                }
+                header('Content-Type: text/plain'); // merged from WP #9093
                 die('XML-RPC server accepts POST requests only.');
             }
 
                 die('XML-RPC server accepts POST requests only.');
             }
 
@@ -425,7 +492,7 @@ EOD;
 
         // Perform the callback and send the response
         if (count($args) == 1) {
 
         // Perform the callback and send the response
         if (count($args) == 1) {
-            // If only one paramater just send that instead of the whole array
+            // If only one parameter just send that instead of the whole array
             $args = $args[0];
         }
 
             $args = $args[0];
         }
 
@@ -466,11 +533,18 @@ EOD;
 
     function output($xml)
     {
 
     function output($xml)
     {
-        $xml = '<?xml version="1.0"?>'."\n".$xml;
+        $charset = function_exists('get_option') ? get_option('blog_charset') : '';
+        if ($charset)
+            $xml = '<?xml version="1.0" encoding="'.$charset.'"?>'."\n".$xml;
+        else
+            $xml = '<?xml version="1.0"?>'."\n".$xml;
         $length = strlen($xml);
         header('Connection: close');
         header('Content-Length: '.$length);
         $length = strlen($xml);
         header('Connection: close');
         header('Content-Length: '.$length);
-        header('Content-Type: text/xml');
+        if ($charset)
+            header('Content-Type: text/xml; charset='.$charset);
+        else
+            header('Content-Type: text/xml');
         header('Date: '.date('r'));
         echo $xml;
         exit;
         header('Date: '.date('r'));
         echo $xml;
         exit;
@@ -548,7 +622,7 @@ EOD;
  * IXR_Request
  *
  * @package IXR
  * IXR_Request
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_Request
 {
  */
 class IXR_Request
 {
@@ -556,7 +630,10 @@ class IXR_Request
     var $args;
     var $xml;
 
     var $args;
     var $xml;
 
-    function IXR_Request($method, $args)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct($method, $args)
     {
         $this->method = $method;
         $this->args = $args;
     {
         $this->method = $method;
         $this->args = $args;
@@ -576,6 +653,13 @@ EOD;
         $this->xml .= '</params></methodCall>';
     }
 
         $this->xml .= '</params></methodCall>';
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Request( $method, $args ) {
+               self::__construct( $method, $args );
+       }
+
     function getLength()
     {
         return strlen($this->xml);
     function getLength()
     {
         return strlen($this->xml);
@@ -591,7 +675,7 @@ EOD;
  * IXR_Client
  *
  * @package IXR
  * IXR_Client
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  *
  */
 class IXR_Client
  *
  */
 class IXR_Client
@@ -609,7 +693,10 @@ class IXR_Client
     // Storage place for an error message
     var $error = false;
 
     // Storage place for an error message
     var $error = false;
 
-    function IXR_Client($server, $path = false, $port = 80, $timeout = 15)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct( $server, $path = false, $port = 80, $timeout = 15 )
     {
         if (!$path) {
             // Assume we have been given a URL instead
     {
         if (!$path) {
             // Assume we have been given a URL instead
@@ -622,6 +709,10 @@ class IXR_Client
             if (!$this->path) {
                 $this->path = '/';
             }
             if (!$this->path) {
                 $this->path = '/';
             }
+
+            if ( ! empty( $bits['query'] ) ) {
+                $this->path .= '?' . $bits['query'];
+            }
         } else {
             $this->server = $server;
             $this->path = $path;
         } else {
             $this->server = $server;
             $this->path = $path;
@@ -631,6 +722,13 @@ class IXR_Client
         $this->timeout = $timeout;
     }
 
         $this->timeout = $timeout;
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Client( $server, $path = false, $port = 80, $timeout = 15 ) {
+               self::__construct( $server, $path, $port, $timeout );
+       }
+
     function query()
     {
         $args = func_get_args();
     function query()
     {
         $args = func_get_args();
@@ -743,19 +841,29 @@ class IXR_Client
  * IXR_Error
  *
  * @package IXR
  * IXR_Error
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_Error
 {
     var $code;
     var $message;
 
  */
 class IXR_Error
 {
     var $code;
     var $message;
 
-    function IXR_Error($code, $message)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct( $code, $message )
     {
         $this->code = $code;
         $this->message = htmlspecialchars($message);
     }
 
     {
         $this->code = $code;
         $this->message = htmlspecialchars($message);
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Error( $code, $message ) {
+               self::__construct( $code, $message );
+       }
+
     function getXml()
     {
         $xml = <<<EOD
     function getXml()
     {
         $xml = <<<EOD
@@ -785,7 +893,7 @@ EOD;
  * IXR_Date
  *
  * @package IXR
  * IXR_Date
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_Date {
     var $year;
  */
 class IXR_Date {
     var $year;
@@ -796,7 +904,10 @@ class IXR_Date {
     var $second;
     var $timezone;
 
     var $second;
     var $timezone;
 
-    function IXR_Date($time)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct( $time )
     {
         // $time can be a PHP timestamp or an ISO one
         if (is_numeric($time)) {
     {
         // $time can be a PHP timestamp or an ISO one
         if (is_numeric($time)) {
@@ -806,6 +917,13 @@ class IXR_Date {
         }
     }
 
         }
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Date( $time ) {
+               self::__construct( $time );
+       }
+
     function parseTimestamp($timestamp)
     {
         $this->year = date('Y', $timestamp);
     function parseTimestamp($timestamp)
     {
         $this->year = date('Y', $timestamp);
@@ -848,17 +966,27 @@ class IXR_Date {
  * IXR_Base64
  *
  * @package IXR
  * IXR_Base64
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_Base64
 {
     var $data;
 
  */
 class IXR_Base64
 {
     var $data;
 
-    function IXR_Base64($data)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct( $data )
     {
         $this->data = $data;
     }
 
     {
         $this->data = $data;
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_Base64( $data ) {
+               self::__construct( $data );
+       }
+
     function getXml()
     {
         return '<base64>'.base64_encode($this->data).'</base64>';
     function getXml()
     {
         return '<base64>'.base64_encode($this->data).'</base64>';
@@ -869,14 +997,17 @@ class IXR_Base64
  * IXR_IntrospectionServer
  *
  * @package IXR
  * IXR_IntrospectionServer
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_IntrospectionServer extends IXR_Server
 {
     var $signatures;
     var $help;
 
  */
 class IXR_IntrospectionServer extends IXR_Server
 {
     var $signatures;
     var $help;
 
-    function IXR_IntrospectionServer()
+       /**
+        * PHP5 constructor.
+        */
+    function __construct()
     {
         $this->setCallbacks();
         $this->setCapabilities();
     {
         $this->setCallbacks();
         $this->setCapabilities();
@@ -910,6 +1041,13 @@ class IXR_IntrospectionServer extends IXR_Server
         );
     }
 
         );
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_IntrospectionServer() {
+               self::__construct();
+       }
+
     function addCallback($method, $callback, $args, $help)
     {
         $this->callbacks[$method] = $callback;
     function addCallback($method, $callback, $args, $help)
     {
         $this->callbacks[$method] = $callback;
@@ -1032,18 +1170,28 @@ class IXR_IntrospectionServer extends IXR_Server
  * IXR_ClientMulticall
  *
  * @package IXR
  * IXR_ClientMulticall
  *
  * @package IXR
- * @since 1.5
+ * @since 1.5.0
  */
 class IXR_ClientMulticall extends IXR_Client
 {
     var $calls = array();
 
  */
 class IXR_ClientMulticall extends IXR_Client
 {
     var $calls = array();
 
-    function IXR_ClientMulticall($server, $path = false, $port = 80)
+       /**
+        * PHP5 constructor.
+        */
+    function __construct( $server, $path = false, $port = 80 )
     {
         parent::IXR_Client($server, $path, $port);
         $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
     }
 
     {
         parent::IXR_Client($server, $path, $port);
         $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
     }
 
+       /**
+        * PHP4 constructor.
+        */
+       public function IXR_ClientMulticall( $server, $path = false, $port = 80 ) {
+               self::__construct( $server, $path, $port );
+       }
+
     function addCall()
     {
         $args = func_get_args();
     function addCall()
     {
         $args = func_get_args();