aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/vendor/kissifrot/php-ixr/src/Client/ClientSSL.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/kissifrot/php-ixr/src/Client/ClientSSL.php')
-rw-r--r--vendor/kissifrot/php-ixr/src/Client/ClientSSL.php235
1 files changed, 235 insertions, 0 deletions
diff --git a/vendor/kissifrot/php-ixr/src/Client/ClientSSL.php b/vendor/kissifrot/php-ixr/src/Client/ClientSSL.php
new file mode 100644
index 000000000..7bbd5a551
--- /dev/null
+++ b/vendor/kissifrot/php-ixr/src/Client/ClientSSL.php
@@ -0,0 +1,235 @@
+<?php
+namespace IXR\Client;
+
+use IXR\Exception\ClientException;
+use IXR\Message\Message;
+use IXR\Request\Request;
+
+/**
+ * Client for communicating with a XML-RPC Server over HTTPS.
+ *
+ * @author Jason Stirk <jstirk@gmm.com.au> (@link http://blog.griffin.homelinux.org/projects/xmlrpc/)
+ * @version 0.2.0 26May2005 08:34 +0800
+ * @copyright (c) 2004-2005 Jason Stirk
+ * @package IXR
+ */
+class ClientSSL extends Client
+{
+ /**
+ * Filename of the SSL Client Certificate
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ private $_certFile;
+
+ /**
+ * Filename of the SSL CA Certificate
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ private $_caFile;
+
+ /**
+ * Filename of the SSL Client Private Key
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ private $_keyFile;
+
+ /**
+ * Passphrase to unlock the private key
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ private $_passphrase;
+
+ /**
+ * Constructor
+ * @param string $server URL of the Server to connect to
+ * @since 0.1.0
+ */
+ public function __construct($server, $path = false, $port = 443, $timeout = false, $timeout_io = null)
+ {
+ parent::__construct($server, $path, $port, $timeout, $timeout_io);
+ $this->useragent = 'The Incutio XML-RPC PHP Library for SSL';
+
+ // Set class fields
+ $this->_certFile = false;
+ $this->_caFile = false;
+ $this->_keyFile = false;
+ $this->_passphrase = '';
+ }
+
+ /**
+ * Set the client side certificates to communicate with the server.
+ *
+ * @since 0.1.0
+ * @param string $certificateFile Filename of the client side certificate to use
+ * @param string $keyFile Filename of the client side certificate's private key
+ * @param string $keyPhrase Passphrase to unlock the private key
+ * @throws ClientException
+ */
+ public function setCertificate($certificateFile, $keyFile, $keyPhrase = '')
+ {
+ // Check the files all exist
+ if (is_file($certificateFile)) {
+ $this->_certFile = $certificateFile;
+ } else {
+ throw new ClientException('Could not open certificate: ' . $certificateFile);
+ }
+
+ if (is_file($keyFile)) {
+ $this->_keyFile = $keyFile;
+ } else {
+ throw new ClientException('Could not open private key: ' . $keyFile);
+ }
+
+ $this->_passphrase = (string)$keyPhrase;
+ }
+
+ public function setCACertificate($caFile)
+ {
+ if (is_file($caFile)) {
+ $this->_caFile = $caFile;
+ } else {
+ throw new ClientException('Could not open CA certificate: ' . $caFile);
+ }
+ }
+
+ /**
+ * Sets the connection timeout (in seconds)
+ * @param int $newTimeOut Timeout in seconds
+ * @returns void
+ * @since 0.1.2
+ */
+ public function setTimeOut($newTimeOut)
+ {
+ $this->timeout = (int)$newTimeOut;
+ }
+
+ /**
+ * Returns the connection timeout (in seconds)
+ * @returns int
+ * @since 0.1.2
+ */
+ public function getTimeOut()
+ {
+ return $this->timeout;
+ }
+
+ /**
+ * Set the query to send to the XML-RPC Server
+ * @since 0.1.0
+ */
+ public function query()
+ {
+ $args = func_get_args();
+ $method = array_shift($args);
+ $request = new Request($method, $args);
+ $length = $request->getLength();
+ $xml = $request->getXml();
+
+ $this->debugOutput('<pre>' . htmlspecialchars($xml) . PHP_EOL . '</pre>');
+
+ //This is where we deviate from the normal query()
+ //Rather than open a normal sock, we will actually use the cURL
+ //extensions to make the calls, and handle the SSL stuff.
+
+ $curl = curl_init('https://' . $this->server . $this->path);
+
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+
+ //Since 23Jun2004 (0.1.2) - Made timeout a class field
+ curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, $this->timeout);
+ if (null !== $this->timeout_io) {
+ curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout_io);
+ }
+
+ if ($this->debug) {
+ curl_setopt($curl, CURLOPT_VERBOSE, 1);
+ }
+
+ curl_setopt($curl, CURLOPT_HEADER, 1);
+ curl_setopt($curl, CURLOPT_POST, 1);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
+ if($this->port !== 443) {
+ curl_setopt($curl, CURLOPT_PORT, $this->port);
+ }
+ curl_setopt($curl, CURLOPT_HTTPHEADER, [
+ "Content-Type: text/xml",
+ "Content-length: {$length}"
+ ]);
+
+ // Process the SSL certificates, etc. to use
+ if (!($this->_certFile === false)) {
+ // We have a certificate file set, so add these to the cURL handler
+ curl_setopt($curl, CURLOPT_SSLCERT, $this->_certFile);
+ curl_setopt($curl, CURLOPT_SSLKEY, $this->_keyFile);
+
+ if ($this->debug) {
+ $this->debugOutput('SSL Cert at : ' . $this->_certFile);
+ $this->debugOutput('SSL Key at : ' . $this->_keyFile);
+ }
+
+ // See if we need to give a passphrase
+ if (!($this->_passphrase === '')) {
+ curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->_passphrase);
+ }
+
+ if ($this->_caFile === false) {
+ // Don't verify their certificate, as we don't have a CA to verify against
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
+ } else {
+ // Verify against a CA
+ curl_setopt($curl, CURLOPT_CAINFO, $this->_caFile);
+ }
+ }
+
+ // Call cURL to do it's stuff and return us the content
+ $contents = curl_exec($curl);
+ curl_close($curl);
+
+ // Check for 200 Code in $contents
+ if (!strstr($contents, '200 OK')) {
+ //There was no "200 OK" returned - we failed
+ return $this->handleError(-32300, 'transport error - HTTP status code was not 200');
+ }
+
+ if ($this->debug) {
+ $this->debugOutput('<pre>' . htmlspecialchars($contents) . PHP_EOL . '</pre>');
+ }
+ // Now parse what we've got back
+ // Since 20Jun2004 (0.1.1) - We need to remove the headers first
+ // Why I have only just found this, I will never know...
+ // So, remove everything before the first <
+ $contents = substr($contents, strpos($contents, '<'));
+
+ $this->message = new Message($contents);
+ if (!$this->message->parse()) {
+ // XML error
+ return $this->handleError(-32700, 'parse error. not well formed');
+ }
+ // Is the message a fault?
+ if ($this->message->messageType == 'fault') {
+ return $this->handleError($this->message->faultCode, $this->message->faultString);
+ }
+
+ // Message must be OK
+ return true;
+ }
+
+ /**
+ * Debug output, if debug is enabled
+ * @param $message
+ */
+ private function debugOutput($message)
+ {
+ if ($this->debug) {
+ echo $message . PHP_EOL;
+ }
+ }
+}