Skip to content

Commit 073273c

Browse files
author
mcramer
committed
- Implemented json remote handler, example:
http://yourispconfig:8080/remote/json.php?sites_web_domain_get with POST data: session=12345678901234567890123456789012&data=%7B%22type%22%3A%22vhost%22%2C%22active%22%3A%22y%22%2C%22php%22%3A%22fast-cgi%22%2C%22fastcgi_php_version%22%3A%22%22%2C%22%23LIMIT%23%22%3A1%7D where data is an urlencoded json-object of the params array used in SOAP api.
1 parent 535a69c commit 073273c

File tree

2 files changed

+127
-0
lines changed

2 files changed

+127
-0
lines changed
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?php
2+
3+
/*
4+
Copyright (c) 2013, Marius Cramer, pixcept KG
5+
All rights reserved.
6+
7+
Redistribution and use in source and binary forms, with or without modification,
8+
are permitted provided that the following conditions are met:
9+
10+
* Redistributions of source code must retain the above copyright notice,
11+
this list of conditions and the following disclaimer.
12+
* Redistributions in binary form must reproduce the above copyright notice,
13+
this list of conditions and the following disclaimer in the documentation
14+
and/or other materials provided with the distribution.
15+
* Neither the name of ISPConfig nor the names of its contributors
16+
may be used to endorse or promote products derived from this software without
17+
specific prior written permission.
18+
19+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20+
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22+
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23+
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24+
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26+
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27+
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28+
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29+
30+
*/
31+
32+
33+
class ISPConfigJSONHandler {
34+
private $methods = array();
35+
private $classes = array();
36+
37+
public function __construct() {
38+
global $app;
39+
40+
// load main remoting file
41+
$app->load('remoting');
42+
43+
// load all remote classes and get their methods
44+
$dir = dirname(realpath(__FILE__)) . '/remote.d';
45+
$d = opendir($dir);
46+
while($f = readdir($d)) {
47+
if($f == '.' || $f == '..') continue;
48+
if(!is_file($dir . '/' . $f) || substr($f, strrpos($f, '.')) != '.php') continue;
49+
50+
$name = substr($f, 0, strpos($f, '.'));
51+
52+
include($dir . '/' . $f);
53+
$class_name = 'remoting_' . $name;
54+
if(class_exists($class_name, false)) {
55+
$this->classes[$class_name] = new $class_name();
56+
foreach(get_class_methods($this->classes[$class_name]) as $method) {
57+
$this->methods[$method] = $class_name;
58+
}
59+
}
60+
}
61+
closedir($d);
62+
63+
// add main methods
64+
$this->methods['login'] = 'remoting';
65+
$this->methods['logout'] = 'remoting';
66+
$this->methods['get_function_list'] = 'remoting';
67+
68+
// create main class
69+
$this->classes['remoting'] = new remoting(array_keys($this->methods));
70+
}
71+
72+
private function _return_json($code, $message, $data = false) {
73+
$ret = new stdClass;
74+
$ret->code = $code;
75+
$ret->message = $message;
76+
$ret->response = $data;
77+
header('Content-Type: application/x-json; charset="utf-8"');
78+
print json_encode($ret);
79+
exit;
80+
}
81+
82+
public function run() {
83+
84+
$method = reset(array_keys($_GET));
85+
$params = array();
86+
87+
if(is_array($_POST)) {
88+
foreach($_POST as $key => $val) {
89+
$tmp = json_decode($val);
90+
if(!$tmp) $params[] = $val;
91+
else $params[] = (array)$tmp;
92+
}
93+
}
94+
95+
if(array_key_exists($method, $this->methods) == false) {
96+
$this->_return_json('invalid_method', 'Method ' . $method . ' does not exist');
97+
}
98+
99+
$class_name = $this->methods[$method];
100+
if(array_key_exists($class_name, $this->classes) == false) {
101+
$this->_return_json('invalid_class', 'Class ' . $class_name . ' does not exist');
102+
}
103+
104+
if(method_exists($this->classes[$class_name], $method) == false) {
105+
$this->_return_json('invalid_method', 'Method ' . $method . ' does not exist in the class it was expected (' . $class_name . ')');
106+
}
107+
108+
try {
109+
$this->_return_json('ok', '', call_user_func_array(array($this->classes[$class_name], $method), $params));
110+
} catch(SoapFault $e) {
111+
$this->_return_json('remote_fault', $e->getMessage());
112+
}
113+
}
114+
}
115+
116+
?>

interface/web/remote/json.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
require_once('../../lib/config.inc.php');
4+
$conf['start_session'] = false;
5+
require_once('../../lib/app.inc.php');
6+
7+
$app->load('json_handler');
8+
$json_handler = new ISPConfigJSONHandler();
9+
$json_handler->run();
10+
11+
?>

0 commit comments

Comments
 (0)