1<?php
2/*
3 * You may not change or alter any portion of this comment or credits
4 * of supporting developers from this source code or any supporting source code
5 * which is considered copyrighted (c) material of the original comment or credit authors.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 */
11
12/**
13 * @copyright    XOOPS Project http://xoops.org/
14 * @license      GNU GPL 2 or later (http://www.gnu.org/licenses/gpl-2.0.html)
15 * @package
16 * @since
17 * @author       XOOPS Development Team, Kazumi Ono (AKA onokazu)
18 */
19
20defined('XOOPS_ROOT_PATH') || exit('XOOPS root path not defined');
21require_once XOOPS_ROOT_PATH . '/class/xml/rpc/xmlrpcapi.php';
22
23/**
24 * Class XoopsApi
25 */
26class XoopsApi extends XoopsXmlRpcApi
27{
28    /**
29     * @param $params
30     * @param $response
31     * @param $module
32     */
33    public function __construct(&$params, &$response, &$module)
34    {
35        parent::__construct($params, $response, $module);
36    }
37
38    public function newPost()
39    {
40        if (!$this->_checkUser($this->params[1], $this->params[2])) {
41            $this->response->add(new XoopsXmlRpcFault(104));
42        } else {
43            if (!$fields =& $this->_getPostFields(null, $this->params[0])) {
44                $this->response->add(new XoopsXmlRpcFault(106));
45            } else {
46                $missing = array();
47                foreach ($fields as $tag => $detail) {
48                    if (!isset($this->params[3][$tag])) {
49                        $data = $this->_getTagCdata($this->params[3]['xoops_text'], $tag, true);
50                        if (trim($data) == '') {
51                            if ($detail['required']) {
52                                $missing[] = $tag;
53                            }
54                        } else {
55                            $post[$tag] =& $data;
56                        }
57                    } else {
58                        $post[$tag] = $this->params[3][$tag];
59                    }
60                }
61                if (count($missing) > 0) {
62                    $msg = '';
63                    foreach ($missing as $m) {
64                        $msg .= '<' . $m . '> ';
65                    }
66                    $this->response->add(new XoopsXmlRpcFault(109, $msg));
67                } else {
68                    // will be removed... don't worry if this looks bad
69                    include_once XOOPS_ROOT_PATH . '/modules/news/class/class.newsstory.php';
70                    $story = new NewsStory();
71                    $error = false;
72                    if ((int)$this->params[4] > 0) {
73                        if (!$this->_checkAdmin()) {
74                            // non admin users cannot publish
75                            $error = true;
76                            $this->response->add(new XoopsXmlRpcFault(111));
77                        } else {
78                            $story->setType('admin');
79                            $story->setApproved(true);
80                            $story->setPublished(time());
81                        }
82                    } else {
83                        if (!$this->_checkAdmin()) {
84                            $story->setType('user');
85                        } else {
86                            $story->setType('admin');
87                        }
88                    }
89                    if (!$error) {
90                        if (isset($post['categories']) && !empty($post['categories'][0])) {
91                            $story->setTopicId((int)$post['categories'][0]['categoryId']);
92                        } else {
93                            $story->setTopicId(1);
94                        }
95                        $story->setTitle(addslashes(trim($post['title'])));
96                        if (isset($post['moretext'])) {
97                            $story->setBodytext(addslashes(trim($post['moretext'])));
98                        }
99                        if (!isset($post['hometext'])) {
100                            $story->setHometext(addslashes(trim($this->params[3]['xoops_text'])));
101                        } else {
102                            $story->setHometext(addslashes(trim($post['hometext'])));
103                        }
104                        $story->setUid($this->user->getVar('uid'));
105                        $story->setHostname($_SERVER['REMOTE_ADDR']);
106                        if (!$this->_checkAdmin()) {
107                            $story->setNohtml(1);
108                        } else {
109                            $story->setNohtml(0);
110                        }
111                        $story->setNosmiley(0);
112                        $story->setNotifyPub(1);
113                        $story->setTopicalign('R');
114                        $ret = $story->store();
115                        if (!$ret) {
116                            $this->response->add(new XoopsXmlRpcFault(106));
117                        } else {
118                            $this->response->add(new XoopsXmlRpcString($ret));
119                        }
120                    }
121                }
122            }
123        }
124    }
125
126    public function editPost()
127    {
128        if (!$this->_checkUser($this->params[1], $this->params[2])) {
129            $this->response->add(new XoopsXmlRpcFault(104));
130        } else {
131            if (!$fields =& $this->_getPostFields($this->params[0])) {
132            } else {
133                $missing = array();
134                foreach ($fields as $tag => $detail) {
135                    if (!isset($this->params[3][$tag])) {
136                        $data = $this->_getTagCdata($this->params[3]['xoops_text'], $tag, true);
137                        if (trim($data) == '') {
138                            if ($detail['required']) {
139                                $missing[] = $tag;
140                            }
141                        } else {
142                            $post[$tag] = $data;
143                        }
144                    } else {
145                        $post[$tag] = $this->params[3][$tag];
146                    }
147                }
148                if (count($missing) > 0) {
149                    $msg = '';
150                    foreach ($missing as $m) {
151                        $msg .= '<' . $m . '> ';
152                    }
153                    $this->response->add(new XoopsXmlRpcFault(109, $msg));
154                } else {
155                    // will be removed... don't worry if this looks bad
156                    include_once XOOPS_ROOT_PATH . '/modules/news/class/class.newsstory.php';
157                    $story   = new NewsStory($this->params[0]);
158                    $storyid = $story->storyid();
159                    if (empty($storyid)) {
160                        $this->response->add(new XoopsXmlRpcFault(106));
161                    } elseif (!$this->_checkAdmin()) {
162                        $this->response->add(new XoopsXmlRpcFault(111));
163                    } else {
164                        $story->setTitle(addslashes(trim($post['title'])));
165                        if (isset($post['moretext'])) {
166                            $story->setBodytext(addslashes(trim($post['moretext'])));
167                        }
168                        if (!isset($post['hometext'])) {
169                            $story->setHometext(addslashes(trim($this->params[3]['xoops_text'])));
170                        } else {
171                            $story->setHometext(addslashes(trim($post['hometext'])));
172                        }
173                        if ($this->params[4]) {
174                            $story->setApproved(true);
175                            $story->setPublished(time());
176                        }
177                        $story->setTopicalign('R');
178                        if (!$story->store()) {
179                            $this->response->add(new XoopsXmlRpcFault(106));
180                        } else {
181                            $this->response->add(new XoopsXmlRpcBoolean(true));
182                        }
183                    }
184                }
185            }
186        }
187    }
188
189    public function deletePost()
190    {
191        if (!$this->_checkUser($this->params[1], $this->params[2])) {
192            $this->response->add(new XoopsXmlRpcFault(104));
193        } else {
194            if (!$this->_checkAdmin()) {
195                $this->response->add(new XoopsXmlRpcFault(111));
196            } else {
197                // will be removed... don't worry if this looks bad
198                include_once XOOPS_ROOT_PATH . '/modules/news/class/class.newsstory.php';
199                $story = new NewsStory($this->params[0]);
200                if (!$story->delete()) {
201                    $this->response->add(new XoopsXmlRpcFault(106));
202                } else {
203                    $this->response->add(new XoopsXmlRpcBoolean(true));
204                }
205            }
206        }
207    }
208
209    // currently returns the same struct as in metaWeblogApi
210    /**
211     * @param bool $respond
212     *
213     * @return array
214     */
215    public function &getPost($respond = true)
216    {
217        if (!$this->_checkUser($this->params[1], $this->params[2])) {
218            $this->response->add(new XoopsXmlRpcFault(104));
219        } else {
220            // will be removed... don't worry if this looks bad
221            include_once XOOPS_ROOT_PATH . '/modules/news/class/class.newsstory.php';
222            $story = new NewsStory($this->params[0]);
223            $ret   = array(
224                'uid'       => $story->uid(),
225                'published' => $story->published(),
226                'storyid'   => $story->storyid(),
227                'title'     => $story->title('Edit'),
228                'hometext'  => $story->hometext('Edit'),
229                'moretext'  => $story->bodytext('Edit')
230            );
231            if (!$respond) {
232                return $ret;
233            } else {
234                if (!$ret) {
235                    $this->response->add(new XoopsXmlRpcFault(106));
236                } else {
237                    $struct  = new XoopsXmlRpcStruct();
238                    $content = '';
239                    foreach ($ret as $key => $value) {
240                        switch ($key) {
241                            case 'uid':
242                                $struct->add('userid', new XoopsXmlRpcString($value));
243                                break;
244                            case 'published':
245                                $struct->add('dateCreated', new XoopsXmlRpcDatetime($value));
246                                break;
247                            case 'storyid':
248                                $struct->add('postid', new XoopsXmlRpcString($value));
249                                $struct->add('link', new XoopsXmlRpcString(XOOPS_URL . '/modules/news/article.php?item_id=' . $value));
250                                $struct->add('permaLink', new XoopsXmlRpcString(XOOPS_URL . '/modules/news/article.php?item_id=' . $value));
251                                break;
252                            case 'title':
253                                $struct->add('title', new XoopsXmlRpcString($value));
254                                break;
255                            default :
256                                $content .= '<' . $key . '>' . trim($value) . '</' . $key . '>';
257                                break;
258                        }
259                    }
260                    $struct->add('description', new XoopsXmlRpcString($content));
261                    $this->response->add($struct);
262                }
263            }
264        }
265
266        return null;
267    }
268
269    /**
270     * @param bool $respond
271     *
272     * @return array
273     */
274    public function &getRecentPosts($respond = true)
275    {
276        if (!$this->_checkUser($this->params[1], $this->params[2])) {
277            $this->response->add(new XoopsXmlRpcFault(104));
278        } else {
279            include_once XOOPS_ROOT_PATH . '/modules/news/class/class.newsstory.php';
280            if (isset($this->params[4]) && (int)$this->params[4] > 0) {
281                $stories =& NewsStory::getAllPublished((int)$this->params[3], 0, $this->params[4]);
282            } else {
283                $stories =& NewsStory::getAllPublished((int)$this->params[3]);
284            }
285            $scount = count($stories);
286            $ret    = array();
287            for ($i = 0; $i < $scount; ++$i) {
288                $ret[] = array(
289                    'uid'       => $stories[$i]->uid(),
290                    'published' => $stories[$i]->published(),
291                    'storyid'   => $stories[$i]->storyId(),
292                    'title'     => $stories[$i]->title('Edit'),
293                    'hometext'  => $stories[$i]->hometext('Edit'),
294                    'moretext'  => $stories[$i]->bodytext('Edit')
295                );
296            }
297            if (!$respond) {
298                return $ret;
299            } else {
300                if (count($ret) == 0) {
301                    $this->response->add(new XoopsXmlRpcFault(106, 'Found 0 Entries'));
302                } else {
303                    $arr   = new XoopsXmlRpcArray();
304                    $count = count($ret);
305                    for ($i = 0; $i < $count; ++$i) {
306                        $struct  = new XoopsXmlRpcStruct();
307                        $content = '';
308                        foreach ($ret[$i] as $key => $value) {
309                            switch ($key) {
310                                case 'uid':
311                                    $struct->add('userid', new XoopsXmlRpcString($value));
312                                    break;
313                                case 'published':
314                                    $struct->add('dateCreated', new XoopsXmlRpcDatetime($value));
315                                    break;
316                                case 'storyid':
317                                    $struct->add('postid', new XoopsXmlRpcString($value));
318                                    $struct->add('link', new XoopsXmlRpcString(XOOPS_URL . '/modules/news/article.php?item_id=' . $value));
319                                    $struct->add('permaLink', new XoopsXmlRpcString(XOOPS_URL . '/modules/news/article.php?item_id=' . $value));
320                                    break;
321                                case 'title':
322                                    $struct->add('title', new XoopsXmlRpcString($value));
323                                    break;
324                                default :
325                                    $content .= '<' . $key . '>' . trim($value) . '</' . $key . '>';
326                                    break;
327                            }
328                        }
329                        $struct->add('description', new XoopsXmlRpcString($content));
330                        $arr->add($struct);
331                        unset($struct);
332                    }
333                    $this->response->add($arr);
334                }
335            }
336        }
337
338        return null;
339    }
340
341    /**
342     * @param bool $respond
343     *
344     * @return array
345     */
346    public function &getCategories($respond = true)
347    {
348        if (!$this->_checkUser($this->params[1], $this->params[2])) {
349            $this->response->add(new XoopsXmlRpcFault(104));
350        } else {
351            include_once XOOPS_ROOT_PATH . '/class/xoopstopic.php';
352            $this->db = XoopsDatabaseFactory::getDatabaseConnection();
353            $xt       = new XoopsTopic($db->prefix('topics'));
354            $ret      = $xt->getTopicsList();
355            if (!$respond) {
356                return $ret;
357            } else {
358                if (count($ret) == 0) {
359                    $this->response->add(new XoopsXmlRpcFault(106, 'Found 0 Entries'));
360                } else {
361                    $arr = new XoopsXmlRpcArray();
362                    foreach ($ret as $topic_id => $topic_vars) {
363                        $struct = new XoopsXmlRpcStruct();
364                        $struct->add('categoryId', new XoopsXmlRpcString($topic_id));
365                        $struct->add('categoryName', new XoopsXmlRpcString($topic_vars['title']));
366                        $struct->add('categoryPid', new XoopsXmlRpcString($topic_vars['pid']));
367                        $arr->add($struct);
368                        unset($struct);
369                    }
370                    $this->response->add($arr);
371                }
372            }
373        }
374
375        return null;
376    }
377}
378