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+ ?>
0 commit comments