diff --git a/core/CHANGELOG.txt b/core/CHANGELOG.txt index 761ed1dba69d4ac74ddaa3b72516980691c8eeb0..0fdb64c29c85bd3510afafb31b9be89393c12fa3 100644 --- a/core/CHANGELOG.txt +++ b/core/CHANGELOG.txt @@ -45,6 +45,7 @@ Drupal 8.0, xxxx-xx-xx (development version) - Removed the Overlay module from core. - Removed the Garland theme from core. - Removed the Statistics module's accesslog functionality and reports from core. +- Removed XML-RPC functionality from core. - Removed backwards-compatibility with 'magic_quotes_gpc'/'magic_quotes_runtime' PHP configuration settings. Both are required to be disabled. - Universally Unique IDentifier (UUID): diff --git a/core/MAINTAINERS.txt b/core/MAINTAINERS.txt index 1f5548335c0e188f5b1896e6cd3aad6d35e74e8d..48c295933cc4ee008dc1bf24e6b58a2016978d0e 100644 --- a/core/MAINTAINERS.txt +++ b/core/MAINTAINERS.txt @@ -433,9 +433,6 @@ Views UI module - Tim Plunkett 'tim.plunkett' http://drupal.org/user/241634 - Damian Lee 'damiankloip' http://drupal.org/user/1037976 -XML-RPC module -- Frederic G. Marand 'fgm' http://drupal.org/user/27985 - Theme maintainers ----------------- diff --git a/core/modules/system/core.api.php b/core/modules/system/core.api.php index 03a711c360b976ea581db2f01de8008be7909d0c..a09da1a550bf42c63f6fa64b77696ebae1681814 100644 --- a/core/modules/system/core.api.php +++ b/core/modules/system/core.api.php @@ -144,19 +144,6 @@ * providing default configuration or configuration import, as outlined in * @ref sec_rest above. * - * @section sec_xmlrpc Using XML-RPC - * In XML-RPC, a web site can set up one or more XML-RPC methods, which it - * will usually service at a central XML-RPC URL. Drupal Core's XML-RPC module - * provides both client and server XML-RPC functionality. - * - * On the server side, the XML-RPC module sets up URL path xmlrpc.php, which - * responds to XML-RPC requests. Individual XML-RPC request methods are defined - * by modules by implementing hook_xmlrpc(); Drupal Core does not define any - * XML-RPC web service requests by default. - * - * On the client side, XML-RPC requests to other web sites that provide XML-RPC - * web services can be performed in Drupal by using the xmlrpc() function. - * * @section sec_integrate Integrating data from other sites into Drupal * If you want to integrate data from other web sites into Drupal, here are * some notes: @@ -176,7 +163,6 @@ * - \Drupal\Component\Serialization\Json (JSON encoding and decoding). * - PHP has functions and classes for parsing XML; see * http://php.net/manual/refs.xml.php - * - As mentioned above, for XML-RPC requests, use function xmlrpc(). * @} */ diff --git a/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php b/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php index c499d3891628f39eeac9ea5b14defabe63097d1c..c4b6c30d12a7629a7c879d32ff1ea974ca8a14a1 100644 --- a/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php +++ b/core/modules/system/src/Tests/Bootstrap/GetFilenameUnitTest.php @@ -29,7 +29,7 @@ function testDrupalGetFilename() { // does not exist. $this->assertFalse(\Drupal::hasService('keyvalue'), 'The container has no keyvalue service.'); // Retrieving the location of a module. - $this->assertIdentical(drupal_get_filename('module', 'xmlrpc'), 'core/modules/xmlrpc/xmlrpc.info.yml'); + $this->assertIdentical(drupal_get_filename('module', 'system'), 'core/modules/system/system.info.yml'); // Retrieving the location of a theme. $this->assertIdentical(drupal_get_filename('theme', 'stark'), 'core/themes/stark/stark.info.yml'); diff --git a/core/modules/system/src/Tests/Extension/ModuleHandlerTest.php b/core/modules/system/src/Tests/Extension/ModuleHandlerTest.php index 8d93c7a76ea87c61e76953a71d08f4055493600d..597bb03c43aa53ec352933b1886c1003b335c517 100644 --- a/core/modules/system/src/Tests/Extension/ModuleHandlerTest.php +++ b/core/modules/system/src/Tests/Extension/ModuleHandlerTest.php @@ -116,7 +116,7 @@ function testDependencyResolution() { $this->assertFalse($this->moduleHandler()->moduleExists('color'), 'ModuleHandler::install() aborts if dependencies are missing.'); // Fix the missing dependency. - // Forum module depends on Ban. Ban depends on XML-RPC module. + // Color module depends on Config. Config depends on Help module. \Drupal::state()->set('module_test.dependency', 'dependency'); drupal_static_reset('system_rebuild_module_data'); @@ -145,9 +145,9 @@ function testDependencyResolution() { $uninstalled_modules = \Drupal::state()->get('module_test.uninstall_order') ?: array(); $this->assertEqual($uninstalled_modules, array('color', 'config', 'help'), 'Modules were uninstalled in the correct order.'); - // Enable forum module again, which should enable both the ban module and - // XML-RPC module. But, this time do it with ban module declaring a - // dependency on a specific version of XML-RPC module in its info file. Make + // Enable Color module again, which should enable both the Config module and + // Help module. But, this time do it with Config module declaring a + // dependency on a specific version of Help module in its info file. Make // sure that Drupal\Core\Extension\ModuleHandler::install() still works. \Drupal::state()->set('module_test.dependency', 'version dependency'); drupal_static_reset('system_rebuild_module_data'); @@ -163,12 +163,7 @@ function testDependencyResolution() { // Finally, verify that the modules were enabled in the correct order. $enable_order = \Drupal::state()->get('module_test.install_order') ?: array(); - $help_position = array_search('help', $enable_order); - $config_position = array_search('config', $enable_order); - $color_position = array_search('color', $enable_order); - $xmlrpc_before_ban = $help_position !== FALSE && $config_position !== FALSE && $help_position < $config_position; - $ban_before_forum = $config_position !== FALSE && $color_position !== FALSE && $config_position < $color_position; - $this->assertTrue($xmlrpc_before_ban && $ban_before_forum, 'Modules were enabled in the correct order.'); + $this->assertIdentical($enable_order, array('help', 'config', 'color')); } /** diff --git a/core/modules/xmlrpc/src/Controller/XmlrpcController.php b/core/modules/xmlrpc/src/Controller/XmlrpcController.php deleted file mode 100644 index 4abbf3da24d79094c31e5a9832f4ff26ea7a2d5f..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/src/Controller/XmlrpcController.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -/** - * @file - * Contains \Drupal\xmlrpc\Controller\XmlrpcController. - */ - -namespace Drupal\xmlrpc\Controller; - -/** - * Contains controller methods for the XML-RPC module. - */ -class XmlrpcController { - - /** - * @todo Remove xmlrpc_server_page(). - */ - public function php() { - module_load_include('server.inc', 'xmlrpc'); - return xmlrpc_server_page(); - } - -} diff --git a/core/modules/xmlrpc/src/Tests/XmlRpcBasicTest.php b/core/modules/xmlrpc/src/Tests/XmlRpcBasicTest.php deleted file mode 100644 index ae57107689b79d823da14f4701a3327e3e103b46..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/src/Tests/XmlRpcBasicTest.php +++ /dev/null @@ -1,91 +0,0 @@ -<?php - -/** - * @file - * Definition of Drupal\xmlrpc\Tests\XmlRpcBasicTest. - */ - -namespace Drupal\xmlrpc\Tests; - -use Drupal\simpletest\WebTestBase; - -/** - * Perform basic XML-RPC tests that do not require addition callbacks. - * - * @group xmlrpc - */ -class XmlRpcBasicTest extends WebTestBase { - - /** - * Modules to enable. - * - * @var array - */ - public static $modules = array('xmlrpc'); - - /** - * Ensure that a basic XML-RPC call with no parameters works. - */ - protected function testListMethods() { - // Minimum list of methods that should be included. - $minimum = array( - 'system.multicall', - 'system.methodSignature', - 'system.getCapabilities', - 'system.listMethods', - 'system.methodHelp', - ); - - // Invoke XML-RPC call to get list of methods. - $url = url('xmlrpc.php', array('absolute' => TRUE)); - $methods = xmlrpc($url, array('system.listMethods' => array())); - - // Ensure that the minimum methods were found. - $count = 0; - foreach ($methods as $method) { - if (in_array($method, $minimum)) { - $count++; - } - } - - $this->assertEqual($count, count($minimum), 'system.listMethods returned at least the minimum listing'); - } - - /** - * Ensure that system.methodSignature returns an array of signatures. - */ - protected function testMethodSignature() { - $url = url('xmlrpc.php', array('absolute' => TRUE)); - $signature = xmlrpc($url, array('system.methodSignature' => array('system.listMethods'))); - $this->assert(is_array($signature) && !empty($signature) && is_array($signature[0]), - 'system.methodSignature returns an array of signature arrays.'); - } - - /** - * Ensure that XML-RPC correctly handles invalid messages when parsing. - */ - protected function testInvalidMessageParsing() { - $invalid_messages = array( - array( - 'message' => xmlrpc_message(''), - 'assertion' => 'Empty message correctly rejected during parsing.', - ), - array( - 'message' => xmlrpc_message('<?xml version="1.0" encoding="ISO-8859-1"?>'), - 'assertion' => 'Empty message with XML declaration correctly rejected during parsing.', - ), - array( - 'message' => xmlrpc_message('<?xml version="1.0"?><params><param><value><string>value</string></value></param></params>'), - 'assertion' => 'Non-empty message without a valid message type is rejected during parsing.', - ), - array( - 'message' => xmlrpc_message('<methodResponse><params><param><value><string>value</string></value></param></methodResponse>'), - 'assertion' => 'Non-empty malformed message is rejected during parsing.', - ), - ); - - foreach ($invalid_messages as $assertion) { - $this->assertFalse(xmlrpc_message_parse($assertion['message']), $assertion['assertion']); - } - } -} diff --git a/core/modules/xmlrpc/src/Tests/XmlRpcMessagesTest.php b/core/modules/xmlrpc/src/Tests/XmlRpcMessagesTest.php deleted file mode 100644 index 46ea73b02ee35e3ccbe884fbe616fa8d315885e7..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/src/Tests/XmlRpcMessagesTest.php +++ /dev/null @@ -1,59 +0,0 @@ -<?php - -/** - * @file - * Definition of Drupal\xmlrpc\Tests\XmlRpcMessagesTest. - */ - -namespace Drupal\xmlrpc\Tests; - -use Drupal\simpletest\WebTestBase; - -/** - * Tests large messages and method alterations. - * - * @group xmlrpc - */ -class XmlRpcMessagesTest extends WebTestBase { - - /** - * Modules to enable. - * - * @var array - */ - public static $modules = array('xmlrpc', 'xmlrpc_test'); - - /** - * Make sure that XML-RPC can transfer large messages. - */ - function testSizedMessages() { - $xml_url = url('xmlrpc.php', array('absolute' => TRUE)); - $sizes = array(8, 80, 160); - foreach ($sizes as $size) { - $xml_message_l = xmlrpc_test_message_sized_in_kb($size); - $xml_message_r = xmlrpc($xml_url, array('messages.messageSizedInKB' => array($size))); - - $this->assertEqual($xml_message_l, $xml_message_r, format_string('XML-RPC messages.messageSizedInKB of %s Kb size received', array('%s' => $size))); - } - } - - /** - * Ensure that hook_xmlrpc_alter() can hide even builtin methods. - */ - protected function testAlterListMethods() { - // Ensure xmlrpc_test.alter() is disabled and retrieve regular list of methods. - \Drupal::state()->set('xmlrpc_test.alter', FALSE); - $url = url('xmlrpc.php', array('absolute' => TRUE)); - $methods1 = xmlrpc($url, array('system.listMethods' => array())); - - // Enable the alter hook and retrieve the list of methods again. - \Drupal::state()->set('xmlrpc_test.alter', TRUE); - $methods2 = xmlrpc($url, array('system.listMethods' => array())); - - $diff = array_diff($methods1, $methods2); - $this->assertTrue(is_array($diff) && !empty($diff), 'Method list is altered by hook_xmlrpc_alter'); - $removed = reset($diff); - $this->assertEqual($removed, 'system.methodSignature', 'Hiding builting system.methodSignature with hook_xmlrpc_alter works'); - } - -} diff --git a/core/modules/xmlrpc/src/Tests/XmlRpcValidatorTest.php b/core/modules/xmlrpc/src/Tests/XmlRpcValidatorTest.php deleted file mode 100644 index 1af8c0678c10731dacfcd5856b2d2182da2900d9..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/src/Tests/XmlRpcValidatorTest.php +++ /dev/null @@ -1,126 +0,0 @@ -<?php - -/** - * @file - * Definition of Drupal\xmlrpc\Tests\XmlRpcValidatorTest. - */ - -namespace Drupal\xmlrpc\Tests; - -use Drupal\simpletest\WebTestBase; - -/** - * See <a href="http://www.xmlrpc.com/validator1Docs">the xmlrpc validator1 - * specification</a>. - * - * @group xmlrpc - */ -class XmlRpcValidatorTest extends WebTestBase { - - /** - * Modules to enable. - * - * @var array - */ - public static $modules = array('xmlrpc', 'xmlrpc_test'); - - /** - * Run validator1 tests. - */ - function testValidator() { - $xml_url = url('xmlrpc.php', array('absolute' => TRUE)); - srand(); - mt_srand(); - - $array_1 = array(array('curly' => mt_rand(-100, 100)), - array('curly' => mt_rand(-100, 100)), - array('larry' => mt_rand(-100, 100)), - array('larry' => mt_rand(-100, 100)), - array('moe' => mt_rand(-100, 100)), - array('moe' => mt_rand(-100, 100)), - array('larry' => mt_rand(-100, 100))); - shuffle($array_1); - $l_res_1 = xmlrpc_test_arrayOfStructsTest($array_1); - $r_res_1 = xmlrpc($xml_url, array('validator1.arrayOfStructsTest' => array($array_1))); - $this->assertIdentical($l_res_1, $r_res_1); - - $string_2 = 't\'&>>zf"md>yr>xlcev<h<"k&j<og"w&&>">>uai"np&s>>q\'&b<>"&&&'; - $l_res_2 = xmlrpc_test_countTheEntities($string_2); - $r_res_2 = xmlrpc($xml_url, array('validator1.countTheEntities' => array($string_2))); - $this->assertIdentical($l_res_2, $r_res_2); - - $struct_3 = array('moe' => mt_rand(-100, 100), 'larry' => mt_rand(-100, 100), 'curly' => mt_rand(-100, 100), 'homer' => mt_rand(-100, 100)); - $l_res_3 = xmlrpc_test_easyStructTest($struct_3); - $r_res_3 = xmlrpc($xml_url, array('validator1.easyStructTest' => array($struct_3))); - $this->assertIdentical($l_res_3, $r_res_3); - - $struct_4 = array('sub1' => array('bar' => 13), - 'sub2' => 14, - 'sub3' => array('foo' => 1, 'baz' => 2), - 'sub4' => array('ss' => array('sss' => array('ssss' => 'sssss')))); - $l_res_4 = xmlrpc_test_echoStructTest($struct_4); - $r_res_4 = xmlrpc($xml_url, array('validator1.echoStructTest' => array($struct_4))); - $this->assertIdentical($l_res_4, $r_res_4); - - $int_5 = mt_rand(-100, 100); - $bool_5 = (($int_5 % 2) == 0); - $string_5 = $this->randomName(); - $double_5 = (double)(mt_rand(-1000, 1000) / 100); - $time_5 = REQUEST_TIME; - $base64_5 = $this->randomName(100); - $l_res_5 = xmlrpc_test_manyTypesTest($int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), $base64_5); - // See http://drupal.org/node/37766 why this currently fails - $l_res_5[5] = $l_res_5[5]->data; - $r_res_5 = xmlrpc($xml_url, array('validator1.manyTypesTest' => array($int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), xmlrpc_base64($base64_5)))); - // @todo Contains objects, objects are not equal. - $this->assertEqual($l_res_5, $r_res_5); - - $size = mt_rand(100, 200); - $array_6 = array(); - for ($i = 0; $i < $size; $i++) { - $array_6[] = $this->randomName(mt_rand(8, 12)); - } - - $l_res_6 = xmlrpc_test_moderateSizeArrayCheck($array_6); - $r_res_6 = xmlrpc($xml_url, array('validator1.moderateSizeArrayCheck' => array($array_6))); - $this->assertIdentical($l_res_6, $r_res_6); - - $struct_7 = array(); - for ($y = 2000; $y < 2002; $y++) { - for ($m = 3; $m < 5; $m++) { - for ($d = 1; $d < 6; $d++) { - $ys = (string) $y; - $ms = sprintf('%02d', $m); - $ds = sprintf('%02d', $d); - $struct_7[$ys][$ms][$ds]['moe'] = mt_rand(-100, 100); - $struct_7[$ys][$ms][$ds]['larry'] = mt_rand(-100, 100); - $struct_7[$ys][$ms][$ds]['curly'] = mt_rand(-100, 100); - } - } - } - $l_res_7 = xmlrpc_test_nestedStructTest($struct_7); - $r_res_7 = xmlrpc($xml_url, array('validator1.nestedStructTest' => array($struct_7))); - $this->assertIdentical($l_res_7, $r_res_7); - - - $int_8 = mt_rand(-100, 100); - $l_res_8 = xmlrpc_test_simpleStructReturnTest($int_8); - $r_res_8 = xmlrpc($xml_url, array('validator1.simpleStructReturnTest' => array($int_8))); - $this->assertIdentical($l_res_8, $r_res_8); - - /* Now test multicall */ - $x = array(); - $x['validator1.arrayOfStructsTest'] = array($array_1); - $x['validator1.countTheEntities'] = array($string_2); - $x['validator1.easyStructTest'] = array($struct_3); - $x['validator1.echoStructTest'] = array($struct_4); - $x['validator1.manyTypesTest'] = array($int_5, $bool_5, $string_5, $double_5, xmlrpc_date($time_5), xmlrpc_base64($base64_5)); - $x['validator1.moderateSizeArrayCheck'] = array($array_6); - $x['validator1.nestedStructTest'] = array($struct_7); - $x['validator1.simpleStructReturnTest'] = array($int_8); - - $a_l_res = array($l_res_1, $l_res_2, $l_res_3, $l_res_4, $l_res_5, $l_res_6, $l_res_7, $l_res_8); - $a_r_res = xmlrpc($xml_url, $x); - $this->assertEqual($a_l_res, $a_r_res); - } -} diff --git a/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.info.yml b/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.info.yml deleted file mode 100644 index 0359f92736b4981822e520be1a581abd7ad33a64..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.info.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: 'XML-RPC Test' -type: module -description: 'Support module for XML-RPC tests according to the validator1 specification.' -package: Testing -version: VERSION -core: 8.x diff --git a/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.module b/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.module deleted file mode 100644 index 320704005369371f1bef9a0ce38f715091e65241..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/tests/modules/xmlrpc_test/xmlrpc_test.module +++ /dev/null @@ -1,112 +0,0 @@ -<?php - -function xmlrpc_test_arrayOfStructsTest($array) { - $sum = 0; - foreach ($array as $struct) { - if (isset($struct['curly'])) { - $sum += $struct['curly']; - } - } - return $sum; -} - -function xmlrpc_test_countTheEntities($string) { - return array( - 'ctLeftAngleBrackets' => substr_count($string, '<'), - 'ctRightAngleBrackets' => substr_count($string, '>'), - 'ctAmpersands' => substr_count($string, '&'), - 'ctApostrophes' => substr_count($string, "'"), - 'ctQuotes' => substr_count($string, '"'), - ); -} - -function xmlrpc_test_easyStructTest($array) { - return $array["curly"] + $array["moe"] + $array["larry"]; -} - -function xmlrpc_test_echoStructTest($array) { - return $array; -} - -function xmlrpc_test_manyTypesTest($number, $boolean, $string, $double, $dateTime, $base64) { - $timestamp = gmmktime($dateTime->hour, $dateTime->minute, $dateTime->second, $dateTime->month, $dateTime->day, $dateTime->year); - return array($number, $boolean, $string, $double, xmlrpc_date($timestamp), xmlrpc_Base64($base64)); -} - -function xmlrpc_test_moderateSizeArrayCheck($array) { - return array_shift($array) . array_pop($array); -} - -function xmlrpc_test_nestedStructTest($array) { - return $array["2000"]["04"]["01"]["larry"] + $array["2000"]["04"]["01"]["moe"] + $array["2000"]["04"]["01"]["curly"]; -} - -function xmlrpc_test_simpleStructReturnTest($number) { - return array("times10" => ($number*10), "times100" => ($number*100), "times1000" => ($number*1000)); -} - -/** - * Implements hook_xmlrpc(). - */ -function xmlrpc_test_xmlrpc() { - return array( - 'validator1.arrayOfStructsTest' => 'xmlrpc_test_arrayOfStructsTest', - 'validator1.countTheEntities' => 'xmlrpc_test_countTheEntities', - 'validator1.easyStructTest' => 'xmlrpc_test_easyStructTest', - 'validator1.echoStructTest' => 'xmlrpc_test_echoStructTest', - 'validator1.manyTypesTest' => 'xmlrpc_test_manyTypesTest', - 'validator1.moderateSizeArrayCheck' => 'xmlrpc_test_moderateSizeArrayCheck', - 'validator1.nestedStructTest' => 'xmlrpc_test_nestedStructTest', - 'validator1.simpleStructReturnTest' => 'xmlrpc_test_simpleStructReturnTest', - 'messages.messageSizedInKB' => 'xmlrpc_test_message_sized_in_kb', - ); -} - -/** - * Implements hook_xmlrpc_alter(). - * - * Hide (or not) the system.methodSignature() service depending on a variable. - */ -function xmlrpc_test_xmlrpc_alter(&$services) { - $xmlprc_alter = \Drupal::state()->get('xmlrpc_test.alter') ?: FALSE; - if ($xmlprc_alter) { - $remove = NULL; - foreach ($services as $key => $value) { - if (!is_array($value)) { - continue; - } - if ($value[0] == 'system.methodSignature') { - $remove = $key; - break; - } - } - if (isset($remove)) { - unset($services[$remove]); - } - } -} - -/** - * Created a message of the desired size in KB. - * - * @param $size - * Message size in KB. - * @return array - * Generated message structure. - */ -function xmlrpc_test_message_sized_in_kb($size) { - $message = array(); - - $word = 'abcdefg'; - - // Create a ~1KB sized struct. - for ($i = 0 ; $i < 128; $i++) { - $line['word_' . $i] = $word; - } - - for ($i = 0; $i < $size; $i++) { - $message['line_' . $i] = $line; - } - - return $message; -} diff --git a/core/modules/xmlrpc/xmlrpc.api.php b/core/modules/xmlrpc/xmlrpc.api.php deleted file mode 100644 index beaacf15afade61cd64ffa245b66427590a8dcce..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/xmlrpc.api.php +++ /dev/null @@ -1,86 +0,0 @@ -<?php - -/** - * @file - * Hooks provided by the XML-RPC module. - */ - -/** - * Register XML-RPC callbacks. - * - * This hook lets a module register callback functions to be called when - * particular XML-RPC methods are invoked by a client. - * - * @return - * An array which maps XML-RPC methods to Drupal functions. Each array - * element is either a pair of method => function or an array with four - * entries: - * - The XML-RPC method name (for example, module.function). - * - The Drupal callback function (for example, module_function). - * - The method signature is an array of XML-RPC types. The first element - * of this array is the type of return value and then you should write a - * list of the types of the parameters. XML-RPC types are the following - * (See the types at http://www.xmlrpc.com/spec): - * - "boolean": 0 (false) or 1 (true). - * - "double": a floating point number (for example, -12.214). - * - "int": a integer number (for example, -12). - * - "array": an array without keys (for example, array(1, 2, 3)). - * - "struct": an associative array or an object (for example, - * array('one' => 1, 'two' => 2)). - * - "date": when you return a date, then you may either return a - * timestamp (time(), mktime() etc.) or an ISO8601 timestamp. When - * date is specified as an input parameter, then you get an object, - * which is described in the function xmlrpc_date - * - "base64": a string containing binary data, automatically - * encoded/decoded automatically. - * - "string": anything else, typically a string. - * - A descriptive help string, enclosed in a t() function for translation - * purposes. - * Both forms are shown in the example. - * - * @ingroup third_party - */ -function hook_xmlrpc() { - return array( - 'drupal.login' => 'drupal_login', - array( - 'drupal.site.ping', - 'drupal_directory_ping', - array('boolean', 'string', 'string', 'string', 'string', 'string'), - t('Handling ping request')) - ); -} - -/** - * Alters the definition of XML-RPC methods before they are called. - * - * This hook allows modules to modify the callback definition of declared - * XML-RPC methods, right before they are invoked by a client. Methods may be - * added, or existing methods may be altered. - * - * Note that hook_xmlrpc() supports two distinct and incompatible formats to - * define a callback, so care must be taken when altering other methods. - * - * @param $methods - * An asssociative array of method callback definitions, as returned from - * hook_xmlrpc() implementations. - * - * @see hook_xmlrpc() - * @see xmlrpc_server() - */ -function hook_xmlrpc_alter(&$methods) { - // Directly change a simple method. - $methods['drupal.login'] = 'mymodule_login'; - - // Alter complex definitions. - foreach ($methods as $key => &$method) { - // Skip simple method definitions. - if (!is_int($key)) { - continue; - } - // Perform the wanted manipulation. - if ($method[0] == 'drupal.site.ping') { - $method[1] = 'mymodule_directory_ping'; - } - } -} diff --git a/core/modules/xmlrpc/xmlrpc.inc b/core/modules/xmlrpc/xmlrpc.inc deleted file mode 100644 index aaa94218698daf3c3650da005f2ae269479e7017..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/xmlrpc.inc +++ /dev/null @@ -1,628 +0,0 @@ -<?php - -/** - * @file - * Drupal XML-RPC library. - * - * Based on the IXR - The Incutio XML-RPC Library - (c) Incutio Ltd 2002-2005 - * Version 1.7 (beta) - Simon Willison, 23rd May 2005 - * Site: http://scripts.incutio.com/xmlrpc/ - * Manual: http://scripts.incutio.com/xmlrpc/manual.php - * This version is made available under the GNU GPL License - */ - -use Drupal\Component\Utility\String; -use GuzzleHttp\Exception\RequestException; - -/** - * Turns a data structure into objects with 'data' and 'type' attributes. - * - * @param $data - * The data structure. - * @param $type - * Optional type to assign to $data. - * - * @return object - * An XML-RPC data object containing the input $data. - */ -function xmlrpc_value($data, $type = FALSE) { - $xmlrpc_value = new stdClass(); - $xmlrpc_value->data = $data; - if (!$type) { - $type = xmlrpc_value_calculate_type($xmlrpc_value); - } - $xmlrpc_value->type = $type; - if ($type == 'struct') { - // Turn all the values in the array into new xmlrpc_values - foreach ($xmlrpc_value->data as $key => $value) { - $xmlrpc_value->data[$key] = xmlrpc_value($value); - } - } - if ($type == 'array') { - for ($i = 0, $j = count($xmlrpc_value->data); $i < $j; $i++) { - $xmlrpc_value->data[$i] = xmlrpc_value($xmlrpc_value->data[$i]); - } - } - return $xmlrpc_value; -} - -/** - * Maps a PHP type to an XML-RPC type. - * - * @param $xmlrpc_value - * Variable whose type should be mapped. - * - * @return string - * The corresponding XML-RPC type. - * - * @see http://www.xmlrpc.com/spec#scalars - */ -function xmlrpc_value_calculate_type($xmlrpc_value) { - // http://www.php.net/gettype: Never use gettype() to test for a certain type - // [...] Instead, use the is_* functions. - if (is_bool($xmlrpc_value->data)) { - return 'boolean'; - } - if (is_double($xmlrpc_value->data)) { - return 'double'; - } - if (is_int($xmlrpc_value->data)) { - return 'int'; - } - if (is_array($xmlrpc_value->data)) { - // empty or integer-indexed arrays are 'array', string-indexed arrays 'struct' - return empty($xmlrpc_value->data) || range(0, count($xmlrpc_value->data) - 1) === array_keys($xmlrpc_value->data) ? 'array' : 'struct'; - } - if (is_object($xmlrpc_value->data)) { - if (isset($xmlrpc_value->data->is_date)) { - return 'date'; - } - if (isset($xmlrpc_value->data->is_base64)) { - return 'base64'; - } - $xmlrpc_value->data = get_object_vars($xmlrpc_value->data); - return 'struct'; - } - // default - return 'string'; -} - -/** - * Generates XML representing the given value. - * - * @param $xmlrpc_value - * A value to be represented in XML. - * - * @return - * XML representation of $xmlrpc_value. - */ -function xmlrpc_value_get_xml($xmlrpc_value) { - switch ($xmlrpc_value->type) { - case 'boolean': - return '<boolean>' . (($xmlrpc_value->data) ? '1' : '0') . '</boolean>'; - - case 'int': - return '<int>' . $xmlrpc_value->data . '</int>'; - - case 'double': - return '<double>' . $xmlrpc_value->data . '</double>'; - - case 'string': - // Note: we don't escape apostrophes because of the many blogging clients - // that don't support numerical entities (and XML in general) properly. - return '<string>' . htmlspecialchars($xmlrpc_value->data) . '</string>'; - - case 'array': - $return = '<array><data>' . "\n"; - foreach ($xmlrpc_value->data as $item) { - $return .= ' <value>' . xmlrpc_value_get_xml($item) . "</value>\n"; - } - $return .= '</data></array>'; - return $return; - - case 'struct': - $return = '<struct>' . "\n"; - foreach ($xmlrpc_value->data as $name => $value) { - $return .= " <member><name>" . String::checkPlain($name) . "</name><value>"; - $return .= xmlrpc_value_get_xml($value) . "</value></member>\n"; - } - $return .= '</struct>'; - return $return; - - case 'date': - return xmlrpc_date_get_xml($xmlrpc_value->data); - - case 'base64': - return xmlrpc_base64_get_xml($xmlrpc_value->data); - } - return FALSE; -} - -/** - * Constructs an object representing an XML-RPC message. - * - * @param $message - * A string containing an XML message. - * - * @return object - * An XML-RPC object containing the message. - * - * @see http://www.xmlrpc.com/spec - */ -function xmlrpc_message($message) { - $xmlrpc_message = new stdClass(); - // The stack used to keep track of the current array/struct - $xmlrpc_message->array_structs = array(); - // The stack used to keep track of if things are structs or array - $xmlrpc_message->array_structs_types = array(); - // A stack as well - $xmlrpc_message->current_struct_name = array(); - $xmlrpc_message->message = $message; - return $xmlrpc_message; -} - -/** - * Parses an XML-RPC message. - * - * If parsing fails, the faultCode and faultString will be added to the message - * object. - * - * @param $xmlrpc_message - * An object generated by xmlrpc_message(). - * - * @return - * TRUE if parsing succeeded; FALSE otherwise. - */ -function xmlrpc_message_parse($xmlrpc_message) { - $xmlrpc_message->_parser = xml_parser_create(); - // Set XML parser to take the case of tags into account. - xml_parser_set_option($xmlrpc_message->_parser, XML_OPTION_CASE_FOLDING, FALSE); - // Set XML parser callback functions - xml_set_element_handler($xmlrpc_message->_parser, 'xmlrpc_message_tag_open', 'xmlrpc_message_tag_close'); - xml_set_character_data_handler($xmlrpc_message->_parser, 'xmlrpc_message_cdata'); - xmlrpc_message_set($xmlrpc_message); - if (!xml_parse($xmlrpc_message->_parser, $xmlrpc_message->message)) { - return FALSE; - } - xml_parser_free($xmlrpc_message->_parser); - - // Grab the error messages, if any. - $xmlrpc_message = xmlrpc_message_get(); - if (!isset($xmlrpc_message->messagetype)) { - return FALSE; - } - elseif ($xmlrpc_message->messagetype == 'fault') { - $xmlrpc_message->fault_code = $xmlrpc_message->params[0]['faultCode']; - $xmlrpc_message->fault_string = $xmlrpc_message->params[0]['faultString']; - } - return TRUE; -} - -/** - * Stores a copy of the most recent XML-RPC message object temporarily. - * - * @param $value - * An XML-RPC message to store, or NULL to keep the last message. - * - * @return object - * The most recently stored message. - * - * @see xmlrpc_message_get() - */ -function xmlrpc_message_set($value = NULL) { - static $xmlrpc_message; - if ($value) { - $xmlrpc_message = $value; - } - return $xmlrpc_message; -} - -/** - * Returns the most recently stored XML-RPC message object. - * - * @return object - * The most recently stored message. - * - * @see xmlrpc_message_set() - */ -function xmlrpc_message_get() { - return xmlrpc_message_set(); -} - -/** - * Handles opening tags for XML parsing in xmlrpc_message_parse(). - */ -function xmlrpc_message_tag_open($parser, $tag, $attr) { - $xmlrpc_message = xmlrpc_message_get(); - $xmlrpc_message->current_tag_contents = ''; - $xmlrpc_message->last_open = $tag; - switch ($tag) { - case 'methodCall': - case 'methodResponse': - case 'fault': - $xmlrpc_message->messagetype = $tag; - break; - - // Deal with stacks of arrays and structs - case 'data': - $xmlrpc_message->array_structs_types[] = 'array'; - $xmlrpc_message->array_structs[] = array(); - break; - - case 'struct': - $xmlrpc_message->array_structs_types[] = 'struct'; - $xmlrpc_message->array_structs[] = array(); - break; - } - xmlrpc_message_set($xmlrpc_message); -} - -/** - * Handles character data for XML parsing in xmlrpc_message_parse(). - */ -function xmlrpc_message_cdata($parser, $cdata) { - $xmlrpc_message = xmlrpc_message_get(); - $xmlrpc_message->current_tag_contents .= $cdata; - xmlrpc_message_set($xmlrpc_message); -} - -/** - * Handles closing tags for XML parsing in xmlrpc_message_parse(). - */ -function xmlrpc_message_tag_close($parser, $tag) { - $xmlrpc_message = xmlrpc_message_get(); - $value_flag = FALSE; - switch ($tag) { - case 'int': - case 'i4': - $value = (int)trim($xmlrpc_message->current_tag_contents); - $value_flag = TRUE; - break; - - case 'double': - $value = (double)trim($xmlrpc_message->current_tag_contents); - $value_flag = TRUE; - break; - - case 'string': - $value = $xmlrpc_message->current_tag_contents; - $value_flag = TRUE; - break; - - case 'dateTime.iso8601': - $value = xmlrpc_date(trim($xmlrpc_message->current_tag_contents)); - // $value = $iso->getTimestamp(); - $value_flag = TRUE; - break; - - case 'value': - // If no type is indicated, the type is string - // We take special care for empty values - if (trim($xmlrpc_message->current_tag_contents) != '' || (isset($xmlrpc_message->last_open) && ($xmlrpc_message->last_open == 'value'))) { - $value = (string) $xmlrpc_message->current_tag_contents; - $value_flag = TRUE; - } - unset($xmlrpc_message->last_open); - break; - - case 'boolean': - $value = (boolean)trim($xmlrpc_message->current_tag_contents); - $value_flag = TRUE; - break; - - case 'base64': - $value = base64_decode(trim($xmlrpc_message->current_tag_contents)); - $value_flag = TRUE; - break; - - // Deal with stacks of arrays and structs - case 'data': - case 'struct': - $value = array_pop($xmlrpc_message->array_structs); - array_pop($xmlrpc_message->array_structs_types); - $value_flag = TRUE; - break; - - case 'member': - array_pop($xmlrpc_message->current_struct_name); - break; - - case 'name': - $xmlrpc_message->current_struct_name[] = trim($xmlrpc_message->current_tag_contents); - break; - - case 'methodName': - $xmlrpc_message->methodname = trim($xmlrpc_message->current_tag_contents); - break; - } - if ($value_flag) { - if (count($xmlrpc_message->array_structs) > 0) { - // Add value to struct or array - if ($xmlrpc_message->array_structs_types[count($xmlrpc_message->array_structs_types) - 1] == 'struct') { - // Add to struct - $xmlrpc_message->array_structs[count($xmlrpc_message->array_structs) - 1][$xmlrpc_message->current_struct_name[count($xmlrpc_message->current_struct_name) - 1]] = $value; - } - else { - // Add to array - $xmlrpc_message->array_structs[count($xmlrpc_message->array_structs) - 1][] = $value; - } - } - else { - // Just add as a parameter - $xmlrpc_message->params[] = $value; - } - } - if (!in_array($tag, array("data", "struct", "member"))) { - $xmlrpc_message->current_tag_contents = ''; - } - xmlrpc_message_set($xmlrpc_message); -} - -/** - * Constructs an object representing an XML-RPC request. - * - * @param $method - * The name of the method to be called. - * @param $args - * An array of parameters to send with the method. - * - * @return object - * An XML-RPC object representing the request. - */ -function xmlrpc_request($method, $args) { - $xmlrpc_request = new stdClass(); - $xmlrpc_request->method = $method; - $xmlrpc_request->args = $args; - $xmlrpc_request->xml = <<<EOD -<?xml version="1.0"?> -<methodCall> -<methodName>{$xmlrpc_request->method}</methodName> -<params> - -EOD; - foreach ($xmlrpc_request->args as $arg) { - $xmlrpc_request->xml .= '<param><value>'; - $v = xmlrpc_value($arg); - $xmlrpc_request->xml .= xmlrpc_value_get_xml($v); - $xmlrpc_request->xml .= "</value></param>\n"; - } - $xmlrpc_request->xml .= '</params></methodCall>'; - return $xmlrpc_request; -} - -/** - * Generates, temporarily saves, and returns an XML-RPC error object. - * - * @param $code - * The error code. - * @param $message - * The error message. - * @param $reset - * TRUE to empty the temporary error storage. Ignored if $code is supplied. - * - * @return object - * An XML-RPC error object representing $code and $message, or the most - * recently stored error object if omitted. - */ -function xmlrpc_error($code = NULL, $message = NULL, $reset = FALSE) { - static $xmlrpc_error; - if (isset($code)) { - $xmlrpc_error = new stdClass(); - $xmlrpc_error->is_error = TRUE; - $xmlrpc_error->code = $code; - $xmlrpc_error->message = $message; - } - elseif ($reset) { - $xmlrpc_error = NULL; - } - return $xmlrpc_error; -} - -/** - * Converts an XML-RPC error object into XML. - * - * @param $xmlrpc_error - * The XML-RPC error object. - * - * @return string - * An XML representation of the error as an XML methodResponse. - */ -function xmlrpc_error_get_xml($xmlrpc_error) { - return <<<EOD -<methodResponse> - <fault> - <value> - <struct> - <member> - <name>faultCode</name> - <value><int>{$xmlrpc_error->code}</int></value> - </member> - <member> - <name>faultString</name> - <value><string>{$xmlrpc_error->message}</string></value> - </member> - </struct> - </value> - </fault> -</methodResponse> - -EOD; -} - -/** - * Converts a PHP or ISO date/time to an XML-RPC object. - * - * @param $time - * A PHP timestamp or an ISO date-time string. - * - * @return object - * An XML-RPC time/date object. - */ -function xmlrpc_date($time) { - $xmlrpc_date = new stdClass(); - $xmlrpc_date->is_date = TRUE; - // $time can be a PHP timestamp or an ISO one - if (is_numeric($time)) { - $xmlrpc_date->year = gmdate('Y', $time); - $xmlrpc_date->month = gmdate('m', $time); - $xmlrpc_date->day = gmdate('d', $time); - $xmlrpc_date->hour = gmdate('H', $time); - $xmlrpc_date->minute = gmdate('i', $time); - $xmlrpc_date->second = gmdate('s', $time); - $xmlrpc_date->iso8601 = gmdate('Ymd\TH:i:s', $time); - } - else { - $xmlrpc_date->iso8601 = $time; - $time = str_replace(array('-', ':'), '', $time); - $xmlrpc_date->year = substr($time, 0, 4); - $xmlrpc_date->month = substr($time, 4, 2); - $xmlrpc_date->day = substr($time, 6, 2); - $xmlrpc_date->hour = substr($time, 9, 2); - $xmlrpc_date->minute = substr($time, 11, 2); - $xmlrpc_date->second = substr($time, 13, 2); - } - return $xmlrpc_date; -} - -/** - * Converts an XML-RPC date-time object into XML. - * - * @param $xmlrpc_date - * The XML-RPC date-time object. - * - * @return string - * An XML representation of the date/time as XML. - */ -function xmlrpc_date_get_xml($xmlrpc_date) { - return '<dateTime.iso8601>' . $xmlrpc_date->year . $xmlrpc_date->month . $xmlrpc_date->day . 'T' . $xmlrpc_date->hour . ':' . $xmlrpc_date->minute . ':' . $xmlrpc_date->second . '</dateTime.iso8601>'; -} - -/** - * Returns an XML-RPC base 64 object. - * - * @param $data - * Base 64 data to store in returned object. - * - * @return object - * An XML-RPC base 64 object. - */ -function xmlrpc_base64($data) { - $xmlrpc_base64 = new stdClass(); - $xmlrpc_base64->is_base64 = TRUE; - $xmlrpc_base64->data = $data; - return $xmlrpc_base64; -} - -/** - * Converts an XML-RPC base 64 object into XML. - * - * @param $xmlrpc_base64 - * The XML-RPC base 64 object. - * - * @return string - * An XML representation of the base 64 data as XML. - */ -function xmlrpc_base64_get_xml($xmlrpc_base64) { - return '<base64>' . base64_encode($xmlrpc_base64->data) . '</base64>'; -} - -/** - * Performs one or more XML-RPC requests. - * - * @param string $url - * An absolute URL of the XML-RPC endpoint, e.g., - * http://example.com/xmlrpc.php - * @param array $args - * An associative array whose keys are the methods to call and whose values - * are the arguments to pass to the respective method. If multiple methods - * are specified, a system.multicall is performed. - * @param array $headers - * (optional) An array of HTTP headers to pass along. - * - * @return - * A single response (single request) or an array of responses (multicall - * request). Each response is the return value of the method, just as if it - * has been a local function call, on success, or FALSE on failure. If FALSE - * is returned, see xmlrpc_errno() and xmlrpc_error_msg() to get more - * information. - */ -function _xmlrpc($url, array $args, array $headers = array()) { - xmlrpc_clear_error(); - if (count($args) > 1) { - $multicall_args = array(); - foreach ($args as $method => $call) { - $multicall_args[] = array('methodName' => $method, 'params' => $call); - } - $method = 'system.multicall'; - $args = array($multicall_args); - } - else { - $method = key($args); - $args = $args[$method]; - } - $xmlrpc_request = xmlrpc_request($method, $args); - - $headers['Content-Type'] = 'text/xml'; - - try { - $response = \Drupal::httpClient()->post($url, array('headers' => $headers, 'body' => $xmlrpc_request->xml)); - } - catch (RequestException $exception) { - xmlrpc_error(NULL, $exception->getMethod()); - return FALSE; - } - $message = xmlrpc_message($response->getBody(TRUE)); - // Now parse what we've got back - if (!xmlrpc_message_parse($message)) { - // XML error - xmlrpc_error(-32700, t('Parse error. Not well formed')); - return FALSE; - } - // Is the message a fault? - if ($message->messagetype == 'fault') { - xmlrpc_error($message->fault_code, $message->fault_string); - return FALSE; - } - // We now know that the message is well-formed and a non-fault result. - if ($method == 'system.multicall') { - // Return per-method results or error objects. - $return = array(); - foreach ($message->params[0] as $result) { - if (array_keys($result) == array(0)) { - $return[] = $result[0]; - } - else { - $return[] = xmlrpc_error($result['faultCode'], $result['faultString']); - } - } - } - else { - $return = $message->params[0]; - } - return $return; -} - -/** - * Returns the last XML-RPC client error number. - */ -function xmlrpc_errno() { - $error = xmlrpc_error(); - return ($error != NULL ? $error->code : NULL); -} - -/** - * Returns the last XML-RPC client error message. - */ -function xmlrpc_error_msg() { - $error = xmlrpc_error(); - return ($error != NULL ? $error->message : NULL); -} - -/** - * Clears any previously-saved errors. - * - * @see xmlrpc_error() - */ -function xmlrpc_clear_error() { - xmlrpc_error(NULL, NULL, TRUE); -} diff --git a/core/modules/xmlrpc/xmlrpc.info.yml b/core/modules/xmlrpc/xmlrpc.info.yml deleted file mode 100644 index e10ec9cc68a907dc589c152a1ce50b81feac4d68..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/xmlrpc.info.yml +++ /dev/null @@ -1,6 +0,0 @@ -name: XML-RPC -type: module -description: 'Provides XML-RPC functionality.' -package: Core -version: VERSION -core: 8.x diff --git a/core/modules/xmlrpc/xmlrpc.module b/core/modules/xmlrpc/xmlrpc.module deleted file mode 100644 index 21fafe1e7fd3ee33007f15912d5b82f8be9453a8..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/xmlrpc.module +++ /dev/null @@ -1,56 +0,0 @@ -<?php - -/** - * @file - * Enables XML-RPC functionality. - */ - -use Drupal\Core\Routing\RouteMatchInterface; - -/** - * Implements hook_help(). - */ -function xmlrpc_help($route_name, RouteMatchInterface $route_match) { - switch ($route_name) { - case 'help.page.xmlrpc': - $output = ''; - $output .= '<h3>' . t('About') . '</h3>'; - $output .= '<p>' . t('The XML-RPC module gives external systems the opportunity to communicate with the site through the <a href="http://en.wikipedia.org/wiki/XML-RPC">XML-RPC protocol</a>. An XML-RPC client can communicate with the site by making a request to <a href="!xrphp">xmlrpc.php</a>. For more information, see <a href="!xrdocs">the online documentation for the XML-RPC module</a>.', array('!xrphp' => \Drupal::url('xmlrpc.php'),'!xrdocs' => 'https://drupal.org/documentation/modules/xmlrpc')) . '</p>'; - return $output; - } -} - -/** - * Performs one or more XML-RPC request(s). - * - * Usage example: - * @code - * $result = xmlrpc('http://example.com/xmlrpc.php', array( - * 'service.methodName' => array($parameter, $second, $third), - * )); - * @endcode - * - * @param string $url - * An absolute URL of the XML-RPC endpoint. - * @param array $args - * An associative array whose keys are the methods to call and whose values - * are the arguments to pass to the respective method. If multiple methods - * are specified, a system.multicall is performed. - * @param array $headers - * (optional) An array of headers to pass along. - * - * @return - * For one request: - * Either the return value of the method on success, or FALSE. - * If FALSE is returned, see xmlrpc_errno() and xmlrpc_error_msg(). - * For multiple requests: - * An array of results. Each result will either be the result - * returned by the method called, or an xmlrpc_error object if the call - * failed. See xmlrpc_error(). - * - * @ingroup third_party - */ -function xmlrpc($url, array $args, array $headers = array()) { - module_load_include('inc', 'xmlrpc'); - return _xmlrpc($url, $args, $headers); -} diff --git a/core/modules/xmlrpc/xmlrpc.routing.yml b/core/modules/xmlrpc/xmlrpc.routing.yml deleted file mode 100644 index f6cc78c604af88d9a78659e2d9d9ef21f1d81a85..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/xmlrpc.routing.yml +++ /dev/null @@ -1,7 +0,0 @@ -xmlrpc.php: - path: '/xmlrpc.php' - defaults: - _title: 'XML-RPC' - _content: '\Drupal\xmlrpc\Controller\XmlrpcController::php' - requirements: - _access: 'TRUE' diff --git a/core/modules/xmlrpc/xmlrpc.server.inc b/core/modules/xmlrpc/xmlrpc.server.inc deleted file mode 100644 index 0fb497d63fdbc801f248b8decd25d9fb149037d0..0000000000000000000000000000000000000000 --- a/core/modules/xmlrpc/xmlrpc.server.inc +++ /dev/null @@ -1,413 +0,0 @@ -<?php - -/** - * @file - * Page callback file for the xmlrpc module. - */ - -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; - -/** - * Process an XML-RPC request. - * - * @return \Symfony\Component\HttpFoundation\Response - * A Response object. - * - * @deprecated in Drupal 8.x-dev, will be removed before Drupal 8.0. - * Use \Drupal\xmlrpc\Controller\XmlrpcController::php(). - */ -function xmlrpc_server_page() { - module_load_include('inc', 'xmlrpc'); - return xmlrpc_server(\Drupal::moduleHandler()->invokeAll('xmlrpc')); -} - -/** - * Invokes XML-RPC methods on this server. - * - * @param array $callbacks - * Either an associative array of external XML-RPC method names as keys with - * the callbacks they map to as values, or a more complex structure - * describing XML-RPC callbacks as returned from hook_xmlrpc(). - * - * @return \Symfony\Component\HttpFoundation\Response - * A Response object. - */ -function xmlrpc_server($callbacks) { - $xmlrpc_server = new stdClass(); - // Define built-in XML-RPC method names - $defaults = array( - 'system.multicall' => 'xmlrpc_server_multicall', - array( - 'system.methodSignature', - 'xmlrpc_server_method_signature', - array('array', 'string'), - 'Returns an array describing the return type and required parameters of a method.', - ), - array( - 'system.getCapabilities', - 'xmlrpc_server_get_capabilities', - array('struct'), - 'Returns a struct describing the XML-RPC specifications supported by this server.', - ), - array( - 'system.listMethods', - 'xmlrpc_server_list_methods', - array('array'), - 'Returns an array of available methods on this server.', - ), - array( - 'system.methodHelp', - 'xmlrpc_server_method_help', - array('string', 'string'), - 'Returns a documentation string for the specified method.', - ), - ); - // We build an array of all method names by combining the built-ins - // with those defined by modules implementing the _xmlrpc hook. - // Built-in methods are overridable. - $callbacks = array_merge($defaults, (array) $callbacks); - \Drupal::moduleHandler()->alter('xmlrpc', $callbacks); - foreach ($callbacks as $key => $callback) { - // we could check for is_array($callback) - if (is_int($key)) { - $method = $callback[0]; - $xmlrpc_server->callbacks[$method] = $callback[1]; - $xmlrpc_server->signatures[$method] = $callback[2]; - $xmlrpc_server->help[$method] = $callback[3]; - } - else { - $xmlrpc_server->callbacks[$key] = $callback; - $xmlrpc_server->signatures[$key] = ''; - $xmlrpc_server->help[$key] = ''; - } - } - - $data = file_get_contents('php://input'); - if (!$data) { - throw new BadRequestHttpException('XML-RPC server accepts POST requests only.'); - } - $xmlrpc_server->message = xmlrpc_message($data); - if (!xmlrpc_message_parse($xmlrpc_server->message)) { - return xmlrpc_server_error(-32700, t('Parse error. Request not well formed.')); - } - if ($xmlrpc_server->message->messagetype != 'methodCall') { - return xmlrpc_server_error(-32600, t('Server error. Invalid XML-RPC. Request must be a methodCall.')); - } - if (!isset($xmlrpc_server->message->params)) { - $xmlrpc_server->message->params = array(); - } - xmlrpc_server_set($xmlrpc_server); - $result = xmlrpc_server_call($xmlrpc_server, $xmlrpc_server->message->methodname, $xmlrpc_server->message->params); - - if (is_object($result) && !empty($result->is_error)) { - return xmlrpc_server_error($result); - } - // Encode the result - $r = xmlrpc_value($result); - // Create the XML - $xml = ' -<methodResponse> - <params> - <param> - <value>' . xmlrpc_value_get_xml($r) . '</value> - </param> - </params> -</methodResponse> - -'; - // Send it - return xmlrpc_server_output($xml); -} - -/** - * Throws an XML-RPC error. - * - * @param $error - * An error object or integer error code. - * @param $message - * (optional) The description of the error. Used only if an integer error - * code was passed in. - * - * @return \Symfony\Component\HttpFoundation\Response - * A Response object. - */ -function xmlrpc_server_error($error, $message = FALSE) { - if ($message && !is_object($error)) { - $error = xmlrpc_error($error, $message); - } - return xmlrpc_server_output(xmlrpc_error_get_xml($error)); -} - -/** - * Sends XML-RPC output to the browser. - * - * @param string $xml - * XML to send to the browser. - * - * @return \Symfony\Component\HttpFoundation\Response - * A Response object. - */ -function xmlrpc_server_output($xml) { - $xml = '<?xml version="1.0"?>' . "\n" . $xml; - $headers = array( - 'Content-Length' => strlen($xml), - 'Content-Type' => 'text/xml' - ); - return new Response($xml, 200, $headers); -} - -/** - * Stores a copy of an XML-RPC request temporarily. - * - * @param object $xmlrpc_server - * (optional) Request object created by xmlrpc_server(). Omit to leave the - * previous server object saved. - * - * @return - * The latest stored request. - * - * @see xmlrpc_server_get() - */ -function xmlrpc_server_set($xmlrpc_server = NULL) { - static $server; - if (!isset($server)) { - $server = $xmlrpc_server; - } - return $server; -} - -/** - * Retrieves the latest stored XML-RPC request. - * - * @return object - * The stored request. - * - * @see xmlrpc_server_set() - */ -function xmlrpc_server_get() { - return xmlrpc_server_set(); -} - -/** - * Dispatches an XML-RPC request and any parameters to the appropriate handler. - * - * @param object $xmlrpc_server - * Object containing information about this XML-RPC server, the methods it - * provides, their signatures, etc. - * @param string $methodname - * The external XML-RPC method name; e.g., 'system.methodHelp'. - * @param array $args - * Array containing any parameters that are to be sent along with the request. - * - * @return - * The results of the call. - */ -function xmlrpc_server_call($xmlrpc_server, $methodname, $args) { - // Make sure parameters are in an array - if ($args && !is_array($args)) { - $args = array($args); - } - // Has this method been mapped to a Drupal function by us or by modules? - if (!isset($xmlrpc_server->callbacks[$methodname])) { - return xmlrpc_error(-32601, t('Server error. Requested method @methodname not specified.', array("@methodname" => $xmlrpc_server->message->methodname))); - } - $method = $xmlrpc_server->callbacks[$methodname]; - $signature = $xmlrpc_server->signatures[$methodname]; - - // If the method has a signature, validate the request against the signature - if (is_array($signature)) { - $ok = TRUE; - // Remove first element of $signature which is the unused 'return type'. - array_shift($signature); - // Check the number of arguments - if (count($args) != count($signature)) { - return xmlrpc_error(-32602, t('Server error. Wrong number of method parameters.')); - } - // Check the argument types - foreach ($signature as $key => $type) { - $arg = $args[$key]; - switch ($type) { - case 'int': - case 'i4': - if (is_array($arg) || !is_int($arg)) { - $ok = FALSE; - } - break; - - case 'base64': - case 'string': - if (!is_string($arg)) { - $ok = FALSE; - } - break; - - case 'boolean': - if ($arg !== FALSE && $arg !== TRUE) { - $ok = FALSE; - } - break; - - case 'float': - case 'double': - if (!is_float($arg)) { - $ok = FALSE; - } - break; - - case 'date': - case 'dateTime.iso8601': - if (!$arg->is_date) { - $ok = FALSE; - } - break; - } - if (!$ok) { - return xmlrpc_error(-32602, t('Server error. Invalid method parameters.')); - } - } - } - - if (!function_exists($method)) { - return xmlrpc_error(-32601, t('Server error. Requested function @method does not exist.', array("@method" => $method))); - } - // Call the mapped function - return call_user_func_array($method, $args); -} - -/** - * Dispatches multiple XML-RPC requests. - * - * @param array $methodcalls - * An array of XML-RPC requests to make. Each request is an array with the - * following elements: - * - methodName: Name of the method to invoke. - * - params: Parameters to pass to the method. - * - * @return - * An array of the results of each request. - * - * @see xmlrpc_server_call() - */ -function xmlrpc_server_multicall($methodcalls) { - // See http://www.xmlrpc.com/discuss/msgReader$1208 - $return = array(); - $xmlrpc_server = xmlrpc_server_get(); - foreach ($methodcalls as $call) { - $ok = TRUE; - if (!isset($call['methodName']) || !isset($call['params'])) { - $result = xmlrpc_error(3, t('Invalid syntax for system.multicall.')); - $ok = FALSE; - } - $method = $call['methodName']; - $params = $call['params']; - if ($method == 'system.multicall') { - $result = xmlrpc_error(-32600, t('Recursive calls to system.multicall are forbidden.')); - } - elseif ($ok) { - $result = xmlrpc_server_call($xmlrpc_server, $method, $params); - } - if (is_object($result) && !empty($result->is_error)) { - $return[] = array( - 'faultCode' => $result->code, - 'faultString' => $result->message, - ); - } - else { - $return[] = array($result); - } - } - return $return; -} - -/** - * Lists the methods available on this XML-RPC server. - * - * XML-RPC method system.listMethods maps to this function. - * - * @return array - * Array of the names of methods available on this server. - */ -function xmlrpc_server_list_methods() { - $xmlrpc_server = xmlrpc_server_get(); - return array_keys($xmlrpc_server->callbacks); -} - -/** - * Returns a list of the capabilities of this server. - * - * XML-RPC method system.getCapabilities maps to this function. - * - * @return array - * Array of server capabilities. - * - * @see http://groups.yahoo.com/group/xml-rpc/message/2897 - */ -function xmlrpc_server_get_capabilities() { - return array( - 'xmlrpc' => array( - 'specUrl' => 'http://www.xmlrpc.com/spec', - 'specVersion' => 1, - ), - 'faults_interop' => array( - 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php', - 'specVersion' => 20010516, - ), - 'system.multicall' => array( - 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208', - 'specVersion' => 1, - ), - 'introspection' => array( - 'specUrl' => 'http://scripts.incutio.com/xmlrpc/introspection.html', - 'specVersion' => 1, - ), - ); -} - -/** - * Returns one method signature for a function. - * - * This is the function mapped to the XML-RPC method system.methodSignature. - * - * A method signature is an array of the input and output types of a method. For - * instance, the method signature of this function is array('array', 'string'), - * because it takes an array and returns a string. - * - * @param string $methodname - * Name of method to return a method signature for. - * - * @return array - * An array of arrays of types, each of the arrays representing one method - * signature of the function that $methodname maps to. - */ -function xmlrpc_server_method_signature($methodname) { - $xmlrpc_server = xmlrpc_server_get(); - if (!isset($xmlrpc_server->callbacks[$methodname])) { - return xmlrpc_error(-32601, t('Server error. Requested method @methodname not specified.', array("@methodname" => $methodname))); - } - if (!is_array($xmlrpc_server->signatures[$methodname])) { - return xmlrpc_error(-32601, t('Server error. Requested method @methodname signature not specified.', array("@methodname" => $methodname))); - } - // We array of types - $return = array(); - foreach ($xmlrpc_server->signatures[$methodname] as $type) { - $return[] = $type; - } - return array($return); -} - -/** - * Returns the help for an XML-RPC method. - * - * XML-RPC method system.methodHelp maps to this function. - * - * @param string $method - * Name of method for which we return a help string. - * - * @return string - * Help text for $method. - */ -function xmlrpc_server_method_help($method) { - $xmlrpc_server = xmlrpc_server_get(); - return $xmlrpc_server->help[$method]; -} diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh index 54bef824f9957f84bb3d438c362a3147398d882a..16b29ca1dbd3ee1d65f93a660404f7a802dafa44 100755 --- a/core/scripts/run-tests.sh +++ b/core/scripts/run-tests.sh @@ -190,7 +190,7 @@ function simpletest_script_help() { as the names of test groups as shown at admin/config/development/testing. These group names typically correspond to module names like "User" - or "Profile" or "System", but there is also a group "XML-RPC". + or "Profile" or "System", but there is also a group "Database". If --class is specified then these are interpreted as the names of specific test classes whose test methods will be run. Tests must be separated by commas. Ignored if --all is specified.