OSDN Git Service

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