diff --git a/plugins/Linkback/LinkbackPlugin.php b/plugins/Linkback/LinkbackPlugin.php index 2aeb8ea016..ac95b4ab25 100644 --- a/plugins/Linkback/LinkbackPlugin.php +++ b/plugins/Linkback/LinkbackPlugin.php @@ -311,6 +311,12 @@ class LinkbackPlugin extends Plugin public function onRouterInitialized(URLMapper $m) { $m->connect('main/linkback/webmention', array('action' => 'webmention')); + $m->connect('main/linkback/pingback', array('action' => 'pingback')); + } + + public function onStartShowHTML($action) + { + header('X-Pingback: ' . common_local_url('pingback')); } public function version() diff --git a/plugins/Linkback/actions/pingback.php b/plugins/Linkback/actions/pingback.php new file mode 100644 index 0000000000..8d2c87fb02 --- /dev/null +++ b/plugins/Linkback/actions/pingback.php @@ -0,0 +1,87 @@ +. + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +class PingbackAction extends Action +{ + protected function handle() + { + GNUsocial::setApi(true); // Minimize error messages to aid in debugging + parent::handle(); + if ($this->isPost()) { + return $this->handlePost(); + } + + return false; + } + + function handlePost() + { + + $server = xmlrpc_server_create(); + xmlrpc_server_register_method($server, 'pingback.ping', array($this, 'ping')); + echo xmlrpc_server_call_method($server, file_get_contents('php://input'), null, array('encoding' => 'utf-8')); + xmlrpc_server_destroy($server); + return true; + } + + function ping($method, $parameters) { + list($source, $target) = $parameters; + + if(!$source) { + return array( + 'faultCode' => 0x0010, + 'faultString' => '"source" is missing' + ); + } + + if(!$target) { + return array( + 'faultCode' => 0x0020, + 'faultString' => '"target" is missing' + ); + } + + $response = linkback_get_source($source, $target); + if(!$response) { + return array( + 'faultCode' => 0x0011, + 'faultString' => 'Source does not link to target' + ); + } + + $notice = linkback_get_target($target); + if(!$notice) { + return array( + 'faultCode' => 0x0021, + 'faultString' => 'Target not found' + ); + } + + $url = linkback_save($source, $target, $response, $notice); + if(!$url) { + return array( + 'faultCode' => 0, + 'faultString' => 'An error occured while saving.' + ); + } + + return array('Success'); + } +}