summaryrefslogtreecommitdiff
path: root/vendor/JsonRPC/Server.php
diff options
context:
space:
mode:
authorFrédéric Guillot <fred@kanboard.net>2014-11-04 21:33:05 -0500
committerFrédéric Guillot <fred@kanboard.net>2014-11-04 21:33:05 -0500
commit135b921db75da5995eab7e36393ecd4d2b0bc66f (patch)
tree46efc60fcf1f9d5c57ab1fb9418c2acfbda0698a /vendor/JsonRPC/Server.php
parent850645dd6b22f5b495d1680e0b49540e0ebf9bd3 (diff)
Switch to composer
Diffstat (limited to 'vendor/JsonRPC/Server.php')
-rw-r--r--vendor/JsonRPC/Server.php352
1 files changed, 0 insertions, 352 deletions
diff --git a/vendor/JsonRPC/Server.php b/vendor/JsonRPC/Server.php
deleted file mode 100644
index 72d4e27e..00000000
--- a/vendor/JsonRPC/Server.php
+++ /dev/null
@@ -1,352 +0,0 @@
-<?php
-
-namespace JsonRPC;
-
-use ReflectionFunction;
-use Closure;
-
-/**
- * JsonRPC server class
- *
- * @package JsonRPC
- * @author Frederic Guillot
- * @license Unlicense http://unlicense.org/
- */
-class Server
-{
- /**
- * Data received from the client
- *
- * @access private
- * @var string
- */
- private $payload;
-
- /**
- * List of procedures
- *
- * @static
- * @access private
- * @var array
- */
- static private $procedures = array();
-
- /**
- * Constructor
- *
- * @access public
- * @param string $payload Client data
- */
- public function __construct($payload = '')
- {
- $this->payload = $payload;
- }
-
- /**
- * IP based client restrictions
- *
- * Return an HTTP error 403 if the client is not allowed
- *
- * @access public
- * @param array $hosts List of hosts
- */
- public function allowHosts(array $hosts) {
-
- if (! in_array($_SERVER['REMOTE_ADDR'], $hosts)) {
-
- header('Content-Type: application/json');
- header('HTTP/1.0 403 Forbidden');
- echo '["Access Forbidden"]';
- exit;
- }
- }
-
- /**
- * HTTP Basic authentication
- *
- * Return an HTTP error 401 if the client is not allowed
- *
- * @access public
- * @param array $users Map of username/password
- */
- public function authentication(array $users)
- {
- // OVH workaround
- if (isset($_SERVER['REMOTE_USER'])) {
- list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', base64_decode(substr($_SERVER['REMOTE_USER'], 6)));
- }
-
- if (! isset($_SERVER['PHP_AUTH_USER']) ||
- ! isset($users[$_SERVER['PHP_AUTH_USER']]) ||
- $users[$_SERVER['PHP_AUTH_USER']] !== $_SERVER['PHP_AUTH_PW']) {
-
- header('WWW-Authenticate: Basic realm="JsonRPC"');
- header('Content-Type: application/json');
- header('HTTP/1.0 401 Unauthorized');
- echo '["Authentication failed"]';
- exit;
- }
- }
-
- /**
- * Register a new procedure
- *
- * @access public
- * @param string $name Procedure name
- * @param closure $callback Callback
- */
- public function register($name, Closure $callback)
- {
- self::$procedures[$name] = $callback;
- }
-
- /**
- * Unregister a procedure
- *
- * @access public
- * @param string $name Procedure name
- */
- public function unregister($name)
- {
- if (isset(self::$procedures[$name])) {
- unset(self::$procedures[$name]);
- }
- }
-
- /**
- * Unregister all procedures
- *
- * @access public
- */
- public function unregisterAll()
- {
- self::$procedures = array();
- }
-
- /**
- * Return the response to the client
- *
- * @access public
- * @param array $data Data to send to the client
- * @param array $payload Incoming data
- * @return string
- */
- public function getResponse(array $data, array $payload = array())
- {
- if (! array_key_exists('id', $payload)) {
- return '';
- }
-
- $response = array(
- 'jsonrpc' => '2.0',
- 'id' => $payload['id']
- );
-
- $response = array_merge($response, $data);
-
- @header('Content-Type: application/json');
- return json_encode($response);
- }
-
- /**
- * Map arguments to the procedure
- *
- * @access public
- * @param array $request_params Incoming arguments
- * @param array $method_params Procedure arguments
- * @param array $params Arguments to pass to the callback
- * @param integer $nb_required_params Number of required parameters
- * @return bool
- */
- public function mapParameters(array $request_params, array $method_params, array &$params, $nb_required_params)
- {
- if (count($request_params) < $nb_required_params) {
- return false;
- }
-
- // Positional parameters
- if (array_keys($request_params) === range(0, count($request_params) - 1)) {
- $params = $request_params;
- return true;
- }
-
- // Named parameters
- foreach ($method_params as $p) {
-
- $name = $p->getName();
-
- if (isset($request_params[$name])) {
- $params[$name] = $request_params[$name];
- }
- else if ($p->isDefaultValueAvailable()) {
- $params[$name] = $p->getDefaultValue();
- }
- else {
- return false;
- }
- }
-
- return true;
- }
-
- /**
- * Parse the payload and test if the parsed JSON is ok
- *
- * @access public
- * @return boolean
- */
- public function isValidJsonFormat()
- {
- if (empty($this->payload)) {
- $this->payload = file_get_contents('php://input');
- }
-
- if (is_string($this->payload)) {
- $this->payload = json_decode($this->payload, true);
- }
-
- return is_array($this->payload);
- }
-
- /**
- * Test if all required JSON-RPC parameters are here
- *
- * @access public
- * @return boolean
- */
- public function isValidJsonRpcFormat()
- {
- if (! isset($this->payload['jsonrpc']) ||
- ! isset($this->payload['method']) ||
- ! is_string($this->payload['method']) ||
- $this->payload['jsonrpc'] !== '2.0' ||
- (isset($this->payload['params']) && ! is_array($this->payload['params']))) {
-
- return false;
- }
-
- return true;
- }
-
- /**
- * Return true if we have a batch request
- *
- * @access public
- * @return boolean
- */
- private function isBatchRequest()
- {
- return array_keys($this->payload) === range(0, count($this->payload) - 1);
- }
-
- /**
- * Handle batch request
- *
- * @access private
- * @return string
- */
- private function handleBatchRequest()
- {
- $responses = array();
-
- foreach ($this->payload as $payload) {
-
- if (! is_array($payload)) {
-
- $responses[] = $this->getResponse(array(
- 'error' => array(
- 'code' => -32600,
- 'message' => 'Invalid Request'
- )),
- array('id' => null)
- );
- }
- else {
-
- $server = new Server($payload);
- $response = $server->execute();
-
- if ($response) {
- $responses[] = $response;
- }
- }
- }
-
- return empty($responses) ? '' : '['.implode(',', $responses).']';
- }
-
- /**
- * Parse incoming requests
- *
- * @access public
- * @return string
- */
- public function execute()
- {
- // Invalid Json
- if (! $this->isValidJsonFormat()) {
- return $this->getResponse(array(
- 'error' => array(
- 'code' => -32700,
- 'message' => 'Parse error'
- )),
- array('id' => null)
- );
- }
-
- // Handle batch request
- if ($this->isBatchRequest()){
- return $this->handleBatchRequest();
- }
-
- // Invalid JSON-RPC format
- if (! $this->isValidJsonRpcFormat()) {
-
- return $this->getResponse(array(
- 'error' => array(
- 'code' => -32600,
- 'message' => 'Invalid Request'
- )),
- array('id' => null)
- );
- }
-
- // Procedure not found
- if (! isset(self::$procedures[$this->payload['method']])) {
-
- return $this->getResponse(array(
- 'error' => array(
- 'code' => -32601,
- 'message' => 'Method not found'
- )),
- $this->payload
- );
- }
-
- // Execute the procedure
- $callback = self::$procedures[$this->payload['method']];
- $params = array();
-
- $reflection = new ReflectionFunction($callback);
-
- if (isset($this->payload['params'])) {
-
- $parameters = $reflection->getParameters();
-
- if (! $this->mapParameters($this->payload['params'], $parameters, $params, $reflection->getNumberOfRequiredParameters())) {
-
- return $this->getResponse(array(
- 'error' => array(
- 'code' => -32602,
- 'message' => 'Invalid params'
- )),
- $this->payload
- );
- }
- }
-
- $result = $reflection->invokeArgs($params);
-
- return $this->getResponse(array('result' => $result), $this->payload);
- }
-}