* @link http://wiki.foosel.net/snippets/dokuwiki/linkback */ if (!defined('DOKU_INC')) define('DOKU_INC', realpath(dirname(__FILE__) . '/../../../../') . '/'); require_once (DOKU_INC . 'inc/init.php'); require_once (DOKU_PLUGIN . 'linkback/tools.php'); require_once (DOKU_PLUGIN . 'linkback/http.php'); class TrackbackServer { // helper instance /** @var PluginInterface|tools_plugin_linkback */ var $tools; /** * Construct helper and process request. */ function __construct() { $this->tools = plugin_load('tools', 'linkback'); //TODO type 'tools'? is that possible? $this->_process(); } /** * Process trackback request. */ function _process() { // Plugin not enabled? Quit if (plugin_isdisabled('linkback')) { $this->_printTrackbackError('Trackbacks disabled.'); return; } // Trackbacks not enabled? Quit if (!$this->tools->getConf('enable_trackback')) { $this->_printTrackbackError('Trackbacks disabled.'); return; } // No POST request? Quit if ($_SERVER['REQUEST_METHOD'] != 'POST') { $this->_printTrackbackError('Trackback was not received via HTTP POST.'); return; } // get ID $ID = substr($_SERVER['PATH_INFO'], 1); $file = metaFN($ID, '.linkbacks'); $data = array ( 'send' => false, 'receive' => false, 'display' => false, 'sentpings' => array (), 'receivedpings' => array (), 'number' => 0, ); if (@ file_exists($file)) $data = unserialize(io_readFile($file, false)); // target is not trackback-enabled? Quit if (!$data['receive']) { $this->_printTrackbackError('Trackbacks not enabled for this resource.'); return; } // construct unique id for trackback $lid = md5($_REQUEST['url']); $linkback = array ( 'lid' => $lid, 'title' => strip_tags($_REQUEST['title']), 'url' => $_REQUEST['url'], 'excerpt' => strip_tags($_REQUEST['excerpt']), 'raw_excerpt' => $_REQUEST['excerpt'], 'blog_name' => strip_tags($_REQUEST['blog_name']), 'received' => time(), 'submitter_ip' => $_SERVER['REMOTE_ADDR'], 'submitter_useragent' => $_SERVER['HTTP_USER_AGENT'], 'submitter_referer' => $_SERVER['HTTP_REFERER'], 'type' => 'trackback', 'show' => true, ); $log = array( date('Y/m/d H:i', time()) . ': Received trackback from ' . $linkback['url'] . ' (' . $linkback['lid'] . ')', ); // Given URL is not an url? Quit if (!preg_match("#^([a-z0-9\-\.+]+?)://.*#i", $linkback['url'])) { $log[] = "\tTrackback URL is invalid"; if ($this->tools->getConf('log_processing')) $this->tools->addProcessLogEntry($log); $this->_printTrackbackError('Given trackback URL is not an URL.'); return; } // Trackback already done? Quit if ($data['receivedpings'][$lid]) { $log[] = "\tTrackback already received"; if ($this->tools->getConf('log_processing')) $this->tools->addProcessLogEntry($log); $this->_printTrackbackError('Trackback already received.'); return; } // Source does not exist? Quit $page = $this->tools->getPage($linkback['url']); if (!$page['success'] && ($page['status'] < 200 || $page['status'] >= 300)) { $log[] = "\tLinked page cannot be reached, status " .$page['status']; if ($this->tools->getConf('log_processing')) $this->tools->addProcessLogEntry($log); $this->_printTrackbackError('Linked page cannot be reached ('.$page['error'].').'); return; } // Prepare event for Antispam plugins $evt_data = array ( 'linkback' => $linkback, 'page' => $page, 'target' => wl($ID, '', true), 'show' => true, 'log' => $log, ); $event = new Doku_Event('ACTION_LINKBACK_RECEIVED', $evt_data); if ($event->advise_before()) { $linkback['show'] = $evt_data['show']; if ($this->tools->getConf('usefavicon')) { $linkback['favicon'] = $this->tools->getFavicon($linkback['url'], $page['body']); } // add trackback $data['receivedpings'][$lid] = $linkback; if ($linkback['show']) $data['number']++; io_saveFile($file, serialize($data)); $this->tools->addLogEntry($linkback['received'], $ID, 'cl', '', $linkback['lid']); $this->tools->notify($ID, $linkback); $this->_printTrackbackSuccess(); } else { $this->_printTrackbackError('Trackback denied: Spam.'); } if ($this->tools->getConf('log_processing')) $this->tools->addProcessLogEntry($evt_data['log']); $event->advise_after(); } /** * Print trackback success xml. */ function _printTrackbackSuccess() { echo '' . NL . '' . NL . '0' . NL . ''; } /** * Print trackback error xml. */ function _printTrackbackError($reason = '') { echo '' . NL . '' . NL . '1' . NL . '' . $reason . '' . NL . ''; } } $server = new TrackbackServer();