OSDN Git Service

3.15 taka-san version
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / xmlrpc / api_metaweblog.inc.php
1 <?php\r
2 \r
3 /** \r
4   * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/) \r
5   * Copyright (C) 2002-2004 The Nucleus Group\r
6   *\r
7   * This program is free software; you can redistribute it and/or\r
8   * modify it under the terms of the GNU General Public License\r
9   * as published by the Free Software Foundation; either version 2\r
10   * of the License, or (at your option) any later version.\r
11   * (see nucleus/documentation/index.html#license for more info)\r
12   */\r
13 \r
14 /*\r
15  *      This file contains definitions for the methods of the metaWeblog API\r
16  */\r
17          \r
18         \r
19         // metaWeblog.newPost\r
20         $f_metaWeblog_newPost_sig = array(array(\r
21                         // return type\r
22                         $xmlrpcString,  // itemid of the new item\r
23 \r
24                         // params:\r
25                         $xmlrpcString,  // blogid\r
26                         $xmlrpcString,  // username\r
27                         $xmlrpcString,  // password\r
28                         $xmlrpcStruct,  // content\r
29                         $xmlrpcBoolean, // publish boolean (set to false to create draft)\r
30 \r
31                 ));\r
32         $f_metaWeblog_newPost_doc = "Adds a new item to the given blog. Adds it as a draft when publish is false";\r
33         function f_metaWeblog_newPost($m) {\r
34                 $blogid =                       _getScalar($m,0);\r
35                 $username =             _getScalar($m,1);\r
36                 $password =             _getScalar($m,2);\r
37                 $struct =                       $m->getParam(3);\r
38                         $content =              _getStructVal($struct, 'description');\r
39                         $title =                _getStructVal($struct, 'title');\r
40 \r
41                         // category is optional (thus: be careful)!\r
42                         $catlist = $struct->structmem('categories');\r
43                         if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) \r
44                                 $category = _getArrayVal($catlist, 0);\r
45 \r
46                 $publish = _getScalar($m,4);\r
47 \r
48                 return _addItem($blogid, $username, $password, $title, $content, '', $publish, 0, $category);\r
49         }\r
50         \r
51         \r
52         // metaWeblog.getCategories\r
53         $f_metaWeblog_getCategories_sig = array(array(\r
54                 // return\r
55                 $xmlrpcStruct,  // categories for blog\r
56                 \r
57                 // params\r
58                 $xmlrpcString,  // blogid\r
59                 $xmlrpcString,  // username\r
60                 $xmlrpcString,  // password\r
61                 \r
62         ));\r
63         $f_metaWeblog_getCategories_doc = "Returns the categories for a given blog";\r
64         function f_metaWeblog_getCategories($m) {\r
65                 $blogid =       _getScalar($m,0);\r
66                 $username =     _getScalar($m,1);\r
67                 $password =     _getScalar($m,2);\r
68         \r
69                 return _categoryList($blogid, $username, $password);\r
70         }\r
71         \r
72 \r
73         // metaWeblog.getPost\r
74         $f_metaWeblog_getPost_sig = array(array(\r
75                 // return\r
76                 $xmlrpcStruct,  // the juice \r
77                 \r
78                 // params\r
79                 $xmlrpcString,  // itemid\r
80                 $xmlrpcString,  // username\r
81                 $xmlrpcString,  // password\r
82                 \r
83         ));\r
84         $f_metaWeblog_getPost_doc = "Retrieves a post";\r
85         function f_metaWeblog_getPost($m) {\r
86                 $itemid =       _getScalar($m,0);\r
87                 $username =     _getScalar($m,1);\r
88                 $password =     _getScalar($m,2);\r
89         \r
90                 return _mw_getPost($itemid, $username, $password);\r
91         }\r
92         \r
93 \r
94         // metaWeblog.editPost\r
95         $f_metaWeblog_editPost_sig = array(array(\r
96                         // return type\r
97                         $xmlrpcBoolean, // true\r
98 \r
99                         // params:\r
100                         $xmlrpcString,  // itemid\r
101                         $xmlrpcString,  // username\r
102                         $xmlrpcString,  // password\r
103                         $xmlrpcStruct,  // content\r
104                         $xmlrpcBoolean, // publish boolean (set to false to create draft)\r
105 \r
106                 ));\r
107         $f_metaWeblog_editPost_doc = "Edits an item";\r
108         function f_metaWeblog_editPost($m) {\r
109                 global $manager;\r
110 \r
111                 $itemid =                       _getScalar($m,0);\r
112                 $username =             _getScalar($m,1);\r
113                 $password =             _getScalar($m,2);\r
114 \r
115                 $category = '';\r
116                 $struct =                       $m->getParam(3);\r
117                         $content =              _getStructVal($struct, 'description');\r
118                         $title =                _getStructVal($struct, 'title');\r
119 \r
120                         // category is optional (thus: be careful)!\r
121                         $catlist = $struct->structmem('categories');\r
122                         if ($catlist && ($catlist->kindOf() == "array") && ($catlist->arraysize() > 0)) {\r
123                                 $category = _getArrayVal($catlist, 0);\r
124                         } \r
125                         \r
126                 $publish = _getScalar($m,4);\r
127 \r
128                 // get old title and extended part \r
129                 if (!$manager->existsItem($itemid,1,1))\r
130                         return _error(6,"No such item ($itemid)");\r
131                 $blogid = getBlogIDFromItemID($itemid);\r
132 \r
133                 $old =& $manager->getItem($itemid,1,1);\r
134                 \r
135                 if ($category == '')\r
136                 {\r
137                         // leave category unchanged when not present\r
138                         $catid = $old['catid'];\r
139                 }\r
140                 else\r
141                 {\r
142                         $blog = new BLOG($blogid);\r
143                         $catid = $blog->getCategoryIdFromName($category);\r
144                 }\r
145                 \r
146                 if ($old['draft'] && $publish) {\r
147                         $wasdraft = 1;\r
148                         $publish = 1;\r
149                 } else {\r
150                         $wasdraft = 0;\r
151                 }\r
152 \r
153                 return _edititem($itemid, $username, $password, $catid, $title, $content, $old['more'], $wasdraft, $publish, $old['closed']);\r
154 \r
155         }\r
156         \r
157         // metaWeblog.newMediaObject\r
158         $f_metaWeblog_newMediaObject_sig = array(array(\r
159                 //  return type\r
160                 $xmlrpcStruct,          // "url" element\r
161                 \r
162                 // params\r
163                 $xmlrpcString,          // blogid\r
164                 $xmlrpcString,          // username\r
165                 $xmlrpcString,          // password\r
166                 $xmlrpcStruct           // 'name', 'type' and 'bits'\r
167         ));\r
168         $f_metaWeblog_newMediaObject_doc = 'Uploads a file to to the media library of the user';\r
169         function f_metaWeblog_newMediaObject($m) {\r
170                 $blogid         = _getScalar($m, 0);\r
171                 $username       = _getScalar($m, 1);\r
172                 $password       = _getScalar($m, 2);\r
173                 \r
174                 $struct         = $m->getParam(3);\r
175                         $name   = _getStructVal($struct, 'name');\r
176                         $type   = _getStructVal($struct, 'type');\r
177                         $bits   = _getStructVal($struct, 'bits');\r
178                         \r
179                 return _newMediaObject($blogid, $username, $password, array('name' => $name, 'type' => $type, 'bits' => $bits));\r
180         }\r
181         \r
182         // metaWeblog.getRecentPosts\r
183         $f_metaWeblog_getRecentPosts_sig = array(array(\r
184                 // return type\r
185                 $xmlrpcStruct,          // array of structs\r
186 \r
187                 // params\r
188                 $xmlrpcString,          // blogid\r
189                 $xmlrpcString,          // username\r
190                 $xmlrpcString,          // password\r
191                 $xmlrpcInt                      // number of posts\r
192         ));\r
193         $f_metaWeblog_getRecentPosts_doc = 'Returns recent weblog items.';\r
194         function f_metaWeblog_getRecentPosts($m) {\r
195                 $blogid         = _getScalar($m, 0);\r
196                 $username       = _getScalar($m, 1);\r
197                 $password       = _getScalar($m, 2);\r
198                 $amount         = intval(_getScalar($m, 3));\r
199                 \r
200                 return _getRecentItemsMetaWeblog($blogid, $username, $password, $amount); \r
201         }\r
202         \r
203         function _getRecentItemsMetaWeblog($blogid, $username, $password, $amount) {\r
204         \r
205                 $blogid = intval($blogid);\r
206                 $amount = intval($amount);\r
207         \r
208                 // 1. login\r
209                 $mem = new MEMBER();\r
210                 if (!$mem->login($username, $password))\r
211                         return _error(1,"Could not log in");\r
212 \r
213                 // 2. check if allowed \r
214                 if (!BLOG::existsID($blogid))\r
215                         return _error(2,"No such blog ($blogid)");\r
216                 if (!$mem->teamRights($blogid))\r
217                         return _error(3,"Not a team member");\r
218                 $amount = intval($amount);\r
219                 if (($amount < 1) or ($amount > 20))\r
220                         return _error(5,"Amount parameter must be in range 1..20");\r
221 \r
222                 // 3. create and return list of recent items\r
223                 // Struct returned has dateCreated, userid, blogid and content\r
224                 \r
225                 $blog = new BLOG($blogid);\r
226 \r
227                 $structarray = array();         // the array in which the structs will be stored\r
228 \r
229                 $query = "SELECT mname, ibody, iauthor, ibody, inumber, ititle as title, itime, cname as category"\r
230                            .' FROM '.sql_table('item').', '.sql_table('category').', '.sql_table('member')\r
231                            ." WHERE iblog=$blogid and icat=catid and iauthor=mnumber"\r
232                            ." ORDER BY itime DESC"\r
233                            ." LIMIT $amount";\r
234                 $r = sql_query($query);\r
235                 \r
236                 while ($row = mysql_fetch_assoc($r)) {\r
237                 \r
238                         // remove linebreaks if needed\r
239                         if ($blog->convertBreaks())\r
240                                 $row['ibody'] = removeBreaks($row['ibody']);\r
241 \r
242                         $newstruct = new xmlrpcval(array(\r
243                                 "dateCreated" => new xmlrpcval(iso8601_encode(strtotime($row['itime'])),"dateTime.iso8601"),\r
244                                 "userid" => new xmlrpcval($row['iauthor'],"string"),\r
245                                 "blogid" => new xmlrpcval($blogid,"string"),\r
246                                 "postid" => new xmlrpcval($row['inumber'],"string"),\r
247                                 "description" => new xmlrpcval($row['ibody'],"string"),\r
248                                 "title" => new xmlrpcval($row['title'],"string"),\r
249                                 "categories" => new xmlrpcval(\r
250                                                 array(\r
251                                                         new xmlrpcval($row['category'], "string")\r
252                                                 )\r
253                                                 ,"array")\r
254                         ),'struct');\r
255                         \r
256                 //TODO: String link?\r
257                 //TODO: String permaLink?\r
258                 //TODO: String nucleus_more?\r
259                 \r
260                 \r
261                         array_push($structarray, $newstruct);           \r
262                 }\r
263 \r
264                 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));\r
265         }\r
266         \r
267         function _newMediaObject($blogid, $username, $password, $info) {\r
268                 global $CONF, $DIR_MEDIA, $DIR_LIBS;\r
269                 \r
270                 // - login\r
271                 $mem = new MEMBER();\r
272                 if (!$mem->login($username, $password))\r
273                         return _error(1,'Could not log in');\r
274                 \r
275                 // - check if team member \r
276                 if (!BLOG::existsID($blogid))\r
277                         return _error(2,"No such blog ($blogid)");\r
278                 if (!$mem->teamRights($blogid))\r
279                         return _error(3,'Not a team member');\r
280                         \r
281                 $b = new BLOG($blogid);\r
282                 \r
283                 // - decode data\r
284                 $data = $info['bits']; // decoding was done transparantly by xmlrpclib\r
285                 \r
286                 // - check filesize\r
287                 if (strlen($data) > $CONF['MaxUploadSize'])\r
288                         return _error(9, 'filesize is too big');\r
289 \r
290                 \r
291                 // - check if filetype is allowed (check filename)\r
292                 $filename = $info['name'];\r
293                 $ok = 0;\r
294                 $allowedtypes = explode (',', $CONF['AllowedTypes']);\r
295                 foreach ( $allowedtypes as $type ) \r
296                         if (eregi("\." .$type. "$",$filename)) $ok = 1;    \r
297                 if (!$ok) \r
298                         _error(8, 'Filetype is not allowed');\r
299                                 \r
300                 // - add file to media library\r
301                 include_once($DIR_LIBS . 'MEDIA.php');  // media classes\r
302                 \r
303                 // always use private media library of member\r
304                 $collection = $mem->getID();\r
305 \r
306                 // prefix filename with current date (YYYY-MM-DD-)\r
307                 // this to avoid nameclashes\r
308                 if ($CONF['MediaPrefix'])\r
309                         $filename = strftime("%Y%m%d-", time()) . $filename;    \r
310                         \r
311                 $res = MEDIA::addMediaObjectRaw($collection, $filename, $data);\r
312                 if ($res)\r
313                         return _error(10, $res);\r
314                 \r
315                 // - return URL\r
316                 $urlstruct = new xmlrpcval(array(\r
317                         "url" => new xmlrpcval($CONF['MediaURL'] . $collection. '/' . $filename,'string')\r
318                 ),'struct');            \r
319                 \r
320                 return new xmlrpcresp($urlstruct);\r
321         }\r
322         \r
323         function _categoryList($blogid, $username, $password) {\r
324                 // 1. login\r
325                 $mem = new MEMBER();\r
326                 if (!$mem->login($username, $password))\r
327                         return _error(1,"Could not log in");\r
328 \r
329                 // check if on team and blog exists\r
330                 if (!BLOG::existsID($blogid))\r
331                         return _error(2,"No such blog ($blogid)");\r
332                 if (!$mem->teamRights($blogid))\r
333                         return _error(3,"Not a team member");\r
334                         \r
335                 $b = new BLOG($blogid);\r
336                 \r
337                 $categorystruct = array();\r
338 \r
339                 $query =  "SELECT cname, cdesc, catid"\r
340                                 . ' FROM '.sql_table('category')\r
341                                 . " WHERE cblog=" . intval($blogid)\r
342                                 . " ORDER BY cname";\r
343                 $r = sql_query($query);\r
344 \r
345                 while ($obj = mysql_fetch_object($r)) {\r
346 \r
347                         $categorystruct[$obj->cname] = new xmlrpcval(\r
348                                 array(\r
349                                         "description" => new xmlrpcval($obj->cdesc,"string"),\r
350                                         "htmlUrl" => new xmlrpcval($b->getURL() . "?catid=" . $obj->catid ,"string"),\r
351                                         "rssUrl" => new xmlrpcval("","string")\r
352                                 )\r
353                         ,'struct');\r
354                 }\r
355                 \r
356                 \r
357                 return new xmlrpcresp(new xmlrpcval( $categorystruct , "struct"));\r
358         \r
359         }\r
360         \r
361         \r
362         function _mw_getPost($itemid, $username, $password) {\r
363                 global $manager;\r
364                 \r
365                 // 1. login\r
366                 $mem = new MEMBER();\r
367                 if (!$mem->login($username, $password))\r
368                         return _error(1,"Could not log in");\r
369 \r
370                 // 2. check if allowed \r
371                 if (!$manager->existsItem($itemid,1,1))\r
372                         return _error(6,"No such item ($itemid)");\r
373                 $blogid = getBlogIDFromItemID($itemid);\r
374                 if (!$mem->teamRights($blogid))\r
375                         return _error(3,"Not a team member");\r
376 \r
377                 // 3. return the item\r
378                 $item =& $manager->getItem($itemid,1,1); // (also allow drafts and future items)\r
379                 \r
380                 $b = new BLOG($blogid);\r
381                 if ($b->convertBreaks())\r
382                         $item['body'] = removeBreaks($item['body']);\r
383                         \r
384                 $categoryname = $b->getCategoryName($item['catid']);\r
385 \r
386                 $newstruct = new xmlrpcval(array(\r
387                         "dateCreated" => new xmlrpcval(iso8601_encode($item['timestamp']),"dateTime.iso8601"),\r
388                         "userid" => new xmlrpcval($item['authorid'],"string"),\r
389                         "blogid" => new xmlrpcval($blogid,"string"),\r
390                         "postid" => new xmlrpcval($itemid, "string"),\r
391                         "description" => new xmlrpcval($item['body'],"string"),\r
392                         "title" => new xmlrpcval($item['title'],"string"),\r
393                         "categories" => new xmlrpcval(\r
394                                         array(\r
395                                                 new xmlrpcval($categoryname, "string")\r
396                                         )\r
397                                         ,"array")\r
398                 ),'struct');\r
399                 \r
400                 //TODO: add "String link" to struct?\r
401                 //TODO: add "String permaLink" to struct? \r
402                 //TODO: add "String nucleus_more" to struct?\r
403 \r
404                 return new xmlrpcresp($newstruct);\r
405         \r
406         }\r
407         \r
408         $functionDefs = array_merge($functionDefs,\r
409                 array(\r
410                          "metaWeblog.newPost" =>\r
411                          array(\r
412                                 "function" => "f_metaWeblog_newPost",\r
413                                 "signature" => $f_metaWeblog_newPost_sig,\r
414                                 "docstring" => $f_metaWeblog_newPost_doc\r
415                          ),\r
416 \r
417                          "metaWeblog.getCategories" =>\r
418                          array(\r
419                                 "function" => "f_metaWeblog_getCategories",\r
420                                 "signature" => $f_metaWeblog_getCategories_sig,\r
421                                 "docstring" => $f_metaWeblog_getCategories_doc\r
422                          ),     \r
423 \r
424                          "metaWeblog.getPost" =>\r
425                          array(\r
426                                 "function" => "f_metaWeblog_getPost",\r
427                                 "signature" => $f_metaWeblog_getPost_sig,\r
428                                 "docstring" => $f_metaWeblog_getPost_doc\r
429                          ),     \r
430 \r
431                          "metaWeblog.editPost" =>\r
432                          array(\r
433                                 "function" => "f_metaWeblog_editPost",\r
434                                 "signature" => $f_metaWeblog_editPost_sig,\r
435                                 "docstring" => $f_metaWeblog_editPost_doc\r
436                          ),\r
437                          \r
438                          'metaWeblog.newMediaObject' =>\r
439                          array(\r
440                                 'function' => 'f_metaWeblog_newMediaObject',\r
441                                 'signature' => $f_metaWeblog_newMediaObject_sig,\r
442                                 'docstring' => $f_metaWeblog_newMediaObject_doc\r
443                          ),\r
444                          \r
445                          'metaWeblog.getRecentPosts' =>\r
446                          array(\r
447                                 'function' => 'f_metaWeblog_getRecentPosts',\r
448                                 'signature' => $f_metaWeblog_getRecentPosts_sig,\r
449                                 'docstring' => $f_metaWeblog_getRecentPosts_doc\r
450                          )                       \r
451                 \r
452                 )\r
453         );\r
454 ?>