3 * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
4 * Copyright (C) 2002-2011 The Nucleus Group
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 * (see nucleus/documentation/index.html#license for more info)
14 * This script is provides an XML-RPC [1] interface to Nucleus [2].
16 * At this time, the Blogger API [3], the metaWeblog API [4] and
17 * parts of the Movable Type API [5] are implemented
19 * This script uses the the 'XML-RPC for PHP v1.02' implementation [6]
20 * All other code was written by Wouter Demuynck [7]
22 * [1] http://www.xmlrpc.com/
23 * [2] http://nucleuscms.org/
24 * [3] http://plant.blogger.com/api/
25 * [4] http://www.xmlrpc.com/metaWeblogApi
26 * [5] http://www.movabletype.org/docs/mtmanual_programmatic.html
27 * [6] http://phpxmlrpc.sourceforge.net/
28 * [7] http://demuynck.org/
31 * The Blogger API: (more info in the documentation)
35 * blogger.getUsersBlogs
37 * blogger.getRecentPosts
43 * Note: The getUserInfo response contains an empty 'lastname' and the full name as
45 * Note: Blogger API methods only affect the body field of items
47 * The metaWeblog API (more info in documentation)
52 * metaWeblog.getCategories
53 * metaWeblog.newMediaObject
54 * metaWeblog.getRecentPosts
56 * Note: metaWeblog API methods only affect the body and title fields of items.
57 * the extended part is left untouched (and empty for new posts)
59 * The Movable Type API
63 * @license http://nucleuscms.org/license.txt GNU General Public License
64 * @copyright Copyright (C) 2002-2011 The Nucleus Group
66 * @version $NucleusJP: server.php,v 1.8.2.1 2007/09/07 07:12:42 kimitake Exp $
70 require("../../config.php"); // include Nucleus libs and code
71 //include($DIR_LIBS . "xmlrpc.inc.php");
72 //include($DIR_LIBS . "xmlrpcs.inc.php");
73 include_libs('xmlrpc.inc.php',false,false);
74 include_libs('xmlrpcs.inc.php',false,false);
76 /* define xmlrpc settings */
77 //$xmlrpc_internalencoding = _CHARSET;
78 $xmlrpc_internalencoding = 'UTF-8';
79 $xmlrpc_defencoding = 'UTF-8';
81 /* definition of available methods */
83 $functionDefs = array();
85 // load server functions
86 include('api_blogger.inc.php');
87 include('api_metaweblog.inc.php');
88 // include('api_nucleus.inc.php'); // uncomment if you still want to use the nucleus.* methods
89 include('api_mt.inc.php');
93 $s = new xmlrpc_server( $functionDefs );
96 /* ------------------------------ private functions ---------------------------------- */
99 * Adds an item to the given blog. Username and password are required to login
101 function _addItem($blogid, $username, $password, $title, $body, $more, $publish, $closed, $catname = "") {
102 $blog = new BLOG($blogid);
103 $timestamp = $blog->getCorrectTime();
104 return _addDatedItem($blogid, $username, $password, $title, $body, $more, $publish, $closed, $timestamp, 0, $catname);
108 * Adds item to blog, with time of item given
110 function _addDatedItem($blogid, $username, $password, $title, $body, $more, $publish, $closed, $timestamp, $future, $catname = "") {
114 if (!$mem->login($username, $password))
115 return _error(1,"Could not log in");
117 // 2. check if allowed to add to blog
118 if (!BLOG::existsID($blogid))
119 return _error(2,"No such blog ($blogid)");
120 if (!$mem->teamRights($blogid))
121 return _error(3,"Not a team member");
123 return _error(4,"Cannot add empty items!");
125 // 3. calculate missing vars
126 $blog = new BLOG($blogid);
128 // get category id (or id for default category when false category)
129 $catid = $blog->getCategoryIdFromName($catname);
138 if (strtolower(_CHARSET) != 'utf-8') {
139 $title = mb_convert_encoding($title, _CHARSET, "UTF-8");
\r
140 $body = mb_convert_encoding($body, _CHARSET, "UTF-8");
\r
141 $more = mb_convert_encoding($more, _CHARSET, "UTF-8");
\r
145 $itemid = $blog->additem($catid, $title, $body, $more, $blogid, $mem->getID(), $timestamp, $closed, $draft);
147 // [TODO] ping weblogs.com ?
149 return new xmlrpcresp(new xmlrpcval($itemid,"string"));
153 * Updates an item. Username and password are required to login
155 function _edititem($itemid, $username, $password, $catid, $title, $body, $more, $wasdraft, $publish, $closed) {
160 if (!$mem->login($username, $password))
161 return _error(1,"Could not log in");
163 // 2. check if allowed to add to blog
164 if (!$manager->existsItem($itemid,1,1))
165 return _error(6,"No such item ($itemid)");
166 if (!$mem->canAlterItem($itemid))
167 return _error(7,"Not allowed to alter item");
169 if (strtolower(_CHARSET) != 'utf-8') {
170 $title = mb_convert_encoding($title, _CHARSET, _CHARSET.",UTF-8");
\r
171 $body = mb_convert_encoding($body, _CHARSET, _CHARSET.",UTF-8");
\r
172 $more = mb_convert_encoding($more, _CHARSET, _CHARSET.",UTF-8");
\r
176 ITEM::update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, 0);
178 return new xmlrpcresp(new xmlrpcval(1,"boolean"));
182 * Gives the list of blogs to which the user with given name and password has access
184 function _getUsersBlogs($username, $password) {
187 if (!$mem->login($username, $password))
188 return _error(1,"Could not log in");
190 // 2. Get list of blogs
192 $structarray = array();
193 $query = "SELECT bnumber, bname, burl"
194 . ' FROM '.sql_table('blog').', '.sql_table('team')
195 . " WHERE tblog=bnumber and tmember=" . $mem->getID()
197 $r = sql_query($query);
199 while ($obj = sql_fetch_object($r)) {
201 $blogurl = $obj->burl;
203 $blogurl = 'http://';
205 $newstruct = new xmlrpcval(array(
206 "url" => new xmlrpcval($blogurl,"string"),
207 "blogid" => new xmlrpcval($obj->bnumber,"string"),
208 "blogName" => new xmlrpcval($obj->bname,"string")
210 array_push($structarray, $newstruct);
213 return new xmlrpcresp(new xmlrpcval( $structarray , "array"));
217 function _getUserInfo($username, $password) {
220 if (!$mem->login($username, $password))
221 return _error(1,"Could not log in");
223 // 3. return the info
224 // Structure returned has nickname, userid, url, email, lastname, firstname
226 $newstruct = new xmlrpcval(array(
227 "nickname" => new xmlrpcval($mem->getDisplayName(),"string"),
228 "userid" => new xmlrpcval($mem->getID(),"string"),
229 "url" => new xmlrpcval($mem->getURL(),"string"),
230 "email" => new xmlrpcval($mem->getEmail(),"string"),
231 "lastname" => new xmlrpcval("","string"),
232 "firstname" => new xmlrpcval($mem->getRealName(),"string")
235 return new xmlrpcresp($newstruct);
243 function _deleteItem($itemid, $username, $password) {
248 if (!$mem->login($username, $password))
249 return _error(1,"Could not log in");
251 // 2. check if allowed
252 if (!$manager->existsItem($itemid,1,1))
253 return _error(6,"No such item ($itemid)");
254 $blogid = getBlogIDFromItemID($itemid);
255 if (!$mem->teamRights($blogid))
256 return _error(3,"Not a team member");
259 ITEM::delete($itemid);
261 return new xmlrpcresp(new xmlrpcval(1,"boolean"));
267 function _getSkinPart($blogid, $username, $password, $type) {
270 if (!$mem->login($username, $password))
271 return _error(1,"Could not log in");
273 // 2. check if allowed
274 if (!BLOG::existsID($blogid))
275 return _error(2,"No such blog ($blogid)");
276 if (!$mem->teamRights($blogid))
277 return _error(3,"Not a team member");
279 // 3. return skin part
280 $blog = new BLOG($blogid);
281 $skin = new SKIN($blog->getDefaultSkin());
282 return new xmlrpcresp(new xmlrpcval($skin->getContent($type),"string"));
286 function _setSkinPart($blogid, $username, $password, $content, $type) {
289 if (!$mem->login($username, $password))
290 return _error(1,"Could not log in");
292 // 2. check if allowed
293 if (!BLOG::existsID($blogid))
294 return _error(2,"No such blog ($blogid)");
295 if (!$mem->teamRights($blogid))
296 return _error(3,"Not a team member");
298 // 3. update skin part
299 $blog = new BLOG($blogid);
300 $skin = new SKIN($blog->getDefaultSkin());
301 $skin->update($type, $content);
303 return new xmlrpcresp(new xmlrpcval(1,'boolean'));
307 * Some convenience methods
310 function _getScalar($m, $idx) {
311 $v = $m->getParam($idx);
312 return $v->scalarval();
315 function _getStructVal($struct, $key) {
316 $t = $struct->structmem($key);
318 return ''; // no such struct value
320 return $t->scalarval();
323 function _getArrayVal($a, $idx) {
324 $t = $a->arraymem($idx);
325 return $t->scalarval();
329 * Returns an XML-RPC error response
330 * $err is the error number (>0, will be added to $xmlrpcerruser)
332 function _error($err, $msg) {
333 global $xmlrpcerruser;
334 return new xmlrpcresp(0, $xmlrpcerruser + $err, $msg);