1797c0d11SAndreas Gohr<?php 27aec69d1SGuy Brandif(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../'); 3797c0d11SAndreas Gohr 4797c0d11SAndreas Gohr// fix when '<?xml' isn't on the very first line 5797c0d11SAndreas Gohrif(isset($HTTP_RAW_POST_DATA)) $HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA); 6797c0d11SAndreas Gohr 7797c0d11SAndreas Gohr 8797c0d11SAndreas Gohrrequire_once(DOKU_INC.'inc/init.php'); 9fdd2e9d6SMichael Klier 10fdd2e9d6SMichael Klierif(!$conf['xmlrpc']) { 11fdd2e9d6SMichael Klier die('XML-RPC server not enabled.'); 12fdd2e9d6SMichael Klier} 13fdd2e9d6SMichael Klier 14797c0d11SAndreas Gohrrequire_once(DOKU_INC.'inc/common.php'); 15797c0d11SAndreas Gohrrequire_once(DOKU_INC.'inc/auth.php'); 16797c0d11SAndreas Gohrsession_write_close(); //close session 17797c0d11SAndreas Gohrrequire_once(DOKU_INC.'inc/IXR_Library.php'); 18797c0d11SAndreas Gohr 19797c0d11SAndreas Gohr 20797c0d11SAndreas Gohr/** 21797c0d11SAndreas Gohr * Contains needed wrapper functions and registers all available 22797c0d11SAndreas Gohr * XMLRPC functions. 23797c0d11SAndreas Gohr */ 24797c0d11SAndreas Gohrclass dokuwiki_xmlrpc_server extends IXR_IntrospectionServer { 25797c0d11SAndreas Gohr var $methods = array(); 26797c0d11SAndreas Gohr 27797c0d11SAndreas Gohr /** 28797c0d11SAndreas Gohr * Constructor. Register methods and run Server 29797c0d11SAndreas Gohr */ 30797c0d11SAndreas Gohr function dokuwiki_xmlrpc_server(){ 31797c0d11SAndreas Gohr $this->IXR_IntrospectionServer(); 32797c0d11SAndreas Gohr 33797c0d11SAndreas Gohr /* DokuWiki's own methods */ 34797c0d11SAndreas Gohr $this->addCallback( 35797c0d11SAndreas Gohr 'dokuwiki.getVersion', 36797c0d11SAndreas Gohr 'getVersion', 37797c0d11SAndreas Gohr array('string'), 38fdd2e9d6SMichael Klier 'Returns the running DokuWiki version.' 39797c0d11SAndreas Gohr ); 40797c0d11SAndreas Gohr 41797c0d11SAndreas Gohr /* Wiki API v2 http://www.jspwiki.org/wiki/WikiRPCInterface2 */ 42797c0d11SAndreas Gohr $this->addCallback( 43797c0d11SAndreas Gohr 'wiki.getRPCVersionSupported', 44797c0d11SAndreas Gohr 'this:wiki_RPCVersion', 45797c0d11SAndreas Gohr array('int'), 46fdd2e9d6SMichael Klier 'Returns 2 with the supported RPC API version.' 47797c0d11SAndreas Gohr ); 48797c0d11SAndreas Gohr $this->addCallback( 49797c0d11SAndreas Gohr 'wiki.getPage', 50797c0d11SAndreas Gohr 'this:rawPage', 51797c0d11SAndreas Gohr array('string','string'), 52797c0d11SAndreas Gohr 'Get the raw Wiki text of page, latest version.' 53797c0d11SAndreas Gohr ); 54797c0d11SAndreas Gohr $this->addCallback( 55797c0d11SAndreas Gohr 'wiki.getPageVersion', 56797c0d11SAndreas Gohr 'this:rawPage', 57797c0d11SAndreas Gohr array('string','string','int'), 58797c0d11SAndreas Gohr 'Get the raw Wiki text of page.' 59797c0d11SAndreas Gohr ); 60797c0d11SAndreas Gohr $this->addCallback( 61797c0d11SAndreas Gohr 'wiki.getPageHTML', 62797c0d11SAndreas Gohr 'this:htmlPage', 63797c0d11SAndreas Gohr array('string','string'), 64797c0d11SAndreas Gohr 'Return page in rendered HTML, latest version.' 65797c0d11SAndreas Gohr ); 66797c0d11SAndreas Gohr $this->addCallback( 67797c0d11SAndreas Gohr 'wiki.getPageHTMLVersion', 68797c0d11SAndreas Gohr 'this:htmlPage', 69797c0d11SAndreas Gohr array('string','string','int'), 70797c0d11SAndreas Gohr 'Return page in rendered HTML.' 71797c0d11SAndreas Gohr ); 72797c0d11SAndreas Gohr $this->addCallback( 73797c0d11SAndreas Gohr 'wiki.getAllPages', 74797c0d11SAndreas Gohr 'this:listPages', 75797c0d11SAndreas Gohr array('struct'), 76797c0d11SAndreas Gohr 'Returns a list of all pages. The result is an array of utf8 pagenames.' 77797c0d11SAndreas Gohr ); 78797c0d11SAndreas Gohr $this->addCallback( 7926bec61eSMichael Klier 'wiki.getAttachments', 8026bec61eSMichael Klier 'this:listAttachments', 8126bec61eSMichael Klier array('struct'), 8226bec61eSMichael Klier 'Returns a list of all media files.' 8326bec61eSMichael Klier ); 8426bec61eSMichael Klier $this->addCallback( 85797c0d11SAndreas Gohr 'wiki.getBackLinks', 86797c0d11SAndreas Gohr 'this:listBackLinks', 87797c0d11SAndreas Gohr array('struct','string'), 88797c0d11SAndreas Gohr 'Returns the pages that link to this page.' 89797c0d11SAndreas Gohr ); 90797c0d11SAndreas Gohr $this->addCallback( 91797c0d11SAndreas Gohr 'wiki.getPageInfo', 92797c0d11SAndreas Gohr 'this:pageInfo', 93797c0d11SAndreas Gohr array('struct','string'), 94797c0d11SAndreas Gohr 'Returns a struct with infos about the page.' 95797c0d11SAndreas Gohr ); 96797c0d11SAndreas Gohr $this->addCallback( 97797c0d11SAndreas Gohr 'wiki.getPageInfoVersion', 98797c0d11SAndreas Gohr 'this:pageInfo', 99797c0d11SAndreas Gohr array('struct','string','int'), 100797c0d11SAndreas Gohr 'Returns a struct with infos about the page.' 101797c0d11SAndreas Gohr ); 1023a1dad2dSDennis Ploeger $this->addCallback( 10373056168SMichael Klier 'wiki.getPageVersions', 10473056168SMichael Klier 'this:pageVersions', 10573056168SMichael Klier array('struct','string','int'), 10673056168SMichael Klier 'Returns the available revisions of the page.' 10773056168SMichael Klier ); 10873056168SMichael Klier $this->addCallback( 1093a1dad2dSDennis Ploeger 'wiki.putPage', 1103a1dad2dSDennis Ploeger 'this:putPage', 111222572bfSMichael Klier array('int', 'string', 'string', 'struct'), 112fdd2e9d6SMichael Klier 'Saves a wiki page.' 1133a1dad2dSDennis Ploeger ); 114beccd742SMichael Klier $this->addCallback( 115beccd742SMichael Klier 'wiki.listLinks', 116beccd742SMichael Klier 'this:listLinks', 117beccd742SMichael Klier array('struct','string'), 118fdd2e9d6SMichael Klier 'Lists all links contained in a wiki page.' 119beccd742SMichael Klier ); 12063dd0d58SMichael Klier $this->addCallback( 12163dd0d58SMichael Klier 'wiki.getRecentChanges', 12263dd0d58SMichael Klier 'this:getRecentChanges', 12363dd0d58SMichael Klier array('struct','int'), 12463dd0d58SMichael Klier 'Returns a strukt about all recent changes since given timestamp.' 12563dd0d58SMichael Klier ); 126e62b9ea5SMichael Klier $this->addCallback( 127e62b9ea5SMichael Klier 'wiki.aclCheck', 128e62b9ea5SMichael Klier 'this:aclCheck', 129e62b9ea5SMichael Klier array('struct', 'string'), 130e62b9ea5SMichael Klier 'Returns the permissions of a given wiki page.' 131e62b9ea5SMichael Klier ); 132*2aca132fSMichael Klier $this->addCallback( 133*2aca132fSMichael Klier 'wiki.putAttachment', 134*2aca132fSMichael Klier 'this:putAttachment', 135*2aca132fSMichael Klier array('struct', 'string', 'base64', 'struct'), 136*2aca132fSMichael Klier 'Upload a file to the wiki.' 137*2aca132fSMichael Klier ); 138797c0d11SAndreas Gohr 139797c0d11SAndreas Gohr $this->serve(); 140797c0d11SAndreas Gohr } 141797c0d11SAndreas Gohr 142797c0d11SAndreas Gohr /** 143797c0d11SAndreas Gohr * Return a raw wiki page 144797c0d11SAndreas Gohr */ 145797c0d11SAndreas Gohr function rawPage($id,$rev=''){ 146797c0d11SAndreas Gohr if(auth_quickaclcheck($id) < AUTH_READ){ 147797c0d11SAndreas Gohr return new IXR_Error(1, 'You are not allowed to read this page'); 148797c0d11SAndreas Gohr } 1492c176304SMichael Klier $text = rawWiki($id,$rev); 1502c176304SMichael Klier if(!$text) { 1512c176304SMichael Klier $data = array($id); 1522c176304SMichael Klier return trigger_event('HTML_PAGE_FROMTEMPLATE',$data,'pageTemplate',true); 1532c176304SMichael Klier } else { 1542c176304SMichael Klier return $text; 1552c176304SMichael Klier } 156797c0d11SAndreas Gohr } 157797c0d11SAndreas Gohr 158797c0d11SAndreas Gohr /** 159797c0d11SAndreas Gohr * Return a wiki page rendered to html 160797c0d11SAndreas Gohr */ 161797c0d11SAndreas Gohr function htmlPage($id,$rev=''){ 162797c0d11SAndreas Gohr if(auth_quickaclcheck($id) < AUTH_READ){ 163797c0d11SAndreas Gohr return new IXR_Error(1, 'You are not allowed to read this page'); 164797c0d11SAndreas Gohr } 165797c0d11SAndreas Gohr return p_wiki_xhtml($id,$rev,false); 166797c0d11SAndreas Gohr } 167797c0d11SAndreas Gohr 168797c0d11SAndreas Gohr /** 169797c0d11SAndreas Gohr * List all pages - we use the indexer list here 170797c0d11SAndreas Gohr */ 171797c0d11SAndreas Gohr function listPages(){ 172797c0d11SAndreas Gohr require_once(DOKU_INC.'inc/fulltext.php'); 173797c0d11SAndreas Gohr return ft_pageLookup(''); 174797c0d11SAndreas Gohr } 175797c0d11SAndreas Gohr 176797c0d11SAndreas Gohr /** 17726bec61eSMichael Klier * List all media files. 17826bec61eSMichael Klier */ 17926bec61eSMichael Klier function listAttachments($ns) { 18026bec61eSMichael Klier global $conf; 18126bec61eSMichael Klier global $lang; 18226bec61eSMichael Klier 18326bec61eSMichael Klier $ns = cleanID($ns); 18426bec61eSMichael Klier 18526bec61eSMichael Klier if(auth_quickaclcheck($ns.':*') >= AUTH_READ) { 18626bec61eSMichael Klier $dir = utf8_encodeFN(str_replace(':', '/', $ns)); 18726bec61eSMichael Klier 18826bec61eSMichael Klier $data = array(); 18926bec61eSMichael Klier require_once(DOKU_INC.'inc/search.php'); 19026bec61eSMichael Klier search($data, $conf['mediadir'], 'search_media', array(), $dir); 19126bec61eSMichael Klier 19226bec61eSMichael Klier if(!count($data)) { 19326bec61eSMichael Klier return array(); 19426bec61eSMichael Klier } 19526bec61eSMichael Klier 19626bec61eSMichael Klier $files = array(); 19726bec61eSMichael Klier foreach($data as $item) { 19826bec61eSMichael Klier $file = array(); 19926bec61eSMichael Klier $file['id'] = $item['id']; 20026bec61eSMichael Klier $file['size'] = $item['size']; 20126bec61eSMichael Klier $file['mtime'] = $item['mtime']; 20226bec61eSMichael Klier $file['isimg'] = $item['isimg']; 20326bec61eSMichael Klier $file['writable'] = $item['writeable']; 20426bec61eSMichael Klier array_push($files, $file); 20526bec61eSMichael Klier } 20626bec61eSMichael Klier 20726bec61eSMichael Klier return $files; 20826bec61eSMichael Klier 20926bec61eSMichael Klier } else { 21026bec61eSMichael Klier return new IXR_Error(1, 'You are not allowed to list media files.'); 21126bec61eSMichael Klier } 21226bec61eSMichael Klier } 21326bec61eSMichael Klier 21426bec61eSMichael Klier /** 215797c0d11SAndreas Gohr * Return a list of backlinks 216797c0d11SAndreas Gohr */ 217beccd742SMichael Klier function listBackLinks($id){ 218797c0d11SAndreas Gohr require_once(DOKU_INC.'inc/fulltext.php'); 219797c0d11SAndreas Gohr return ft_backlinks($id); 220797c0d11SAndreas Gohr } 221797c0d11SAndreas Gohr 222797c0d11SAndreas Gohr /** 22363dd0d58SMichael Klier * Return some basic data about a page 224797c0d11SAndreas Gohr */ 225797c0d11SAndreas Gohr function pageInfo($id,$rev=''){ 226797c0d11SAndreas Gohr if(auth_quickaclcheck($id) < AUTH_READ){ 227797c0d11SAndreas Gohr return new IXR_Error(1, 'You are not allowed to read this page'); 228797c0d11SAndreas Gohr } 229797c0d11SAndreas Gohr $file = wikiFN($id,$rev); 230797c0d11SAndreas Gohr $time = @filemtime($file); 231797c0d11SAndreas Gohr if(!$time){ 232797c0d11SAndreas Gohr return new IXR_Error(10, 'The requested page does not exist'); 233797c0d11SAndreas Gohr } 234797c0d11SAndreas Gohr 235797c0d11SAndreas Gohr $info = getRevisionInfo($id, $time, 1024); 236797c0d11SAndreas Gohr 237797c0d11SAndreas Gohr $data = array( 238797c0d11SAndreas Gohr 'name' => $id, 239797c0d11SAndreas Gohr 'lastModified' => new IXR_Date($time), 240797c0d11SAndreas Gohr 'author' => (($info['user']) ? $info['user'] : $info['ip']), 241797c0d11SAndreas Gohr 'version' => $time 242797c0d11SAndreas Gohr ); 24363dd0d58SMichael Klier 24463dd0d58SMichael Klier return ($data); 245797c0d11SAndreas Gohr } 246797c0d11SAndreas Gohr 247797c0d11SAndreas Gohr /** 2483a1dad2dSDennis Ploeger * Save a wiki page 249222572bfSMichael Klier * 250222572bfSMichael Klier * @author Michael Klier <chi@chimeric.de> 2513a1dad2dSDennis Ploeger */ 252222572bfSMichael Klier function putPage($id, $text, $params) { 2533a1dad2dSDennis Ploeger global $TEXT; 254a6a229ceSMichael Klier global $lang; 2553a1dad2dSDennis Ploeger 256222572bfSMichael Klier $id = cleanID($id); 257222572bfSMichael Klier $TEXT = trim($text); 258222572bfSMichael Klier $sum = $params['sum']; 259222572bfSMichael Klier $minor = $params['minor']; 260222572bfSMichael Klier 261222572bfSMichael Klier if(empty($id)) 262fdd2e9d6SMichael Klier return new IXR_Error(1, 'Empty page ID'); 263222572bfSMichael Klier 26451597811SMichael Klier if(!page_exists($id) && empty($TEXT)) { 26551597811SMichael Klier return new IXR_ERROR(1, 'Refusing to write an empty new wiki page'); 26651597811SMichael Klier } 26751597811SMichael Klier 268055b0144SChris Smith if(auth_quickaclcheck($id) < AUTH_EDIT) 269222572bfSMichael Klier return new IXR_Error(1, 'You are not allowed to edit this page'); 2703a1dad2dSDennis Ploeger 2713a1dad2dSDennis Ploeger // Check, if page is locked 272222572bfSMichael Klier if(checklock($id)) 273222572bfSMichael Klier return new IXR_Error(1, 'The page is currently locked'); 274222572bfSMichael Klier 275a6a229ceSMichael Klier // SPAM check 2763a1dad2dSDennis Ploeger if(checkwordblock()) 277222572bfSMichael Klier return new IXR_Error(1, 'Positive wordblock check'); 2783a1dad2dSDennis Ploeger 279a6a229ceSMichael Klier // autoset summary on new pages 280a6a229ceSMichael Klier if(!page_exists($id) && empty($sum)) { 281a6a229ceSMichael Klier $sum = $lang['created']; 282a6a229ceSMichael Klier } 283a6a229ceSMichael Klier 284a6a229ceSMichael Klier // autoset summary on deleted pages 285a6a229ceSMichael Klier if(page_exists($id) && empty($TEXT) && empty($sum)) { 286a6a229ceSMichael Klier $sum = $lang['deleted']; 287a6a229ceSMichael Klier } 288a6a229ceSMichael Klier 289222572bfSMichael Klier lock($id); 2903a1dad2dSDennis Ploeger 291222572bfSMichael Klier saveWikiText($id,$TEXT,$sum,$minor); 2923a1dad2dSDennis Ploeger 293222572bfSMichael Klier unlock($id); 2943a1dad2dSDennis Ploeger 2953a1dad2dSDennis Ploeger return 0; 296beccd742SMichael Klier } 2973a1dad2dSDennis Ploeger 298beccd742SMichael Klier /** 299*2aca132fSMichael Klier * Uploads a file to the wiki. 300*2aca132fSMichael Klier * 301*2aca132fSMichael Klier * Michael Klier <chi@chimeric.de> 302*2aca132fSMichael Klier */ 303*2aca132fSMichael Klier function putAttachment($ns, $file, $params) { 304*2aca132fSMichael Klier global $conf; 305*2aca132fSMichael Klier global $lang; 306*2aca132fSMichael Klier 307*2aca132fSMichael Klier $auth = auth_quickaclcheck($ns.':*'); 308*2aca132fSMichael Klier if($auth >= AUTH_UPLOAD) { 309*2aca132fSMichael Klier if(!isset($params['name'])) { 310*2aca132fSMichael Klier return new IXR_ERROR(1, 'Filename not given.'); 311*2aca132fSMichael Klier } 312*2aca132fSMichael Klier 313*2aca132fSMichael Klier $ftmp = $conf['tmpdir'] . '/' . $params['name']; 314*2aca132fSMichael Klier $name = $params['name']; 315*2aca132fSMichael Klier 316*2aca132fSMichael Klier // save temporary file 317*2aca132fSMichael Klier @unlink($ftmp); 318*2aca132fSMichael Klier $buff = base64_decode($file); 319*2aca132fSMichael Klier io_saveFile($ftmp, $buff); 320*2aca132fSMichael Klier 321*2aca132fSMichael Klier // get filename 322*2aca132fSMichael Klier list($iext, $imime) = mimetype($name); 323*2aca132fSMichael Klier $id = cleanID($ns.':'.$name); 324*2aca132fSMichael Klier $fn = mediaFN($id); 325*2aca132fSMichael Klier 326*2aca132fSMichael Klier // get filetype regexp 327*2aca132fSMichael Klier $types = array_keys(getMimeTypes()); 328*2aca132fSMichael Klier $types = array_map(create_function('$q','return preg_quote($q,"/");'),$types); 329*2aca132fSMichael Klier $regex = join('|',$types); 330*2aca132fSMichael Klier 331*2aca132fSMichael Klier // because a temp file was created already 332*2aca132fSMichael Klier if(preg_match('/\.('.$regex.')$/i',$fn)) { 333*2aca132fSMichael Klier //check for overwrite 334*2aca132fSMichael Klier if(@file_exists($fn) && (!$params['ow'] || $auth < AUTH_DELETE)) { 335*2aca132fSMichael Klier return new IXR_ERROR(1, $lang['uploadexist']); 336*2aca132fSMichael Klier } 337*2aca132fSMichael Klier // check for valid content 338*2aca132fSMichael Klier @require_once(DOKU_INC.'inc/media.php'); 339*2aca132fSMichael Klier $ok = media_contentcheck($ftmp, $imime); 340*2aca132fSMichael Klier if($ok == -1) { 341*2aca132fSMichael Klier return new IXR_ERROR(1, sprintf($lang['uploadexist'], ".$iext")); 342*2aca132fSMichael Klier } elseif($ok == -2) { 343*2aca132fSMichael Klier return new IXR_ERROR(1, $lang['uploadspam']); 344*2aca132fSMichael Klier } elseif($ok == -3) { 345*2aca132fSMichael Klier return new IXR_ERROR(1, $lang['uploadxss']); 346*2aca132fSMichael Klier } 347*2aca132fSMichael Klier 348*2aca132fSMichael Klier // prepare event data 349*2aca132fSMichael Klier $data[0] = $ftmp; 350*2aca132fSMichael Klier $data[1] = $fn; 351*2aca132fSMichael Klier $data[2] = $id; 352*2aca132fSMichael Klier $data[3] = $imime; 353*2aca132fSMichael Klier 354*2aca132fSMichael Klier // trigger event 355*2aca132fSMichael Klier require_once(DOKU_INC.'inc/events.php'); 356*2aca132fSMichael Klier return trigger_event('MEDIA_UPLOAD_FINISH', $data, array($this, '_media_upload_action'), true); 357*2aca132fSMichael Klier 358*2aca132fSMichael Klier } else { 359*2aca132fSMichael Klier return new IXR_ERROR(1, $lang['uploadwrong']); 360*2aca132fSMichael Klier } 361*2aca132fSMichael Klier } else { 362*2aca132fSMichael Klier return new IXR_ERROR(1, "You don't have permissions to upload files."); 363*2aca132fSMichael Klier } 364*2aca132fSMichael Klier } 365*2aca132fSMichael Klier 366*2aca132fSMichael Klier /** 367*2aca132fSMichael Klier * Moves the temporary file to its final destination. 368*2aca132fSMichael Klier * 369*2aca132fSMichael Klier * Michael Klier <chi@chimeric.de> 370*2aca132fSMichael Klier */ 371*2aca132fSMichael Klier function _media_upload_action($data) { 372*2aca132fSMichael Klier global $conf; 373*2aca132fSMichael Klier 374*2aca132fSMichael Klier if(is_array($data) && count($data)===4) { 375*2aca132fSMichael Klier io_createNamespace($data[2], 'media'); 376*2aca132fSMichael Klier if(rename($data[0], $data[1])) { 377*2aca132fSMichael Klier chmod($data[1], $conf['fmode']); 378*2aca132fSMichael Klier media_notify($data[2], $data[1], $data[3]); 379*2aca132fSMichael Klier return $data[2]; 380*2aca132fSMichael Klier } else { 381*2aca132fSMichael Klier return new IXR_ERROR(1, 'Upload failed.'); 382*2aca132fSMichael Klier } 383*2aca132fSMichael Klier } else { 384*2aca132fSMichael Klier return new IXR_ERROR(1, 'Upload failed.'); 385*2aca132fSMichael Klier } 386*2aca132fSMichael Klier } 387*2aca132fSMichael Klier 388*2aca132fSMichael Klier /** 389e62b9ea5SMichael Klier * Returns the permissions of a given wiki page 390e62b9ea5SMichael Klier */ 391e62b9ea5SMichael Klier function aclCheck($id) { 392e62b9ea5SMichael Klier return auth_quickaclcheck($id); 393e62b9ea5SMichael Klier } 394e62b9ea5SMichael Klier 395e62b9ea5SMichael Klier /** 396beccd742SMichael Klier * Lists all links contained in a wiki page 39763dd0d58SMichael Klier * 39863dd0d58SMichael Klier * @author Michael Klier <chi@chimeric.de> 399beccd742SMichael Klier */ 400beccd742SMichael Klier function listLinks($id) { 401beccd742SMichael Klier if(auth_quickaclcheck($id) < AUTH_READ){ 402beccd742SMichael Klier return new IXR_Error(1, 'You are not allowed to read this page'); 403beccd742SMichael Klier } 404beccd742SMichael Klier $links = array(); 405beccd742SMichael Klier 406beccd742SMichael Klier // resolve page instructions 407beccd742SMichael Klier $ins = p_cached_instructions(wikiFN(cleanID($id))); 408beccd742SMichael Klier 409beccd742SMichael Klier // instantiate new Renderer - needed for interwiki links 410beccd742SMichael Klier include(DOKU_INC.'inc/parser/xhtml.php'); 411beccd742SMichael Klier $Renderer = new Doku_Renderer_xhtml(); 412beccd742SMichael Klier $Renderer->interwiki = getInterwiki(); 413beccd742SMichael Klier 414beccd742SMichael Klier // parse parse instructions 415beccd742SMichael Klier foreach($ins as $in) { 416beccd742SMichael Klier $link = array(); 417beccd742SMichael Klier switch($in[0]) { 418beccd742SMichael Klier case 'internallink': 419beccd742SMichael Klier $link['type'] = 'local'; 420beccd742SMichael Klier $link['page'] = $in[1][0]; 421beccd742SMichael Klier $link['href'] = wl($in[1][0]); 422beccd742SMichael Klier array_push($links,$link); 423beccd742SMichael Klier break; 424beccd742SMichael Klier case 'externallink': 425beccd742SMichael Klier $link['type'] = 'extern'; 426beccd742SMichael Klier $link['page'] = $in[1][0]; 427beccd742SMichael Klier $link['href'] = $in[1][0]; 428beccd742SMichael Klier array_push($links,$link); 429beccd742SMichael Klier break; 430beccd742SMichael Klier case 'interwikilink': 431beccd742SMichael Klier $url = $Renderer->_resolveInterWiki($in[1][2],$in[1][3]); 432beccd742SMichael Klier $link['type'] = 'extern'; 433beccd742SMichael Klier $link['page'] = $url; 434beccd742SMichael Klier $link['href'] = $url; 435beccd742SMichael Klier array_push($links,$link); 436beccd742SMichael Klier break; 437beccd742SMichael Klier } 438beccd742SMichael Klier } 439beccd742SMichael Klier 44063dd0d58SMichael Klier return ($links); 44163dd0d58SMichael Klier } 44263dd0d58SMichael Klier 44363dd0d58SMichael Klier /** 44463dd0d58SMichael Klier * Returns a list of recent changes since give timestamp 44563dd0d58SMichael Klier * 44663dd0d58SMichael Klier * @author Michael Klier <chi@chimeric.de> 44763dd0d58SMichael Klier */ 44863dd0d58SMichael Klier function getRecentChanges($timestamp) { 44963dd0d58SMichael Klier global $conf; 45063dd0d58SMichael Klier 45163dd0d58SMichael Klier if(strlen($timestamp) != 10) 45263dd0d58SMichael Klier return new IXR_Error(20, 'The provided value is not a valid timestamp'); 45363dd0d58SMichael Klier 45463dd0d58SMichael Klier $changes = array(); 45563dd0d58SMichael Klier 45663dd0d58SMichael Klier require_once(DOKU_INC.'inc/changelog.php'); 45763dd0d58SMichael Klier require_once(DOKU_INC.'inc/pageutils.php'); 45863dd0d58SMichael Klier 45963dd0d58SMichael Klier // read changes 46063dd0d58SMichael Klier $lines = @file($conf['changelog']); 46163dd0d58SMichael Klier 46263dd0d58SMichael Klier if(empty($lines)) 46363dd0d58SMichael Klier return new IXR_Error(10, 'The changelog could not be read'); 46463dd0d58SMichael Klier 46563dd0d58SMichael Klier // we start searching at the end of the list 46663dd0d58SMichael Klier $lines = array_reverse($lines); 46763dd0d58SMichael Klier 46863dd0d58SMichael Klier // cache seen pages and skip them 46963dd0d58SMichael Klier $seen = array(); 47063dd0d58SMichael Klier 47163dd0d58SMichael Klier foreach($lines as $line) { 47263dd0d58SMichael Klier 47363dd0d58SMichael Klier if(empty($line)) continue; // skip empty lines 47463dd0d58SMichael Klier 47563dd0d58SMichael Klier $logline = parseChangelogLine($line); 47663dd0d58SMichael Klier 47763dd0d58SMichael Klier if($logline === false) continue; 47863dd0d58SMichael Klier 47963dd0d58SMichael Klier // skip seen ones 48063dd0d58SMichael Klier if(isset($seen[$logline['id']])) continue; 48163dd0d58SMichael Klier 48263dd0d58SMichael Klier // skip minors 48363dd0d58SMichael Klier if($logline['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT && ($flags & RECENTS_SKIP_MINORS)) continue; 48463dd0d58SMichael Klier 48563dd0d58SMichael Klier // remember in seen to skip additional sights 48663dd0d58SMichael Klier $seen[$logline['id']] = 1; 48763dd0d58SMichael Klier 48863dd0d58SMichael Klier // check if it's a hidden page 48963dd0d58SMichael Klier if(isHiddenPage($logline['id'])) continue; 49063dd0d58SMichael Klier 49163dd0d58SMichael Klier // check ACL 49263dd0d58SMichael Klier if(auth_quickaclcheck($logline['id']) < AUTH_READ) continue; 49363dd0d58SMichael Klier 49463dd0d58SMichael Klier // check existance 49563dd0d58SMichael Klier if((!@file_exists(wikiFN($logline['id']))) && ($flags & RECENTS_SKIP_DELETED)) continue; 49663dd0d58SMichael Klier 49763dd0d58SMichael Klier // check if logline is still in the queried time frame 49863dd0d58SMichael Klier if($logline['date'] >= $timestamp) { 49963dd0d58SMichael Klier $change['name'] = $logline['id']; 500610b2ab1SMichael Klier $change['lastModified'] = new IXR_Date($logline['date']); 50163dd0d58SMichael Klier $change['author'] = $logline['user']; 50263dd0d58SMichael Klier $change['version'] = $logline['date']; 50363dd0d58SMichael Klier array_push($changes, $change); 50463dd0d58SMichael Klier } else { 50563dd0d58SMichael Klier $changes = array_reverse($changes); 50663dd0d58SMichael Klier return ($changes); 50763dd0d58SMichael Klier } 50863dd0d58SMichael Klier } 50963dd0d58SMichael Klier // in case we still have nothing at this point 51063dd0d58SMichael Klier return new IXR_Error(30, 'There are no changes in the specified timeframe'); 5113a1dad2dSDennis Ploeger } 5123a1dad2dSDennis Ploeger 5133a1dad2dSDennis Ploeger /** 51473056168SMichael Klier * Returns a list of available revisions of a given wiki page 51573056168SMichael Klier * 51673056168SMichael Klier * @author Michael Klier <chi@chimeric.de> 51773056168SMichael Klier */ 51873056168SMichael Klier function pageVersions($id, $first) { 51973056168SMichael Klier global $conf; 52073056168SMichael Klier 52173056168SMichael Klier $versions = array(); 52273056168SMichael Klier 52373056168SMichael Klier if(empty($id)) 52473056168SMichael Klier return new IXR_Error(1, 'Empty page ID'); 52573056168SMichael Klier 52673056168SMichael Klier require_once(DOKU_INC.'inc/changelog.php'); 52773056168SMichael Klier 52873056168SMichael Klier $revisions = getRevisions($id, $first, $conf['recent']+1); 52973056168SMichael Klier 53073056168SMichael Klier if(count($revisions)==0 && $first!=0) { 53173056168SMichael Klier $first=0; 53273056168SMichael Klier $revisions = getRevisions($id, $first, $conf['recent']+1); 53373056168SMichael Klier } 53473056168SMichael Klier 53545c63471SMichael Klier if(count($revisions)>0 && $first==0) { 53645c63471SMichael Klier array_unshift($revisions, ''); // include current revision 53745c63471SMichael Klier array_pop($revisions); // remove extra log entry 53845c63471SMichael Klier } 53945c63471SMichael Klier 54073056168SMichael Klier $hasNext = false; 54173056168SMichael Klier if(count($revisions)>$conf['recent']) { 54273056168SMichael Klier $hasNext = true; 54373056168SMichael Klier array_pop($revisions); // remove extra log entry 54473056168SMichael Klier } 54573056168SMichael Klier 54673056168SMichael Klier if(!empty($revisions)) { 54773056168SMichael Klier foreach($revisions as $rev) { 54873056168SMichael Klier $file = wikiFN($id,$rev); 54973056168SMichael Klier $time = @filemtime($file); 55045c63471SMichael Klier // we check if the page actually exists, if this is not the 55145c63471SMichael Klier // case this can lead to less pages being returned than 55245c63471SMichael Klier // specified via $conf['recent'] 55373056168SMichael Klier if($time){ 55473056168SMichael Klier $info = getRevisionInfo($id, $time, 1024); 55573056168SMichael Klier if(!empty($info)) { 55673056168SMichael Klier $data['user'] = $info['user']; 55773056168SMichael Klier $data['ip'] = $info['ip']; 55873056168SMichael Klier $data['type'] = $info['type']; 55973056168SMichael Klier $data['sum'] = $info['sum']; 56073056168SMichael Klier $data['modified'] = new IXR_Date($info['date']); 56173056168SMichael Klier $data['version'] = $info['date']; 56273056168SMichael Klier array_push($versions, $data); 56373056168SMichael Klier } 56473056168SMichael Klier } 56573056168SMichael Klier } 56673056168SMichael Klier return $versions; 56773056168SMichael Klier } else { 56873056168SMichael Klier return array(); 56973056168SMichael Klier } 57073056168SMichael Klier } 57173056168SMichael Klier 57273056168SMichael Klier /** 573797c0d11SAndreas Gohr * The version of Wiki RPC API supported 574797c0d11SAndreas Gohr */ 575797c0d11SAndreas Gohr function wiki_RPCVersion(){ 576797c0d11SAndreas Gohr return 2; 577797c0d11SAndreas Gohr } 578797c0d11SAndreas Gohr} 579797c0d11SAndreas Gohr 580797c0d11SAndreas Gohr$server = new dokuwiki_xmlrpc_server(); 581797c0d11SAndreas Gohr 582*2aca132fSMichael Klier// vim:ts=4:sw=4:et:enc=utf-8: 583