* @link http://wiki.foosel.net/snippets/dokuwiki/linkback
*/
use dokuwiki\HTTP\DokuHTTPClient;
if (!defined('DOKU_INC'))
define('DOKU_INC', realpath(dirname(__FILE__) . '/../../../../') . '/');
require_once (DOKU_INC . 'inc/init.php');
/**
* Class TrackbackServer
*/
class TrackbackServer {
/** @var helper_plugin_blogtng_linkback */
var $tools;
/**
* Construct helper and process request.
*/
function __construct() {
$this->tools = plugin_load('helper', 'blogtng_linkback');
$this->_process();
}
/**
* Process trackback request.
*/
function _process() {
// get ID
global $ID, $INPUT;
$ID = substr($_SERVER['PATH_INFO'], 1);
$sourceUri = $INPUT->str('url');
if (is_null($this->tools) || !$this->tools->linkbackAllowed()) {
$this->_printTrackbackError('Trackbacks disabled.');
return;
}
// No POST request? Quit
if ($INPUT->server->str('REQUEST_METHOD') != 'POST') {
$this->_printTrackbackError('Trackback was not received via HTTP POST.');
return;
}
// Given URL is not an url? Quit
if (!preg_match("#^([a-z0-9\-\.+]+?)://.*#i", $sourceUri)) {
$this->_printTrackbackError('Given trackback URL is not an URL.');
return;
}
// Source does not exist? Quit
$http = new DokuHTTPClient;
$page = $http->get($sourceUri);
if ($page === false) {
$this->_printTrackbackError('Linked page cannot be reached');
return;
}
if (!$this->tools->saveLinkback('trackback', strip_tags($INPUT->post->str('title')),
$sourceUri, strip_tags($INPUT->post->str('excerpt')), $ID)) {
$this->_printTrackbackError('Trackback already received.');
return;
}
$this->_printTrackbackSuccess();
}
/**
* Print trackback success xml.
*/
function _printTrackbackSuccess() {
echo '' . NL .
'' . NL .
'0' . NL .
'';
}
/**
* Print trackback error xml.
*
* @param string $reason
*/
function _printTrackbackError($reason = '') {
echo '' . NL .
'' . NL .
'1' . NL .
'' . $reason . '' . NL .
'';
}
}
$server = new TrackbackServer();