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