WordPress 4.7
[autoinstalls/wordpress.git] / wp-includes / IXR / class-IXR-introspectionserver.php
1 <?php
2
3 /**
4  * IXR_IntrospectionServer
5  *
6  * @package IXR
7  * @since 1.5.0
8  */
9 class IXR_IntrospectionServer extends IXR_Server
10 {
11     var $signatures;
12     var $help;
13
14         /**
15          * PHP5 constructor.
16          */
17     function __construct()
18     {
19         $this->setCallbacks();
20         $this->setCapabilities();
21         $this->capabilities['introspection'] = array(
22             'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html',
23             'specVersion' => 1
24         );
25         $this->addCallback(
26             'system.methodSignature',
27             'this:methodSignature',
28             array('array', 'string'),
29             'Returns an array describing the return type and required parameters of a method'
30         );
31         $this->addCallback(
32             'system.getCapabilities',
33             'this:getCapabilities',
34             array('struct'),
35             'Returns a struct describing the XML-RPC specifications supported by this server'
36         );
37         $this->addCallback(
38             'system.listMethods',
39             'this:listMethods',
40             array('array'),
41             'Returns an array of available methods on this server'
42         );
43         $this->addCallback(
44             'system.methodHelp',
45             'this:methodHelp',
46             array('string', 'string'),
47             'Returns a documentation string for the specified method'
48         );
49     }
50
51         /**
52          * PHP4 constructor.
53          */
54         public function IXR_IntrospectionServer() {
55                 self::__construct();
56         }
57
58     function addCallback($method, $callback, $args, $help)
59     {
60         $this->callbacks[$method] = $callback;
61         $this->signatures[$method] = $args;
62         $this->help[$method] = $help;
63     }
64
65     function call($methodname, $args)
66     {
67         // Make sure it's in an array
68         if ($args && !is_array($args)) {
69             $args = array($args);
70         }
71
72         // Over-rides default call method, adds signature check
73         if (!$this->hasMethod($methodname)) {
74             return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.');
75         }
76         $method = $this->callbacks[$methodname];
77         $signature = $this->signatures[$methodname];
78         $returnType = array_shift($signature);
79
80         // Check the number of arguments
81         if (count($args) != count($signature)) {
82             return new IXR_Error(-32602, 'server error. wrong number of method parameters');
83         }
84
85         // Check the argument types
86         $ok = true;
87         $argsbackup = $args;
88         for ($i = 0, $j = count($args); $i < $j; $i++) {
89             $arg = array_shift($args);
90             $type = array_shift($signature);
91             switch ($type) {
92                 case 'int':
93                 case 'i4':
94                     if (is_array($arg) || !is_int($arg)) {
95                         $ok = false;
96                     }
97                     break;
98                 case 'base64':
99                 case 'string':
100                     if (!is_string($arg)) {
101                         $ok = false;
102                     }
103                     break;
104                 case 'boolean':
105                     if ($arg !== false && $arg !== true) {
106                         $ok = false;
107                     }
108                     break;
109                 case 'float':
110                 case 'double':
111                     if (!is_float($arg)) {
112                         $ok = false;
113                     }
114                     break;
115                 case 'date':
116                 case 'dateTime.iso8601':
117                     if (!is_a($arg, 'IXR_Date')) {
118                         $ok = false;
119                     }
120                     break;
121             }
122             if (!$ok) {
123                 return new IXR_Error(-32602, 'server error. invalid method parameters');
124             }
125         }
126         // It passed the test - run the "real" method call
127         return parent::call($methodname, $argsbackup);
128     }
129
130     function methodSignature($method)
131     {
132         if (!$this->hasMethod($method)) {
133             return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.');
134         }
135         // We should be returning an array of types
136         $types = $this->signatures[$method];
137         $return = array();
138         foreach ($types as $type) {
139             switch ($type) {
140                 case 'string':
141                     $return[] = 'string';
142                     break;
143                 case 'int':
144                 case 'i4':
145                     $return[] = 42;
146                     break;
147                 case 'double':
148                     $return[] = 3.1415;
149                     break;
150                 case 'dateTime.iso8601':
151                     $return[] = new IXR_Date(time());
152                     break;
153                 case 'boolean':
154                     $return[] = true;
155                     break;
156                 case 'base64':
157                     $return[] = new IXR_Base64('base64');
158                     break;
159                 case 'array':
160                     $return[] = array('array');
161                     break;
162                 case 'struct':
163                     $return[] = array('struct' => 'struct');
164                     break;
165             }
166         }
167         return $return;
168     }
169
170     function methodHelp($method)
171     {
172         return $this->help[$method];
173     }
174 }