From ce9b51ed7f2febf37f2da0df983315f1c71f95a6 Mon Sep 17 00:00:00 2001
From: Marius Burkard <m.burkard@pixcept.de>
Date: Mon, 23 May 2016 04:21:02 -0400
Subject: [PATCH] - changed json handler for REST api

---
 interface/lib/classes/json_handler.inc.php |  167 +++++++++++++++++++++++++++++--------------------------
 1 files changed, 88 insertions(+), 79 deletions(-)

diff --git a/interface/lib/classes/json_handler.inc.php b/interface/lib/classes/json_handler.inc.php
index d2acb22..de8dd5b 100644
--- a/interface/lib/classes/json_handler.inc.php
+++ b/interface/lib/classes/json_handler.inc.php
@@ -31,86 +31,95 @@
 
 
 class ISPConfigJSONHandler {
-    private $methods = array();
-    private $classes = array();
+	private $methods = array();
+	private $classes = array();
 
-    public function __construct() {
-        global $app;
-        
-        // load main remoting file
-        $app->load('remoting');
-        
-        // load all remote classes and get their methods
-        $dir = dirname(realpath(__FILE__)) . '/remote.d';
-        $d = opendir($dir);
-        while($f = readdir($d)) {
-            if($f == '.' || $f == '..') continue;
-            if(!is_file($dir . '/' . $f) || substr($f, strrpos($f, '.')) != '.php') continue;
-            
-            $name = substr($f, 0, strpos($f, '.'));
-            
-            include($dir . '/' . $f);
-            $class_name = 'remoting_' . $name;
-            if(class_exists($class_name, false)) {
-                $this->classes[$class_name] = new $class_name();
-                foreach(get_class_methods($this->classes[$class_name]) as $method) {
-                    $this->methods[$method] = $class_name;
-                }
-            }
-        }
-        closedir($d);
-        
-        // add main methods
-        $this->methods['login'] = 'remoting';
-        $this->methods['logout'] = 'remoting';
-        $this->methods['get_function_list'] = 'remoting';
-        
-        // create main class
-        $this->classes['remoting'] = new remoting(array_keys($this->methods));
-    }
-    
-    private function _return_json($code, $message, $data = false) {
-        $ret = new stdClass;
-        $ret->code = $code;
-        $ret->message = $message;
-        $ret->response = $data;
-        header('Content-Type: application/x-json; charset="utf-8"');
-        print json_encode($ret);
-        exit;
-    }
-    
-    public function run() {
-        
-        $method = reset(array_keys($_GET));
-        $params = array();
+	public function __construct() {
+		global $app;
 
-        if(is_array($_POST)) {
-            foreach($_POST as $key => $val) {
-                $tmp = json_decode($val);
-                if(!$tmp) $params[] = $val;
-                else $params[] = (array)$tmp;
-            }
-        }
-        
-        if(array_key_exists($method, $this->methods) == false) {
-            $this->_return_json('invalid_method', 'Method ' . $method . ' does not exist');
-        }
-        
-        $class_name = $this->methods[$method];
-        if(array_key_exists($class_name, $this->classes) == false) {
-            $this->_return_json('invalid_class', 'Class ' . $class_name . ' does not exist');
-        }
-        
-        if(method_exists($this->classes[$class_name], $method) == false) {
-            $this->_return_json('invalid_method', 'Method ' . $method . ' does not exist in the class it was expected (' . $class_name . ')');
-        }
-        
-        try {
-            $this->_return_json('ok', '', call_user_func_array(array($this->classes[$class_name], $method), $params));
-        } catch(SoapFault $e) {
-            $this->_return_json('remote_fault', $e->getMessage());
-        }
-    }
+		// load main remoting file
+		$app->load('remoting');
+
+		// load all remote classes and get their methods
+		$dir = dirname(realpath(__FILE__)) . '/remote.d';
+		$d = opendir($dir);
+		while($f = readdir($d)) {
+			if($f == '.' || $f == '..') continue;
+			if(!is_file($dir . '/' . $f) || substr($f, strrpos($f, '.')) != '.php') continue;
+
+			$name = substr($f, 0, strpos($f, '.'));
+
+			include $dir . '/' . $f;
+			$class_name = 'remoting_' . $name;
+			if(class_exists($class_name, false)) {
+				$this->classes[$class_name] = new $class_name();
+				foreach(get_class_methods($this->classes[$class_name]) as $method) {
+					$this->methods[$method] = $class_name;
+				}
+			}
+		}
+		closedir($d);
+
+		// add main methods
+		$this->methods['login'] = 'remoting';
+		$this->methods['logout'] = 'remoting';
+		$this->methods['get_function_list'] = 'remoting';
+
+		// create main class
+		$this->classes['remoting'] = new remoting(array_keys($this->methods));
+	}
+
+	private function _return_json($code, $message, $data = false) {
+		$ret = new stdClass;
+		$ret->code = $code;
+		$ret->message = $message;
+		$ret->response = $data;
+
+		header('Content-Type: application/json; charset="utf-8"');
+		print json_encode($ret);
+		exit;
+	}
+
+	public function run() {
+
+		if(!isset($_GET) || !is_array($_GET) || count($_GET) < 1) {
+			$this->_return_json('invalid_method', 'Method not provided in json call');
+		}
+		$keys = array_keys($_GET);
+		$method = reset($keys);
+		$params = array();
+		
+		$raw = file_get_contents("php://input");
+		$json = json_decode($raw, true);
+		if(!is_array($json)) $this->_return_json('invalid_data', 'The JSON data sent to the api is invalid');
+		
+		if(array_key_exists($method, $this->methods) == false) {
+			$this->_return_json('invalid_method', 'Method ' . $method . ' does not exist');
+		}
+
+		$class_name = $this->methods[$method];
+		if(array_key_exists($class_name, $this->classes) == false) {
+			$this->_return_json('invalid_class', 'Class ' . $class_name . ' does not exist');
+		}
+
+		if(method_exists($this->classes[$class_name], $method) == false) {
+			$this->_return_json('invalid_method', 'Method ' . $method . ' does not exist in the class it was expected (' . $class_name . ')');
+		}
+		
+		$methObj = new ReflectionMethod($this->classes[$class_name], $method);
+		foreach($methObj->getParameters() as $param) {
+			$pname = $param->name;
+			if(isset($json[$pname])) $params[] = $json[$pname];
+			else $params[] = null;
+		}
+		
+		try {
+			$this->_return_json('ok', '', call_user_func_array(array($this->classes[$class_name], $method), $params));
+		} catch(SoapFault $e) {
+			$this->_return_json('remote_fault', $e->getMessage());
+		}
+	}
+
 }
 
-?>
\ No newline at end of file
+?>

--
Gitblit v1.9.1