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 https://xoops.org/
14: * @license GNU GPL 2.0 or later (https://www.gnu.org/licenses/gpl-2.0.html)
15: * @package
16: * @since
17: * @author XOOPS Development Team, Kazumi Ono (AKA onokazu)
18: */
19:
20: defined('XOOPS_ROOT_PATH') || exit('XOOPS root path not defined');
21: require_once XOOPS_ROOT_PATH . '/class/xml/rpc/xmlrpcapi.php';
22:
23: /**
24: * Class XoopsApi
25: */
26: class 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: